Syma s107g Helicopter controller
Dependencies: AccelSensor mbed
Fork of IR_demo by
main.cpp@1:6bdeedba218c, 2014-11-26 (annotated)
- Committer:
- wsmallwood3
- Date:
- Wed Nov 26 19:10:21 2014 +0000
- Revision:
- 1:6bdeedba218c
- Parent:
- 0:e0bef6b1aa57
- Child:
- 2:2ffc4c0b0b90
gfsafgdsa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wsmallwood3 | 1:6bdeedba218c | 1 | //http://www.kerrywong.com/2012/08/27/reverse-engineering-the-syma-s107g-ir-protocol/ |
4180_1 | 0:e0bef6b1aa57 | 2 | #include "mbed.h" |
wsmallwood3 | 1:6bdeedba218c | 3 | |
4180_1 | 0:e0bef6b1aa57 | 4 | PwmOut IRLED(p21); |
4180_1 | 0:e0bef6b1aa57 | 5 | //IR send and receive demo |
wsmallwood3 | 1:6bdeedba218c | 6 | |
wsmallwood3 | 1:6bdeedba218c | 7 | int ROTATION_STATIONARY = 60; |
wsmallwood3 | 1:6bdeedba218c | 8 | int CAL_BYTE = 52; |
wsmallwood3 | 1:6bdeedba218c | 9 | |
wsmallwood3 | 1:6bdeedba218c | 10 | int Throttle, LeftRight, FwdBack; |
wsmallwood3 | 1:6bdeedba218c | 11 | |
wsmallwood3 | 1:6bdeedba218c | 12 | |
wsmallwood3 | 1:6bdeedba218c | 13 | |
wsmallwood3 | 1:6bdeedba218c | 14 | void PutHeader(void) |
wsmallwood3 | 1:6bdeedba218c | 15 | { // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED |
wsmallwood3 | 1:6bdeedba218c | 16 | IRLED = 0.5; |
wsmallwood3 | 1:6bdeedba218c | 17 | wait(.001964); |
wsmallwood3 | 1:6bdeedba218c | 18 | IRLED = 0.0; |
wsmallwood3 | 1:6bdeedba218c | 19 | wait(.001972); |
wsmallwood3 | 1:6bdeedba218c | 20 | } |
wsmallwood3 | 1:6bdeedba218c | 21 | |
wsmallwood3 | 1:6bdeedba218c | 22 | void PutFooter(void) |
wsmallwood3 | 1:6bdeedba218c | 23 | { // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED |
wsmallwood3 | 1:6bdeedba218c | 24 | IRLED = 0.5; |
wsmallwood3 | 1:6bdeedba218c | 25 | wait(.000305); |
wsmallwood3 | 1:6bdeedba218c | 26 | IRLED = 0.0; |
wsmallwood3 | 1:6bdeedba218c | 27 | wait(.088682); |
wsmallwood3 | 1:6bdeedba218c | 28 | } |
wsmallwood3 | 1:6bdeedba218c | 29 | |
wsmallwood3 | 1:6bdeedba218c | 30 | void PutZero(void) |
wsmallwood3 | 1:6bdeedba218c | 31 | { // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED |
wsmallwood3 | 1:6bdeedba218c | 32 | IRLED = 0.5; |
wsmallwood3 | 1:6bdeedba218c | 33 | wait(.000305); |
wsmallwood3 | 1:6bdeedba218c | 34 | IRLED = 0.0; |
wsmallwood3 | 1:6bdeedba218c | 35 | wait(.000293); |
wsmallwood3 | 1:6bdeedba218c | 36 | } |
wsmallwood3 | 1:6bdeedba218c | 37 | |
wsmallwood3 | 1:6bdeedba218c | 38 | void PutOne(void) |
wsmallwood3 | 1:6bdeedba218c | 39 | { // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED |
wsmallwood3 | 1:6bdeedba218c | 40 | IRLED = 0.5; |
wsmallwood3 | 1:6bdeedba218c | 41 | wait(.000306); |
wsmallwood3 | 1:6bdeedba218c | 42 | IRLED = 0.0; |
wsmallwood3 | 1:6bdeedba218c | 43 | wait(0.000687); |
wsmallwood3 | 1:6bdeedba218c | 44 | } |
4180_1 | 0:e0bef6b1aa57 | 45 | |
wsmallwood3 | 1:6bdeedba218c | 46 | void sendCommand(int throttle, int leftRight, int forwardBackward) |
wsmallwood3 | 1:6bdeedba218c | 47 | { |
wsmallwood3 | 1:6bdeedba218c | 48 | int b; |
wsmallwood3 | 1:6bdeedba218c | 49 | |
wsmallwood3 | 1:6bdeedba218c | 50 | PutHeader(); |
wsmallwood3 | 1:6bdeedba218c | 51 | |
wsmallwood3 | 1:6bdeedba218c | 52 | for (int i = 7; i >=0; i--) |
wsmallwood3 | 1:6bdeedba218c | 53 | { |
wsmallwood3 | 1:6bdeedba218c | 54 | b = ((ROTATION_STATIONARY + leftRight) & (1 << i)) >> i; |
wsmallwood3 | 1:6bdeedba218c | 55 | if (b > 0) PutOne(); else PutZero(); |
wsmallwood3 | 1:6bdeedba218c | 56 | } |
wsmallwood3 | 1:6bdeedba218c | 57 | |
wsmallwood3 | 1:6bdeedba218c | 58 | for (int i = 7; i >=0; i--) |
wsmallwood3 | 1:6bdeedba218c | 59 | { |
wsmallwood3 | 1:6bdeedba218c | 60 | b = ((63 + forwardBackward) & (1 << i)) >> i; |
wsmallwood3 | 1:6bdeedba218c | 61 | if (b > 0) PutOne(); else PutZero(); |
wsmallwood3 | 1:6bdeedba218c | 62 | } |
wsmallwood3 | 1:6bdeedba218c | 63 | |
wsmallwood3 | 1:6bdeedba218c | 64 | for (int i = 7; i >=0; i--) |
wsmallwood3 | 1:6bdeedba218c | 65 | { |
wsmallwood3 | 1:6bdeedba218c | 66 | b = (throttle & (1 << i)) >> i; |
wsmallwood3 | 1:6bdeedba218c | 67 | if (b > 0) PutOne(); else PutZero(); |
wsmallwood3 | 1:6bdeedba218c | 68 | } |
wsmallwood3 | 1:6bdeedba218c | 69 | |
wsmallwood3 | 1:6bdeedba218c | 70 | for (int i = 7; i >=0; i--) |
wsmallwood3 | 1:6bdeedba218c | 71 | { |
wsmallwood3 | 1:6bdeedba218c | 72 | b = (CAL_BYTE & (1 << i)) >> i; |
wsmallwood3 | 1:6bdeedba218c | 73 | if (b > 0) PutOne(); else PutZero(); |
wsmallwood3 | 1:6bdeedba218c | 74 | } |
wsmallwood3 | 1:6bdeedba218c | 75 | |
wsmallwood3 | 1:6bdeedba218c | 76 | PutFooter(); |
wsmallwood3 | 1:6bdeedba218c | 77 | |
wsmallwood3 | 1:6bdeedba218c | 78 | } |
wsmallwood3 | 1:6bdeedba218c | 79 | |
wsmallwood3 | 1:6bdeedba218c | 80 | void timerISR() |
wsmallwood3 | 1:6bdeedba218c | 81 | { |
wsmallwood3 | 1:6bdeedba218c | 82 | //read control values from potentiometers |
wsmallwood3 | 1:6bdeedba218c | 83 | //Throttle = analogRead(0); |
wsmallwood3 | 1:6bdeedba218c | 84 | //LeftRight = analogRead(1); |
wsmallwood3 | 1:6bdeedba218c | 85 | //FwdBack = analogRead(2); |
wsmallwood3 | 1:6bdeedba218c | 86 | |
wsmallwood3 | 1:6bdeedba218c | 87 | //Throttle = Throttle / 4; //convert to 0 to 255 |
wsmallwood3 | 1:6bdeedba218c | 88 | Throttle = 65; |
wsmallwood3 | 1:6bdeedba218c | 89 | //LeftRight = LeftRight / 8 - 64; //convert to -64 to 63 |
wsmallwood3 | 1:6bdeedba218c | 90 | LeftRight = 0; //convert to -64 to 63 |
wsmallwood3 | 1:6bdeedba218c | 91 | //FwdBack = FwdBack / 4 - 128; //convert to -128 to 127 |
wsmallwood3 | 1:6bdeedba218c | 92 | FwdBack = 0; //convert to -128 to 127 |
wsmallwood3 | 1:6bdeedba218c | 93 | |
wsmallwood3 | 1:6bdeedba218c | 94 | sendCommand(Throttle, LeftRight, FwdBack); |
wsmallwood3 | 1:6bdeedba218c | 95 | } |
wsmallwood3 | 1:6bdeedba218c | 96 | |
wsmallwood3 | 1:6bdeedba218c | 97 | |
wsmallwood3 | 1:6bdeedba218c | 98 | void Thrust(void) //Test function to test flying. |
wsmallwood3 | 1:6bdeedba218c | 99 | { |
wsmallwood3 | 1:6bdeedba218c | 100 | //Header |
wsmallwood3 | 1:6bdeedba218c | 101 | PutHeader(); |
wsmallwood3 | 1:6bdeedba218c | 102 | //First Byte |
wsmallwood3 | 1:6bdeedba218c | 103 | PutZero(); //1 |
wsmallwood3 | 1:6bdeedba218c | 104 | PutOne(); //2 |
wsmallwood3 | 1:6bdeedba218c | 105 | PutZero(); //3 |
wsmallwood3 | 1:6bdeedba218c | 106 | PutZero(); //4 |
wsmallwood3 | 1:6bdeedba218c | 107 | PutOne(); //5 |
wsmallwood3 | 1:6bdeedba218c | 108 | PutOne(); //6 |
wsmallwood3 | 1:6bdeedba218c | 109 | PutZero(); //7 |
wsmallwood3 | 1:6bdeedba218c | 110 | PutZero(); //8 |
wsmallwood3 | 1:6bdeedba218c | 111 | //Second Byte |
wsmallwood3 | 1:6bdeedba218c | 112 | PutZero(); //1 |
wsmallwood3 | 1:6bdeedba218c | 113 | PutZero(); //2 |
wsmallwood3 | 1:6bdeedba218c | 114 | PutOne(); //3 |
wsmallwood3 | 1:6bdeedba218c | 115 | PutOne(); //4 |
wsmallwood3 | 1:6bdeedba218c | 116 | PutOne(); //5 |
wsmallwood3 | 1:6bdeedba218c | 117 | PutOne(); //6 |
wsmallwood3 | 1:6bdeedba218c | 118 | PutOne(); //7 |
wsmallwood3 | 1:6bdeedba218c | 119 | PutOne(); //8 |
wsmallwood3 | 1:6bdeedba218c | 120 | //Third Byte |
wsmallwood3 | 1:6bdeedba218c | 121 | PutZero(); //1 |
wsmallwood3 | 1:6bdeedba218c | 122 | PutOne(); //2 |
wsmallwood3 | 1:6bdeedba218c | 123 | PutZero(); //3 |
wsmallwood3 | 1:6bdeedba218c | 124 | PutZero(); //4 |
wsmallwood3 | 1:6bdeedba218c | 125 | PutZero(); //5 |
wsmallwood3 | 1:6bdeedba218c | 126 | PutOne(); //6 |
wsmallwood3 | 1:6bdeedba218c | 127 | PutOne(); //7 |
wsmallwood3 | 1:6bdeedba218c | 128 | PutOne(); //8 |
wsmallwood3 | 1:6bdeedba218c | 129 | //Fourth Byte |
wsmallwood3 | 1:6bdeedba218c | 130 | PutZero(); //1 |
wsmallwood3 | 1:6bdeedba218c | 131 | PutOne(); //2 |
wsmallwood3 | 1:6bdeedba218c | 132 | PutOne(); //3 |
wsmallwood3 | 1:6bdeedba218c | 133 | PutZero(); //4 |
wsmallwood3 | 1:6bdeedba218c | 134 | PutOne(); //5 |
wsmallwood3 | 1:6bdeedba218c | 135 | PutOne(); //6 |
wsmallwood3 | 1:6bdeedba218c | 136 | PutOne(); //7 |
wsmallwood3 | 1:6bdeedba218c | 137 | PutZero(); //8 |
wsmallwood3 | 1:6bdeedba218c | 138 | //Footer |
wsmallwood3 | 1:6bdeedba218c | 139 | PutFooter(); |
wsmallwood3 | 1:6bdeedba218c | 140 | } |
wsmallwood3 | 1:6bdeedba218c | 141 | |
wsmallwood3 | 1:6bdeedba218c | 142 | |
wsmallwood3 | 1:6bdeedba218c | 143 | |
wsmallwood3 | 1:6bdeedba218c | 144 | |
4180_1 | 0:e0bef6b1aa57 | 145 | int main() { |
4180_1 | 0:e0bef6b1aa57 | 146 | //IR Transmit code |
4180_1 | 0:e0bef6b1aa57 | 147 | IRLED.period(1.0/38000.0); |
wsmallwood3 | 1:6bdeedba218c | 148 | //Drive IR LED data pin with 38Khz PWM Carrier |
4180_1 | 0:e0bef6b1aa57 | 149 | while(1) { |
wsmallwood3 | 1:6bdeedba218c | 150 | //Thrust(); |
wsmallwood3 | 1:6bdeedba218c | 151 | timerISR(); |
wsmallwood3 | 1:6bdeedba218c | 152 | |
4180_1 | 0:e0bef6b1aa57 | 153 | } |
4180_1 | 0:e0bef6b1aa57 | 154 | } |