Syma s107g Helicopter controller

Dependencies:   AccelSensor mbed

Fork of IR_demo by jim hamblen

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?

UserRevisionLine numberNew 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 }