SHOW:
|
|
- or go back to the newest paste.
1 | #include <Servo.h> | |
2 | #include "IOpins.h" | |
3 | #include "Constants.h" | |
4 | ||
5 | ||
6 | //-------------------------------------------------------------- define global variables --------------------- | |
7 | ||
8 | unsigned int Volts; | |
9 | unsigned int LeftAmps; | |
10 | unsigned int RightAmps; | |
11 | unsigned long chargeTimer; | |
12 | unsigned long leftoverload; | |
13 | unsigned long rightoverload; | |
14 | int highVolts; | |
15 | int startVolts; | |
16 | int Leftspeed=0; | |
17 | int Rightspeed=0; | |
18 | int Speed; | |
19 | int Steer; | |
20 | byte Charged=1; // 0=Flat battery 1=Charged battery | |
21 | int Leftmode=1; // 0=reverse, 1=brake, 2=forward | |
22 | int Rightmode=1; // 0=reverse, 1=brake, 2=forward | |
23 | byte Leftmodechange=0; // Left input must be 1500 before brake or reverse can occur | |
24 | byte Rightmodechange=0; // Right input must be 1500 before brake or reverse can occur | |
25 | int LeftPWM; // PWM value for left motor speed / brake | |
26 | int RightPWM; // PWM value for right motor speed / brake | |
27 | int data; | |
28 | int servo[7]; | |
29 | - | const int trigger = 2; // aaa Define Ping Trigger as D2 |
29 | + | const int trigger = 2; // Define Ping Trigger as D2 |
30 | - | const int echo = 4; // aaa Define Ping Echo D4 |
30 | + | const int echo = 4; // Define Ping Echo D4 |
31 | ||
32 | //-------------------------------------------------------------- define servos -------------------------------- | |
33 | ||
34 | ||
35 | Servo Servo0; // define servos | |
36 | Servo Servo1; // define servos | |
37 | Servo Servo2; // define servos | |
38 | Servo Servo3; // define servos | |
39 | Servo Servo4; // define servos | |
40 | Servo Servo5; // define servos | |
41 | Servo Servo6; // define servos | |
42 | ||
43 | void setup() | |
44 | { | |
45 | //------------------------------------------------------------ Initialize Servos ------------------------------ | |
46 | ||
47 | //Servo0.attach(S0); // attach servo to I/O pin | |
48 | //Servo1.attach(S1); // attach servo to I/O pin | |
49 | Servo2.attach(S2); // attach servo to I/O pin | |
50 | Servo3.attach(S3); // attach servo to I/O pin | |
51 | Servo4.attach(S4); // attach servo to I/O pin | |
52 | Servo5.attach(S5); // attach servo to I/O pin | |
53 | Servo6.attach(S6); // attach servo to I/O pin | |
54 | ||
55 | //------------------------------------------------------------ Set servos to default position ----------------- | |
56 | ||
57 | Servo0.writeMicroseconds(DServo0); // set servo to default position | |
58 | Servo1.writeMicroseconds(DServo1); // set servo to default position | |
59 | Servo2.writeMicroseconds(DServo2); // set servo to default position | |
60 | Servo3.writeMicroseconds(DServo3); // set servo to default position | |
61 | Servo4.writeMicroseconds(DServo4); // set servo to default position | |
62 | Servo5.writeMicroseconds(DServo5); // set servo to default position | |
63 | Servo6.writeMicroseconds(DServo6); // set servo to default position | |
64 | ||
65 | //------------------------------------------------------------ Initialize I/O pins --------------------------- | |
66 | ||
67 | pinMode (Charger,OUTPUT); // change Charger pin to output | |
68 | digitalWrite (Charger,1); // disable current regulator to charge battery | |
69 | ||
70 | if (Cmode==1) | |
71 | { | |
72 | Serial.begin(Brate); // enable serial communications if Cmode=1 | |
73 | Serial.flush(); // flush buffer | |
74 | } | |
75 | //Serial.begin(57600); | |
76 | ||
77 | //------------------------------------------------------------ Initilialize I/O Ping Sensor ----------------- | |
78 | ||
79 | - | pinMode(trigger,OUTPUT); // aaa Set digital pin 2 to trigger output |
79 | + | pinMode(trigger,OUTPUT); // Set digital pin 2 to trigger output |
80 | - | pinMode(echo,INPUT); // aaa Set digital pin 4 to echo input |
80 | + | pinMode(echo,INPUT); // Set digital pin 4 to echo input |
81 | } | |
82 | ||
83 | ||
84 | void loop() | |
85 | { | |
86 | //---------------------------------------- Check battery voltage and current draw of motors --------------- | |
87 | ||
88 | Volts=analogRead(Battery); // read the battery voltage | |
89 | LeftAmps=analogRead(LmotorC); // read left motor current draw | |
90 | RightAmps=analogRead(RmotorC); // read right motor current draw | |
91 | ||
92 | //Serial.print(LeftAmps); | |
93 | //Serial.print(" "); | |
94 | //Serial.println(RightAmps); | |
95 | ||
96 | if (LeftAmps>Leftmaxamps) // is motor current draw exceeding safe limit | |
97 | { | |
98 | analogWrite (LmotorA,0); // turn off motors | |
99 | analogWrite (LmotorB,0); // turn off motors | |
100 | leftoverload=millis(); // record time of overload | |
101 | } | |
102 | ||
103 | if (RightAmps>Rightmaxamps) // is motor current draw exceeding safe limit | |
104 | { | |
105 | analogWrite (RmotorA,0); // turn off motors | |
106 | analogWrite (RmotorB,0); // turn off motors | |
107 | rightoverload=millis(); // record time of overload | |
108 | } | |
109 | ||
110 | if ((Volts<lowvolt) && (Charged==1)) // check condition of the battery | |
111 | { // change battery status from charged to flat | |
112 | ||
113 | //-------------------------- FLAT BATTERY speed controller shuts down until battery is recharged ---- | |
114 | //--------------------------- This is a safety feature to prevent malfunction at low voltages!! ------ | |
115 | ||
116 | Charged=0; // battery is flat | |
117 | highVolts=Volts; // record the voltage | |
118 | startVolts=Volts; | |
119 | chargeTimer=millis(); // record the time | |
120 | ||
121 | digitalWrite (Charger,0); // enable current regulator to charge battery | |
122 | } | |
123 | ||
124 | //------------------------------- CHARGE BATTERY ------------------------------------------------------- | |
125 | ||
126 | if ((Charged==0) && (Volts-startVolts>67)) // if battery is flat and charger has been connected (voltage has increased by at least 1V) | |
127 | { | |
128 | if (Volts>highVolts) // has battery voltage increased? | |
129 | { | |
130 | highVolts=Volts; // record the highest voltage. Used to detect peak charging. | |
131 | chargeTimer=millis(); // when voltage increases record the time | |
132 | } | |
133 | ||
134 | if (Volts>batvolt) // battery voltage must be higher than this before peak charging can occur. | |
135 | { | |
136 | if ((highVolts-Volts)>5 || (millis()-chargeTimer)>chargetimeout) //has voltage begun to drop or levelled out? | |
137 | { | |
138 | Charged=1; // battery voltage has peaked | |
139 | digitalWrite (Charger,1); // turn off current regulator | |
140 | } | |
141 | } | |
142 | } | |
143 | ||
144 | else | |
145 | ||
146 | {//---------------------- GOOD BATTERY speed controller opperates normally ---------------------- | |
147 | ||
148 | switch(Cmode) | |
149 | { | |
150 | case 0: // RC mode via D0 and D1 | |
151 | RCmode(); | |
152 | break; | |
153 | ||
154 | case 1: // Serial mode via D0(RX) and D1(TX) | |
155 | SCmode(); | |
156 | break; | |
157 | ||
158 | case 2: // I2C mode via A4(SDA) and A5(SCL) | |
159 | I2Cmode(); | |
160 | break; | |
161 | } | |
162 | ||
163 | // ------------------------------ Code to drive dual "H" bridges -------------------------------------- | |
164 | ||
165 | if (Charged==1) // Only power motors if battery voltage is good | |
166 | { | |
167 | if ((millis()-leftoverload)>overloadtime) | |
168 | { | |
169 | switch (Leftmode) // if left motor has not overloaded recently | |
170 | { | |
171 | case 2: // left motor forward (2 = forward) | |
172 | analogWrite(LmotorA,0); | |
173 | analogWrite(LmotorB,LeftPWM); | |
174 | break; | |
175 | ||
176 | case 1: // left motor brake (1 = brake) | |
177 | analogWrite(LmotorA,LeftPWM); | |
178 | analogWrite(LmotorB,LeftPWM); | |
179 | break; | |
180 | ||
181 | case 0: // left motor reverse (0 = reverse) | |
182 | analogWrite(LmotorA,LeftPWM); | |
183 | analogWrite(LmotorB,0); | |
184 | break; | |
185 | } | |
186 | } | |
187 | if ((millis()-rightoverload)>overloadtime) | |
188 | { | |
189 | switch (Rightmode) // if right motor has not overloaded recently | |
190 | { | |
191 | case 2: // right motor forward | |
192 | analogWrite(RmotorA,0); | |
193 | analogWrite(RmotorB,RightPWM); | |
194 | break; | |
195 | ||
196 | case 1: // right motor brake | |
197 | analogWrite(RmotorA,RightPWM); | |
198 | analogWrite(RmotorB,RightPWM); | |
199 | break; | |
200 | ||
201 | case 0: // right motor reverse | |
202 | analogWrite(RmotorA,RightPWM); | |
203 | analogWrite(RmotorB,0); | |
204 | break; | |
205 | } | |
206 | } | |
207 | } | |
208 | else // Battery is flat | |
209 | { | |
210 | analogWrite (LmotorA,0); // turn off motors | |
211 | analogWrite (LmotorB,0); // turn off motors | |
212 | analogWrite (RmotorA,0); // turn off motors | |
213 | analogWrite (RmotorB,0); // turn off motors | |
214 | } | |
215 | } | |
216 | } | |
217 | ||
218 | ||
219 | ||
220 | ||
221 | ||
222 | ||
223 | void RCmode() | |
224 | { | |
225 | //---------------------------- Code for RC inputs --------------------------------------------------------- | |
226 | ||
227 | Speed=pulseIn(RCleft,HIGH,25000); // read throttle/left stick | |
228 | Steer=pulseIn(RCright,HIGH,25000); // read steering/right stick | |
229 | ||
230 | ||
231 | if (Speed==0) Speed=1500; // if pulseIn times out (25mS) then set speed to stop | |
232 | if (Steer==0) Steer=1500; // if pulseIn times out (25mS) then set steer to centre | |
233 | ||
234 | if (abs(Speed-1500)<RCdeadband) Speed=1500; // if Speed input is within deadband set to 1500 (1500uS=center | |
235 | // position for most servos) | |
236 | if (abs(Steer-1500)<RCdeadband) Steer=1500; // if Steer input is within deadband set to 1500 | |
237 | //(1500uS=center position for most servos) | |
238 | ||
239 | if (Mix==1) // Mixes speed and steering signals | |
240 | { | |
241 | Steer=Steer-1500; | |
242 | Leftspeed=Speed-Steer; | |
243 | Rightspeed=Speed+Steer; | |
244 | } | |
245 | else // Individual stick control | |
246 | { | |
247 | Leftspeed=Speed; | |
248 | Rightspeed=Steer; | |
249 | } | |
250 | /* | |
251 | Serial.print("Left:"); | |
252 | Serial.print(Leftspeed); | |
253 | Serial.print(" -- Right:"); | |
254 | Serial.println(Rightspeed); | |
255 | */ | |
256 | Leftmode=2; | |
257 | Rightmode=2; | |
258 | if (Leftspeed>(Leftcenter+RCdeadband)) Leftmode=0; // if left input is forward then set left mode to forward | |
259 | if (Rightspeed>(Rightcenter+RCdeadband)) Rightmode=0; // if right input is forward then set right mode to forward | |
260 | ||
261 | LeftPWM=abs(Leftspeed-Leftcenter)*10/scale; // scale 1000-2000uS to 0-255 | |
262 | LeftPWM=min(LeftPWM,255); // set maximum limit 255 | |
263 | ||
264 | RightPWM=abs(Rightspeed-Rightcenter)*10/scale; // scale 1000-2000uS to 0-255 | |
265 | RightPWM=min(RightPWM,255); // set maximum limit 255 | |
266 | } | |
267 | ||
268 | ||
269 | ||
270 | ||
271 | ||
272 | ||
273 | ||
274 | void SCmode() | |
275 | - | {// ------------------------------------------------------------ Code for Serial Communications -------------------------------------- |
275 | + | {// ------------------------------------------------------------ Code for Serial Communications ------------------- |
276 | ||
277 | // FL = flush serial buffer | |
278 | ||
279 | // AN = report Analog inputs 1-5 | |
280 | ||
281 | // SV = next 7 integers will be position information for servos 0-6 | |
282 | ||
283 | // HB = "H" bridge data - next 4 bytes will be: | |
284 | // left motor mode 0-2 | |
285 | // left motor PWM 0-255 | |
286 | // right motor mode 0-2 | |
287 | // right motor PWM 0-255 | |
288 | ||
289 | ||
290 | if (Serial.available()>1) // command available | |
291 | { | |
292 | int A=Serial.read(); | |
293 | int B=Serial.read(); | |
294 | int command=A*256+B; | |
295 | switch (command) | |
296 | { | |
297 | case 17996: // FL | |
298 | Serial.flush(); // flush buffer | |
299 | break; | |
300 | ||
301 | case 16718: // AN - return values of analog inputs 1-5 | |
302 | for (int i=1;i<6;i++) // index analog inputs 1-5 | |
303 | { | |
304 | data=analogRead(i); // read 10bit analog input | |
305 | Serial.write(highByte(data)); // transmit high byte | |
306 | Serial.write(lowByte(data)); // transmit low byte | |
307 | } | |
308 | break; | |
309 | ||
310 | case 21334: // SV - receive postion information for servos 0-6 | |
311 | for (int i=0;i<15;i++) // read 14 bytes of data | |
312 | { | |
313 | Serialread(); | |
314 | servo[i]=data; | |
315 | } | |
316 | Servo0.writeMicroseconds(servo[0]*256+servo[1]); // set servo position | |
317 | Servo1.writeMicroseconds(servo[2]*256+servo[3]); // set servo position | |
318 | Servo2.writeMicroseconds(servo[4]*256+servo[5]); // set servo position | |
319 | Servo3.writeMicroseconds(servo[6]*256+servo[7]); // set servo position | |
320 | Servo4.writeMicroseconds(servo[8]*256+servo[9]); // set servo position | |
321 | Servo5.writeMicroseconds(servo[10]*256+servo[11]); // set servo position | |
322 | Servo6.writeMicroseconds(servo[12]*256+servo[13]); // set servo position | |
323 | break; | |
324 | ||
325 | case 18498: // HB - mode and PWM data for left and right motors | |
326 | Serialread(); | |
327 | Leftmode=data; | |
328 | Serialread(); | |
329 | LeftPWM=data; | |
330 | Serialread(); | |
331 | Rightmode=data; | |
332 | Serialread(); | |
333 | RightPWM=data; | |
334 | break; | |
335 | ||
336 | default: // invalid command | |
337 | Serial.flush(); // flush buffer | |
338 | } | |
339 | } | |
340 | } | |
341 | ||
342 | void Serialread() | |
343 | {//------------------ Read serial port until data has been received ----------------------------------- | |
344 | do | |
345 | { | |
346 | data=Serial.read(); | |
347 | } while (data<0); | |
348 | } | |
349 | ||
350 | ||
351 | ||
352 | ||
353 | ||
354 | ||
355 | ||
356 | void I2Cmode() | |
357 | - | {//----------------------- Your code goes here ------------------------------------------------------ |
357 | + | {//----------------------- Autonomous Code ------------------------------------------------------ |
358 | RightPWM = 128; // sets the speed to half full speed | |
359 | - | void loop(){ |
359 | + | |
360 | Rightmode = 2; // sets the right motor to move forward (at half speed) | |
361 | - | RightPWM = 128; // sets the speed to half full speed |
361 | + | Leftmode = 2; // see code to drive dual H bridges |
362 | ||
363 | unsigned long duration, cm; | |
364 | - | Leftmode = 2; // see code to drive dual H bridges |
364 | + | |
365 | digitalWrite(trigger, LOW); // Ensures a clean trigger pulse | |
366 | delayMicroseconds(5); // 5 us long cleaning | |
367 | digitalWrite(trigger, HIGH); // Turn trigger pin on high (5V) to initiate pulse | |
368 | delayMicroseconds(10); // delay 10 us (minimum time to start pulse) | |
369 | - | delayMicroseconds(5); // .1 ms long cleaning |
369 | + | |
370 | ||
371 | duration = pulseIn(echo, HIGH); // records the length of the echo pulse | |
372 | cm = duration/58; // converts duration into centimeters | |
373 | ||
374 | if (cm < 40){ // is there an obstacle < 100cm away? | |
375 | RightPWM = 128; // set right motor full speed | |
376 | LeftPWM = 2; // set left motor to 0, therefore turning left | |
377 | - | if (cm < 100);{ // is there an obstacle < 100cm away? |
377 | + | |
378 | - | RightPWM = 256; // set right motor full speed |
378 | + | RightPWM = 2; |
379 | - | LeftPWM = 0; // set left motor to 0, therefore turning left |
379 | + | LeftPWM = 128; // turn right (straighten back out) |
380 | delay(3000); | |
381 | - | RightPWM = 0; |
381 | + | |
382 | - | LeftPWM = 256; // turn right (straighten back out) |
382 | + | |
383 | } | |
384 | ||
385 | } |