Advertisement
RenabaReD

Untitled

Dec 5th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.80 KB | None | 0 0
  1. #define INTERVAL 33
  2. #define P_TURN 100 // 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. typedef enum { L, R } Direction;
  22. bool line_l, line_r; // ligne sur la gauche/droite (capteur infrarouge)
  23. bool obstacle_f; // obstacle devant (capteur ultrason)
  24. 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
  25. bool setting_up, fatal_error, success, start;
  26. int speedL=0;
  27. int speedR=0;
  28. bool dirL = true;
  29. bool dirR = true;
  30. double prop =1.100;
  31. bool led=false;
  32. int vit=128;
  33. float rand_turn_duration = 0.3;
  34. int compteur_tour = 0;
  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<2000);
  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. }
  91. else {
  92. turn = (random(1000)<P_TURN);
  93. turn_l = (random(2)==0); }
  94. }
  95.  
  96. void transition()
  97. {
  98. if (fatal_error || success)
  99. {
  100. state = STOP;
  101. return;
  102. }
  103. switch (state)
  104. {
  105. case INIT:
  106. if (setting_up)
  107. {
  108. state = INIT;
  109. }
  110. else
  111. {
  112. if (!obstacle_f && !line_l && !line_r && !turn)
  113. {
  114. state = RUN;
  115. }
  116. else if (turn && turn_l)
  117. {
  118. state = LEFT;
  119. }
  120. else if (turn && !turn_l)
  121. {
  122. state = RIGHT;
  123. }
  124. else
  125. {
  126. state = PAUSE;
  127. }
  128. }
  129. break;
  130. case RUN:
  131. if (!line_l && !line_r && !turn && !obstacle_f)
  132. {
  133. state = RUN;
  134. }
  135. else if (line_r || (!line_l && !line_r && turn && turn_l) && !obstacle_f)
  136. {
  137. state = LEFT;
  138. }
  139. else if (line_l || (!line_l && !line_r && turn && !turn_l) && !obstacle_f)
  140. {
  141. state = RIGHT;
  142. }
  143. else if (obstacle_f)
  144. {
  145. state = PAUSE;
  146. }
  147. else
  148. {
  149. state = STOP;
  150. }
  151. break;
  152. case LEFT:
  153. if (!line_l && !line_r && !obstacle_f)
  154. {
  155. state = RUN;
  156. }
  157. else if (line_l || line_r && !obstacle_f)
  158. {
  159. state = LEFT;
  160. }
  161. else if (obstacle_f)
  162. {
  163. state = PAUSE;
  164. }
  165. else
  166. {
  167. state = STOP;
  168. }
  169. break;
  170. case RIGHT:
  171. if (!line_l && !line_r && !obstacle_f)
  172. {
  173. state = RUN;
  174. }
  175. else if (line_l || line_r && !obstacle_f)
  176. {
  177. state = RIGHT;
  178. }
  179. else if (obstacle_f)
  180. {
  181. state = PAUSE;
  182. }
  183. else
  184. {
  185. state = STOP;
  186. }
  187. break;
  188. case PAUSE:
  189. if (!line_l && !line_r && !obstacle_f)
  190. {
  191. state = RUN;
  192. }
  193. else if (line_r && !obstacle_f)
  194. {
  195. state = LEFT;
  196. }
  197. else if (line_l && !obstacle_f)
  198. {
  199. state = RIGHT;
  200. }
  201. else if (obstacle_f)
  202. {
  203. state = PAUSE;
  204. }
  205. break;
  206. case STOP:
  207. if (start)
  208. {
  209. state = INIT;
  210. }
  211. else
  212. {
  213. state = STOP;
  214. }
  215. break;
  216. default:
  217. state = STOP;
  218. break;
  219. }
  220.  
  221. }
  222.  
  223. void loop() {
  224. // put your main code here, to run repeatedly:
  225. unsigned long t0=millis();
  226. refresh();
  227. transition();
  228. //vit=(vit+7)%255;
  229. //speedL=250;
  230.  
  231. switch (state)
  232. {
  233. case INIT:
  234. Serial.println(F("INIT"));
  235. state=RUN;
  236. break;
  237. case RUN:
  238. Serial.println(F("RUN"));
  239. led=true;
  240. dirL=true;
  241. dirR=true;
  242. speedL=vit;
  243. speedR=vit;
  244. break;
  245. case LEFT:
  246. Serial.println(F("LEFT"));
  247. led=true;
  248. dirL=false;
  249. dirR=true;
  250. speedL=vit;
  251. speedR=vit;
  252. break;
  253. case RIGHT:
  254. Serial.println(F("RIGHT"));
  255. led=true;
  256. dirL=true;
  257. dirR=false;
  258. speedL=vit;
  259. speedR=vit;
  260. break;
  261. case PAUSE:
  262. Serial.println(F("PAUSE"));
  263. led=false;
  264. speedL=0;
  265. speedR=0;
  266. break;
  267. case STOP:
  268. Serial.println(F("STOP"));
  269. led=false;
  270. speedL=0;
  271. speedR=0;
  272. break;
  273. default:
  274. break;
  275. }
  276.  
  277. digitalWrite(PINDIR1, (dirL) ? HIGH : LOW);
  278. digitalWrite(PINDIR1, (dirR) ? HIGH : LOW);
  279. analogWrite(PINPWM1,digitalRead(!PINDIR1 )?(int)(prop*speedL):(int)prop*(255-prop*speedL));
  280. analogWrite(PINPWM2,digitalRead(!PINDIR2 )?speedR:255-speedR);
  281. digitalWrite(LED_BUILTIN, (led)?HIGH:LOW);
  282.  
  283. unsigned long elapsed=millis()-t0;
  284. if (elapsed>INTERVAL) printf("Excessive execution time\n");
  285. else delay(INTERVAL-elapsed);
  286.  
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement