COCHE CONTROL REMOTO

Construir un coche con Arduino que pueda ser dirigido con un mando a distancia por infrarrojos.

Funcionamiento

El coche lleva instalado un Módulo TSOP que recibe las señales que envía el emisor infrarrojo del mando a distancia. Este módulo pasa la señal a Arduino, que se encargará de procesarla y generar el movimiento correspondiente en el vehículo.

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

1 Hoja Técnica H1405

Construcción de la plataforma y conexión de los motores

Conexión del módulo tsop

El módulo TSOP esta formado por 3 pines que conectaremos a:

–  5V de Arduino
–  GND
–  Señal 11 PWM

Cuando realizamos una lectura de los datos, la lectura del pin 11 nos devolverá un valor numérico. El modelo de mando a distancia con el que hemos hecho este ejemplo asocia cada botón a los siguientes códigos numéricos:

– Flecha arriba : 24
– Flecha abajo : 82
– Flecha derecha : 90
– Flecha izquierda : 8
– Botón central OK: 28

 

Programación

Para programar este modelo de coche es necesario instalar en Arduino IDE la librería IRremote. 

  • Pulsa en el menú Herramientas > gestionar bibliotecas
  • En el buscador introduce IRremote. Selecciona «IRremote by shirriff» y pulsa en Instalar.

Ya podemos empezar a programar.

Es posible que los códigos que recibe el coche del mando varíen con respecto al programa de esta documentación. Es recomendable revisar los códigos realizando lecturas y visualizaciones a través del monitor del puerto serie.

El siguiente programa lee los códigos recibidos por el TSOP conectado al pin 11 y los muestra en el puerto serie:

#include <IRremote.h>


const byte IR_RECEIVE_PIN = 11;


void setup()
{
  pinMode(IR_RECEIVE_PIN, INPUT);
  Serial.begin(9600);
}


void loop() {
  if (IrReceiver.decode())
  {
    int value = IrReceiver.decodedIRData.command;
    Serial.println(value, DEC);
    IrReceiver.resume();
    delay(500);
  }
}

Sube el código a tu placa Arduino y accede al monitor serie (en el menú herramientas). A continuación pulsa cada botón del mando a distancia y anota el código que se muestra en el monitor serie para cada botón. Necesitarás esos códigos para controlar el coche.

En el siguiente programa, el TSOP lee los códigos que recibe del mando a distancia. Utilizando un conjunto de condicionales, se comprueba qué código se ha recibido, y en función de su valor se opta por mover los motores para que el coche avance o gire. Utiliza los códigos que viste en el monitor serie para adaptar el siguiente programa a tu proyecto:

#include <IRremote.h>

 

const byte IR_RECEIVE_PIN = 11;

 

int motor1Avance = 6; // usamos un pin de salida al motor
int motor1Atras = 5;  // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor
int value=0;

 

void setup()
{
   Serial.begin(9600);
   Serial.println(«IR Receive test»);
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

 

//definimos los pines de los motores como salidas
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);  
  pinMode(motor2Avance, OUTPUT);  
  pinMode(motor2Atras, OUTPUT);

 

//La plataforma móvil LOG 8080 comienza en estado parada  
  analogWrite(motor1Avance, 0);
  analogWrite(motor1Atras, 0);
  analogWrite(motor2Avance, 0);
  analogWrite(motor2Atras, 0);
}

 

void loop() {  

 

  if (IrReceiver.decode())
  {
      value = IrReceiver.decodedIRData.command;
      Serial.println(value, DEC);
     
      IrReceiver.resume();

 

// Si el dato recibido es 24, corresponde a la flecha avance  

 

if (value==24){
        Serial.println(«delante»); // el coche avanza
        analogWrite(motor1Avance, 255);
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 255);
        analogWrite(motor2Atras, 0);
       
       }
       
// si el dato recibido es 28, corresponde con el botón central ok (parar)

 

      if (value==28){
        Serial.println(«parar»);
        analogWrite(motor1Avance, 0); // El coche se para
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 0);
        analogWrite(motor2Atras, 0);
       }

 

//si el dato recibido es 82,corresponde con la flecha abajo

 

  if (value==82){
        Serial.println(«atras»);
        analogWrite(motor1Avance, 0); // El coche retrocede

 

        analogWrite(motor1Atras, 255);
        analogWrite(motor2Avance, 0);
        analogWrite(motor2Atras, 255);
       }
//si el dato recibido es 8, corresponde con la flecha izquierda

 

    if (value==8){
        Serial.println(«IZQUIERDA»);
        analogWrite(motor1Avance, 100); // El coche gira a la izquierda
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 250);
        analogWrite(motor2Atras, 0);
       }

 

//si el dato recibido es 90, corresponde con la flecha derecha

 

   if (value==90){
        Serial.println(«DERECHA»);
        analogWrite(motor1Avance, 250); // El coche gira a la derecha
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 100);
        analogWrite(motor2Atras, 0);
       }
  }
}

Calibración

En los programas el control de los motores se realiza a través del envío de señales analógicas a los pares de salidas 5-6 y 9-10. Cada motor está controlado por dos pines de la tarjeta controladora, y cada pin determinará el sentido de giro del motor, permitiendo que el robot circule de frente o marcha atrás. Estos pines serán tratados como señales analógicas, enviándoles datos de 0 a 255 para poder controlar la velocidad del motor.

Si en ambas salidas enviamos un 0, el coche se parará.

La lógica nos dice que para que el coche circule en línea recta habrá que enviar a ambas salidas el mismo dato (mayor que 0). Si hacemos la prueba observamos que el coche tiende a girar en un determinado sentido. Esto es debido a la imprecisión de este tipo de motores. La mejor solución es regular la velocidad por programación enviando a un motor una señal ligeramente inferior con respecto al otro motor.

Para que el coche gire en un sentido, disminuiremos notablemente la velocidad de uno de los motores (enviando un dato de valor inferior a su salida de Arduino) provocando el giro gracias a la diferencia de velocidad entre ambos motores.

En cuanto al sentido de giro de los motores, éste viene controlado por las conexiones al puente H. Si observamos que cada rueda gira en un sentido, tendremos que modificar el cableado. Por ejemplo si tenemos los motores conectados a las salidas 1 y 3 del puente H y cada motor gira en un sentido, tendremos que cambiar uno de los motores y, o bien pasarle de la salida 1 a la 2, o sino de la salida 3 a la 4.

 

Detalles de tipo práctico

Necesita 4 pilas R6 de 1,5 V, 1 pila 6F22 de 9 V y 1 pila botón CR2025.

Tiempo de construcción: 6 H.

Nivel: Difícil

Pruebas

 

– Aumentar o disminuir la velocidad de los motores

COCHE SEGUIDOR DE LUZ

Programamos el coche para que avance recto pero si detecta una notable diferencia de luz entre sus LDR, gira en dirección a la luz.

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

1 Hoja Técnica H1404

Construcción de la plataforma y conexión de los motores

Sensores de luz

Atornilla los sensores de luz en la parte delantera del coche y realiza las siguientes conexiones:

Sensor 1

+

S

 

5 V
GND
A0

Sensor 2

+

S

 

3,3 V
GND
A1

Pegar la placa board LOG 885 en la parte superior de la plataforma, como se indica en el dibujo.

El cometido de este vehículo es avanzar hacia una fuente de luz. Para detectar esa luz se han colocado en su frontal dos sensores basados en resistencias LDR. Estas resistencias están conectadas a dos entradas analógicas de la tarjeta Arduino (A1 y A2) y son alimentadas por la salida de 5V de su propia tarjeta.

 

Programación

El programa que se ha planteado lee la señal generada por las LDR y se dirige en la dirección de la LDR que mayor luz detecte.

int motor1avance = 5;
int motor1atras = 6;
int motor2avance=9;
int motor2atras=10;
void setup() {
  pinMode(motor1avance, OUTPUT);
  pinMode(motor2avance, OUTPUT);
  pinMode(motor1atras, OUTPUT);
  pinMode(motor2atras, OUTPUT);
  analogWrite(motor2atras, 0);
  analogWrite(motor1atras, 0);
}
void loop() {
  if(analogRead(A0)>(analogRead(A5)+100)){
    analogWrite(motor1avance,100);
    analogWrite(motor2avance,200);
  }
  else{
    if(analogRead(A5)>(analogRead(A0)+100)){
      analogWrite(motor1avance,200);
      analogWrite(motor2avance,100);
    }
    else{
      analogWrite(motor1avance,100);
      analogWrite(motor2avance,100);
    }

  }
}

Calibración

Si el coche no responde correctamente, es probable que se deba a que el aula está muy iluminada y no llega a detectar nunca una diferencia entre las dos LDR de 100 unidades.

Puede ser útil realizar un pequeño programa que lea los valores de las LDR y los muestre por el puerto serie. Así podrás iluminar y tapar cada LDR para ver qué diferencia de valores hay entre ellas y ajustar el rango dentro del condicional. 

Por ejemplo, introduce el siguiente programa en la placa Arduino:

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print(«A0 = «);
  Serial.println(analogRead(A0));
  Serial.print(«A5 = «);
  Serial.println(analogRead(A5));
  delay(500);
}

Prueba a iluminar las LDRs con una linterna o a taparlas para darles sombra. En función de los valores leídos, decide si 100 es suficiente rango de diferencia o si debes subir o bajar este valor para que el robot funcione correctamente.

COCHE EXPLORADOR

Con un mismo montaje el vehículo puede realizar dos funciones:

– Busca un oponente y lo empuja (lucha de sumo)
– Circula evitando obstáculos (laberinto/explorador)

Funcionamiento

El coche dispone de un sensor ultrasónico que envía una señal a la tarjeta Arduino cuando detecta un objeto a una cierta distancia. Esta señal la utilizará la tarjeta para valorar si acudir hacia el objeto o cambiar su dirección según la función que estemos programando (sumo o explorador).

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

1 Hoja Técnica H1403

Construcción de la plataforma y conexión de los motores

Conexión del sensor ultrasonido

El sensor ultrasonido dispone de 4 pines:

  •  VCC: se conecta a la salida de 5V de la tarjeta Arduino.
  • GND: se conecta a una toma tierra (gnd) de la tarjeta Arduino.
  • TRIG: se conecta a un pin digital de la tarjeta Arduino y su función será pedir al sensor que lance un pulso de sonido.
  • ECHO: se conecta a un pin digital de la tarjeta Arduino y su función será medir el tiempo que tarda el pulso de sonido en llegar a un obstáculo.

 

Programación

int pinSondeo = 12;
int pinEcho = 11;
int motor1Avance = 5; // Conexión del sistema motriz LOG 49
int motor1Atras = 6; // Conexión del sistema motriz LOG 49
int motor2Avance = 9; // Conexión del sistema motriz LOG 49
int motor2Atras = 10; // Conexión del sistema motriz LOG 49
void setup() {
  Serial.begin (9600);
  pinMode(pinSondeo, OUTPUT);
  pinMode(pinEcho, INPUT);
  pinMode(motor1Avance, OUTPUT); //Declara pin de Salida
  pinMode(motor1Atras, OUTPUT); //Declara pin de Salida
  pinMode(motor2Avance, OUTPUT); //Declara pin de Salida
  pinMode(motor2Atras, OUTPUT); //Declara pin de Salida
  }
void loop() {
  long duration, distance;
  digitalWrite(pinSondeo, LOW);
  delayMicroseconds(2);
  digitalWrite(pinSondeo, HIGH); //envía pulso de luz
  delayMicroseconds(10);
  digitalWrite(pinSondeo, LOW);
  duration = pulseIn(pinEcho, HIGH); //recibe el tiempo de desplazamiento
  Serial.println(«Duration»);
  Serial.println(duration);
  distance = (duration/2) / 29.1; //Constante para calcular distancia
  if (distance < 50) { //si estamos cerca del objeto
    analogWrite(motor1Avance, 0); // los motores se detienen
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 0);
    analogWrite(motor2Atras, 0);
    int direccion = random(1, 3); //seleccionamos una dirección aleatoria
    Serial.println(direccion);
    if (direccion==1){
      Serial.println(«derecha»); // la plataforma gira a la derecha
      analogWrite(motor1Avance, 0);
      analogWrite(motor1Atras, 150);
      analogWrite(motor2Avance, 100);
      analogWrite(motor2Atras, 0);
    }
    else{
      Serial.println(«izquierda»); // la plataforma gira a la izquierda
      analogWrite(motor1Avance, 100);
      analogWrite(motor1Atras, 0);
      analogWrite(motor2Avance, 0);
      analogWrite(motor2Atras, 150);
    }
    delay(500);
    analogWrite(motor1Avance, 0); // la plataforma se detiene
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 0);
    analogWrite(motor2Atras, 0);
  }
  else{
    analogWrite(motor1Avance, 150); // la plataforma avanza recto
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 125);
    analogWrite(motor2Atras, 0);
    Serial.println(«avanzo, campo libre»);
  }
}

Calibrar

– En los programas, el control de los motores se realiza a través del envío de señales analógicas a los pares de salidas 5-6 y 9-10. Cada motor está controlado por dos pines de la tarjeta controladora, y cada pin determinará el sentido de giro del motor, permitiendo que el robot circule de frente o marcha atrás. Estos pines serán tratados como señales analógicas, enviándoles datos de 0 a 255 para poder controlar la velocidad del motor.

– Si en ambas salidas enviamos un 0, el coche se parará.

– La lógica nos dice que para que el coche circule en línea recta habrá que enviar a ambas salidas el mismo dato (mayor que 0). Si hacemos la prueba observamos que el coche tiende a girar en un determinado sentido. Esto es debido a la imprecisión de este tipo de motores. La mejor solución es regular la velocidad por programación enviando a un motor una señal ligeramente inferior con respecto al otro motor.

– Para que el coche gire en un sentido, disminuiremos notablemente la velocidad de uno de los motores (enviando un dato de valor inferior a su salida de Arduino) provocando el giro gracias a la diferencia de velocidad entre ambos motores.

– En cuanto al sentido de giro de los motores, éste viene controlado por las conexiones al puente H. Si observamos que cada rueda gira en un sentido, tendremos que modificar el cableado. Por ejemplo si tenemos los motores conectados a las salidas 1 y 3 del puente H y cada motor gira en un sentido, tendremos que cambiar uno de los motores y o bien pasarle de la salida 1 a la 2 o sino de la salida 3 a la 4.

Detalles de tipo práctico

– Desconectar la alimentación del controlador de motores L298N cuando no se esté utilizando para no gastar las pilas.

– Necesita 4 pilas R6 de 1,5 V y 1 pila 6F22 de 9 V.

– Tiempo de construcción: 6 H.

– Nivel: Difícil

Pruebas

– Aumentar o disminuir la velocidad de los motores

COCHE SUMO

Con un mismo montaje el vehículo puede realizar dos funciones:

– Busca un oponente y lo empuja (lucha de sumo)
– Circula evitando obstáculos (laberinto/explorador)

Funcionamiento

El coche dispone de un sensor ultrasónico que envía una señal a la tarjeta Arduino cuando detecta un objeto a una cierta distancia. Esta señal la utilizará la tarjeta para valorar si acudir hacia el objeto o cambiar su dirección según la función que estemos programando (sumo o explorador).

Lista de materiales

1 Bola de rodadura LOG 36

2 Ruedas 4 en 1 LOG 46

1 Perfil de aluminio LOG 260

4 Tornillos M3 x 10 mm LOG 464

8 Tornillos M3 x 16 mm LOG 464M

4 Tornillos M4x 10 mm LOG 466

2 Tornillos de M2 x 10 mm LOG 474P

2 Tuercas de M2 LOG 480P

12 Tuercas M3 LOG 480

4 Tuercas M4 LOG 481

1 Portapilas plano 4xR6 LOG 534E

1 Controlador de motores L298N LOG 8444

1 Sensor ultrasónico HC-SR04 LOG 8446

1 Conector 9V para Arduino LOG 7734

1 Latiguillo M-M LOG S7519

8 Latiguillos M-H largos LOG S7518

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

2 Micro reductoras con cable LOG S13R200

1 Hoja Técnica H1403

Construcción de la plataforma y conexión de los motores

Conexión del sensor ultrasonido

El sensor ultrasonido dispone de 4 pines:

  •  VCC: se conecta a la salida de 5V de la tarjeta Arduino.
  • GND: se conecta a una toma tierra (gnd) de la tarjeta Arduino.
  • TRIG: se conecta a un pin digital de la tarjeta Arduino y su función será pedir al sensor que lance un pulso de sonido.
  • ECHO: se conecta a un pin digital de la tarjeta Arduino y su función será medir el tiempo que tarda el pulso de sonido en llegar a un obstáculo.
 

 

Programación

int pinSondeo = 12; // Pin para activar el sensor LOG 8446
int pinEcho = 11; // valor del sensor de ultrasonidos LOG 8446
int motor1Avance = 5; // pin para el sistema motriz LOG 49
int motor1Atras = 6; // pin para el sistema motriz LOG 49
int motor2Avance = 9; // pin para el sistema motriz LOG 49
int motor2Atras = 10; // pin para el sistema motriz LOG 49
void setup() {
  Serial.begin (9600);
  pinMode(pinSondeo, OUTPUT);
  pinMode(pinEcho, INPUT);
  pinMode(motor1Avance, OUTPUT); //pin de motores en modo salida
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);
}
void loop() {
  long duration, distance;
  digitalWrite(pinSondeo, LOW);
  delayMicroseconds(2);
  digitalWrite(pinSondeo, HIGH); //envío de pulso de luz
  delayMicroseconds(10);
  digitalWrite(pinSondeo, LOW);
  duration = pulseIn(pinEcho, HIGH); //lectura del tiempo que tardó
  Serial.println(«Duration»);
  Serial.println(duration);
  distance = (duration/2) / 29.1; //calcula la distancia
  if (distance<20){
    analogWrite(motor2Avance, 200);
    analogWrite(motor2Atras, 0);
    analogWrite(motor1Avance, 200);
    analogWrite(motor1Atras, 0);

  }
  else{
    analogWrite(motor2Avance, 200);
    analogWrite(motor2Atras, 0);
    analogWrite(motor1Avance, 0);
    analogWrite(motor1Atras, 200);
    Serial.println(«Buscando»);
  }
}

Calibración

– En los programas, el control de los motores se realiza a través del envío de señales analógicas a los pares de salidas 5-6 y 9-10. Cada motor está controlado por dos pines de la tarjeta controladora, y cada pin determinará el sentido de giro del motor, permitiendo que el robot circule de frente o marcha atrás. Estos pines serán tratados como señales analógicas, enviándoles datos de 0 a 255 para poder controlar la velocidad del motor.

– Si en ambas salidas enviamos un 0, el coche se parará.

– La lógica nos dice que para que el coche circule en línea recta habrá que enviar a ambas salidas el mismo dato (mayor que 0). Si hacemos la prueba observamos que el coche tiende a girar en un determinado sentido. Esto es debido a la imprecisión de este tipo de motores. La mejor solución es regular la velocidad por programación enviando a un motor una señal ligeramente inferior con respecto al otro motor.

– Para que el coche gire en un sentido, disminuiremos notablemente la velocidad de uno de los motores (enviando un dato de valor inferior a su salida de Arduino) provocando el giro gracias a la diferencia de velocidad entre ambos motores.

– En cuanto al sentido de giro de los motores, éste viene controlado por las conexiones al puente H. Si observamos que cada rueda gira en un sentido, tendremos que modificar el cableado. Por ejemplo si tenemos los motores conectados a las salidas 1 y 3 del puente H y cada motor gira en un sentido, tendremos que cambiar uno de los motores y o bien pasarle de la salida 1 a la 2 o sino de la salida 3 a la 4.

Detalles de tipo práctico

– Desconectar la alimentación del controlador de motores L298N cuando no se esté utilizando para no gastar las pilas.

– Necesita 4 pilas R6 de 1,5 V y 1 pila 6F22 de 9 V.

– Tiempo de construcción: 6 H.

– Nivel: Difícil

Pruebas

– Aumentar o disminuir la velocidad de los motores

COCHE BLUETOOTH

Construimos un coche cuyos movimientos controlamos por Bluetooth.

Funcionamiento

El circuito del coche contiene un dispositivo bluetooth que permite su comunicación con cualquier móvil. Utilizando una app de control bluetooth para Arduino, podrás dirigir el coche con un móvil Android. La app envía una serie de códigos a la placa Arduino y ésta interpreta los códigos generando el movimiento deseado en los motores.

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

1 Hoja Técnica H1402

Construcción de la plataforma y conexión de los motores

Conexión del módulo bluetooth

El módulo bluetooth es el encargado de la comunicación entre la tarjeta Arduino y el dispositivo móvil con el que controlaremos el coche.

El módulo bluetooth tiene 4 pines:

– GND: Se conecta a un pin GND de Arduino
– V: Se conecta al pin 5V del controlador de motores
– TXD: Se conecta al pin RX de Arduino
– RXD: Se conecta al pin TX de Arduino

Los pines TX y RX son los que se van a encargar de la transmisión y recepción de datos.

APP de control

Para controlar el coche, encontrarás en Google Play numerosas aplicaciones libres para controlar una placa Arduino por bluetooth. Todas ellas se conectarán al coche a través del módulo bluetooth conectado a Arduino. 

Cuando la app intente conectar con el bluetooth del coche, localizará un dispositivo con identificador «HC-06». Al emparejar te solicitará un código, introduce «1234«.

El interface de la aplicación, mostrará una serie de botones emulando un mando a distancia. Al presionar cada botón, éste enviará a la placa Arduino un código. Cuando la placa recibe el código, debe interpretar qué botón se ha pulsado y presionar los botones correspondientes.

Cada aplicación enviará los códigos que su programador haya estimado conveniente, por lo que siempre debemos empezar realizando una lectura por el puerto serie de estos códigos.

Cuando hayas elegido una app, introduce en tu coche el siguiente programa:

A continuación sigue estos pasos:

  1. Desconecta los latiguillos de los pines 0 y 1 de la placa Arduino
  2. Sube el programa a la placa.
  3. Conecta los latiguillos de los pines 0 y 1
  4. Abre el monitor serie de Arduino IDE
  5. Conecta la app que has instalado en el móvil.
  6. Empareja el bluetooth de la app y del coche
  7. Elige qué botón se encargará de controlar cada movimiento del coche: avanzar, parar, girar a la derecha, girar a la izquierda, retroceder
  8. Pulsa cada botón de la app y anota los códigos que se reciben por el puerto serie para cada botón.
Estos códigos los necesitarás para programar la placa Arduino

Programación

Al realizar la programación de la placa, el programa lee el código que envía la app al presionarse un botón y en función del valor del código, activa los motores para que el coche se mueva en una u otra dirección. Revisa los códigos de los condicionales y cámbialos por los códigos del los botones de app que has elegido tu.

Para programar el módulo bluetooth debes añadir la extensión «Bluetooth Serial». Pulsa en extensiones y en el buscador introduce el nombre de la extensión. a continuación pulsa en el símbolo «+» y agrega la extensión. Aparecerá una nueva sección con bloques para el envío y recepción de datos.

Recuerda desconectar los latiguillos de los pines 1 y 0 antes de subir el programa. Una vez subido, vuelve a conectarlos.

 int motor1Avance = 5; // usamos un pin de salida al motor
int motor1Atras = 6; // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor
int estado = 0;
void setup() {
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);
  analogWrite(motor1Avance, 0);
  analogWrite(motor1Atras, 0);
  analogWrite(motor2Avance, 0);
  analogWrite(motor2Atras, 0);
  Serial.begin(9600);
}
void loop() {
  if(Serial.available() > 0){
    estado = Serial.read();
  }
  Serial.println(estado); // código recibido al pulsar un botón de la app
  if (estado == 52)  
  {
    analogWrite(motor1Avance, 0);
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 0);
    analogWrite(motor2Atras, 0);
    Serial.println(«parado»);
  }
 if (estado == 78)
 {
    analogWrite(motor1Avance, 255);
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 248);
    analogWrite(motor2Atras, 0);
    Serial.println(«adelante»);
 }
 if (estado == 69)
 {
    analogWrite(motor1Avance, 100);
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 200);
    analogWrite(motor2Atras, 0);
    Serial.println(«derecha»);
 }
 if (estado == 87)
 {
    analogWrite(motor1Avance, 200);
    analogWrite(motor1Atras, 0);
    analogWrite(motor2Avance, 100);
    analogWrite(motor2Atras, 0);
    Serial.println(«izquierda»);
 }
 if (estado == 83)
 {
    analogWrite(motor1Avance, 0);
    analogWrite(motor1Atras, 255);
    analogWrite(motor2Avance, 0);
    analogWrite(motor2Atras, 255);
    Serial.println(«atras»);
  }
}
 

Programa tu propia APP

Actualmente hay programas por bloques muy sencillos que puedes utilizar para crear tu propia APP para controlar tu coche desde el móvil. Una de ellas es AppInventor

Entra en appinventor.mit.edu y crea una cuenta para comenzar. 

Una vez dentro, pulsa en “nuevo proyecto”, 

Asígnale un nombre y pulsa en aceptar.

Cuando programamos aplicaciones para móviles, tenemos que crear el aspecto grafico de la app y el código de programación. Al entrar en el proyecto, accedes al diseño de la pantalla de tu aplicación. 
 

En la columna de la izquierda tienes todos los objetos que pueden formar parte de tu aplicación: botones, etiquetas, cajas para introducir texto…

En la segunda columna tendrás la pantalla de un móvil donde irás definiendo la organización gráfica de tu aplicación.

En la siguiente columna tienes el listado de objetos que forman tu aplicación.

En la última columna a la derecha aparecerán las propiedades del objeto que tengas seleccionado en cada momento.

La aplicación que vamos a realizar se comunicará vía bluetooth con el coche que hemos construido. Así, el primer objeto que vamos a arrastrar a la app es el “cliente bluetooth”: pulsa en conectividad (en la columna paleta) y arrastra el objeto cliente bluetooth sobre la pantalla móvil que aparece en el visor. Observarás que el icono bluetooth se sitúa fuera del móvil, justo debajo, entre los componentes no visibles.

El siguiente objeto a introducir es el selector de lista. Este objeto se encarga de mostrar todos los dispositivos bluetooth detectados por el móvil para que el usuario elija el que se corresponda con el coche bluetooth y realice la conexión. 

Si haces clic sobre el “botón selector” que has introducido en el emulador del móvil, podrás cambiar sus propiedades en la columna de la derecha:
 
– Imagen: Puedes elegir un archivo con una imagen que mostrar en lugar del texto que aparece 
  dentro del botón del selector.
– Texto: Puedes introducir un texto a mostrar dentro del botón.
 
Probamos cambiando el texto por la palabra: Conectar BT.

Es recomendable cambiar el nombre de los objetos por nombres que sean descriptivos para facilitar su identificación a la hora de programar.

Para cambiar el nombre del objeto, en la columna componentes, pulsa sobre el objeto selector de lista. A continuación, abajo, pulsa en el botón cambiar nombre. Aparecerá una ventana donde podrás introducir el nuevo nombre del objeto, por ejemplo conectar_bt.

 El tercer objeto que vamos a introducir es un “notificador” para poder mostrar mensajes en nuestra aplicación. Cuando lo arrastres a la aplicación, quedará abajo, entre los objetos no visibles. 
 

Una vez introducidos los objetos necesarios para la conexión bluetooth entre el coche y el móvil, procedemos a programar la aplicación para realizar esta conexión.

Pulsa en el botón bloques, arriba a la derecha, para acceder a la ventada de programación.

En la siguiente ventana verás una columna a la izquierda con los bloques que puedes utilizar y una zona blanca a la derecha donde irás colocando los bloques que formarán parte de tu aplicación.

Para programar la conexión bluetooth entre la app y el vehículo utilizamos el evento “cuando conectar_bt después de selección” que localizarán al pulsar en el objeto conectar_bt. Este evento ejecutará los bloques que introduzcamos en él cuando el usuario haya seleccionado un dispositivo bluetooth de la lista detectada por el móvil.

Una vez hecha la selección del dispositivo bluetooth, comprobamos la conectividad. Pulsamos en control y arrastramos el bloque “si… entonces…” dentro del bloque anterior.

Como condición hacemos una llamada a la conexión bluetooth poniendo como dispositivo el elemento seleccionado en el selector conectar_bt.

Este bloque lo encontrarás dentro del objeto cliente bluetooth.

Una vez hecha la selección del dispositivo bluetooth, comprobamos la conectividad. Pulsamos en control y arrastramos el bloque “si… entonces…” dentro del bloque anterior.

Uniendo estos bloques, el código quedaría así:

Si la conexión se hace correctamente, mostramos un mensaje a través del notificador. Pulsa en el notificador y busca el bloque “llamar… MostrarDiálogoMensaje…”. Arrástralo dentro del bloque “si…entonces”. Dentro de la sección “texto” encontrarás un bloque con unas comillas dobles. Debes utilizar ese bloque para añadir el texto del mensaje que vas a visualizar:

Una vez realizada la conexión, vamos a ver cómo se haría el envío de órdenes a la placa arduino.

Tenemos que agregar a nuestra APP un botón para cada movimiento. Empezamos con el botón “avanzar”. Pulsa en el botón diseñador para volver a la ventana de diseño gráfico de la app. En el menú de la izquierda, busca “botón” y arrástralo a la app.

Igual que hiciste en el selector de lista, cambia el texto y el nombre del botón para que sea fácil de identificar. Si pulsas sobre la opción “imagen” en el menú de la derecha, podrás mostrar un icono dentro del botón en lugar de un texto.

Pasamos a programar el envío de la señal desde el botón, pulsando sobre “bloques”.

A cada movimiento posible que realice el vehículo le vamos a asignar una letra:

– Avanzar: a
– Izquierda: b
– Parar: c
– Derecha: d
– Retroceder: e

Al pulsar el botón correspondiente, la app envía por bluetooth esa letra a la placa Arduino. La placa analiza el código ASCII de la letra recibida, y ejecuta el movimiento correspondiente a la letra. Comprobamos si el bluetooth está disponible.

En el menú de la izquierda, pulsa en el botón avanzar y busca el bloque Cuneado…Clic… Este bloque se ejecutará cuando en la pantalla de la app se pulse sobre el botón avanzar. Arrástralo a la zona de programación. Después introduce dentro de este bloque un condicional “si…entonces”. A continuación, pulsa sobre el cliente bluetooth y busca el bloque “disponible” y arrástralo dentro de la condición.

Para enviar el código “a”, pulsa en el bluetooth (menú de la izquierda) y busca el bloque “EnviarTexto”. Arrástralo dentro del bloque “si…entonces…”

Dentro de la sección texto arrastra el primer bloque dentro del bloque EnviarTexto y escribe la letra “a” respetando la minúscula.


Para probar el programa que has hecho hasta ahora, pulsa en el menú generar > app
(generar código QR)

Aparecerá un código QR que podrás escanear con tu móvil para descargar e instalar tu app. Recuerda que debes configurar tu móvil para permitir la instalación de aplicaciones desde fuentes desconocidas.

Para programar el resto de la app, sólo tienes que crear los botones con el resto de movimientos posibles, y por cada movimiento introduce una secuencia de bloques como la que hemos hecho para la acción avanzar.

COCHE SEGUIDOR DE LÍNEA

El coche recorre un circuito creado con cinta aislante negra. Dispone de dos sensores en los bajos del coche. Cada uno de los sensores envía una señal analógica a la tarjeta Arduino. En función del valor de estas dos señales, la tarjeta decidirá si el coche debe continuar en la misma dirección o modificarla ligeramente para no salirse de la línea negra.

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma Móvil LOG DM8080

1 Hoja Técnica H1401

Construcción de la plataforma y conexión de los motores

Conexión de los sensores de línea

Los sensores de línea nos permiten medir el reflejo de la luz sobre una superficie y en función de su valor sabremos si el sensor está sobre una superficie blanca o negra.

Los sensores están colocados en la parte baja del coche. Cuando ambos sensores devuelven una señal analógica superior a 50, se considera que están colocados sobre la línea negra y por lo tanto el coche circula recto (los dos motores a la misma velocidad).

Si alguno de los sensores detecta un valor inferior a 50, la tarjeta Arduino entiende que está en zona blanca y debe realizar un ligero giro para modificar su dirección.

Estos sensores nos van a devolver un valor analógico, por lo que se conecta a las señales analógicas A0 y A5.

Los sensores tienen un potenciómetro en el centro, inicialmente los podemos poner en el centro e ir regulando dependiendo de la luz ambiental

Programación


int motor1avanza=5;
int motor1atras=6;
int motor2avanza=9;
int motor2atras=10;

void setup() {
 
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  Serial.print(«A0 = «);
  Serial.println(analogRead(A0));

  Serial.print(«A5 = «);
  Serial.println(analogRead(A5));
 
  if((analogRead(A5)<100) && (analogRead(A0)>100)){
    Serial.println(«izquierda»);
    analogWrite(motor1avanza,0);
    analogWrite(motor2avanza,0);
    analogWrite(motor1atras,150);
    analogWrite(motor2atras,0);
  }
  else{
    if((analogRead(A0)<100) && (analogRead(A5)>100)){
      Serial.println(«derecha»);
      analogWrite(motor1avanza,0);
      analogWrite(motor2avanza,0);
      analogWrite(motor1atras,0);
      analogWrite(motor2atras,150);
    }
    else{
      if((analogRead(A0)<100) && (analogRead(A5)<100)){
        Serial.println(«brusco»);
        analogWrite(motor1avanza,0);
        analogWrite(motor2avanza,0);
        analogWrite(motor1atras,100);
        analogWrite(motor2atras,0);
      }
      else{
        Serial.println(«recto»);
        analogWrite(motor1avanza,0);
        analogWrite(motor2avanza,0);
        analogWrite(motor1atras,100);
        analogWrite(motor2atras,100);
      }
    }
  }
}    

CALIBRACIÓN

En los programas, el control de los motores se realiza a través del envío de señales analógicas a las salidas 6 y 10 de la tarjeta Arduino. La señal analógica a enviar tendrá un valor desde 0 hasta 255. Cada salida controla un motor del coche.

Si en ambas salidas enviamos un 0, el coche se parará.

La lógica nos dice que para que el coche circule en línea recta habrá que enviar a ambas salidas el mismo dato (mayor que 0). Si hacemos la prueba observamos que el coche tiende a girar en un determinado sentido. Esto es debido a la imprecisión de este tipo de motores. La mejor solución es regular la velocidad por programación enviando a un motor una señal ligeramente inferior con respecto al otro motor.

Si lo que queremos es que el coche gire en un sentido, disminuiremos notablemente la velocidad de uno de los motores (enviando un dato de valor inferior a su salida de Arduino) provocando el giro gracias a la diferencia de velocidad entre ambos motores.

DETALLES DE TIPO PRÁCTICO

Desconectar la alimentación del controlador de motores L298N cuando no se esté utilizando para no gastar las pilas.


Necesita 4 pilas R6 de 1,5 V y 1 pila 6F22 de 9 V.

PRUEBAS

Realizar distintos circuitos con la cinta aislante negra LOG 455N.
 
Aumentar o disminuir la velocidad de los motores

COCHE PROGRAMADO

Una vez montada la plataforma y los elementos básicos (Arduino, motores y controlador de motores), procedemos a programar los diferentes movimientos del coche.

Ver instrucciones de montaje de la plataforma

Ver conexión del controlador de motores

Recordamos la conexión de los motores según este esquema:

El motor 1 (derecha) está conectado a los pines de Arduino 5 y 6 y el motor 2 (izquierda) está conectado a los pines 9 y 10. Para que los motores se muevan seguimos las indicaciones de esta tabla, enviando a los pines las señales que se indican:

Así, podemos decir que los pines 5 y 9 hacen que los motores giren hacia adelante, mientras que los pines 6 y 10 hacen que los motores giren hacia atrás.

Para facilitar la programación, creamos una variable para cada pin cuya nomenclatura nos facilitará recordar qué pines hacen que nuestro coche avance y cuáles que retroceda.

mBlock

Al inicio de cualquier programa, asignamos a cada variable el pin asociado a su dirección de giro:

Veamos como programar distintos movimientos:

Si el motor 1 retrocede en lugar de avanzar, intercambia en la placa Arduino los cables de los pines 5 y 6.

Si el motor 2 retrocede en lugar de avanzar, intercambia en la placa Arduino los cables de los pines 9 y 10.

Si el motor 1 avanza en lugar de retroceder, intercambia en la placa Arduino los cables de los pines 5 y 10.

Si el motor 2 avanza en lugar de retroceder, intercambia en la placa Arduino los cables de los pines 6 y 9.

int motor1Avance = 5; // usamos un pin de salida al motor
int motor1Atras = 6; // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor

 

void setup() {
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);

 

}

 

void loop() {
analogWrite(motor1Avance, 250);
analogWrite(motor2Avance, 250);
analogWrite(motor1Atras, 0);
analogWrite(motor2Atras, 0);
}
int motor1Avance = 5; // usamos un pin de salida al motor
int motor1Atras = 6; // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor

 

void setup() {
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);

 

}

 

void loop() {
analogWrite(motor1Avance, 0);
analogWrite(motor2Avance, 0);
analogWrite(motor1Atras, 250);
analogWrite(motor2Atras, 250);
}
int motor1Avance = 5; // usamos un pin de salida al motor
int motor1Atras = 6; // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor

 

void setup() {
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);

 

}

 

void loop() {
 
analogWrite(motor1Avance, 250);
analogWrite(motor2Avance, 50);
analogWrite(motor1Atras, 0);
analogWrite(motor2Atras, 0);
}
int motor1Avance = 5; // usamos un pin de salida al motor
int motor1Atras = 6; // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor

 

void setup() {
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);
  pinMode(motor2Avance, OUTPUT);
  pinMode(motor2Atras, OUTPUT);

 

}

 

void loop() {
analogWrite(motor1Avance, 50);
analogWrite(motor2Avance, 250);
analogWrite(motor1Atras, 0);
analogWrite(motor2Atras, 0);
}

Si el motor 1 retrocede en lugar de avanzar, intercambia en la placa Arduino los cables de los pines 5 y 6.

Si el motor 2 retrocede en lugar de avanzar, intercambia en la placa Arduino los cables de los pines 9 y 10.

ROBOTIZAR LA PLATAFORMA

Tras montar la plataforma como se indicó aquí, procedemos a conectar los motores y la placa Arduino.

Atornilla la placa Arduino UNO y el controlador de motores a la plataforma superior.

Corta el latiguillo macho-macho por la mitad y suelda cada mitad a uno de los cables del portapilas.

Conexión del controlador de motores

El controlador de motores L298N (puente H) consiste en 4 interruptores que nos permiten controlar la polaridad de la corriente que llega a los dos motores conectados al controlador de motores. Así en función de la polaridad podemos controlar el sentido de giro de los motores. Además funcionan como regulador de corriente, pudiendo determinar una velocidad de giro de 0 a 255.

Para poder controlar la velocidad de giro de los motores, se han conectado a los pines 5, 6, 9 y 10 de Arduino que permiten la modularidad (PWM).

Conectamos el motor 1 (derecha) a los pines 5 y 6, y el motor 2 (izquierda) a los pines 9 y 10. Los pines 5 y 9 se utilizarán para indicar que el coche avance. Los pines 6 y 10 se utilizan para que el coche retroceda.

 

La siguiente tabla nos servirá de guía para relacionar los movimientos del coche con las señales que debemos enviar en cada pin:

Programación

La placa Arduino puede programarse en diferentes lenguajes. A lo largo de esta web verás que la mayoría de los ejemplos se presentan en dos lenguajes diferentes: uno basado en bloques y otro basado en código con líneas de texto. Cada lenguaje ofrece una dificultad diferente. Puedes comenzar con cualquiera de ellos siguiendo estos enlaces:

 

PLATAFORMA MÓVIL

Todos los modelos tienen en común la plataforma móvil que alberga los motores y los diferentes elementos característicos de cada robot.

Con este kit se construye una plataforma robótica versátil, adecuada para incorporar una tarjeta controladora tipo Arduino. Las bases tienen ranuras y orificios para facilitar el paso de cables y latiguillos así como el anclaje de otras placas, shields y elementos mecánicos o electrónicos para dotar al robot de diversas funciones.

Lista de materiales:

DM…

Montaje de la plataforma:

Atornilla la bola de rodadura, los sensores y el portapilas, por la cara de la base que no tiene el logo serigrafiado. Utiliza los diferentes tornillos y tuercas que se detallan en los dibujos.

Por la cara del logotipo, monta las reductoras junto con los soportes y el perfil de aluminio en forma de Z..

Atornilla el controlador de motores y la placa Arduino en la segunda base, por la cara del logotipo. Intercala un bulón de plástico entre las placas y la base, para que los pines que sobresalen por debajo de las placas no se aplasten con la base.

Inserta las abrazaderas y el soporte de sensor ultrasonido para fijar las dos bases.

MALETA DE COCHES ROBÓTICOS

En este kit se incluye el material necesario para construir 8 modelos de coche diferentes:

  1. Coche programado
  2. Coche seguidor de línea negra 
  3. Coche bluetooth
  4. Coche bluetooth con dirección
  5. Coche sumo
  6. Coche explorador
  7. Coche seguidor de luz
  8. Coche control remoto

A lo largo de esta sección veremos cómo construir y programar cada modelo. Para la programación de los coches se han utilizado dos programas diferentes: