microbit pca9685 demo

Dependencies:   MicroBitPCA9685 microbit

Committer:
Asimov
Date:
Fri Jan 13 21:15:52 2017 +0000
Revision:
0:a46cb73d2e3e
demo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Asimov 0:a46cb73d2e3e 1 /* Martin Cottrell v0.1 */
Asimov 0:a46cb73d2e3e 2 /* Thanks for all the examples this is based on */
Asimov 0:a46cb73d2e3e 3 /* This is an initial proof of concept using PCA9685 with microbit */
Asimov 0:a46cb73d2e3e 4 /* Needs many refinements and I'll also looking at PWM 9110s next */
Asimov 0:a46cb73d2e3e 5 /* Enjoy! */
Asimov 0:a46cb73d2e3e 6
Asimov 0:a46cb73d2e3e 7 #include "MicroBit.h"
Asimov 0:a46cb73d2e3e 8 #include "MicroBitPCA9685.h"
Asimov 0:a46cb73d2e3e 9 MicroBit uBit;
Asimov 0:a46cb73d2e3e 10
Asimov 0:a46cb73d2e3e 11 int setServoPulse(MicroBitPCA9685& uPCA9685, uint8_t n, float pulse) {
Asimov 0:a46cb73d2e3e 12 float pulselength = 10000; // 10,000 units per seconds
Asimov 0:a46cb73d2e3e 13 pulse = 4094 * pulse / pulselength;
Asimov 0:a46cb73d2e3e 14 return uPCA9685.setPWM(n, 0, pulse);
Asimov 0:a46cb73d2e3e 15 }
Asimov 0:a46cb73d2e3e 16
Asimov 0:a46cb73d2e3e 17 int setAllServoPulse(MicroBitPCA9685& uPCA9685, float pulse) {
Asimov 0:a46cb73d2e3e 18 float pulselength = 10000; // 10,000 units per seconds
Asimov 0:a46cb73d2e3e 19 pulse = 4094 * pulse / pulselength;
Asimov 0:a46cb73d2e3e 20 return uPCA9685.setAllPWM(0, pulse);
Asimov 0:a46cb73d2e3e 21 }
Asimov 0:a46cb73d2e3e 22
Asimov 0:a46cb73d2e3e 23 void initServoDriver(MicroBitPCA9685& uPCA9685) {
Asimov 0:a46cb73d2e3e 24 uPCA9685.begin();
Asimov 0:a46cb73d2e3e 25 uPCA9685.setPrescale(64); //This value is decided for 10ms interval.
Asimov 0:a46cb73d2e3e 26 uPCA9685.frequencyI2C(400000); //400kHz
Asimov 0:a46cb73d2e3e 27 }
Asimov 0:a46cb73d2e3e 28
Asimov 0:a46cb73d2e3e 29 int main()
Asimov 0:a46cb73d2e3e 30 {
Asimov 0:a46cb73d2e3e 31 // Initialise the micro:bit runtime.
Asimov 0:a46cb73d2e3e 32 uBit.init();
Asimov 0:a46cb73d2e3e 33 MicroBitPCA9685 uPCA9685(uBit.i2c, 0x80);
Asimov 0:a46cb73d2e3e 34 //0x80 out the box PCA9685 address
Asimov 0:a46cb73d2e3e 35
Asimov 0:a46cb73d2e3e 36 initServoDriver(uPCA9685);
Asimov 0:a46cb73d2e3e 37 while(true){
Asimov 0:a46cb73d2e3e 38 uBit.display.scroll("All");
Asimov 0:a46cb73d2e3e 39 setAllServoPulse(uPCA9685, 2300);
Asimov 0:a46cb73d2e3e 40 wait(0.5);
Asimov 0:a46cb73d2e3e 41 setAllServoPulse(uPCA9685, 1350);
Asimov 0:a46cb73d2e3e 42 wait(0.5);
Asimov 0:a46cb73d2e3e 43
Asimov 0:a46cb73d2e3e 44 for (int mov = 550; mov < 2300; mov++){
Asimov 0:a46cb73d2e3e 45 setAllServoPulse(uPCA9685, mov);
Asimov 0:a46cb73d2e3e 46 wait(0.001);
Asimov 0:a46cb73d2e3e 47 }
Asimov 0:a46cb73d2e3e 48
Asimov 0:a46cb73d2e3e 49 for (int motor = 0; motor < 7; motor++){
Asimov 0:a46cb73d2e3e 50 //I had 7 servos!
Asimov 0:a46cb73d2e3e 51 char buf[2];
Asimov 0:a46cb73d2e3e 52 sprintf(buf, "%d", motor);
Asimov 0:a46cb73d2e3e 53 uBit.display.scroll(buf, 50);
Asimov 0:a46cb73d2e3e 54
Asimov 0:a46cb73d2e3e 55 wait(0.2);
Asimov 0:a46cb73d2e3e 56 setServoPulse(uPCA9685, motor, 2300);
Asimov 0:a46cb73d2e3e 57
Asimov 0:a46cb73d2e3e 58 wait(0.4);//delay necessary to perform the action
Asimov 0:a46cb73d2e3e 59 setServoPulse(uPCA9685, motor, 1350);
Asimov 0:a46cb73d2e3e 60 wait(0.4);
Asimov 0:a46cb73d2e3e 61
Asimov 0:a46cb73d2e3e 62 for (int mov = 550; mov < 2300; mov++){
Asimov 0:a46cb73d2e3e 63 setServoPulse(uPCA9685, motor, mov);
Asimov 0:a46cb73d2e3e 64 wait(0.001);
Asimov 0:a46cb73d2e3e 65 }
Asimov 0:a46cb73d2e3e 66 }
Asimov 0:a46cb73d2e3e 67
Asimov 0:a46cb73d2e3e 68 }
Asimov 0:a46cb73d2e3e 69 }