Advertisement
Guest User

Untitled

a guest
Jun 4th, 2020
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.59 KB | None | 0 0
  1. //#include <ArduinoLowPower.h>
  2. //#include <avr/power.h>
  3. #include <avr/sleep.h>
  4.  
  5.  
  6. volatile bool startStopState = true;
  7. volatile byte chaseHideState = HIGH; //HIGH for CHASING mode, LOW - HIDING mode
  8.  
  9. const byte motorDriverEnablePin = 7;
  10. const byte startStopButtonPin = 2;
  11. const byte chaseHideButtonPin = 3;
  12. const byte rightLdrPin = A2;
  13. const byte leftLdrPin = A3;
  14. const byte rightMotorPin[] = {5, 4};
  15. const byte leftMotorPin[] = {15, 14}; //A1, A0
  16. int trigPin = 11; // trig pin of HC-SR04
  17. int echoPin = 10; // Echo pin of HC-SR04
  18.  
  19. int distance,duration;
  20.  
  21.  
  22. void setup()
  23. {
  24. pinMode(motorDriverEnablePin, OUTPUT);
  25. pinMode(LED_BUILTIN, OUTPUT);
  26. pinMode(startStopButtonPin, INPUT_PULLUP);
  27. pinMode(chaseHideButtonPin, INPUT_PULLUP);
  28. pinMode(rightLdrPin, INPUT);
  29. pinMode(leftLdrPin, INPUT);
  30. pinMode(rightMotorPin[0], OUTPUT);
  31. pinMode(rightMotorPin[1], OUTPUT);
  32. pinMode(leftMotorPin[0], OUTPUT);
  33. pinMode(leftMotorPin[1], OUTPUT);
  34. pinMode(trigPin, OUTPUT); // set trig pin as output
  35. pinMode(echoPin, INPUT); //set echo pin as input to capture reflected waves
  36.  
  37. attachInterrupt(digitalPinToInterrupt(startStopButtonPin), startStopButtonPressed, FALLING);
  38. attachInterrupt(digitalPinToInterrupt(chaseHideButtonPin), chaseHideButtonRelesed, RISING);
  39.  
  40. digitalWrite(rightLdrPin, HIGH); //A2 -> activate internal resistor
  41. digitalWrite(leftLdrPin, HIGH); //A3 -> activate internal resistor
  42.  
  43. Serial.begin(115200);
  44. }
  45.  
  46. void loop()
  47. {
  48. if(startStopState) //Start
  49. {
  50. signed rightLdrVal = 1023 - analogRead(rightLdrPin);
  51. signed leftLdrVal = 1023 - analogRead(leftLdrPin);
  52. signed ldrDiffVal = abs(leftLdrVal - rightLdrVal);
  53.  
  54. digitalWrite(trigPin, HIGH);
  55. delay(1);
  56. digitalWrite(trigPin, LOW);
  57. // Measure the pulse input in echo pin
  58. digitalWrite(trigPin, LOW);
  59. duration = pulseIn(echoPin, HIGH);
  60. // Distance is half the duration divided by 29.1 (from datasheet)
  61. distance = (duration/2) / 29.1;
  62. Serial.print("Distance: ");
  63. Serial.print(distance);
  64.  
  65.  
  66.  
  67. Serial.print("\tLeft LDR: ");
  68. Serial.print(leftLdrVal);
  69. Serial.print("\tRight LDR: ");
  70. Serial.print(rightLdrVal);
  71. Serial.print("\tLDR Diff: ");
  72. Serial.print(ldrDiffVal);
  73. Serial.print("\tMode: ");
  74.  
  75. digitalWrite(motorDriverEnablePin, HIGH);
  76.  
  77. if(chaseHideState) //CHASING mode
  78. {
  79. Serial.print("CHASE");
  80. Serial.print("\tAction: ");
  81.  
  82.  
  83. if(ldrDiffVal <= 10 && leftLdrVal > 800 && rightLdrVal > 800)
  84. driveForward();
  85. else if(leftLdrVal > rightLdrVal && ldrDiffVal > 10 && leftLdrVal > 800 && rightLdrVal > 800)
  86. turnLeft();
  87. else if(rightLdrVal > leftLdrVal && ldrDiffVal > 10 && leftLdrVal > 800 && rightLdrVal > 800)
  88. turnRight();
  89. else
  90. stop();
  91. }
  92. else //HIDING mode
  93. {
  94. Serial.print("HIDE");
  95. Serial.print("\tAction: ");
  96.  
  97. if(ldrDiffVal <= 10 && leftLdrVal > 800 && rightLdrVal > 800)
  98. driveBackward();
  99. else if(leftLdrVal > rightLdrVal && ldrDiffVal > 10 && leftLdrVal > 800 && rightLdrVal > 800)
  100. turnRightBackward();
  101. else if(rightLdrVal > leftLdrVal && ldrDiffVal > 10 && leftLdrVal > 800 && rightLdrVal > 800)
  102. turnLeftBackward();
  103. else
  104. stop();
  105. }
  106. }
  107. else //Stop
  108. {
  109. digitalWrite(motorDriverEnablePin, LOW);
  110. Serial.println("Sleeping...");
  111. //Sleep...
  112. goToSleep();
  113. }
  114. }
  115.  
  116. void goToSleep()
  117. {
  118. byte adcsra = ADCSRA; //save the ADC Control and Status Register A
  119. ADCSRA = 0; //disable the ADC
  120. /*
  121. EICRA = _BV(ISC01); //configure INT0 to trigger on falling edge
  122. EIMSK = _BV(INT0); //enable INT0
  123. set_sleep_mode(SLEEP_MODE_IDLE); //-> The least power savings
  124. set_sleep_mode(SLEEP_MODE_ADC);
  125. set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  126. set_sleep_mode(SLEEP_MODE_STANDBY);
  127. set_sleep_mode(SLEEP_MODE_PWR_DOWN); //-> The most power savings
  128. */
  129. set_sleep_mode(SLEEP_MODE_IDLE);
  130. cli(); //stop interrupts to ensure the BOD timed sequence executes as required
  131. sleep_enable();
  132. //disable brown-out detection while sleeping (20-25ยตA)
  133. /*
  134. uint8_t mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);
  135. uint8_t mcucr2 = mcucr1 & ~_BV(BODSE);
  136. MCUCR = mcucr1;
  137. MCUCR = mcucr2;
  138. */
  139. sleep_bod_disable(); //for AVR-GCC 4.3.3 and later, this is equivalent to the previous 4 lines of code
  140. sei(); //ensure interrupts enabled so we can wake up again
  141. sleep_cpu(); //go to sleep
  142. sleep_disable(); //wake up here
  143. ADCSRA = adcsra; //restore ADCSRA
  144. }
  145.  
  146.  
  147. //ISR#0
  148. void startStopButtonPressed()
  149. {
  150. startStopState = !startStopState;
  151. }
  152. //ISR#1
  153. void chaseHideButtonRelesed()
  154. {
  155. chaseHideState = !chaseHideState;
  156. }
  157.  
  158. void stop()
  159. {
  160. digitalWrite(rightMotorPin[0], LOW);
  161. digitalWrite(rightMotorPin[1], LOW);
  162. digitalWrite(leftMotorPin[0], LOW);
  163. digitalWrite(leftMotorPin[1], LOW);
  164. Serial.println("Stop");
  165. }
  166.  
  167. void driveForward()
  168. {
  169. digitalWrite(rightMotorPin[0], HIGH); //D5 -> INPUT#3
  170. digitalWrite(rightMotorPin[1], LOW); //D4 -> INPUT#4
  171. digitalWrite(leftMotorPin[0], LOW); //D15(A1) -> INPUT#1
  172. digitalWrite(leftMotorPin[1], HIGH); //D14(A0) -> INPUT#2
  173. Serial.println("Forward");
  174. }
  175.  
  176. void driveBackward()
  177. {
  178. digitalWrite(rightMotorPin[0], LOW); //D5 -> INPUT#3
  179. digitalWrite(rightMotorPin[1], HIGH); //D4 -> INPUT#4
  180. digitalWrite(leftMotorPin[0], HIGH); //D15(A1) -> INPUT#1
  181. digitalWrite(leftMotorPin[1], LOW); //D14(A0) -> INPUT#2
  182. Serial.println("Backward");
  183. }
  184.  
  185. void turnRight()
  186. {
  187. digitalWrite(rightMotorPin[0], LOW); //D5 -> INPUT#3
  188. digitalWrite(rightMotorPin[1], LOW); //D4 -> INPUT#4
  189. digitalWrite(leftMotorPin[0], LOW); //D15(A1) -> INPUT#1
  190. digitalWrite(leftMotorPin[1], HIGH); //D14(A0) -> INPUT#2
  191. Serial.println("Right");
  192. }
  193.  
  194. void turnRightBackward()
  195. {
  196. digitalWrite(rightMotorPin[0], LOW); //D5 -> INPUT#3
  197. digitalWrite(rightMotorPin[1], LOW); //D4 -> INPUT#4
  198. digitalWrite(leftMotorPin[0], HIGH); //D15(A1) -> INPUT#1
  199. digitalWrite(leftMotorPin[1], LOW); //D14(A0) -> INPUT#2
  200. Serial.println("Right Backward");
  201. }
  202.  
  203. void turnLeft()
  204. {
  205. //analogWrite(rightMotorPin[0], 1); //D5 -> INPUT#3 //turnLeft -> min speed
  206. digitalWrite(rightMotorPin[0], HIGH); //D5 -> INPUT#3
  207. digitalWrite(rightMotorPin[1], LOW); //D4 -> INPUT#4
  208. digitalWrite(leftMotorPin[0], LOW); //D15(A1) -> INPUT#1
  209. digitalWrite(leftMotorPin[1], LOW); //D14(A0) -> INPUT#2
  210. Serial.println("Left");
  211. }
  212.  
  213. void turnLeftBackward()
  214. {
  215. digitalWrite(rightMotorPin[0], LOW); //D5 -> INPUT#3
  216. digitalWrite(rightMotorPin[1], HIGH); //D4 -> INPUT#4
  217. digitalWrite(leftMotorPin[0], LOW); //D15(A1) -> INPUT#1
  218. digitalWrite(leftMotorPin[1], LOW); //D14(A0) -> INPUT#2
  219. Serial.println("Left Backward");
  220. }
  221.  
  222. void turnCounterclockwise()
  223. {
  224. digitalWrite(rightMotorPin[0], HIGH); //D5 -> INPUT#3
  225. digitalWrite(rightMotorPin[1], LOW); //D4 -> INPUT#4
  226. digitalWrite(leftMotorPin[0], HIGH); //D15(A1) -> INPUT#1
  227. digitalWrite(leftMotorPin[1], LOW); //D14(A0) -> INPUT#2
  228. Serial.println("Counterclockwise");
  229. }
  230.  
  231. void turnClockwise()
  232. {
  233. digitalWrite(rightMotorPin[0], LOW); //D5 -> INPUT#3
  234. digitalWrite(rightMotorPin[1], HIGH); //D4 -> INPUT#4
  235. digitalWrite(leftMotorPin[0], LOW); //D15(A1) -> INPUT#1
  236. digitalWrite(leftMotorPin[1], HIGH); //D14(A0) -> INPUT#2
  237. Serial.println("Clockwise");
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement