# Control de un coche Arduino por Bluetooth

## 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

1. OUT1: Conexión “+” para o motor A.
2. OUT2: Conexión “-” para o motor A.
3. +12V: Conexión de alimentación, máximo 35 V DC.
4. GND
5. +5V: Proporciona 5 V para alimentar a placa Arduíno.
6. 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.
7. IN1: Pins de control dos motores
8. IN2
9. IN3
10. IN4
11. 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.
12. OUT3: Conexión “+” para o motor B.
13. 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.

Arduino
// 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); } }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | // 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.

### App Inventor

### Prácticas

### Apps para Arduíno

### Licenza