Advertisement
KRITSADA

Arduino 4WD Clone

Sep 8th, 2016
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*************************************************
  2.  * Public Constants
  3.  *************************************************/
  4.  
  5. #define NOTE_B0  31
  6. #define NOTE_C1  33
  7. #define NOTE_CS1 35
  8. #define NOTE_D1  37
  9. #define NOTE_DS1 39
  10. #define NOTE_E1  41
  11. #define NOTE_F1  44
  12. #define NOTE_FS1 46
  13. #define NOTE_G1  49
  14. #define NOTE_GS1 52
  15. #define NOTE_A1  55
  16. #define NOTE_AS1 58
  17. #define NOTE_B1  62
  18. #define NOTE_C2  65
  19. #define NOTE_CS2 69
  20. #define NOTE_D2  73
  21. #define NOTE_DS2 78
  22. #define NOTE_E2  82
  23. #define NOTE_F2  87
  24. #define NOTE_FS2 93
  25. #define NOTE_G2  98
  26. #define NOTE_GS2 104
  27. #define NOTE_A2  110
  28. #define NOTE_AS2 117
  29. #define NOTE_B2  123
  30. #define NOTE_C3  131
  31. #define NOTE_CS3 139
  32. #define NOTE_D3  147
  33. #define NOTE_DS3 156
  34. #define NOTE_E3  165
  35. #define NOTE_F3  175
  36. #define NOTE_FS3 185
  37. #define NOTE_G3  196
  38. #define NOTE_GS3 208
  39. #define NOTE_A3  220
  40. #define NOTE_AS3 233
  41. #define NOTE_B3  247
  42. #define NOTE_C4  262
  43. #define NOTE_CS4 277
  44. #define NOTE_D4  294
  45. #define NOTE_DS4 311
  46. #define NOTE_E4  330
  47. #define NOTE_F4  349
  48. #define NOTE_FS4 370
  49. #define NOTE_G4  392
  50. #define NOTE_GS4 415
  51. #define NOTE_A4  440
  52. #define NOTE_AS4 466
  53. #define NOTE_B4  494
  54. #define NOTE_C5  523
  55. #define NOTE_CS5 554
  56. #define NOTE_D5  587
  57. #define NOTE_DS5 622
  58. #define NOTE_E5  659
  59. #define NOTE_F5  698
  60. #define NOTE_FS5 740
  61. #define NOTE_G5  784
  62. #define NOTE_GS5 831
  63. #define NOTE_A5  880
  64. #define NOTE_AS5 932
  65. #define NOTE_B5  988
  66. #define NOTE_C6  1047
  67. #define NOTE_CS6 1109
  68. #define NOTE_D6  1175
  69. #define NOTE_DS6 1245
  70. #define NOTE_E6  1319
  71. #define NOTE_F6  1397
  72. #define NOTE_FS6 1480
  73. #define NOTE_G6  1568
  74. #define NOTE_GS6 1661
  75. #define NOTE_A6  1760
  76. #define NOTE_AS6 1865
  77. #define NOTE_B6  1976
  78. #define NOTE_C7  2093
  79. #define NOTE_CS7 2217
  80. #define NOTE_D7  2349
  81. #define NOTE_DS7 2489
  82. #define NOTE_E7  2637
  83. #define NOTE_F7  2794
  84. #define NOTE_FS7 2960
  85. #define NOTE_G7  3136
  86. #define NOTE_GS7 3322
  87. #define NOTE_A7  3520
  88. #define NOTE_AS7 3729
  89. #define NOTE_B7  3951
  90. #define NOTE_C8  4186
  91. #define NOTE_CS8 4435
  92. #define NOTE_D8  4699
  93. #define NOTE_DS8 4978
  94.  
  95. #include <AFMotor.h> // Enables the Motor library
  96. #include <Servo.h> // Enables the Servo library
  97. //#include "pitches.h"
  98.  
  99. // notes in the melody:
  100. int melody[] = {
  101.   NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
  102. };
  103.  
  104. // note durations: 4 = quarter note, 8 = eighth note, etc.:
  105. int noteDurations[] = {
  106.   4, 8, 8, 4, 4, 4, 4, 4
  107. };
  108. long randNumber;
  109. //Servo PingServo;
  110. AF_DCMotor motor1(1); // Motor 1 is connected to the port 1 on the motor shield
  111. AF_DCMotor motor2(2); // Motor 2 is connected to the port 2 on the motor shield
  112. AF_DCMotor motor3(3); // Motor 3 is connected to the port 1 on the motor shield
  113. AF_DCMotor motor4(4); // Motor 4 is connected to the port 2 on the motor shield
  114. int minSafeDist = 15 ; // Minimum distance for ping sensor to know when to turn
  115. //int pingPin = 30; // Ping sensor is connected to port A0
  116. int trigPin = 30;
  117. int echoPin = 31;
  118. float pingTime;
  119. float targetDistance;
  120. float speedOfSound = 776.5;
  121. int centerDist, leftDist, rightDist, backDist; // Define variables center, left, right and back distance
  122. long duration, inches, cm; // Define variables for Ping sensor
  123.  
  124. int trigPinL = 34;
  125. int echoPinL = 35;
  126. float pingTimeL;
  127. float targetDistanceL;
  128. long inchesL;
  129.  
  130. int beepPin = 36;
  131.  
  132. void beep(unsigned char delayms){
  133.   for (int thisNote = 0; thisNote < 8; thisNote++) {
  134.  
  135.     // to calculate the note duration, take one second
  136.     // divided by the note type.
  137.     //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
  138.     int noteDuration = 1000 / noteDurations[thisNote];
  139.     tone(beepPin, melody[thisNote], noteDuration);
  140.  
  141.     // to distinguish the notes, set a minimum time between them.
  142.     // the note's duration + 30% seems to work well:
  143.     int pauseBetweenNotes = noteDuration * 1.30;
  144.     delay(pauseBetweenNotes);
  145.     // stop the tone playing:
  146.     noTone(beepPin);
  147.   }
  148. }  
  149.  
  150.  
  151. void setup() {
  152. //PingServo.attach(10); // Servo is attached to pin 10 in the motor shield
  153. //PingServo.write(90); // Center the Ping sensor (puts it at 90 degrees)
  154. pinMode(trigPin, OUTPUT);
  155. pinMode(echoPin, INPUT);
  156. pinMode(beepPin, OUTPUT);
  157. motor1.setSpeed(200); // Sets the speed of the first motor (At 0, the motors are turned off. 255 is the fastest setting that you are able to use, I used 215 to not push the motors too hard.)
  158. motor2.setSpeed(200); // Sets the speed of the second motor (At 0, the motors are turned off. 255 is the fastest setting that you are able to use, I used 215 to not push the motors too hard.)
  159. motor3.setSpeed(200); // Sets the speed of the first motor (At 0, the motors are turned off. 255 is the fastest setting that you are able to use, I used 215 to not push the motors too hard.)
  160. motor4.setSpeed(200);
  161. Serial.begin(9600); // Enables Serial monitor for debugging purposes
  162. Serial.println("Serial test!"); // Test the Serial communication
  163.  
  164. }
  165.  
  166. void AllStop() {
  167. motor1.run(RELEASE); // Turns off motor 1
  168. motor2.run(RELEASE); // Turns off motor 2
  169. motor3.run(RELEASE); // Turns off motor 3
  170. motor4.run(RELEASE);
  171. }
  172. void AllForward() { // Makes the robot go forward
  173. motor1.run(FORWARD); // Motor 1 goes forward
  174. motor2.run(FORWARD); // Motor 2 goes forward
  175. //delay(100);
  176. //if(inches >= minSafeDist && inchesL >= minSafeDist){
  177.   motor3.run(FORWARD); // Motor 3 goes forward
  178.   motor4.run(FORWARD); // Motor 4 goes forward
  179. //}
  180. Serial.println("Going forward"); // Prints a line in the serial monitor
  181. }
  182. void turnRight() { // Makes the robot go right
  183. motor2.run(BACKWARD); // Turns off motor 2
  184. motor1.run(FORWARD); // Motor 1 goes forward
  185. delay(1600); // Time required to turn right (1.6 seconds)
  186. Serial.println("Motors going Right"); // Prints a line in the serial monitor
  187. }
  188. void GoBack(){ // Makes the robot go back
  189. motor2.run(BACKWARD); // Motor 2 goes back
  190. motor1.run(BACKWARD); // Motor 1 goes back
  191. delay(1600); // Time Required to go back (1.6 seconds)
  192. Serial.println("Backward"); // Prints a line in the serial monitor
  193. }
  194. void turnLeft() { // Makes the robot go Left
  195. motor2.run(FORWARD); // Motor 2 goes forward
  196. motor1.run(BACKWARD); // turns off motor 1
  197. delay(1600); //Time Required to turn left (1.6)Seconds
  198. Serial.println("Motors going Left");// Prints a line in the serial monitor
  199. }
  200.  
  201. // Starts the loop to decide what to do
  202. void loop()
  203. {
  204. LookAhead();
  205. Serial.print(inches);
  206. Serial.println(" inches"); // Prints a line in the serial monitor
  207. Serial.println(inches);
  208. if(inches >= minSafeDist || inchesL >= minSafeDist) /* If the inches in front of an object is greater than or equal to the minimum safe distance (11 inches), react*/
  209. {
  210. AllForward(); // All wheels forward
  211. //delay(110); // Wait 0.11 seconds
  212. }else if (inches < minSafeDist) // If not:
  213. {
  214.   Serial.print("Turn right");
  215.   beep(200);
  216.   AllStop();
  217.   //randNumber = random(10, 20);
  218.   //if(randNumber < 10.) {
  219.   //  turnLeft();
  220.   //  }
  221.   //else {
  222.     turnRight();
  223.   //}
  224.   //turnLeft();
  225. } /*else if (inchesL < minSafeDist) {
  226.   Serial.print("Turn right");
  227.   AllStop();
  228.   turnRight();
  229. }*/
  230. /*{
  231. AllStop(); // Stop all motors
  232. LookAround(); // Check your surroundings for best route
  233. if(rightDist > leftDist) // If the right distance is greater than the left distance , turn right
  234. {
  235. turnRight();
  236. }else if (leftDist > rightDist) // If the left distance is greater than the right distance , turn left
  237. {
  238. turnLeft();
  239. }else if (leftDist&&rightDist<minSafeDist) // If the left and right distance is smaller than the min safe distance (11 inch) go back
  240. {
  241. GoBack();
  242. }
  243. }*/
  244. }
  245.  
  246. unsigned long ping() {
  247.   digitalWrite(trigPin, LOW);
  248.   delayMicroseconds(2000);
  249.   digitalWrite(trigPin, HIGH);
  250.   delayMicroseconds(15);
  251.   digitalWrite(trigPin, LOW);
  252.   pingTime = pulseIn(echoPin, HIGH);
  253.   pingTime = pingTime/1000000.;
  254.   pingTime = pingTime/3600.;
  255.   targetDistance = speedOfSound * pingTime;
  256.   targetDistance = targetDistance/2;
  257.   inches = targetDistance*63360; //Convert target distance to inches from mile;
  258.   Serial.print("targetDistance");
  259. }
  260.  
  261. unsigned long pingL() {
  262.   digitalWrite(trigPinL, LOW);
  263.   delayMicroseconds(2000);
  264.   digitalWrite(trigPinL, HIGH);
  265.   delayMicroseconds(15);
  266.   digitalWrite(trigPinL, LOW);
  267.   pingTimeL = pulseIn(echoPinL, HIGH);
  268.   pingTimeL = pingTimeL/1000000.;
  269.   pingTimeL = pingTimeL/3600.;
  270.   targetDistanceL = speedOfSound * pingTimeL;
  271.   targetDistanceL = targetDistanceL/2;
  272.   inchesL = targetDistanceL*63360; //Convert target distance to inches from mile;
  273.   Serial.print("targetDistanceL");
  274.   Serial.print(inchesL);
  275. }
  276.  
  277. long microsecondsToInches(long microseconds) // converts time to a distance
  278. {
  279. return microseconds / 74 / 2;
  280. }
  281. long microsecondsToCentimeters(long microseconds) // converts time to a distance
  282. {
  283. return microseconds / 29 / 2;
  284. }
  285.  
  286. void LookAhead() {
  287. //PingServo.write(90);// angle to look forward
  288. delay(175); // wait 0.175 seconds
  289. ping();
  290. //if(inches < minSafeDist) {AllStop();}
  291. //pingL();
  292. //if(inchesL < minSafeDist) {AllStop();}
  293. }
  294.  
  295. void LookAround(){
  296. //PingServo.write(180); // 180° angle
  297. //delay(320); // wait 0.32 seconds
  298. ping();
  299. pingL();
  300. //rightDist = inches; //get the right distance
  301. //PingServo.write(0); // look to the other side
  302. //delay(620); // wait 0.62 seconds
  303. //ping();
  304. //leftDist = inches; // get the left distance
  305. //PingServo.write(90); // 90° angle
  306. //delay(275); // wait 0.275 seconds
  307.  
  308. // Prints a line in the serial monitor
  309. //Serial.print("RightDist: ");
  310. //Serial.println(rightDist);
  311. //Serial.print("LeftDist: ");
  312. //Serial.println(leftDist);
  313. //Serial.print("CenterDist: ");
  314. //Serial.println(centerDist);
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement