Descrición
Imos a controlar a velocidade e o sentido de avance dun coche con Arduíno mediante Bluetooth.
- Faremos o control de sentido de xiro de dous motores de corrente continua.
- Mediante PWM imos controlar as súas velocidades de xiro.
Materiais:
- Placa Arduino
- Placa Protoboard
- Pila 9 V
- Módulo Bluetooth HC-05
- 2 Resistencias: unha de 1kΩ e outra de 560Ω, para o divisor de tensión do BT.
- Módulo integrado L298N (para o control dos motores)
- Dous motores de corrente continua
- Dúas rodas para os motores
- Unha roda tola
- Chasis
(1: Bluetooth, 2: Conrolador de motores L298N, 3: Motor e roda, 4: Roda tola)
(Chasis)
Para a montaxe do chasis podes consultar esta páxina.
Que é o controlador L298N?
O L298 tamén, coñecido como driver ou dobre ponte h, é un dispositivo electrónico, en forma de circuíto integrado, formado a base de transistores para poder controlar, con base a pulsos, o sentido da corrente, podendo inverter así, a polaridade das súas saídas. Esta formado, a grandes liñas, por dúas pontes h, que poden controlar motores de corrente continua (D.C.) de 5 e 12 voltios e pode soportar ata 1 e 2 Amperios.
Pins do módulo L298N
- OUT1: Conexión “+” para o motor A.
- OUT2: Conexión “-” para o motor A.
- +12V: Conexión de alimentación, máximo 35 V DC.
- GND
- +5V: Proporciona 5 V para alimentar a placa Arduíno.
- ENA: Habilita o motor A. Hai que quitar a ponte, así podemos introducir por el pulsos PWM e controlar a velocidade do motor de continua.
- IN1: Pins de control dos motores
- IN2
- IN3
- IN4
- ENB: Habilita o motor B. Hai que quitar a ponte, así podemos introducir por el pulsos PWM e controlar a velocidade do motor de continua.
- OUT3: Conexión “+” para o motor B.
- OUT4: Conexión “-” para o motor B.
Conexións
No módulo L298N é posible que as entradas ENA e ENB traian unha ponte de fábrica… quitamos as pontes das entradas ENA e ENB.
- Conectamos un motor ás saídas OUT1 e OUT2.
- Conectamos o outro motor ás saídas OUT3 e OUT4.
Realizamos as seguintes conexións, dende o módulo L298N a Arduino:
- ENA ⇒ 10
- In1 ⇒ 9
- In2 ⇒ 8
- In3 ⇒ 7
- In4 ⇒ 6
- ENB ⇒ 5
- Alimentamos con 9 V o módulo L298N, conectándoo a +12V (Vcc) e Gnd.
- Conectamos a saída de 5 V e o Gnd do módulo L298N aos 5 V e Gnd do Arduíno. É moi importante non esquecer conectar o cable do Gnd ao Arduíno.
Ao conectalo desta maneira, a saída de 5 V do módulo L298N alimentará ao Arduíno, e non necesitaremos alimentar o Arduíno con ningunha outra fonte de alimentación.
Realizamos as seguintes conexións, dende o Bluetooth HC-05 a Arduino:
- VCC ⇒ 3.3V
- GND ⇒ GND
- TXD ⇒ 0 → RX
- RXD ⇒ TX→1
O módulo Bluetooth aliméntase con 3,3 V.
Programación en IDE de Arduíno
Cando vaias cargar o programa ao Arduíno, quita o cable vermello de alimentación do módulo Bluetooth (se tentas cargar co módulo Bluetooth conectado, dará erro). Unha vez cargado o programa no Arduíno, volve conectar o cable vermello do módulo Bluetooth.
// Conexións do Motor A char val; int enA = 10; int in1 = 9; int in2 = 8; // Conexións do Motor B int enB = 5; int in3 = 7; int in4 = 6; void setup() { Serial.begin(9600); // Terminais de saida no Arduino pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); analogWrite(enA, 90); analogWrite(enB, 90); } void loop() { if( Serial.available() ) val = Serial.read(); // Avanza Motor A if( val == '1' ) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); } // Avanza Motor A e B if( val == '2' ) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } // Avanza Motor B if( val == '3' ) { digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } // Parar A if( val == '4' ) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } // Parar A e B if( val == '5' ) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } // Parar B if( val == '6' ) { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } // Retrocede A if( val == '7' ) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } // Retrocede A e B if( val == '8' ) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } // Retrocede B if( val == '9' ) { digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } if( val == 'A' ) { analogWrite(enA, 70); analogWrite(enB, 70); } if( val == 'B' ) { analogWrite(enA, 110); analogWrite(enB, 110); } if( val == 'C' ) { analogWrite(enA, 150); analogWrite(enB, 150); } if( val == 'D' ) { analogWrite(enA, 200); analogWrite(enB, 200); } if( val == 'E' ) { analogWrite(enA, 250); analogWrite(enB, 250); } }
Segundo se envíen os caracteres A, B, C, D o E, a velocidade dos motores será 70, 110, 150, 200 o 250 respectivamente. Estes valores producen distintos ciclos útiles (Duty Cycle) de PWM.
Programación en App Inventor
Deseño
Inserimos os elementos indicados:
- sdl_Conectar é un SelectorDeLista.
- Btn_Desconectar é un Botón.
- B1 … B9 son Botóns.
- A … E son Botóns.
- ClienteBluetooth1
- Notificador1
Programación de bloques
- Vinculamos o Bluetooth e do dispositivo Android.
- Segundo a tecla pulsada envíase un carácter mediante BT.
- Coas teclas “Avanza” moverase cara adiante o motor A, o motor B ou os dous.
- Coas teclas de “Parar” pararase o motor A, o motor B ou os dous.
- Coas teclas de “Retro” retrocederá o motor A, o motor B ou os dous.
- Para controlar a velocidade dos motores utilizaremos 5 botóns, segundo o botón pulsado enviarase o carácter: A, B, C, D ou E, que indicará un nivel de velocidade.
A lento (70), B un pouco máis rápido (110), C máis rápido (150), D moi rápido (200) e E máxima velocidade (250).
Poderíase enviar a velocidade mediante un Deslizador (como vimos no titorial de Bluetooth co LED RGB), pero é máis sinxelo enviando só 5 niveis de velocidade con estes botóns. Xa que resulta máis sinxelo enviar un carácter que varios, se tivésemos que enviar a velocidade 125, por exemplo, o código complicaríase.
Nota:
O movemento do coche pode ter problemas pola falta de paralelidade das rodas. Posiblemente un motor vire máis rápido que o outro. Podes tentar corrixilo mediante a variable de velocidade.