Proyecto Arduino: del sensor al coche robot Parte 1

Presentación del proyecto

En este proyecto aprenderás a utilizar los componentes que más adelante formarán parte de un coche robot de cuatro motores.

Antes de construir el coche completo, trabajaremos por etapas para comprender qué hace cada componente, cómo se conecta y cómo se controla desde un programa.

El proyecto se divide en dos partes:

ParteQué vamos a trabajarResultado
Parte 1. Medir y observar el entornoSensor de ultrasonidos, servomotor y combinación de ambosUn escáner que mide distancias en distintas direcciones
Parte 2. Controlar el movimientoMotores DC, controlador L293D y combinación con el sensorUn montaje de banco que detiene los motores ante un obstáculo

En la primera parte no conectaremos motores DC ni el controlador L293D. El servomotor se utilizará para orientar el sensor.

El coche completo será una fase posterior. En estas dos partes nos centraremos en comprender y comprobar sus componentes.

Objetivos generales

Al finalizar el proyecto deberás ser capaz de:

  • Identificar los cables y conexiones de cada componente.
  • Distinguir entre un sensor y un actuador.
  • Medir distancias con un HC-SR04.
  • Colocar un servo en diferentes posiciones.
  • Combinar el servo y el sensor para observar distintas direcciones.
  • Controlar el sentido y la velocidad de motores DC mediante un L293D.
  • Utilizar una lectura del sensor para tomar una decisión.
  • Documentar los montajes y explicar los resultados.

Forma de trabajo

En cada práctica seguirás este proceso:

  1. Comprender: lee qué hace el componente y para qué sirve.
  2. Predecir: escribe qué esperas que ocurra.
  3. Montar: realiza las conexiones con la alimentación desconectada.
  4. Programar: introduce el código y súbelo al Arduino.
  5. Comprobar: observa el resultado y registra las pruebas.
  6. Modificar: cambia una parte del programa y explica su efecto.

No basta con conseguir que el montaje funcione. Debes poder explicar por qué funciona.


Parte 1. Medir y observar el entorno

Material necesario

  • Arduino Uno R3 y cable USB.
  • Sensor de ultrasonidos HC-SR04.
  • Servomotor de posición SG90 o similar.
  • Fuente regulada de 5 V adecuada para el servo.
  • Cables y protoboard.
  • Regla o cinta métrica.
  • Una caja o superficie plana para realizar las mediciones.
  • Un soporte ligero para colocar el sensor sobre el servo.

Preparación del entorno

Antes de comenzar:

  1. Abre Arduino IDE.
  2. Selecciona la placa Arduino Uno.
  3. Selecciona el puerto al que está conectado el Arduino.
  4. Crea un programa diferente para cada práctica.
  5. Guarda los programas con estos nombres:
01_ultrasonidos
02_servo
03_escaner

Mapa de conexiones de esta parte

ComponenteConexión al Arduino
HC-SR04: VCC5V
HC-SR04: GNDGND
HC-SR04: TRIGD12
HC-SR04: ECHOD13
Señal del servoD9
Alimentación del servoFuente externa regulada de 5 V
GND de la fuente del servoUnido al GND del Arduino

Práctica 1. Medir distancias con ultrasonidos

Qué vamos a aprender

El HC-SR04 permite medir la distancia hasta un objeto.

Para hacerlo:

  1. El Arduino envía una orden por el pin TRIG.
  2. El sensor emite una señal ultrasónica.
  3. La señal rebota en el objeto.
  4. El sensor comunica por ECHO el tiempo asociado al recorrido.

Como el sonido viaja hasta el objeto y vuelve, debemos dividir el recorrido entre dos.

Conexiones

Pin del HC-SR04Arduino Uno
VCC5V
GNDGND
TRIGD12
ECHOD13

Comprueba los nombres impresos en el sensor antes de conectar los cables.

Montaje paso a paso

  1. Desconecta el cable USB del Arduino.
  2. Conecta VCC a 5V.
  3. Conecta GND a GND.
  4. Conecta TRIG a D12.
  5. Conecta ECHO a D13.
  6. Coloca el sensor de forma que sus dos cápsulas apunten hacia la zona que quieres medir.
  7. Revisa las conexiones antes de conectar el USB.

Programa

const byte TRIG = 12;
const byte ECHO = 13;

float medirCm() {
  // Preparar el disparo.
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);

  // Enviar el pulso de disparo.
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  // Esperar el eco, con un límite de tiempo.
  unsigned long tiempo = pulseIn(ECHO, HIGH, 30000UL);

  // Un resultado de cero significa que no llegó el eco.
  if (tiempo == 0) {
    return -1.0;
  }

  // Convertir el tiempo en distancia.
  return tiempo * 0.0343 / 2.0;
}

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  Serial.begin(9600);
}

void loop() {
  float distancia = medirCm();

  if (distancia < 0) {
    Serial.println("Sin eco");
  } else {
    Serial.print("Distancia: ");
    Serial.print(distancia, 1);
    Serial.println(" cm");
  }

  delay(100);
}

Cómo comprobarlo

  1. Sube el programa.
  2. Abre el Monitor serie a 9600 baudios.
  3. Coloca una caja plana aproximadamente a 10 cm.
  4. Mide la distancia real con una regla.
  5. Repite a 20 y 40 cm.
  6. Inclina la caja y observa si cambia la lectura.
  7. Retira el objeto y observa qué sucede.

Tabla de resultados

Distancia medida con reglaLectura del sensorDiferencia
10 cm
20 cm
40 cm

Resultado esperado

La distancia mostrada cambia al mover el objeto.

Cuando no se recibe el eco dentro del tiempo de espera, aparece «Sin eco». Esto no significa que el objeto esté a cero centímetros.

Modificación obligatoria

Modifica el programa para que, además de la distancia, muestre:

  • «Objeto cercano» cuando la distancia sea de 20 cm o menos.
  • «Objeto alejado» cuando supere los 20 cm.
  • «Sin eco» cuando no exista una lectura.

Preguntas

  1. ¿Qué función tiene TRIG?
  2. ¿Qué función tiene ECHO?
  3. ¿Por qué dividimos entre dos?
  4. ¿Por qué una superficie inclinada puede afectar a la lectura?
  5. ¿Por qué no debemos interpretar «Sin eco» como cero centímetros?

Práctica 2. Controlar la posición de un servo

Qué vamos a aprender

Un servo de posición permite mover su eje hasta un ángulo determinado.

Lo utilizaremos para orientar el sensor de ultrasonidos hacia diferentes direcciones.

Este servo recibe una orden de posición. Su funcionamiento es distinto al de los motores DC que harán girar las ruedas.

Conexiones

Cable del servoConexión
Señal, normalmente naranja o amarilloD9 del Arduino
RojoPositivo de la fuente regulada de 5 V
Marrón o negroGND de la fuente
GND de la fuenteGND del Arduino

Comprueba los colores y las características de tu modelo.

La masa de la fuente y la del Arduino deben estar unidas.

Montaje paso a paso

  1. Desconecta todas las alimentaciones.
  2. Conecta la señal del servo a D9.
  3. Conecta los cables de alimentación del servo a su fuente.
  4. Une el GND de la fuente con el GND del Arduino.
  5. Coloca el servo sobre una superficie estable.
  6. Revisa las conexiones.
  7. Conecta el Arduino y sube el programa.

Programa

#include <Servo.h>

Servo giro;
const byte PIN_SERVO = 9;

void setup() {
  giro.attach(PIN_SERVO);

  // Comenzar en la posición central.
  giro.write(90);
  delay(1000);
}

void loop() {
  giro.write(30);
  delay(1000);

  giro.write(90);
  delay(1000);

  giro.write(150);
  delay(1000);
}

Cómo comprobarlo

  1. Observa el movimiento entre las tres posiciones.
  2. Comprueba que el brazo no choque con ningún objeto.
  3. No fuerces el eje con la mano.
  4. Cambia las posiciones a 45°, 90° y 135°.
  5. Cambia los tiempos de espera y observa la diferencia.

Tabla de resultados

Ángulo solicitadoPosición observadaObservaciones
30°
90°
150°

Resultado esperado

El servo se coloca sucesivamente en las posiciones indicadas.

Los ángulos del programa son órdenes de posición; la posición física exacta depende del servo y de cómo se haya colocado su brazo.

Modificación obligatoria

Crea una secuencia que:

  1. Comience a 90°.
  2. Se mueva a 45°.
  3. Regrese a 90°.
  4. Se mueva a 135°.
  5. Regrese a 90°.

Espera un segundo entre posiciones.

Preguntas

  1. ¿Para qué sirve el cable de señal?
  2. ¿Qué hace attach()?
  3. ¿Qué hace write()?
  4. ¿Por qué unimos las masas?
  5. ¿Qué diferencia existe entre un servo de posición y un motor DC de una rueda?

Práctica 3. Construir un escáner de distancias

Qué vamos a aprender

Combinaremos los dos montajes anteriores.

El servo orientará el HC-SR04 hacia distintas posiciones y el Arduino realizará una medición en cada una.

El resultado será un pequeño escáner del entorno.

Conexiones

Mantén las conexiones de las prácticas anteriores:

ElementoConexión
HC-SR04 VCC5V del Arduino
HC-SR04 GNDGND del Arduino
HC-SR04 TRIGD12
HC-SR04 ECHOD13
Señal del servoD9
Alimentación del servoFuente externa regulada de 5 V
GND de la fuenteGND del Arduino

Montaje paso a paso

  1. Lleva el servo a 90° con un programa de prueba.
  2. Desconecta las alimentaciones.
  3. Fija el sensor sobre el brazo del servo mediante un soporte ligero.
  4. Deja holgura en los cables del sensor.
  5. Comprueba que puede moverse entre 30° y 150° sin tirar de los cables.
  6. Combina las conexiones.
  7. Sube el programa.

Programa

#include <Servo.h>

Servo giro;

const byte PIN_SERVO = 9;
const byte TRIG = 12;
const byte ECHO = 13;

float medirCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long tiempo = pulseIn(ECHO, HIGH, 30000UL);

  if (tiempo == 0) {
    return -1.0;
  }

  return tiempo * 0.0343 / 2.0;
}

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  Serial.begin(9600);

  giro.attach(PIN_SERVO);
  giro.write(90);
  delay(600);
}

void loop() {
  const byte angulos[] = {30, 90, 150, 90};

  for (byte i = 0; i < 4; i++) {
    giro.write(angulos[i]);

    // Esperar a que termine el movimiento antes de medir.
    delay(500);

    float distancia = medirCm();

    Serial.print("Angulo: ");
    Serial.print(angulos[i]);
    Serial.print(" grados | ");

    if (distancia < 0) {
      Serial.println("Sin eco");
    } else {
      Serial.print(distancia, 1);
      Serial.println(" cm");
    }

    delay(100);
  }
}

Cómo comprobarlo

  1. Abre el Monitor serie a 9600 baudios.
  2. Coloca objetos en distintas direcciones.
  3. Observa la distancia asociada a cada ángulo.
  4. Anota qué ángulo corresponde físicamente a izquierda, centro y derecha en tu montaje.
  5. Cambia la posición de los objetos y repite.

Tabla de resultados

ÁnguloDirección físicaDistanciaLectura válida
30°
90°
150°

Resultado esperado

El sensor se orienta hacia varias posiciones y muestra una distancia asociada a cada una.

Modificación obligatoria

Modifica el programa para guardar las lecturas de las tres posiciones y mostrar cuál tiene mayor distancia entre las lecturas válidas.

Si ninguna lectura es válida, debe mostrar:

No se puede determinar la dirección más despejada.

Preguntas

  1. ¿Por qué esperamos después de mover el servo?
  2. ¿Por qué debemos relacionar cada distancia con su ángulo?
  3. ¿Podemos considerar que una dirección sin eco está necesariamente libre?
  4. ¿Cómo podría utilizar esta información el futuro coche?

Entrega de la parte 1

Entrega una carpeta comprimida con:

parte_1/
├── README.md
├── imagenes/
├── 01_ultrasonidos/
├── 02_servo/
└── 03_escaner/

En el README.md incluye:

  • Explicación de las tres prácticas.
  • Fotografías y conexiones.
  • Tablas de resultados.
  • Respuestas a las preguntas.
  • Modificaciones realizadas.
  • Una conclusión sobre cómo funciona el escáner.