Updated to latest version. Added in new version of the Siren

Dependencies:   mbed-src

Fork of VolundrIntroCase2015 by Volundr

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?

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