Advertisement
RenabaReD

Untitled

Dec 5th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. #define INTERVAL 33
  2. #define P_TURN 300 // en pour mille
  3.  
  4. #define PINDIR1 4
  5. #define PINPWM1 5
  6. #define PINDIR2 2
  7. #define PINPWM2 3
  8. #define PINTRIG 12
  9. #define PINECHO 11
  10.  
  11.  
  12.  
  13. /* Constantes pour le timeout */
  14. const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
  15.  
  16. typedef struct {
  17. bool far_l, far_r, close_l, close_r;
  18. } IR_Capture;
  19.  
  20. typedef enum { INIT, RUN, LEFT, RIGHT, PAUSE, STOP } State ;
  21. bool line_l, line_r; // ligne sur la gauche/droite (capteur infrarouge)
  22. bool obstacle_f; // obstacle devant (capteur ultrason)
  23. bool turn, turn_l; // y a une proba de tourner au cours de la course (marche aléatoire), et une proba pour savoir si on tourne à gauche ou droite
  24. bool setting_up, fatal_error, success, start;
  25. int speedL=0;
  26. int speedR=0;
  27. bool dirL = true;
  28. bool dirR = true;
  29. double prop =1.100;
  30. bool led=false;
  31. int vit=128;
  32. float rand_turn_duration = 200;
  33. int compteur_tour = 0;
  34. const int distance_lim = 1500;
  35.  
  36. State state;
  37.  
  38. void setup() {
  39. // port série
  40. Serial.begin(115200);
  41. //on initialise les pins du moteur 1
  42. pinMode(PINDIR1, OUTPUT);
  43. pinMode(PINPWM1, OUTPUT);
  44. pinMode(PINDIR2, OUTPUT);
  45. pinMode(PINPWM2, OUTPUT);
  46.  
  47. digitalWrite(PINDIR1,LOW);
  48. digitalWrite(PINDIR2,LOW);
  49.  
  50. pinMode(PINTRIG, OUTPUT);
  51. digitalWrite(PINTRIG, LOW); // La broche TRIGGER doit être à LOW au repos
  52. pinMode(PINECHO, INPUT);
  53.  
  54. pinMode(LED_BUILTIN, OUTPUT);
  55. digitalWrite(LED_BUILTIN, LOW);
  56.  
  57. state=INIT;
  58. }
  59.  
  60. IR_Capture detect_IR()
  61. {
  62. // capteurs infrarouges
  63. IR_Capture cap;
  64.  
  65. return cap;
  66. }
  67.  
  68. void detect_US()
  69. {
  70. // capteurs ultrasons
  71. digitalWrite(PINTRIG, HIGH);
  72. delayMicroseconds(10);
  73. digitalWrite(PINTRIG, LOW);
  74. long measure = pulseIn(PINECHO, HIGH, MEASURE_TIMEOUT);
  75. //Serial.println(measure);
  76. obstacle_f = (measure!=0 && measure<distance_lim);
  77. }
  78.  
  79. void refresh()
  80. {
  81. // met à jour les globals (conditions)
  82. detect_IR();
  83. detect_US();
  84. if (turn) {
  85. if(compteur_tour<int(rand_turn_duration/INTERVAL)) compteur_tour++;
  86. else {
  87. turn=false;
  88. compteur_tour=0;
  89. }
  90. Serial.println(compteur_tour);
  91. }
  92. else {
  93. turn = (random(1000)<P_TURN);
  94. turn_l = (random(2)==1); }
  95. }
  96.  
  97. void transition()
  98. {
  99. if (fatal_error || success)
  100. {
  101. state = STOP;
  102. return;
  103. }
  104. switch (state)
  105. {
  106. case INIT:
  107. if (setting_up) {
  108. state = INIT;
  109. }
  110. else {
  111. if (!obstacle_f && !line_l && !line_r && !turn) {
  112. state = RUN;
  113. }
  114. else if (turn && turn_l) {
  115. state = LEFT;
  116. }
  117. else if (turn && !turn_l) {
  118. state = RIGHT;
  119. } else
  120. {
  121. state = PAUSE;
  122. }
  123. }
  124. break;
  125. case RUN:
  126. if (!line_l && !line_r && !turn && !obstacle_f) {
  127. state = RUN;
  128. }
  129. else if (line_r || (!line_l && !line_r && turn && turn_l) && !obstacle_f) {
  130. state = LEFT;
  131. }
  132. else if (line_l || (!line_l && !line_r && turn && !turn_l) && !obstacle_f) {
  133. state = RIGHT;
  134. }
  135. else if (obstacle_f) {
  136. state = PAUSE;
  137. }
  138. else {
  139. state = STOP;
  140. }
  141. break;
  142. case LEFT:
  143. if (!line_l && !line_r && !obstacle_f) {
  144. state = RUN;
  145. }
  146. else if (line_l || line_r && !obstacle_f) {
  147. state = LEFT;
  148. }
  149. else if (obstacle_f) {
  150. state = PAUSE;
  151. }
  152. else {
  153. state = STOP;
  154. }
  155. break;
  156. case RIGHT:
  157. if (!line_l && !line_r && !obstacle_f) {
  158. state = RUN;
  159. }
  160. else if (line_l || line_r && !obstacle_f) {
  161. state = RIGHT;
  162. }
  163. else if (obstacle_f) {
  164. state = PAUSE;
  165. }
  166. else {
  167. state = STOP;
  168. }
  169. break;
  170. case PAUSE:
  171. if (!line_l && !line_r && !obstacle_f) {
  172. state = RUN;
  173. }
  174. else if (line_r && !obstacle_f) {
  175. state = LEFT;
  176. }
  177. else if (line_l && !obstacle_f) {
  178. state = RIGHT;
  179. }
  180. else if (obstacle_f) {
  181. state = PAUSE;
  182. }
  183. break;
  184. case STOP:
  185. if (start) {
  186. state = INIT;
  187. }
  188. else {
  189. state = STOP;
  190. }
  191. break;
  192. default:
  193. state = STOP;
  194. break;
  195. }
  196.  
  197. }
  198.  
  199. void loop() {
  200. // put your main code here, to run repeatedly:
  201. unsigned long t0=millis();
  202. refresh();
  203. transition();
  204. //vit=(vit+7)%255;
  205. //speedL=250;
  206.  
  207. switch (state)
  208. {
  209. case INIT:
  210. Serial.println(F("INIT"));
  211. state=RUN;
  212. break;
  213. case RUN:
  214. Serial.println(F("RUN"));
  215. led=false;
  216. dirL=true;
  217. dirR=true;
  218. speedL=vit;
  219. speedR=vit;
  220. break;
  221. case LEFT:
  222. Serial.println(F("LEFT"));
  223. led=false;
  224. dirL=false;
  225. dirR=true;
  226. speedL=vit;
  227. speedR=vit;
  228. break;
  229. case RIGHT:
  230. Serial.println(F("RIGHT"));
  231. led=false;
  232. dirL=true;
  233. dirR=false;
  234. speedL=vit;
  235. speedR=vit;
  236. break;
  237. case PAUSE:
  238. Serial.println(F("PAUSE"));
  239. led=true;
  240. speedL=0;
  241. speedR=0;
  242. break;
  243. case STOP:
  244. Serial.println(F("STOP"));
  245. led=false;
  246. speedL=0;
  247. speedR=0;
  248. break;
  249. default:
  250. break;
  251. }
  252.  
  253. digitalWrite(PINDIR1, (dirL) ? LOW : HIGH);
  254. digitalWrite(PINDIR1, (dirR) ? LOW : HIGH);
  255. analogWrite(PINPWM1,digitalRead(!PINDIR1 )?(int)(prop*speedL):(int)prop*(255-speedL));
  256. analogWrite(PINPWM2,digitalRead(!PINDIR2 )?speedR:255-speedR);
  257. digitalWrite(LED_BUILTIN, (led)?HIGH:LOW);
  258.  
  259. unsigned long elapsed=millis()-t0;
  260. if (elapsed>INTERVAL) printf("Excessive execution time\n");
  261. else delay(INTERVAL-elapsed);
  262.  
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement