Updated to latest version. Added in new version of the Siren
Dependencies: mbed-src
Fork of VolundrIntroCase2015 by
main.cpp@4:17d1343916ec, 2016-08-12 (annotated)
- Committer:
- ThorsAvenger
- Date:
- Fri Aug 12 16:30:45 2016 +0000
- Revision:
- 4:17d1343916ec
- Parent:
- 3:ce51f3857195
Added block oscillator for the siren;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tweaker1331 | 0:9826a0b36948 | 1 | #include "mbed.h" |
tweaker1331 | 1:fad61b6e660b | 2 | /* |
tweaker1331 | 1:fad61b6e660b | 3 | MOTOR A |
tweaker1331 | 1:fad61b6e660b | 4 | ENA - p21 |
tweaker1331 | 1:fad61b6e660b | 5 | IN1 - p5 --> OUT1 - MOTORA+ |
tweaker1331 | 1:fad61b6e660b | 6 | IN2 - p6 --> OUT2 - MOTORA- |
tweaker1331 | 1:fad61b6e660b | 7 | MOTOR B |
tweaker1331 | 1:fad61b6e660b | 8 | ENB - p22 |
tweaker1331 | 1:fad61b6e660b | 9 | IN3 - p26 --> OUT3 - MOTORB+ |
tweaker1331 | 1:fad61b6e660b | 10 | IN4 - p25 --> OUT4 - MOTORB- |
tweaker1331 | 1:fad61b6e660b | 11 | */ |
tweaker1331 | 1:fad61b6e660b | 12 | |
tweaker1331 | 2:7ca8b2154664 | 13 | Timeout systicker; |
tweaker1331 | 2:7ca8b2154664 | 14 | |
tweaker1331 | 1:fad61b6e660b | 15 | PwmOut in1(p5); |
tweaker1331 | 1:fad61b6e660b | 16 | PwmOut in2(p6); |
tweaker1331 | 1:fad61b6e660b | 17 | |
tweaker1331 | 1:fad61b6e660b | 18 | PwmOut in3(p26); |
tweaker1331 | 1:fad61b6e660b | 19 | PwmOut in4(p25); |
ThorsAvenger | 4:17d1343916ec | 20 | PwmOut block(p24); |
tweaker1331 | 1:fad61b6e660b | 21 | |
tweaker1331 | 1:fad61b6e660b | 22 | DigitalOut en_a(p21); |
tweaker1331 | 1:fad61b6e660b | 23 | DigitalOut en_b(p22); |
tweaker1331 | 1:fad61b6e660b | 24 | |
tweaker1331 | 3:ce51f3857195 | 25 | DigitalOut led1(LED1); |
tweaker1331 | 3:ce51f3857195 | 26 | DigitalOut led2(LED2); |
tweaker1331 | 3:ce51f3857195 | 27 | DigitalOut led3(LED3); |
tweaker1331 | 3:ce51f3857195 | 28 | DigitalOut led4(LED4); |
tweaker1331 | 3:ce51f3857195 | 29 | |
tweaker1331 | 3:ce51f3857195 | 30 | AnalogIn collision(p15); |
tweaker1331 | 3:ce51f3857195 | 31 | |
tweaker1331 | 3:ce51f3857195 | 32 | DigitalOut sirene(p19); |
tweaker1331 | 3:ce51f3857195 | 33 | DigitalOut lights(p20); |
tweaker1331 | 1:fad61b6e660b | 34 | |
tweaker1331 | 1:fad61b6e660b | 35 | Serial bluetooth(p9, p10); |
tweaker1331 | 3:ce51f3857195 | 36 | //Serial pc(USBTX, USBRX); |
tweaker1331 | 2:7ca8b2154664 | 37 | |
tweaker1331 | 3:ce51f3857195 | 38 | static int control_state = 0; // When 0, allow bluetooth control, When 1 disable bluetooth control |
tweaker1331 | 1:fad61b6e660b | 39 | |
tweaker1331 | 3:ce51f3857195 | 40 | void reset_LED() |
tweaker1331 | 2:7ca8b2154664 | 41 | { |
tweaker1331 | 3:ce51f3857195 | 42 | led1.write(0); |
tweaker1331 | 3:ce51f3857195 | 43 | led2.write(0); |
tweaker1331 | 3:ce51f3857195 | 44 | led3.write(0); |
tweaker1331 | 3:ce51f3857195 | 45 | led4.write(0); |
tweaker1331 | 3:ce51f3857195 | 46 | } |
tweaker1331 | 3:ce51f3857195 | 47 | |
tweaker1331 | 3:ce51f3857195 | 48 | void TimeOut_handler() |
tweaker1331 | 3:ce51f3857195 | 49 | { |
tweaker1331 | 3:ce51f3857195 | 50 | in1.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 51 | in2.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 52 | in3.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 53 | in4.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 54 | reset_LED(); |
tweaker1331 | 2:7ca8b2154664 | 55 | } |
tweaker1331 | 1:fad61b6e660b | 56 | |
tweaker1331 | 1:fad61b6e660b | 57 | /* Initialize timers for the H-bridge*/ |
tweaker1331 | 1:fad61b6e660b | 58 | int init_drive() |
tweaker1331 | 1:fad61b6e660b | 59 | { |
tweaker1331 | 1:fad61b6e660b | 60 | // Set PWM frequency to 10 kHz |
tweaker1331 | 1:fad61b6e660b | 61 | in1.period_us(100); |
tweaker1331 | 1:fad61b6e660b | 62 | in2.period_us(100); |
tweaker1331 | 1:fad61b6e660b | 63 | in3.period_us(100); |
tweaker1331 | 1:fad61b6e660b | 64 | in4.period_us(100); |
ThorsAvenger | 4:17d1343916ec | 65 | |
ThorsAvenger | 4:17d1343916ec | 66 | // Set Block frequency of Siren to 2 Hz with DC of 50% |
ThorsAvenger | 4:17d1343916ec | 67 | block.period(1.0f); |
ThorsAvenger | 4:17d1343916ec | 68 | block.write(0.50f); |
tweaker1331 | 3:ce51f3857195 | 69 | |
tweaker1331 | 3:ce51f3857195 | 70 | in1.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 71 | in2.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 72 | in3.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 73 | in4.write(0.0); |
tweaker1331 | 1:fad61b6e660b | 74 | /* Set enable pin high. NEVER set this pins low during driving. |
tweaker1331 | 1:fad61b6e660b | 75 | There are no protection diodes and with EN low, H-bridge is in Hi-Z mode. |
tweaker1331 | 1:fad61b6e660b | 76 | This can generate a high voltage that breaks the H-bridge.*/ |
tweaker1331 | 1:fad61b6e660b | 77 | en_a.write(1); |
tweaker1331 | 1:fad61b6e660b | 78 | en_b.write(1); |
tweaker1331 | 1:fad61b6e660b | 79 | |
tweaker1331 | 1:fad61b6e660b | 80 | return 1; |
tweaker1331 | 1:fad61b6e660b | 81 | } |
tweaker1331 | 1:fad61b6e660b | 82 | |
tweaker1331 | 1:fad61b6e660b | 83 | void rxCallback() |
tweaker1331 | 1:fad61b6e660b | 84 | { |
tweaker1331 | 3:ce51f3857195 | 85 | static int sirene_state = 0; |
tweaker1331 | 3:ce51f3857195 | 86 | static int lights_state = 0; |
tweaker1331 | 3:ce51f3857195 | 87 | |
tweaker1331 | 3:ce51f3857195 | 88 | if (control_state == 1) |
tweaker1331 | 3:ce51f3857195 | 89 | { |
tweaker1331 | 3:ce51f3857195 | 90 | return; |
tweaker1331 | 1:fad61b6e660b | 91 | } |
tweaker1331 | 3:ce51f3857195 | 92 | |
tweaker1331 | 3:ce51f3857195 | 93 | float time_out_sec = 0.1; |
tweaker1331 | 2:7ca8b2154664 | 94 | char c; |
tweaker1331 | 3:ce51f3857195 | 95 | c = bluetooth.getc(); |
tweaker1331 | 2:7ca8b2154664 | 96 | switch (c) { |
tweaker1331 | 2:7ca8b2154664 | 97 | // Forward direction |
tweaker1331 | 3:ce51f3857195 | 98 | case 'W': |
tweaker1331 | 3:ce51f3857195 | 99 | reset_LED(); |
tweaker1331 | 3:ce51f3857195 | 100 | led1.write(1); |
tweaker1331 | 2:7ca8b2154664 | 101 | in1.write(1.0); |
tweaker1331 | 2:7ca8b2154664 | 102 | in2.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 103 | in3.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 104 | in4.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 105 | systicker.attach(&TimeOut_handler, time_out_sec); |
tweaker1331 | 2:7ca8b2154664 | 106 | break; |
tweaker1331 | 2:7ca8b2154664 | 107 | // Backward direction |
tweaker1331 | 3:ce51f3857195 | 108 | case 'S': |
tweaker1331 | 3:ce51f3857195 | 109 | reset_LED(); |
tweaker1331 | 3:ce51f3857195 | 110 | led2.write(1); |
tweaker1331 | 2:7ca8b2154664 | 111 | in1.write(0.0); |
tweaker1331 | 2:7ca8b2154664 | 112 | in2.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 113 | in3.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 114 | in4.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 115 | systicker.attach(&TimeOut_handler, time_out_sec); |
tweaker1331 | 2:7ca8b2154664 | 116 | break; |
tweaker1331 | 2:7ca8b2154664 | 117 | // Left direction |
tweaker1331 | 3:ce51f3857195 | 118 | case 'A': |
tweaker1331 | 3:ce51f3857195 | 119 | reset_LED(); |
tweaker1331 | 3:ce51f3857195 | 120 | led3.write(1); |
tweaker1331 | 2:7ca8b2154664 | 121 | in1.write(1.0); |
tweaker1331 | 2:7ca8b2154664 | 122 | in2.write(0.0); |
tweaker1331 | 2:7ca8b2154664 | 123 | in3.write(0.0); |
tweaker1331 | 2:7ca8b2154664 | 124 | in4.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 125 | systicker.attach(&TimeOut_handler, time_out_sec); |
tweaker1331 | 2:7ca8b2154664 | 126 | break; |
tweaker1331 | 3:ce51f3857195 | 127 | case 'D': |
tweaker1331 | 3:ce51f3857195 | 128 | reset_LED(); |
tweaker1331 | 3:ce51f3857195 | 129 | led4.write(1); |
tweaker1331 | 2:7ca8b2154664 | 130 | in1.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 131 | in2.write(0.0); |
tweaker1331 | 2:7ca8b2154664 | 132 | in3.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 133 | in4.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 134 | systicker.attach(&TimeOut_handler, time_out_sec); |
tweaker1331 | 2:7ca8b2154664 | 135 | break; |
tweaker1331 | 3:ce51f3857195 | 136 | case 'g': |
tweaker1331 | 3:ce51f3857195 | 137 | if (sirene_state == 0) { |
tweaker1331 | 3:ce51f3857195 | 138 | sirene.write(0); |
tweaker1331 | 3:ce51f3857195 | 139 | sirene_state = 1; |
tweaker1331 | 3:ce51f3857195 | 140 | } else { |
tweaker1331 | 3:ce51f3857195 | 141 | sirene.write(1); |
tweaker1331 | 3:ce51f3857195 | 142 | sirene_state = 0; |
tweaker1331 | 3:ce51f3857195 | 143 | } |
tweaker1331 | 3:ce51f3857195 | 144 | break; |
tweaker1331 | 3:ce51f3857195 | 145 | case 'k': |
tweaker1331 | 3:ce51f3857195 | 146 | if (lights_state == 0) { |
tweaker1331 | 3:ce51f3857195 | 147 | lights.write(1); |
tweaker1331 | 3:ce51f3857195 | 148 | lights_state = 1; |
tweaker1331 | 3:ce51f3857195 | 149 | } else { |
tweaker1331 | 3:ce51f3857195 | 150 | lights.write(0); |
tweaker1331 | 3:ce51f3857195 | 151 | lights_state = 0; |
tweaker1331 | 3:ce51f3857195 | 152 | } |
tweaker1331 | 3:ce51f3857195 | 153 | break; |
tweaker1331 | 2:7ca8b2154664 | 154 | } |
tweaker1331 | 2:7ca8b2154664 | 155 | } |
tweaker1331 | 2:7ca8b2154664 | 156 | |
tweaker1331 | 1:fad61b6e660b | 157 | /* Initialize the bluetooth module*/ |
tweaker1331 | 1:fad61b6e660b | 158 | int init_bluetooth() |
tweaker1331 | 1:fad61b6e660b | 159 | { |
tweaker1331 | 1:fad61b6e660b | 160 | bluetooth.baud(9600); |
tweaker1331 | 1:fad61b6e660b | 161 | bluetooth.attach(&rxCallback, Serial::RxIrq); |
tweaker1331 | 1:fad61b6e660b | 162 | return 1; |
tweaker1331 | 0:9826a0b36948 | 163 | } |
tweaker1331 | 0:9826a0b36948 | 164 | |
tweaker1331 | 1:fad61b6e660b | 165 | int main() |
tweaker1331 | 1:fad61b6e660b | 166 | { |
tweaker1331 | 3:ce51f3857195 | 167 | float value=0.0; |
tweaker1331 | 3:ce51f3857195 | 168 | |
tweaker1331 | 3:ce51f3857195 | 169 | sirene.write(1); // Is switched with PNP --> High is off |
tweaker1331 | 3:ce51f3857195 | 170 | lights.write(0); // Is directly connected to IO-pin --> Low is off |
tweaker1331 | 0:9826a0b36948 | 171 | |
tweaker1331 | 0:9826a0b36948 | 172 | init_drive(); |
tweaker1331 | 3:ce51f3857195 | 173 | init_bluetooth(); |
tweaker1331 | 2:7ca8b2154664 | 174 | |
tweaker1331 | 3:ce51f3857195 | 175 | /** Collision Low == 1.2 V |
tweaker1331 | 3:ce51f3857195 | 176 | Collision High == 1.7V |
tweaker1331 | 3:ce51f3857195 | 177 | Trigger on 1.5V -> 0.45 |
tweaker1331 | 3:ce51f3857195 | 178 | */ |
tweaker1331 | 3:ce51f3857195 | 179 | while(1) { |
tweaker1331 | 3:ce51f3857195 | 180 | value = collision.read(); |
tweaker1331 | 3:ce51f3857195 | 181 | if (value >= 0.45) { |
tweaker1331 | 3:ce51f3857195 | 182 | control_state = 1; // Disable bluetooth control |
tweaker1331 | 3:ce51f3857195 | 183 | // Drive backwards for a second |
tweaker1331 | 3:ce51f3857195 | 184 | led2.write(1); |
tweaker1331 | 3:ce51f3857195 | 185 | led3.write(1); |
tweaker1331 | 3:ce51f3857195 | 186 | led4.write(1); |
tweaker1331 | 3:ce51f3857195 | 187 | led1.write(1); |
tweaker1331 | 3:ce51f3857195 | 188 | in1.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 189 | in2.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 190 | in3.write(1.0); |
tweaker1331 | 3:ce51f3857195 | 191 | in4.write(0.0); |
tweaker1331 | 3:ce51f3857195 | 192 | wait (1); |
tweaker1331 | 3:ce51f3857195 | 193 | reset_LED(); |
tweaker1331 | 3:ce51f3857195 | 194 | control_state = 0; // Allow bluetooth control |
tweaker1331 | 3:ce51f3857195 | 195 | } else { |
tweaker1331 | 3:ce51f3857195 | 196 | // do nothing |
tweaker1331 | 3:ce51f3857195 | 197 | } |
tweaker1331 | 1:fad61b6e660b | 198 | |
tweaker1331 | 3:ce51f3857195 | 199 | } |
tweaker1331 | 1:fad61b6e660b | 200 | } |