Guest User

Robot Car v1.0

a guest
May 2nd, 2013
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.98 KB | None | 0 0
  1. /*
  2. Robot Car by Luís Bulek
  3. Versão: 1.0
  4. Revisão: 14.04.2012
  5.  
  6. Controlar um Carro Robo por intermédio de um controle remoto infravermelho,
  7. com dois motores de trações separadas, usando como etapa de potência duas Pontes H,
  8. para controle independente dos motores. O carro contém dois LEDs com tripla função,
  9. servem como faróis, seta indicando a mudança de direção e indicador de marcha a ré.
  10.  
  11. Comandos básicos: avançar, retroceder, esquerda, direita, ligar/desligar os faróis
  12.  
  13. Ligação do ARDUINO a Etapa de Potência:
  14. +========================================================+
  15. |Etapa de Potência | ARDUINO UNO |LABEL |
  16. +================================================|=======+
  17. |1 - GND | GND | |
  18. |2 - M1 Avançar | 5 | M1_A |
  19. |3 - M1 Retroceder | 6 | M1_R |
  20. |4 - M2 Avançar | 9 | M2_A |
  21. |5 - M2 Retroceder | 10 | M2_R |
  22. |6 - NC | - | |
  23. |7 - LED Esquerdo (Farol/Pisca) | 2 | LED_E |
  24. |8 - LED Direito (Farol/Pisca) | 4 | LED_D |
  25. |- SPEAKER | 7 | SPEAKER |
  26. |- IRPIN | 11 | IRPIN |
  27. +========================================================+
  28. A escolha das saídas PWM (5,6,9,10), se dá em função de já pensar
  29. em controlar a velocidade dos motores por PWM
  30.  
  31. Obs.: Futuramente colocarei sensores de obstáculos (IR ou Ultrasom), para evitar que o carro
  32. colida com os mesmos, mesmo que o operador comande o carro para frente ou para trás.
  33.  
  34.  
  35. */
  36. #include <NECIRrcv.h>
  37.  
  38. #define IRPIN 11 // Porta do detector de IR
  39. // Controlar a direção do carro
  40. #define AVANCAR 0xE9166B86 // CH+
  41. #define RETROCEDER 0xEB146B86 // CH-
  42. #define ESQUERDA 0xE8176B86 // VOL-
  43. #define DIREITA 0xE01F6B86 // VOL+
  44. #define PARAR 0xE31C6B86 // ZOOM
  45. #define FAROIS 0xFF006B86 // SOURCE
  46.  
  47. // não sei que função dar a estas teclas
  48. #define POWER 0xE11E6B86 // POWER
  49. #define ALARME 0xEC136B86 // LOOP
  50.  
  51. // Aumenta/Diminui a velocidade dos dois motores
  52. #define VEL_MAIS 0xEF106B86 // +100
  53. #define VEL_MENOS 0xE7186B86 // MUTE
  54.  
  55. // Saídas que estão conectados os motores
  56. #define M1_A 6 // Motor 1 avançar
  57. #define M1_R 5 // Motor 1 retroceder
  58. #define M2_A 10 // Motor 2 avançar
  59. #define M2_R 9 // Motor 2 retroceder
  60.  
  61. // Saídas que estão conectados os LEDs
  62. #define LED_E 2 // Farol Esquerdo
  63. #define LED_D 4 // Fatrol Direito
  64. // Piezo alarme
  65. #define SPEAKER 7
  66.  
  67. // alternar o estado dos leds (farois), conforme o apertar dos botões do controle
  68. // Ligar / Desligar os leds
  69. boolean LED_E_STATE = LOW;
  70. boolean LED_D_STATE = LOW;
  71. boolean RE = false;
  72.  
  73. unsigned long UltMov;
  74. byte Vel = 120; // inicializa a velocidade dos motores em 50%
  75.  
  76. NECIRrcv ir(IRPIN) ; // classe utilizada pela library IR
  77.  
  78. void setup() {
  79. Serial.begin(9600) ; // usada para debug
  80. Serial.println("Robot Car - Carro guiado por Controle Remoto") ;
  81. ir.begin() ; // inicializar IR
  82.  
  83. // definir pinos dos motores como saída
  84. pinMode(M1_A, OUTPUT);
  85. pinMode(M1_R, OUTPUT);
  86. pinMode(M2_A, OUTPUT);
  87. pinMode(M2_R, OUTPUT);
  88. // definir pinos dos leds como saida
  89. pinMode(LED_E, OUTPUT);
  90. pinMode(LED_D, OUTPUT);
  91.  
  92. pinMode(SPEAKER, OUTPUT);
  93. //playTone(4000,500);
  94. }
  95.  
  96. void loop()
  97. {
  98. unsigned long ircode ;
  99.  
  100. while (ir.available()) {
  101. ircode = ir.read() ;
  102. Serial.print("got code: 0x") ;
  103. Serial.println(ircode,HEX) ;
  104. };
  105.  
  106. // ligar / desligar farois (os dois leds)
  107. if (ircode == FAROIS) {
  108. LED_E_STATE = !LED_E_STATE;
  109. digitalWrite(LED_E, LED_E_STATE);
  110. LED_D_STATE = !LED_D_STATE;
  111. digitalWrite(LED_D, LED_D_STATE);
  112. };
  113.  
  114. // Aumentar/Diminuir a velocidade dos motores
  115. if (ircode == VEL_MAIS) {
  116. Vel+=10;
  117. Serial.println(Vel);
  118. if (UltMov == AVANCAR) Motor(HIGH, LOW, HIGH, LOW);
  119. if (UltMov == RETROCEDER) Motor(LOW, HIGH, LOW, HIGH);
  120. }
  121.  
  122. if (ircode == VEL_MENOS) {
  123. Vel-=10;
  124. Serial.println(Vel);
  125. if (UltMov == AVANCAR) Motor(HIGH, LOW, HIGH, LOW);
  126. if (UltMov == RETROCEDER) Motor(LOW, HIGH, LOW, HIGH);
  127. }
  128.  
  129. // Deixar a velocidade dentros dos limites do PWM
  130. if (Vel < 10) Vel = 10;
  131. if (Vel > 240) Vel = 240;
  132.  
  133. // avançar carro
  134. if (ircode == AVANCAR) Avancar();
  135.  
  136. // parar carro
  137. if (ircode == PARAR) Parar();
  138.  
  139. // retroceder carro
  140. if (ircode == RETROCEDER) Retroceder();
  141.  
  142. // avançar à direita
  143. if (ircode == DIREITA) Avancar_direita();
  144.  
  145. // avançar à esquerda
  146. if (ircode == ESQUERDA) Avancar_esquerda();
  147.  
  148. // piscar os 2 leds quando for marcha a ré
  149. if (RE) Piscar_doisLeds();
  150. }
  151.  
  152. void Motor(boolean M1A, boolean M1R, boolean M2A, boolean M2R) {
  153. // Envia para as portas de saída, os comandos para os motores
  154.  
  155. // Se for colocar o motor em movimento, usar o PWM
  156. if (M1A == HIGH)
  157. analogWrite(M1_A, Vel);
  158. else
  159. digitalWrite(M1_A, LOW); // parar o motor
  160.  
  161. if (M1R == HIGH)
  162. analogWrite(M1_R, Vel);
  163. else
  164. digitalWrite(M1_R, LOW);
  165.  
  166. if (M2A == HIGH)
  167. analogWrite(M2_A, Vel);
  168. else
  169. digitalWrite(M2_A, LOW);
  170.  
  171. if (M2R == HIGH)
  172. analogWrite(M2_R, Vel);
  173. else
  174. digitalWrite(M2_R, LOW);
  175. }
  176.  
  177. void Piscar_doisLeds() {
  178. // piscar os dois leds quando for marcha a ré
  179. digitalWrite(LED_E, LOW);
  180. digitalWrite(LED_D, LOW);
  181. //playTone(1000, 300);
  182. delay(300);
  183. digitalWrite(LED_E, HIGH);
  184. digitalWrite(LED_D, HIGH);
  185. //playTone(300, 500);
  186. delay(300);
  187. digitalWrite(LED_E, LOW);
  188. digitalWrite(LED_D, LOW);
  189.  
  190. digitalWrite(LED_E, LED_E_STATE);
  191. digitalWrite(LED_D, LED_D_STATE);
  192. }
  193.  
  194. void Parar() {
  195. // Parar o carro
  196. UltMov = PARAR;
  197. Motor(LOW, LOW, LOW, LOW);
  198. RE = false;
  199. }
  200.  
  201. void Avancar() {
  202. // mover o carro para frente
  203. UltMov = AVANCAR;
  204. Motor(HIGH, LOW, HIGH, LOW);
  205. RE = false;
  206. }
  207.  
  208. void Retroceder() {
  209. // mover o carro para trás
  210. UltMov = RETROCEDER;
  211. Motor(LOW, HIGH, LOW, HIGH);
  212. // indicar que foi dada marcha a ré
  213. RE = true;
  214. }
  215.  
  216. void Avancar_direita() {
  217. // Avancar à direita
  218. Motor(HIGH, LOW, LOW, LOW);
  219.  
  220. for (int x = 0; x < 3; x++) {
  221. Piscar_led(LED_D);
  222. };
  223. Avancar();
  224. }
  225.  
  226. void Avancar_esquerda() {
  227. // Avançar à esquerda
  228. Motor(LOW, LOW, HIGH, LOW);
  229.  
  230. for (int x = 0; x < 3; x++) {
  231. Piscar_led(LED_E);
  232. };
  233. Avancar();
  234. }
  235.  
  236. void Piscar_led(byte LED) {
  237. digitalWrite(LED, LOW);
  238. delay(300);
  239. digitalWrite(LED, HIGH);
  240. delay(300);
  241. digitalWrite(LED, LOW);
  242. digitalWrite(LED_E, LED_E_STATE);
  243. digitalWrite(LED_D, LED_D_STATE);
  244. }
  245.  
  246. void playTone(int tone, int duration) {
  247. for (long i = 0; i < duration * 1000L; i += tone * 2) {
  248. digitalWrite(SPEAKER, HIGH);
  249. delayMicroseconds(tone);
  250. digitalWrite(SPEAKER, LOW);
  251. delayMicroseconds(tone);
  252. }
  253. }
Advertisement
Add Comment
Please, Sign In to add comment