Guías · 20 min de lectura

Cómo hacer un coche robot con Arduino y Bluetooth paso a paso

Coche (carro) robot Arduino paso a paso: materiales y coste, cableado L298N y HC-05, pilas 18650, código de marcha, control por móvil y soluciones a desvíos.

Hacer un coche con Arduino (o carro, como se dice en gran parte de Latinoamérica) es una de las formas más divertidas de aprender electrónica y programación en un mismo proyecto. Con dos motorreductores, un controlador de motores L298N, dos pilas 18650, un módulo Bluetooth HC-05 y un Arduino Uno puedes construir en un fin de semana un coche robot que manejas desde el móvil. Por el camino verás en primera persona por qué los motores no se pueden conectar directamente al Arduino, por qué la elección de la batería es tan importante y cómo unas pocas líneas de código mueven un vehículo real.

En esta guía construimos juntos un coche robot 2WD (dos motores) de principio a fin: lista de materiales y costes, montaje del chasis, tablas de conexiones, código para avanzar, retroceder y girar, y control por Bluetooth desde el móvil. Los dos problemas que más atascan a los principiantes, que el coche no vaya recto y que el Arduino se reinicie al arrancar los motores, tienen cada uno su propia sección con soluciones concretas. En las últimas secciones verás cómo manejar el mismo coche con un ESP32 o una Raspberry Pi Pico y cómo convertirlo en un robot que esquiva obstáculos o sigue líneas.

Arduino Uno
Arduino Uno
L298N
L298N
HC-05
HC-05
18650 Li-ion
18650 Li-ion

¿Cómo funciona un coche robot con Arduino?

Un coche robot se divide en cuatro partes. El Arduino es el cerebro: lee la orden que llega del móvil y decide qué motor gira, en qué sentido y a qué velocidad. El controlador L298N es el músculo: convierte las débiles señales de 5 V del Arduino en la corriente alta que necesitan los motores. Los motorreductores hacen girar las ruedas y el paquete de baterías alimenta todo. Estos coches no tienen dirección; giran haciendo que las dos ruedas vayan a distinta velocidad o en sentidos opuestos. Esto se llama tracción diferencial: si la rueda izquierda gira hacia delante y la derecha hacia atrás, el coche gira a la derecha sobre sí mismo. Una pequeña rueda loca delante o detrás mantiene el equilibrio del chasis.

Motorreductor TT amarillo con rueda de 65 mm
El motor estándar de los coches robot: un motor TT con caja reductora de plástico amarilla y una rueda de 65 mm. La reductora divide la velocidad del motor entre 48 y aumenta su par.
CaracterísticaMotor TT amarillo (1:48)
Tensión de trabajo3–6 V
Relación de reducción1:48 (engranajes de plástico)
Velocidad sin cargaUnas 90–120 RPM a 3 V y 200–250 RPM a 6 V
Corriente sin cargaUnos 150–160 mA
Corriente de bloqueoUnos 1,1–1,5 A
Diámetro de rueda (en kits)65 mm
Velocidad del coche a 6 VUnos 0,7 m/s (π × 0,065 m × 200 / 60)

La fila más importante de la tabla es la corriente de bloqueo: cuando una rueda empuja contra un obstáculo o el coche arranca, cada motor consume durante un instante más de 1 amperio. Un pin de Arduino, en cambio, da como mucho 20–40 mA, por eso los motores siempre se conectan a través de un controlador. Al hacer este trabajo el L298N pierde unos 1,5–2,5 V; con un paquete de 7,4 V a los motores les llegan 5–6 V, justo el rango ideal de los motores TT. Explicamos el funcionamiento interno del controlador y el puente H en detalle en Control de motor DC con el L298N.

Lista de materiales

PiezaCantidadNota
Kit de chasis acrílico 2WD para coche robot1Suele incluir 2 motores TT, 2 ruedas, rueda loca, interruptor, soportes de motor y tornillos
Arduino Uno R3 (vale un clon) + cable USB1También sirve un Nano; los números de pin son los mismos
Módulo controlador de motores L298N12 A por canal; controla dos motores por separado
Módulo Bluetooth HC-05 o HC-061Para comunicarse con un móvil Android
Pila de litio 186502Celdas de marca capaces de dar al menos 5 A
Portapilas 18650 doble (en serie)1Conecta las dos celdas en serie y da 7,4 V
Cargador de 186501Un cargador que cargue cada celda por separado
Cables jumper (macho-hembra y hembra-hembra)20+Entre el Arduino, el L298N y el HC-05
Resistencias de 1 kΩ y 2 kΩ1 + 1Divisor de tensión para la entrada RXD del HC-05
Condensador cerámico de 100 nF2–4En los bornes del motor; reduce el ruido eléctrico
Condensador electrolítico de 470–1000 µF (16 V o más)1Recomendado; en la entrada de alimentación del L298N
Bridas, cinta de doble cara, separadores M3VariosPara fijar placas y cables

La mayoría de los kits de chasis traen también un portapilas para 4 pilas AA; como verás enseguida, junto con el L298N se queda corto, por eso añadimos pilas 18650 a la lista. El HC-06 es el hermano más sencillo del HC-05, que solo funciona como esclavo, y es más que suficiente para manejar un coche desde el móvil. Los discos de plástico ranurados del kit son discos de encoder para un sensor de velocidad con el que más adelante podrás hacer que el coche vaya perfectamente recto; no los tires, guárdalos por ahora.

Coste: ¿en qué se va el presupuesto?

Los precios cambian constantemente según el vendedor y el tipo de cambio, así que no damos cifras; en su lugar te mostramos qué partidas se llevan el presupuesto y dónde puedes ahorrar. La regla general es: los módulos electrónicos (L298N, HC-05, resistencias) son baratos, y la mayor parte del presupuesto se va en la placa, el kit de chasis y, sobre todo, las pilas y el cargador. La batería es lo último en lo que conviene ahorrar: unas buenas celdas 18650 se recargan cientos de veces y sirven para todos tus proyectos de robots siguientes.

PartidaNivel de precioConsejo de ahorro
Kit de chasis (con motores y ruedas)MedioUn kit suele salir más barato que comprar motores, ruedas y rueda loca por separado
Arduino UnoMedio (clon) – alto (original)Para aprender basta un clon; también puedes reutilizar el Uno o Nano que ya tengas
Controlador L298NBajoUn módulo controla dos motores; también basta uno para 4WD
HC-05 / HC-06Bajo – medioSi solo vas a manejarlo con el móvil, un HC-06 es suficiente
2 pilas 18650 + cargadorLa partida más caraLas celdas muy baratas que dicen "9900 mAh" suelen ser falsas; no ahorres aquí
Cables, resistencias, condensadores, tornillosBajoCasi todo viene ya en los kits de inicio
Si ya tienes un kit de Arduino para principiantes, la placa, los cables y las resistencias están cubiertos; solo necesitas el kit de chasis, un L298N, un HC-05 y las pilas. Los "kits de coche inteligente" que traen todo en una caja son cómodos porque incluyen su propia placa de motores y código listo, pero cuestan más y te quitan la oportunidad de aprender el cableado.

¿2WD o 4WD?

Característica2WD (2 motores + rueda loca)4WD (4 motores)
GiroGira sobre sí mismo con facilidad y de forma cerradaGira derrapando las ruedas de lado (skid steer); le cuesta sobre alfombra
ConsumoUnos 0,3–0,6 A en marchaAproximadamente el doble
AutonomíaMayorMenor
Terreno irregularLa rueda loca puede engancharse en los bordesMejor agarre
Ir rectoLa rueda loca puede desviar el coche al girar sobre su ejeMás estable
Conexión al L298NCada motor en su propio canalLos dos motores de cada lado en paralelo en un canal
Ideal paraPrimer coche, robot seguidor de líneaExteriores, cargas más pesadas

Para tu primer coche recomendamos 2WD: es más barato, consume menos, gira sobre sí mismo con facilidad y encaja mejor con proyectos posteriores como un robot seguidor de línea. Si montas un 4WD, conecta en paralelo los dos motores de cada lado a los mismos bornes OUT y comprueba que ambos giran en el mismo sentido. Así, un canal del L298N lleva la corriente de dos motores; en marcha normal no hay problema, pero si las ruedas se bloquean se puede superar el límite de 2 A por canal y la protección térmica del controlador corta los motores.

Alimentación: ¿por qué dos pilas 18650?

La mayoría de los problemas de un coche robot vienen de una batería mal elegida. La fuente correcta debe cumplir dos condiciones a la vez: dejar suficiente tensión a los motores después de la pérdida del L298N y no hundirse cuando los motores piden varios amperios al arrancar. Dos celdas 18650 de litio en serie (2S) dan 8,4 V con carga completa y 7,4 V de media, y entregan varios amperios sin esfuerzo. El Arduino Uno recomienda 7–12 V en su entrada VIN, así que el mismo paquete puede alimentar tanto los motores como el Arduino. Con celdas de 2500 mAh, un coche 2WD que consume de media 0,8 A en marcha (motores y placas) funciona en teoría unas 3 horas; como nunca descargas la batería por completo, 2–2,5 horas es una cifra más realista. Para calcularlo con tus propios valores usa la herramienta Duración de la batería.

Pila recargable de litio 18650
Pila de litio 18650: 18 mm de diámetro y 65 mm de largo; 4,2 V cargada y 3,6–3,7 V de media. Dos en serie forman el paquete de 7,4 V ideal para un coche robot.
Fuente de alimentaciónTensiónCapacidad de corrientePara un coche robot
Pila de 9 V9 VMuy bajaNo sirve; la causa más común de reinicios
4 pilas AA alcalinas6 V (cae rápido con carga)MediaFloja; tras el L298N a los motores les llegan unos 4 V
4 pilas AA NiMH (recargables)4,8 VBuenaTensión insuficiente con el L298N
2 pilas 18650 de litio (2S)7,4 V (8,4 V cargadas)Alta (varios amperios)La mejor opción
3 pilas 18650 de litio (3S)11,1 V (12,6 V cargadas)AltaDemasiado para motores TT; supera el límite de 12 V del jumper de 5V
Batería externa USB (powerbank)5 VBuenaSolo para alimentar el Arduino por separado
Las pilas de litio son potentes, pero exigen cuidado. Al colocarlas en el portapilas revisa dos veces la polaridad; una 18650 puesta al revés o en cortocircuito se calienta mucho y puede provocar un incendio. La tensión por celda nunca debe bajar de 3,0 V; cárgalas cuando el coche empiece a ir más lento (unos 6,6 V el paquete). Los módulos TP4056 solo cargan una celda y no pueden cargar directamente un paquete en serie; saca las pilas del portapilas, cárgalas en un cargador de 18650 y no las dejes nunca sin vigilancia mientras se cargan.

En lugar de adivinar cuánta carga queda, puedes medirla. Conecta el positivo de la batería (después del interruptor) a A0 mediante un divisor de tensión de dos resistencias de 10 kΩ: un paquete de 8,4 V aparece en A0 como 4,2 V, por debajo del límite de lectura de 5 V del Arduino. El divisor solo consume unos 0,4 mA, así que no afecta a la autonomía.

Arduino (C++)
1// Pil + (anahtardan sonra) → 10 kΩ → A0 → 10 kΩ → GND / battery + (after the switch) → 10 kΩ → A0 → 10 kΩ → GND
2const float DIVIDER = 2.0;   // iki eşit direnç gerilimi yarıya böler / two equal resistors halve the voltage
3
4void setup() {
5  Serial.begin(9600);
6}
7
8void loop() {
9  float v = analogRead(A0) * 5.0 / 1023.0 * DIVIDER;
10  Serial.print(F("Pil / Battery: "));
11  Serial.print(v, 2);
12  Serial.println(F(" V"));
13  if (v < 6.6) Serial.println(F("Sarj et / Charge now"));   // hücre başına 3,3 V / 3.3 V per cell
14  delay(1000);
15}

Montaje paso a paso

  1. Retira el papel protector de las piezas acrílicas. Si los motores vienen sin cables, suelda dos cables a cada motor y refuerza las soldaduras con silicona caliente; un cable de motor que se rompe por la vibración es la avería más frecuente.
  2. Fija los motores en la parte inferior del chasis con los soportes acrílicos en forma de T y los tornillos M3 largos del kit. Los dos ejes deben quedar alineados y los terminales de los motores deben mirar hacia dentro.
  3. Si vas a usar los discos de encoder, colócalos ahora en el lado interior del eje del motor; con las ruedas puestas es complicado.
  4. Monta la rueda loca en el centro del otro extremo del chasis con separadores. Elige una altura que deje el chasis paralelo al suelo.
  5. Encaja las ruedas a fondo haciendo coincidir el eje en forma de D; una rueda floja hace que el coche se desvíe constantemente.
  6. Coloca el portapilas con cinta de doble cara o velcro de forma que su peso quede cerca del eje de las ruedas. Si casi todo el peso cae sobre la rueda loca, las ruedas motrices patinan.
  7. Monta el Arduino y el L298N en la plataforma superior con separadores de plástico. Debes poder llegar con facilidad al conector USB del Arduino y el disipador del L298N debe quedar al aire; vigila que los tornillos metálicos no toquen las soldaduras bajo las placas.
  8. Conecta el interruptor en serie con el cable positivo de la batería; así podrás encender y apagar el coche sin sacar las pilas.
  9. Trenza los dos cables de cada motor hasta el L298N, mantén todos los cables cortos y recógelos con bridas. Antes de poner las pilas, comprueba con un multímetro que no hay cortocircuito entre los bornes de la batería.
Antes de atornillar los motores al chasis, toca un instante los terminales de cada uno con 2 pilas AA para comprobar el sentido de giro y marca los cables. Si marcas ambos motores de modo que "cable rojo al positivo significa hacia delante", no cometerás errores de sentido al cablear.

Esquema de conexiones

Piensa en el cableado en dos partes: la parte de potencia (batería, interruptor, L298N, motores) y la de señal (los cables finos que van del Arduino al L298N y al HC-05). Quita los pequeños jumpers de los pines ENA y ENB del L298N; conectaremos esos pines a las salidas PWM del Arduino para ajustar la velocidad por código. El jumper de 5V del L298N, en cambio, se queda puesto: como el paquete está por debajo de 12 V, el propio regulador de la placa alimenta la lógica del controlador.

Módulo controlador de motores L298N de doble canal
Controlador L298N: los motores van a las borneras azules de los lados y la batería a la bornera triple delantera; los pines ENA, IN1–IN4 y ENB van al Arduino.
Borne del L298NConexión
OUT1, OUT2Motor izquierdo (en 4WD, los dos motores izquierdos en paralelo)
OUT3, OUT4Motor derecho (en 4WD, los dos motores derechos en paralelo)
12VPositivo de la batería a través del interruptor
GNDNegativo de la batería y pin GND del Arduino (tierra común)
5VLibre con el Arduino Uno; alimenta la placa con el ESP32 y la Pico
Jumper de 5VSe queda puesto (batería por debajo de 12 V)
Jumpers de ENA y ENBSe quitan; los pines van a salidas PWM del Arduino
ConexiónArduino UnoESP32Raspberry Pi Pico
L298N ENA (velocidad motor izquierdo)D5 (PWM)GPIO 25GP15
L298N IN1D7GPIO 27GP14
L298N IN2D8GPIO 33GP13
L298N ENB (velocidad motor derecho)D6 (PWM)GPIO 26GP10
L298N IN3D9GPIO 32GP12
L298N IN4D4GPIO 4GP11
HC-05 TXDD10 (RX de SoftwareSerial)No hace falta (Bluetooth integrado)GP1 (RX de UART0)
HC-05 RXDD11, a través de un divisor 1 kΩ / 2 kΩNo hace faltaGP0 (TX de UART0), directo
HC-05 VCC5VNo hace faltaSalida 5V del L298N
Alimentación de la placaVIN ← positivo de la batería tras el interruptor5V (VIN) ← salida 5V del L298NVSYS ← salida 5V del L298N
GNDComún con GND del L298N y negativo de la bateríaComúnComún
No te saltes nunca estas tres reglas: todos los GND (negativo de la batería, L298N, Arduino, HC-05) deben estar unidos entre sí; los motores nunca se alimentan del pin 5V del Arduino; y la salida 5V del L298N no se conecta al pin VIN del Arduino. VIN necesita al menos 7 V; con 5 V el regulador del Arduino no funciona bien y la placa se vuelve inestable. El pin RXD del HC-05 es una entrada de 3,3 V; reduce la señal TX de 5 V del Uno con un divisor de 1 kΩ y 2 kΩ: D11 → 1 kΩ → RXD, RXD → 2 kΩ → GND (5 V × 2/3 ≈ 3,3 V).

Elegimos D5 y D6 como pines de velocidad a propósito. En el Uno, la librería Servo desactiva el PWM de los pines 9 y 10, y la función tone() el de los pines 3 y 11. Con ENA y ENB en 5 y 6, el control de velocidad sigue funcionando cuando más adelante añadas un servo o un zumbador. D2 y D3 quedan reservados para los encoders porque admiten interrupciones. Puedes ver la distribución de pines de tu placa en la herramienta Pinout.

Primer código: adelante, atrás, izquierda y derecha

Antes de pasar al Bluetooth, probemos los motores y el cableado por sí solos. El corazón del código es la función drive(izquierda, derecha): recibe la velocidad de cada motor por separado de -255 a 255; un valor positivo es hacia delante, uno negativo hacia atrás y cero es parar. Cómo se convierte el valor de velocidad en tensión lo explicamos en ¿Qué es PWM?. Antes de subir el código, pon el coche sobre una caja para que las ruedas giren en el aire; la espera de 3 segundos en setup() te da tiempo para ello.

Arduino (C++)
1// Sol motor / left motor: ENA=5, IN1=7, IN2=8 — Sağ motor / right motor: ENB=6, IN3=9, IN4=4
2const int ENA = 5, IN1 = 7, IN2 = 8;
3const int ENB = 6, IN3 = 9, IN4 = 4;
4
5const int SPEED = 180;   // temel hız 0-255 / base speed 0-255
6const int TRIM = 0;      // % düzeltme: + sol, - sağ motoru yavaşlatır / % trim: + slows left, - slows right
7
8void drive(int left, int right) {               // her biri -255 … 255 / each -255 … 255
9  if (TRIM > 0) left = left * (100 - TRIM) / 100;
10  if (TRIM < 0) right = right * (100 + TRIM) / 100;
11  digitalWrite(IN1, left > 0);  digitalWrite(IN2, left < 0);
12  digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
13  analogWrite(ENA, abs(left));
14  analogWrite(ENB, abs(right));
15}
16
17void forward()   { drive(SPEED, SPEED); }
18void backward()  { drive(-SPEED, -SPEED); }
19void turnLeft()  { drive(-SPEED, SPEED); }     // yerinde sola / spin left in place
20void turnRight() { drive(SPEED, -SPEED); }     // yerinde sağa / spin right in place
21void stopCar()   { drive(0, 0); }
22
23void setup() {
24  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
25  for (int p : pins) pinMode(p, OUTPUT);
26  stopCar();
27  delay(3000);             // tekerlekleri kaldırmak için zaman / time to lift the wheels
28}
29
30void loop() {
31  forward();   delay(1500);
32  stopCar();   delay(500);
33  backward();  delay(1500);
34  stopCar();   delay(500);
35  turnLeft();  delay(600);
36  stopCar();   delay(500);
37  turnRight(); delay(600);
38  stopCar();   delay(2000);
39}
MovimientoMotor izquierdoMotor derechoCódigo
AdelanteAdelanteAdelantedrive(180, 180)
AtrásAtrásAtrásdrive(-180, -180)
Giro a la izquierda sobre sí mismoAtrásAdelantedrive(-180, 180)
Giro a la derecha sobre sí mismoAdelanteAtrásdrive(180, -180)
Curva abierta a la izquierdaAdelante lentoAdelantedrive(90, 180)
PararParadoParadodrive(0, 0)

Con las ruedas en el aire, el coche debe ir hacia delante, hacia atrás, a la izquierda y a la derecha por turnos. Si una rueda gira al revés, no toques el código: intercambia los dos cables de ese motor en el borne OUT del L298N. Si giran al revés las dos ruedas, intercambia los cables de ambos motores. Si los motores zumban pero no giran, el valor de SPEED es demasiado bajo: la mayoría de los motores TT necesitan un PWM de al menos 80–120 para arrancar, y ese umbral sube a medida que se descarga la batería.

Control por Bluetooth desde el móvil (HC-05)

El HC-05 funciona como un cable serie inalámbrico entre el móvil y el Arduino: la app del móvil envía una letra, el Arduino la lee y hace el movimiento correspondiente. La mayoría de las apps de mando que encuentras en Play Store buscando "Bluetooth RC Car" o "Bluetooth RC Controller" envían F para avanzar, B para retroceder, L para la izquierda, R para la derecha y S para parar al soltar el botón; algunas usan además G, I, H y J para las diagonales y 0–9 y q para la velocidad. Los pines, los patrones del LED y los comandos AT del módulo están en Módulo Bluetooth HC-05.

Módulo Bluetooth HC-05
HC-05: se conecta al móvil por Bluetooth clásico (SPP); su velocidad por defecto es 9600 baudios y el PIN de emparejamiento es 1234 o 0000.
  1. Mientras subes el código de abajo, el interruptor del coche puede quedarse apagado; el Arduino y el HC-05 se alimentan por USB. Si el LED del HC-05 parpadea rápido, el módulo está esperando conexión.
  2. Busca el HC-05 en los ajustes Bluetooth de tu móvil Android y emparéjalo con el PIN 1234 (o 0000 si falla).
  3. Abre la app de mando, concede los permisos de Bluetooth y dispositivos cercanos y elige el HC-05 en la lista. Al conectarse, el LED del módulo da dos destellos cortos cada dos segundos.
  4. Deja el Arduino conectado por USB, abre el Monitor Serie a 9600 baudios y pulsa los botones de la app. En pantalla aparece la letra que envía cada botón; si tu app envía otras letras, cambia las líneas case del código.
  5. Desconecta el cable USB, enciende el interruptor, pon el coche en el suelo y conduce.
Arduino (C++)
1#include <SoftwareSerial.h>
2
3SoftwareSerial bt(10, 11);               // RX, TX → HC-05 TXD, RXD (RXD bölücüyle / RXD via divider)
4
5const int ENA = 5, IN1 = 7, IN2 = 8;     // sol motor / left motor
6const int ENB = 6, IN3 = 9, IN4 = 4;     // sağ motor / right motor
7const int TRIM = 0;                      // % düzeltme / % trim
8const unsigned long TIMEOUT = 600;       // ms; 0 = kapalı / 0 = disabled
9
10int speed = 200;                         // 0-255
11unsigned long lastCmd = 0;
12
13void drive(int left, int right) {
14  if (TRIM > 0) left = left * (100 - TRIM) / 100;
15  if (TRIM < 0) right = right * (100 + TRIM) / 100;
16  digitalWrite(IN1, left > 0);  digitalWrite(IN2, left < 0);
17  digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
18  analogWrite(ENA, abs(left));
19  analogWrite(ENB, abs(right));
20}
21
22void setup() {
23  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
24  for (int p : pins) pinMode(p, OUTPUT);
25  drive(0, 0);
26  Serial.begin(9600);                    // gelen harfleri görmek için / to see incoming letters
27  bt.begin(9600);                        // HC-05 veri modu hızı / HC-05 data mode baud rate
28}
29
30void loop() {
31  if (bt.available()) {
32    char c = bt.read();
33    Serial.println(c);
34    lastCmd = millis();
35    int half = speed / 2;
36    switch (c) {
37      case 'F': drive(speed, speed);   break;   // ileri / forward
38      case 'B': drive(-speed, -speed); break;   // geri / backward
39      case 'L': drive(-speed, speed);  break;   // yerinde sola / spin left
40      case 'R': drive(speed, -speed);  break;   // yerinde sağa / spin right
41      case 'G': drive(half, speed);    break;   // ileri-sol / forward-left
42      case 'I': drive(speed, half);    break;   // ileri-sağ / forward-right
43      case 'H': drive(-half, -speed);  break;   // geri-sol / back-left
44      case 'J': drive(-speed, -half);  break;   // geri-sağ / back-right
45      case 'S': drive(0, 0);           break;   // dur / stop
46      case 'q': speed = 255;           break;   // tam hız / full speed
47      default:
48        if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 100, 240);   // hız kademesi / speed level
49    }
50  }
51  if (TIMEOUT > 0 && millis() - lastCmd > TIMEOUT) drive(0, 0);   // komut yoksa dur / no command: stop
52}
LetraMovimientoMotor izquierdo / derecho
FAdelante+velocidad / +velocidad
BAtrás−velocidad / −velocidad
LGiro a la izquierda−velocidad / +velocidad
RGiro a la derecha+velocidad / −velocidad
G, IAdelante-izquierda, adelante-derechaUn lado a media velocidad
H, JAtrás-izquierda, atrás-derechaUn lado a media velocidad
SParar0 / 0
0–9, qNivel de velocidad0 → 100, 9 → 240, q → 255

El TIMEOUT del código es una medida de seguridad: estas apps envían la misma letra una y otra vez mientras mantienes pulsado el botón, así que si durante 600 ms no llega ninguna letra el código supone que se ha perdido la conexión y para el coche. De este modo el coche no sigue rumbo a la pared si el móvil queda fuera de alcance o la app se cierra. Si tu app envía la letra una sola vez por pulsación, el coche se parará a los 600 ms; en ese caso pon TIMEOUT a 0 para desactivar esta función. Además, no usamos delay() en ningún punto de loop(); las esperas largas retrasan las órdenes, y el porqué lo tienes en millis() frente a delay().

El HC-05 y el HC-06 usan Bluetooth clásico, así que no funcionan con iPhone; iOS no permite este tipo de conexión serie. Si quieres manejarlo con un iPhone, usa un módulo BLE como el HM-10 o un ESP32 con BLE. Si quieres crear tu propia app de mando, echa un vistazo a la guía Arduino y Bluetooth con App Inventor.

El coche no va recto: causas y solución

Si el coche se va desviando poco a poco hacia un lado aunque des a los dos motores el mismo PWM para "adelante", tranquilo: es el problema más habitual de los coches robot. Los motorreductores baratos giran a distinta velocidad incluso con la misma tensión; las diferencias de rozamiento en los engranajes, escobillas e imanes hacen que cada motor sea un poco distinto. Si a eso le sumas una rueda floja, una rueda loca que cambia de orientación o el peso cargado a un lado, desviarse 20–30 cm en 2 metros es lo normal. Corrige primero las causas mecánicas y luego compensa la diferencia restante por software.

SíntomaCausa probableSolución
Siempre se desvía al mismo ladoLos motores giran a distinta velocidadCorrección por software con TRIM, o encoders
Da un volantazo al arrancar y luego se enderezaUn motor arranca más tarde o la rueda loca cambia de orientaciónArranque suave; rueda de bola (ball caster) en lugar de rueda loca
El desvío cambia cada vezRueda floja, neumático que patina o soporte de motor torcidoEncaja la rueda a fondo en el eje y aprieta los tornillos
Gira sobre sí mismo en lugar de avanzarLos cables de un motor están invertidosIntercambia los cables de ese motor en el borne OUT
El desvío aumenta al bajar la bateríaCon poca tensión crece la diferencia entre motoresCarga la batería; ajusta TRIM con la batería llena
Tira hacia un lado al acelerarEl peso está cargado a un ladoColoca batería y placas en el centro, cerca del eje de las ruedas

Una vez resueltos los problemas mecánicos, haz el ajuste fino por software. La constante TRIM del código frena en porcentaje el motor más rápido: un valor positivo frena el motor izquierdo y uno negativo el derecho. Ajústalo así:

  1. Carga las pilas por completo; calibrar con la batería llena da resultados coherentes.
  2. Pega en el suelo una tira de cinta recta de 2 metros y coloca el coche al principio, alineado con la cinta.
  3. En loop() del primer código deja solo forward() y una espera de 3 segundos, y deja que el coche avance.
  4. Si el coche se desvía a la derecha, el motor izquierdo es más rápido: sube TRIM en 3; si se desvía a la izquierda, bájalo en 3.
  5. Repite hasta que el desvío en 2 metros sea de pocos centímetros y copia el mismo valor de TRIM en el código Bluetooth.
  6. Calibra a la velocidad que más uses; la diferencia entre motores cambia un poco con la velocidad.

El siguiente nivel para ir perfectamente recto y medir distancias es el encoder. Colocas en los ejes los discos de 20 ranuras del kit y cuentas cada ranura con un sensor de velocidad de horquilla basado en el LM393. Conecta las salidas de los sensores a los pines D2 y D3, que admiten interrupciones, y compara los pulsos de las dos ruedas: si el lado izquierdo se adelanta, frenas un poco el motor izquierdo. Este sencillo control proporcional (P) mantiene el coche recto sin importar la carga de la batería ni el suelo. Una rueda de 65 mm recorre unos 20,4 cm por vuelta, así que cada pulso equivale a 1 cm aproximadamente. Explicamos cómo funcionan las interrupciones en Interrupciones en Arduino.

El Arduino se reinicia al arrancar los motores

Si el Arduino se reinicia o el HC-05 pierde la conexión (el LED vuelve a parpadear rápido) cuando el coche arranca, cambia de sentido o choca con algo, el problema está casi siempre en la alimentación. Al arrancar, dos motores juntos pueden pedir 2–3 A; una batería débil no puede darlos y su tensión cae de golpe durante un instante. El procesador del Uno se reinicia por seguridad cuando su alimentación baja de 2,7 V (brown-out). A eso se suman el ruido eléctrico de las escobillas de los motores y la caída de tensión en cables finos. Estas son las soluciones, empezando por la más eficaz:

  • Cambia la batería: usa dos pilas 18650 cargadas en lugar de una pila de 9 V o pilas AA gastadas; aquí se acaban la mayoría de los problemas.
  • Alimentación por el camino correcto: alimenta el Arduino desde la batería por VIN; no conectes la salida 5V del L298N a VIN.
  • Condensadores en los motores: suelda un condensador cerámico de 100 nF entre los dos bornes de cada motor; elimina el ruido de las escobillas en su origen.
  • Condensador de reserva: conecta un electrolítico de 470–1000 µF a los bornes 12V y GND del L298N (positivo a 12V). Cubre el pico breve de corriente del arranque.
  • Arranque suave: en lugar de saltar a 255 de golpe, sube la velocidad por pasos como se muestra abajo; el pico de corriente se reduce.
  • Para antes de invertir: pasar directamente de adelante a atrás lleva la corriente del motor al máximo; para 100–200 ms antes de cambiar de sentido.
  • Cables de potencia gruesos y cortos: no uses cables jumper ni protoboard entre la batería y el L298N; usa cable de al menos 0,5 mm² y borneras.
  • Alimentación separada: si el problema sigue, alimenta el Arduino con una powerbank y los motores con la batería, y une los dos GND.
Arduino (C++)
1// Yumuşak kalkış: ilk koddaki drive() ile kullan / soft start: use with drive() from the first sketch
2void rampTo(int target) {
3  for (int s = 60; s < target; s += 20) {
4    drive(s, s);
5    delay(15);              // yaklaşık 10 adımda tam hız / full speed in about 10 steps
6  }
7  drive(target, target);
8}
9
10// Kullanım: forward() yerine rampTo(SPEED) / usage: rampTo(SPEED) instead of forward()
Una forma fácil de saber si el problema es de alimentación o de código: desconecta el cable de VIN, alimenta el Arduino por USB desde el ordenador (deja la conexión de GND) y haz funcionar los motores con la batería. Si los reinicios desaparecen, el problema está sin duda en la alimentación. Conectar un multímetro entre VIN y GND y mirar la tensión cuando el coche arranca también muestra la caída directamente. Para otras causas, consulta Arduino se reinicia solo.

Coche robot con ESP32 y Raspberry Pi Pico

El ESP32 lleva Bluetooth clásico integrado, así que no necesitas el HC-05: la librería BluetoothSerial crea la misma conexión serie con el móvil y las apps de mando anteriores funcionan sin cambios. Las entradas del L298N consideran HIGH todo lo que supera unos 2,3 V, por lo que las señales de 3,3 V del ESP32 son suficientes. Alimenta la placa ESP32 desde la salida 5V del L298N a su pin 5V (VIN); no conectes la batería directamente a ese pin. Este código no compila en el ESP32-S3 ni en el ESP32-C3, porque solo tienen BLE.

Arduino (C++)
1#include "BluetoothSerial.h"
2
3BluetoothSerial bt;
4
5const int ENA = 25, IN1 = 27, IN2 = 33;   // sol motor / left motor
6const int ENB = 26, IN3 = 32, IN4 = 4;    // sağ motor / right motor
7
8int speed = 200;                          // 0-255
9unsigned long lastCmd = 0;
10
11void drive(int left, int right) {
12  digitalWrite(IN1, left > 0);  digitalWrite(IN2, left < 0);
13  digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
14  analogWrite(ENA, abs(left));
15  analogWrite(ENB, abs(right));
16}
17
18void setup() {
19  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
20  for (int p : pins) pinMode(p, OUTPUT);
21  drive(0, 0);
22  bt.begin("BlueGrays-Car");              // telefonda görünecek ad / name shown on the phone
23}
24
25void loop() {
26  if (bt.available()) {
27    char c = bt.read();
28    lastCmd = millis();
29    switch (c) {
30      case 'F': drive(speed, speed);   break;   // ileri / forward
31      case 'B': drive(-speed, -speed); break;   // geri / backward
32      case 'L': drive(-speed, speed);  break;   // yerinde sola / spin left
33      case 'R': drive(speed, -speed);  break;   // yerinde sağa / spin right
34      case 'S': drive(0, 0);           break;   // dur / stop
35      case 'q': speed = 255;           break;   // tam hız / full speed
36      default:
37        if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 100, 240);
38    }
39  }
40  if (millis() - lastCmd > 600) drive(0, 0);    // komut yoksa dur / no command: stop
41}

La Raspberry Pi Pico estándar no tiene Bluetooth, así que conectas el HC-05 a los pines de UART0. Como la Pico trabaja a 3,3 V, esta vez no hace falta divisor de tensión. Alimenta la Pico por el pin VSYS y el HC-05 directamente desde la salida 5V del L298N; funcionando con batería y sin USB, el pin VBUS no tiene tensión. En el código de la Pico la velocidad se indica en porcentaje de -100 a 100:

MicroPython
1from machine import Pin, PWM, UART
2import time
3
4bt = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))   # GP0 → HC-05 RXD, GP1 ← HC-05 TXD
5
6ena = PWM(Pin(15)); ena.freq(1000)                  # sol motor hızı / left motor speed
7enb = PWM(Pin(10)); enb.freq(1000)                  # sağ motor hızı / right motor speed
8in1, in2 = Pin(14, Pin.OUT), Pin(13, Pin.OUT)
9in3, in4 = Pin(12, Pin.OUT), Pin(11, Pin.OUT)
10
11def drive(left, right):                             # -100 … 100 (%)
12    in1.value(left > 0); in2.value(left < 0)
13    in3.value(right > 0); in4.value(right < 0)
14    ena.duty_u16(int(abs(left) * 655))
15    enb.duty_u16(int(abs(right) * 655))
16
17speed = 80
18last = time.ticks_ms()
19drive(0, 0)
20
21while True:
22    if bt.any():
23        c = bt.read(1)
24        last = time.ticks_ms()
25        if c == b'F':   drive(speed, speed)          # ileri / forward
26        elif c == b'B': drive(-speed, -speed)        # geri / backward
27        elif c == b'L': drive(-speed, speed)         # yerinde sola / spin left
28        elif c == b'R': drive(speed, -speed)         # yerinde sağa / spin right
29        elif c == b'S': drive(0, 0)                  # dur / stop
30        elif c == b'q': speed = 100                  # tam hız / full speed
31        elif c and 48 <= c[0] <= 57:                 # '0'…'9' hız kademesi / speed level
32            speed = 40 + (c[0] - 48) * 6
33    if time.ticks_diff(time.ticks_ms(), last) > 600:
34        drive(0, 0)                                  # komut yoksa dur / no command: stop

Siguientes pasos: mejora tu coche

  • Robot que esquiva obstáculos: añade delante un sensor de distancia HC-SR04 y un servomotor que lo gire a izquierda y derecha; los detalles en la guía Robot que esquiva obstáculos.
  • Robot seguidor de línea: coloca 2–3 sensores infrarrojos TCRT5000 bajo la parte delantera y sigue una línea negra en el suelo; consulta Robot seguidor de línea.
  • Mando con joystick: crea un mando de verdad, sin móvil, con un segundo Arduino, un módulo joystick y un nRF24L01.
  • Mando infrarrojo: conduce con los botones del mando de la tele; asigna los códigos de Receptor IR y mando a distancia a las órdenes de marcha.
  • Conducción por Wi-Fi: haz que un ESP32 sirva una página de mando que se abra en el navegador del móvil; la guía Servidor web ESP32 y WebSocket explica la base.
  • Encoders y distancia: con sensores de velocidad haz que el coche avance exactamente 1 metro y gire justo 90 grados; es la base de los robots que resuelven laberintos.
  • Brazo robótico: monta sobre el coche un pequeño brazo robótico con servos para transportar objetos.
HC-SR04
HC-SR04
TCRT5000
TCRT5000
SG90 servo
SG90 servo

Errores frecuentes y soluciones

  • No gira ningún motor: los GND no son comunes, el interruptor está apagado, se quitaron los jumpers de ENA y ENB pero no se conectaron los pines, o la batería está descargada.
  • El LED del L298N está encendido pero los motores solo zumban: el PWM está por debajo del umbral de arranque o la tensión de la batería es baja; sube la velocidad y carga la batería.
  • El código no se sube: puede que estén mal elegidos el puerto o la placa; si conectaste el HC-05 a los pines 0 y 1, desconéctalo al subir. Otras causas en No se puede subir el código a Arduino.
  • El móvil ve el HC-05 pero no se conecta: el módulo está conectado a otro móvil, la app no tiene el permiso de "dispositivos cercanos" o el PIN de emparejamiento es incorrecto.
  • El coche responde tarde: hay un delay() en loop() o se imprime demasiado en el Monitor Serie; haz las esperas con millis().
  • El disipador del L298N se calienta mucho: las ruedas están frenadas o, en un 4WD, la corriente por canal es excesiva; revisa el rozamiento mecánico.
  • El coche da un tirón al encenderlo: al arrancar, los pines están indefinidos durante un instante; configúralos como salidas y llama a drive(0, 0) en las primeras líneas de setup().

Un coche robot con Arduino es un punto de partida genial que enseña control de motores, gestión de la alimentación, comunicación inalámbrica y depuración en un solo proyecto. Al terminarlo tendrás una base que se vuelve un poco más lista con cada sensor nuevo. En la app BlueGrays encontrarás paso a paso, con esquemas y código, los proyectos de coche controlado por Bluetooth con L298N, robot que esquiva obstáculos y detección de suelo blanco y negro con TCRT5000.

Preguntas frecuentes

¿Qué se necesita para hacer un coche con Arduino y cuánto cuesta?

Para un coche Bluetooth básico bastan un kit de chasis 2WD (2 motores TT, ruedas y rueda loca), un Arduino Uno, un controlador L298N, un módulo Bluetooth HC-05, dos pilas 18650 con portapilas y algunos cables jumper. Los precios dependen del vendedor; los módulos son baratos y la mayor parte del presupuesto se va en la placa, el kit de chasis y las pilas con su cargador. Si ya tienes un kit de inicio, el coste baja bastante.

¿Qué batería usar en un coche robot con Arduino?

La mejor opción son dos pilas 18650 de litio en serie: dan 7,4 V, dejan 5–6 V a los motores tras la pérdida de unos 2 V del L298N y entregan la corriente alta que hace falta al arrancar. Una pila de 9 V no da suficiente corriente y provoca reinicios, y con 4 pilas AA los motores van lentos con el L298N.

¿Por qué mi coche Arduino no va recto?

Los motorreductores baratos giran a distinta velocidad incluso con el mismo PWM, y las ruedas flojas, la rueda loca y un peso mal repartido aumentan el desvío. Corrige primero lo mecánico y después frena un poco el motor más rápido con un valor de corrección (trim) en el código. Para ir perfectamente recto necesitas encoders que midan e igualen la velocidad de las dos ruedas.

¿Por qué se reinicia el Arduino cuando arrancan los motores?

Los motores piden varios amperios al arrancar y la tensión de una batería débil cae de golpe; el procesador del Uno se reinicia cuando su alimentación baja. Usa pilas 18650 cargadas, añade condensadores de 100 nF en los bornes de los motores y uno de 470–1000 µF en la entrada del L298N, y sube la velocidad poco a poco. Si sigue, alimenta el Arduino con otra fuente y une los GND.

¿Un coche Bluetooth con HC-05 funciona con iPhone?

No. El HC-05 y el HC-06 usan el perfil de puerto serie del Bluetooth clásico, e iOS no permite que las apps normales abran ese tipo de conexión. Para controlarlo con un iPhone necesitas un módulo BLE como el HM-10 o un ESP32 con BLE; los móviles Android se conectan al HC-05 sin problemas.

¿Puedo usar un shield de motores L293D en lugar del L298N?

Sí. El shield de motores L293D se coloca encima del Arduino Uno y puede controlar cuatro motores DC, lo que simplifica el cableado en coches 4WD. Pero su corriente continua es de solo unos 0,6 A por canal, así que se queda corto antes que el L298N cuando los motores se bloquean, y el shield ocupa muchos pines. Si buscas algo más eficiente, los controladores con MOSFET como el TB6612FNG pierden mucha menos tensión.

Ver todos los proyectos
Coche controlado por Bluetooth con L298N
#80Avanzado
Premium

Coche controlado por Bluetooth con L298N

Proyecto de coche robot 4WD (cuatro motores, tracción en las cuatro ruedas) que se puede controlar desde el teléfono con Arduino y el módulo Bluetooth HC-05. Un total de cuatro ruedas se accionan simu

5.0(38)
64
Robot para evitar obstáculos
#81Avanzado
Premium

Robot para evitar obstáculos

¿Qué le parece construir un vehículo inteligente que encuentre su propio camino? El Robot Evitador de Obstáculos explora constantemente su entorno gracias al sensor ultrasónico que lleva delante. Cuan

5.0(38)
49
Controlar un LED desde el móvil por Bluetooth
#34Principiante
Premium

Controlar un LED desde el móvil por Bluetooth

Proyecto de control inalámbrico que enciende y apaga LEDs con comandos enviados desde el teléfono con módulo Bluetooth HC-06. Enseña el intercambio de datos Bluetooth a través de la comunicación serie

4.8(68)
88
TCRT5000 Detección de superficie blanca y negra
#78Intermedio
Premium

TCRT5000 Detección de superficie blanca y negra

Proyecto que detecta el color del suelo con el sensor TCRT5000 y enciende el LED rojo en suelo negro y el LED verde en suelo blanco. Enseña la lógica de detección del umbral de color que constituye la

4.7(40)
49
Medición de distancia con TCRT5000
#77Intermedio
Premium

Medición de distancia con TCRT5000

Proyecto que mide la cantidad de luz reflejada por la superficie con el sensor infrarrojo TCRT5000 y la muestra como un valor analógico en la pantalla LCD I2C. Enseña los fundamentos de la detección ó

4.6(33)
43
HC-SR04 Medición de distancia (pantalla en serie)
#27Principiante

HC-SR04 Medición de distancia (pantalla en serie)

Sensor ultrasónico HC-SR04 para medir distancias y mostrar el resultado en cm en el monitor serie. Enseña el principio del cálculo de distancias con ondas sonoras.

4.6(44)
66
Sensor de aparcamiento con HC-SR04
#28Intermedio
Premium

Sensor de aparcamiento con HC-SR04

Proyecto de sensor de aparcamiento con sensor HC-SR04 que aumenta la frecuencia del pitido del zumbador a medida que se acerca el objeto y avisa con un LED. Enseña lógica de retroalimentación proporci

4.8(64)
83
Uso del servomotor
#35Principiante
Premium

Uso del servomotor

Proyecto de uso básico que posiciona el servomotor en ángulos de 0°, 90° y 180° en secuencia. Enseña la biblioteca de servomotores y la lógica de control de ángulos.

4.7(48)
66