microbit pca9685 demo
Dependencies: MicroBitPCA9685 microbit
main.cpp@0:a46cb73d2e3e, 2017-01-13 (annotated)
- Committer:
- Asimov
- Date:
- Fri Jan 13 21:15:52 2017 +0000
- Revision:
- 0:a46cb73d2e3e
demo
Who changed what in which revision?
User | Revision | Line number | New 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 | } |