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

Dependencies:   mbed-src

Fork of VolundrIntroCase2015 by Volundr

Committer:
tweaker1331
Date:
Sun Aug 16 11:44:48 2015 +0000
Revision:
3:ce51f3857195
Parent:
2:7ca8b2154664
Child:
4:17d1343916ec
Defintieve versie V1.0

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);
tweaker1331 1:fad61b6e660b 20
tweaker1331 1:fad61b6e660b 21 DigitalOut en_a(p21);
tweaker1331 1:fad61b6e660b 22 DigitalOut en_b(p22);
tweaker1331 1:fad61b6e660b 23
tweaker1331 3:ce51f3857195 24 DigitalOut led1(LED1);
tweaker1331 3:ce51f3857195 25 DigitalOut led2(LED2);
tweaker1331 3:ce51f3857195 26 DigitalOut led3(LED3);
tweaker1331 3:ce51f3857195 27 DigitalOut led4(LED4);
tweaker1331 3:ce51f3857195 28
tweaker1331 3:ce51f3857195 29 AnalogIn collision(p15);
tweaker1331 3:ce51f3857195 30
tweaker1331 3:ce51f3857195 31 DigitalOut sirene(p19);
tweaker1331 3:ce51f3857195 32 DigitalOut lights(p20);
tweaker1331 1:fad61b6e660b 33
tweaker1331 1:fad61b6e660b 34 Serial bluetooth(p9, p10);
tweaker1331 3:ce51f3857195 35 //Serial pc(USBTX, USBRX);
tweaker1331 2:7ca8b2154664 36
tweaker1331 3:ce51f3857195 37 static int control_state = 0; // When 0, allow bluetooth control, When 1 disable bluetooth control
tweaker1331 1:fad61b6e660b 38
tweaker1331 3:ce51f3857195 39 void reset_LED()
tweaker1331 2:7ca8b2154664 40 {
tweaker1331 3:ce51f3857195 41 led1.write(0);
tweaker1331 3:ce51f3857195 42 led2.write(0);
tweaker1331 3:ce51f3857195 43 led3.write(0);
tweaker1331 3:ce51f3857195 44 led4.write(0);
tweaker1331 3:ce51f3857195 45 }
tweaker1331 3:ce51f3857195 46
tweaker1331 3:ce51f3857195 47 void TimeOut_handler()
tweaker1331 3:ce51f3857195 48 {
tweaker1331 3:ce51f3857195 49 in1.write(0.0);
tweaker1331 3:ce51f3857195 50 in2.write(0.0);
tweaker1331 3:ce51f3857195 51 in3.write(0.0);
tweaker1331 3:ce51f3857195 52 in4.write(0.0);
tweaker1331 3:ce51f3857195 53 reset_LED();
tweaker1331 2:7ca8b2154664 54 }
tweaker1331 1:fad61b6e660b 55
tweaker1331 1:fad61b6e660b 56 /* Initialize timers for the H-bridge*/
tweaker1331 1:fad61b6e660b 57 int init_drive()
tweaker1331 1:fad61b6e660b 58 {
tweaker1331 1:fad61b6e660b 59 // Set PWM frequency to 10 kHz
tweaker1331 1:fad61b6e660b 60 in1.period_us(100);
tweaker1331 1:fad61b6e660b 61 in2.period_us(100);
tweaker1331 1:fad61b6e660b 62 in3.period_us(100);
tweaker1331 1:fad61b6e660b 63 in4.period_us(100);
tweaker1331 3:ce51f3857195 64
tweaker1331 3:ce51f3857195 65 in1.write(0.0);
tweaker1331 3:ce51f3857195 66 in2.write(0.0);
tweaker1331 3:ce51f3857195 67 in3.write(0.0);
tweaker1331 3:ce51f3857195 68 in4.write(0.0);
tweaker1331 1:fad61b6e660b 69 /* Set enable pin high. NEVER set this pins low during driving.
tweaker1331 1:fad61b6e660b 70 There are no protection diodes and with EN low, H-bridge is in Hi-Z mode.
tweaker1331 1:fad61b6e660b 71 This can generate a high voltage that breaks the H-bridge.*/
tweaker1331 1:fad61b6e660b 72 en_a.write(1);
tweaker1331 1:fad61b6e660b 73 en_b.write(1);
tweaker1331 1:fad61b6e660b 74
tweaker1331 1:fad61b6e660b 75 return 1;
tweaker1331 1:fad61b6e660b 76 }
tweaker1331 1:fad61b6e660b 77
tweaker1331 1:fad61b6e660b 78 void rxCallback()
tweaker1331 1:fad61b6e660b 79 {
tweaker1331 3:ce51f3857195 80 static int sirene_state = 0;
tweaker1331 3:ce51f3857195 81 static int lights_state = 0;
tweaker1331 3:ce51f3857195 82
tweaker1331 3:ce51f3857195 83 if (control_state == 1)
tweaker1331 3:ce51f3857195 84 {
tweaker1331 3:ce51f3857195 85 return;
tweaker1331 1:fad61b6e660b 86 }
tweaker1331 3:ce51f3857195 87
tweaker1331 3:ce51f3857195 88 float time_out_sec = 0.1;
tweaker1331 2:7ca8b2154664 89 char c;
tweaker1331 3:ce51f3857195 90 c = bluetooth.getc();
tweaker1331 2:7ca8b2154664 91 switch (c) {
tweaker1331 2:7ca8b2154664 92 // Forward direction
tweaker1331 3:ce51f3857195 93 case 'W':
tweaker1331 3:ce51f3857195 94 reset_LED();
tweaker1331 3:ce51f3857195 95 led1.write(1);
tweaker1331 2:7ca8b2154664 96 in1.write(1.0);
tweaker1331 2:7ca8b2154664 97 in2.write(0.0);
tweaker1331 3:ce51f3857195 98 in3.write(0.0);
tweaker1331 3:ce51f3857195 99 in4.write(1.0);
tweaker1331 3:ce51f3857195 100 systicker.attach(&TimeOut_handler, time_out_sec);
tweaker1331 2:7ca8b2154664 101 break;
tweaker1331 2:7ca8b2154664 102 // Backward direction
tweaker1331 3:ce51f3857195 103 case 'S':
tweaker1331 3:ce51f3857195 104 reset_LED();
tweaker1331 3:ce51f3857195 105 led2.write(1);
tweaker1331 2:7ca8b2154664 106 in1.write(0.0);
tweaker1331 2:7ca8b2154664 107 in2.write(1.0);
tweaker1331 3:ce51f3857195 108 in3.write(1.0);
tweaker1331 3:ce51f3857195 109 in4.write(0.0);
tweaker1331 3:ce51f3857195 110 systicker.attach(&TimeOut_handler, time_out_sec);
tweaker1331 2:7ca8b2154664 111 break;
tweaker1331 2:7ca8b2154664 112 // Left direction
tweaker1331 3:ce51f3857195 113 case 'A':
tweaker1331 3:ce51f3857195 114 reset_LED();
tweaker1331 3:ce51f3857195 115 led3.write(1);
tweaker1331 2:7ca8b2154664 116 in1.write(1.0);
tweaker1331 2:7ca8b2154664 117 in2.write(0.0);
tweaker1331 2:7ca8b2154664 118 in3.write(0.0);
tweaker1331 2:7ca8b2154664 119 in4.write(0.0);
tweaker1331 3:ce51f3857195 120 systicker.attach(&TimeOut_handler, time_out_sec);
tweaker1331 2:7ca8b2154664 121 break;
tweaker1331 3:ce51f3857195 122 case 'D':
tweaker1331 3:ce51f3857195 123 reset_LED();
tweaker1331 3:ce51f3857195 124 led4.write(1);
tweaker1331 2:7ca8b2154664 125 in1.write(0.0);
tweaker1331 3:ce51f3857195 126 in2.write(0.0);
tweaker1331 2:7ca8b2154664 127 in3.write(0.0);
tweaker1331 3:ce51f3857195 128 in4.write(1.0);
tweaker1331 3:ce51f3857195 129 systicker.attach(&TimeOut_handler, time_out_sec);
tweaker1331 2:7ca8b2154664 130 break;
tweaker1331 3:ce51f3857195 131 case 'g':
tweaker1331 3:ce51f3857195 132 if (sirene_state == 0) {
tweaker1331 3:ce51f3857195 133 sirene.write(0);
tweaker1331 3:ce51f3857195 134 sirene_state = 1;
tweaker1331 3:ce51f3857195 135 } else {
tweaker1331 3:ce51f3857195 136 sirene.write(1);
tweaker1331 3:ce51f3857195 137 sirene_state = 0;
tweaker1331 3:ce51f3857195 138 }
tweaker1331 3:ce51f3857195 139 break;
tweaker1331 3:ce51f3857195 140 case 'k':
tweaker1331 3:ce51f3857195 141 if (lights_state == 0) {
tweaker1331 3:ce51f3857195 142 lights.write(1);
tweaker1331 3:ce51f3857195 143 lights_state = 1;
tweaker1331 3:ce51f3857195 144 } else {
tweaker1331 3:ce51f3857195 145 lights.write(0);
tweaker1331 3:ce51f3857195 146 lights_state = 0;
tweaker1331 3:ce51f3857195 147 }
tweaker1331 3:ce51f3857195 148 break;
tweaker1331 2:7ca8b2154664 149 }
tweaker1331 2:7ca8b2154664 150 }
tweaker1331 2:7ca8b2154664 151
tweaker1331 1:fad61b6e660b 152 /* Initialize the bluetooth module*/
tweaker1331 1:fad61b6e660b 153 int init_bluetooth()
tweaker1331 1:fad61b6e660b 154 {
tweaker1331 1:fad61b6e660b 155 bluetooth.baud(9600);
tweaker1331 1:fad61b6e660b 156 bluetooth.attach(&rxCallback, Serial::RxIrq);
tweaker1331 1:fad61b6e660b 157 return 1;
tweaker1331 0:9826a0b36948 158 }
tweaker1331 0:9826a0b36948 159
tweaker1331 1:fad61b6e660b 160 int main()
tweaker1331 1:fad61b6e660b 161 {
tweaker1331 3:ce51f3857195 162 float value=0.0;
tweaker1331 3:ce51f3857195 163
tweaker1331 3:ce51f3857195 164 sirene.write(1); // Is switched with PNP --> High is off
tweaker1331 3:ce51f3857195 165 lights.write(0); // Is directly connected to IO-pin --> Low is off
tweaker1331 0:9826a0b36948 166
tweaker1331 0:9826a0b36948 167 init_drive();
tweaker1331 3:ce51f3857195 168 init_bluetooth();
tweaker1331 2:7ca8b2154664 169
tweaker1331 3:ce51f3857195 170 /** Collision Low == 1.2 V
tweaker1331 3:ce51f3857195 171 Collision High == 1.7V
tweaker1331 3:ce51f3857195 172 Trigger on 1.5V -> 0.45
tweaker1331 3:ce51f3857195 173 */
tweaker1331 3:ce51f3857195 174 while(1) {
tweaker1331 3:ce51f3857195 175 value = collision.read();
tweaker1331 3:ce51f3857195 176 if (value >= 0.45) {
tweaker1331 3:ce51f3857195 177 control_state = 1; // Disable bluetooth control
tweaker1331 3:ce51f3857195 178 // Drive backwards for a second
tweaker1331 3:ce51f3857195 179 led2.write(1);
tweaker1331 3:ce51f3857195 180 led3.write(1);
tweaker1331 3:ce51f3857195 181 led4.write(1);
tweaker1331 3:ce51f3857195 182 led1.write(1);
tweaker1331 3:ce51f3857195 183 in1.write(0.0);
tweaker1331 3:ce51f3857195 184 in2.write(1.0);
tweaker1331 3:ce51f3857195 185 in3.write(1.0);
tweaker1331 3:ce51f3857195 186 in4.write(0.0);
tweaker1331 3:ce51f3857195 187 wait (1);
tweaker1331 3:ce51f3857195 188 reset_LED();
tweaker1331 3:ce51f3857195 189 control_state = 0; // Allow bluetooth control
tweaker1331 3:ce51f3857195 190 } else {
tweaker1331 3:ce51f3857195 191 // do nothing
tweaker1331 3:ce51f3857195 192 }
tweaker1331 1:fad61b6e660b 193
tweaker1331 3:ce51f3857195 194 }
tweaker1331 1:fad61b6e660b 195 }