Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. // Farben:
  2. #define ROT 5
  3. #define GELB 4
  4. #define SCHWARZ 1
  5.  
  6. // Richtungen:
  7. #define LINKS 1
  8. #define RECHTS -1
  9. #define GERADE 0
  10.  
  11. void route(int t180, int farbe);
  12. void fahre_Linie(int t180, int kurve);
  13. void drehe_180(int t180);
  14. void drehe(int richtung);
  15. void fahre_gerade(void);
  16. void kreuz(int richtung);
  17. int callibrate(void);
  18. int farbe_einlesen(void);
  19. bool check_hinderniss(void);
  20.  
  21. task main() {
  22. // Sensoren initialisieren:
  23. SetSensorLight(IN_3);
  24. SetSensorColorFull(IN_1);
  25. SetSensorTouch(IN_4);
  26. SetSensorLowspeed(IN_2);
  27.  
  28. // Variablen:
  29. int farbe = -1;
  30. int t180 = callibrate();
  31.  
  32. // Kernroutine:
  33. while(true) {
  34. int t0 = -1;
  35. farbe = farbe_einlesen();
  36. NumOut(1, 1, farbe);
  37. if (farbe == ROT || farbe == GELB || farbe == SCHWARZ) {
  38. route(t180, farbe);
  39. } else {
  40. // erkannte Farbe nicht Teil der Karte
  41. Wait(100);
  42. }
  43. }
  44. }
  45.  
  46. // Funktion bestimmt, welche Route der Roboter
  47. // auf der Karte nimmt:
  48. void route(int t180, int farbe) {
  49. // zum Kreuz fahren:
  50. fahre_Linie(t180, LINKS);
  51.  
  52. // Kreuz überqueren:
  53. switch(farbe) {
  54. case ROT:
  55. kreuz(LINKS);
  56. break;
  57. case GELB:
  58. kreuz(GERADE);
  59. break;
  60. case SCHWARZ:
  61. kreuz(RECHTS);
  62. break;
  63. }
  64.  
  65. // Zum Abgabeort fahren:
  66. // nach Kurve optimieren:
  67. switch(farbe) {
  68. case ROT:
  69. fahre_Linie(t180, RECHTS);
  70. break;
  71. default:
  72. fahre_Linie(t180, LINKS);
  73. break;
  74. }
  75.  
  76. // Abgabeort erreicht
  77. // umdrehen:
  78. drehe_180(t180);
  79. Wait(1500);
  80.  
  81. // zurückfahren:
  82. // nicht (!) nach Kurve optimiert,
  83. // da Roboter auf der schwarzen Bahn Probleme haben
  84. fahre_Linie(t180, LINKS);
  85.  
  86. // Kreuz überqueren:
  87. switch(farbe) {
  88. case ROT:
  89. kreuz(RECHTS);
  90. break;
  91. case GELB:
  92. kreuz(GERADE);
  93. break;
  94. case SCHWARZ:
  95. kreuz(LINKS);
  96. break;
  97. }
  98.  
  99. // Zum Ausgangspunkt zurückfahren:
  100. fahre_Linie(t180, LINKS);
  101.  
  102. // Startpunt erreicht, umdrehen:
  103. drehe_180(t180);
  104. }
  105.  
  106. // Fahre entlang einer schwarzen Linie,
  107. // bis das Linienende erreicht wird:
  108. void fahre_Linie(int t180, int kurve) {
  109. long t0 = CurrentTick();
  110. long turntime = t180 / 2; // ms
  111. bool bende = 0;
  112. while (bende == 0) {
  113. if (Sensor(IN_3) < 40) {
  114. // auf der Linie:
  115. fahre_gerade();
  116. t0 = CurrentTick();
  117. } else {
  118. // nicht auf der Linie:
  119. if (((CurrentTick() - t0) < turntime)) {
  120. // erst auf der einen Seite nach der Linie schauen
  121. drehe(kurve);
  122. } else if((CurrentTick() - t0) < 3 * turntime) {
  123. // dann auf der anderen Seite
  124. drehe(-kurve);
  125. } else {
  126. // Linie weder links noch rechts
  127. // -> Linienende erreicht
  128. drehe(kurve);
  129. Wait(turntime);
  130. Off(OUT_AB);
  131. bende = 1;
  132. }
  133. }
  134. }
  135. }
  136.  
  137. void drehe_180(int t180) {
  138. int speed = 30;
  139.  
  140. OnFwd(OUT_A, speed);
  141. OnRev(OUT_B, speed);
  142. Wait(t180);
  143. Off(OUT_AB);
  144. }
  145.  
  146. void fahre_gerade(void) {
  147. // fahre, solange kein Hinderniss vor dem Roboter ist
  148. while (check_hinderniss()) {
  149. Off(OUT_AB);
  150. Wait(250);
  151. }
  152. OnFwd(OUT_AB, 60);
  153. Wait(250);
  154. }
  155.  
  156. // Funktion, die misst, wie lange es dauert, den Roboter um 180 zu drehen
  157. // erwartet: Roboter (Sensor) auf der schwarzen Linie
  158. int callibrate(void) {
  159. int time_180 = 0;
  160. int t0 = CurrentTick();
  161.  
  162. // erst ein bisschen drehen, sodass der Sensor nicht mehr
  163. // auf der schwarzen Linie ist
  164. drehe(LINKS);
  165. Wait(500);
  166. do {
  167. // dann drehen, bis die schwarze Linie wieder gefunden wurde
  168. drehe(LINKS);
  169. } while (Sensor(IN_3) > 50);
  170. Off(OUT_AB);
  171. time_180 = CurrentTick() - t0;
  172. return time_180;
  173. }
  174.  
  175. void kreuz(int richtung) {
  176. switch(richtung) {
  177. case LINKS:
  178. while (Sensor(IN_3) > 50) {
  179. OnFwd(OUT_A, 20);
  180. OnFwd(OUT_B, 50);
  181. }
  182. Off(OUT_AB);
  183. break;
  184. case RECHTS:
  185. while (Sensor(IN_3) > 50) {
  186. OnFwd(OUT_A, 50);
  187. OnFwd(OUT_B, 20);
  188. }
  189. Off(OUT_AB);
  190. break;
  191. case GERADE:
  192. OnFwd(OUT_A, 30);
  193. OnFwd(OUT_B, 30);
  194. Wait(2000);
  195. Off(OUT_AB);
  196. break;
  197. }
  198. }
  199.  
  200. void drehe(int richtung) {
  201. int speed = 30;
  202.  
  203. switch(richtung) {
  204. case LINKS:
  205. OnRev(OUT_A, speed);
  206. OnFwd(OUT_B, speed);
  207. break;
  208. case RECHTS:
  209. OnFwd(OUT_A, speed);
  210. OnRev(OUT_B, speed);
  211. break;
  212. }
  213. }
  214.  
  215. int farbe_einlesen(void) {
  216. // wartet bis der Knopf gedrückt wird
  217. while(!Sensor(IN_4)) {
  218. true;
  219. }
  220. return Sensor(IN_1);
  221. }
  222.  
  223. bool check_hinderniss(void) {
  224. // falls Hinderniss 20 cm vor dem Roboter ist:
  225. if (SensorUS(IN_2) < 20)
  226. return true;
  227. return false;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement