Miscelánea

Adquisición de los identificadores de las tarjetas RFID MIFARE

Para nuestro proyecto necesitaremos tarjetas RFID MIFARE Classic® 1K – 13,56MHz que por una lado servirán para dar las instrucciones al robot y por otro lado para realizar y verificar el camino del robot en el tablero.

Dividiremos las tarjetas en 2 grupos:

Tarjetas de movimientos /acciones

    1. Tarjeta para el movimiento de avanzar.
    2. Tarjeta para el movimiento de retroceder.
    3. Tarjeta para el movimiento de girar a la izquierda.
    4. Tarjeta para el movimiento de girar a la derecha.
    5. Tarjeta para la acción de resetear los movimientos.
    6. Tarjeta para la acción de ejecutar los movimientos.

     

Tarjetas de tablero

    1. Tarjeta que identifica el inicio del recorrido en el tablero.
    2. Tarjeta que identifica el final del recorrido en el tablero.
    3. Tarjetas que marcan el recorrido entre el punto de inicio y el punto final.

En todas las tarjetas de movimientos y acciones será necesario saber los identificadores internos que tienen, pero de las tarjetas de tablero solo será necesario identificar la que marca el final del recorrido. Estos identificadores posteriormente los tendremos que poner en los programas que cargaremos tanto en la placa de control como en el programa que se carga en el Escornabot.

Las tarjetas de movimiento /acciones serán las tarjetas que el niño irá acercando al lector de tarjetas RFID-RC522 par dar las instrucciones al robot. Con las tarjetas de tablero marcaremos el recorrido que tiene que hacer el robot y se situarán encima del tablero.

¿Por qué de las tarjetas del tablero solo hay identificar la tarjeta de final de recorrido y no todas?  pues porque como veremos ahora no es necesario.

Por una lado la tarjeta de inicio de recorrido no es necesaria identificarla puesto que es el punto de partida del recorrido y el profesor o instructor será el encargado de situar el robot en este punto. Por otro lado cuando el Escornabot termina cada movimiento chequea y por tanto lee que existe una tarjeta debajo de él y esto es independiente del identificador que tenga cada una, si encuentra una tarjeta querrá decir que va por el buen camino. Si por el contrario no encuentra ninguna tarjeta querrá decir que se ha equivocado de camino. La tarjeta de fin de recorrido sí que será necesario saber el identificador porque el Escornabot tendrá que validar si realmente ha llegado al final cuando haya acabado de finalizar todos los movimientos.

Para saber los identificadores de las tarjetas bastará cargar en el  IDE de Arduino la librería de Miguel Balboa (que será la librería que utilizamos en este proyecto para controlar el módulo RFID-RC522) y abrir el programa que viene de ejemplo denominado READNUID.

En el siguiente enlace tenéis la librería (descargar) y el mismo programa READNUID pero con los textos que salen en pantalla traducidos en castellano y la definición de pines SS_PIN y RST_PIN con los valores correctos para nuestro proyecto (descargar).

NOTA:  Si utilizais el sketch original READNUID de la librería recordar de cambiar los pines #define SS_PIN 10 y #define RST_PIN 9 por los valores #define SS_PIN 7 y #define RST_PIN 6

Una vez instalada la librería y cargado el programa en el Arduino Nano de nuestra placa de control abriremos el monitor serie del IDE de Arduino he iremos acercando al módulo RFID-RC522 las diferentes tarjetas (en total tenemos que identificar 7 tarjetas):

Conforme vayamos identificando cada tarjeta la iremos etiquetando y guardando su ID en formato hexadecimal.

A nivel ilustrativo en este tutorial he impreso en cada tarjeta el texto en Braille asociado (espero no haberme equivocado).

Las tarjetas que están en el tablero deben estar enganchadas, para ello usaremos cinta de doble cara poniendo únicamente la longitud de cinta necesaria para que la tarjeta se pueda quitar y poner con facilidad (no os paseis poniendo cinta que luego os va a costar desengancharlas).

El que estén las tarjetas enganchadas al tablero permite por una lado que no se muevan mientras el robot pasa sobre ellas y por otro lado para que el niño pueda “leer” el recorrido  pasando la mano sobre ellas sin desplazarlas.

El tablero tendrá que estar plastificado porque si no al poner y quitar las tarjetas lo romperemos.

NOTA: En un caso real de utilización de estas tarjetas para niños ciegos se deberá disponer de la herramienta necesaria para poder imprimir en Braille las etiquetas que irán en cada tarjeta.

Audios

Para las diferentes locuciones presentes en nuestro proyecto utilizaremos 15 archivos en formato MP3 que grabaremos en la tarjeta MicroSD para posteriormente insertarla en el reproductor MP3.

En mi caso he utilizado una página Web (http://www.fromtexttospeech.com/) donde escribiendo el texto y seleccionando el idioma te genera el archivo MP3 correspondiente aunque también tenéis la opción de grabar vosotros mismos estas locuciones.

Una vez tengamos los 15 archivos MP3 los nombraremos como se muestra a continuación y los grabaremos en la raíz de la tarjeta MicroSD (a la derecha de cada archivo podéis ver el audio que se escuchará):

0001.mp3: "Izquierda"
0002.mp3: "Derecha"
0003.mp3: "Avanzar"
0004.mp3: "Retroceder"
0005.mp3: "Ejecutar"
0006.mp3: "Resetear"

0007.mp3: "Girando a la izquierda"
0008.mp3: "Girando a la derecha"
0009.mp3: "Avanzando"
0010.mp3: "Retrocediendo"

0011.mp3: "¡comenzados!  
0012.mp3 :"¡Vaya!, creo que me he perdido, ¿volvemos a intentarlo?
0013.mp3 : "¡Hemos terminado!, ¡lo has hecho genial!"
0014.mp3 : "¡Vaya!, no he llegado al final, ¿volvemos a intentarlo?
0015.mp3 : "Parando el robot y reseteando movimientos"

NOTA: Es importante no cambiar la numeración de los archivos MP3 mostrados anteriormente ya que ese número identifica el audio que tiene que escucharse en cada acción o movimiento.

En el siguiente enlace tenéis los audios que yo he generado para que los podais utilizar (descargar).

NOTA: Si está utilizando Mac OS X el sistema de archivos agregará automáticamente archivos tipo: «._0001.mp3». Debéis eliminarlos con la instrucción siguiente:

dot_clean / Volumes / <SDVolumeName> ( Donde <SDVolumeName> por el nombre del volumen de vuestra tarjeta SD).

Emparejamiento de los módulos HC-05 y HC-06

Ahora toca emparejar por bluetooth nuestra placa de control (la cual tiene el módulo HC-05) y el Escornabot (el cual tiene el módulo HC-06). Entre ambos se producirá una comunicación bidireccional. Por un lado la placa de control le enviará las instrucciones al robot y por otro lado el Escornabot le irá diciendo el recorrido que va realizando y si lo está ejecutando correctamente chequeando las tarjetas presentes en el tablero.

En internet existe mucha y buena documentación referente a estos dos módulos y en este apartado sólo me centraré en el aspecto más importante para nuestro proyecto: el emparejamiento entre ambos módulos aunque también comentaré los aspectos más importantes a tener en cuenta cuando trabajamos con ellos.

El primer aspecto a comentar es que en ambos módulos el pin de entrada de datos (RXD) y el pin de salida de datos (TXD)  operan a 3,3V y por tanto el pin de entrada (RX) deberá conectarse a nuestro Arduino a través de un divisor de tensión que disminuya la tensión de  salida de 5V del pin del Arduino a unos 3,3V (aproximadamente) cuando está a nivel ALTO. Por el contrario el pin de salida de datos (TXD) puede conectarse directamente a nuestro Arduino ya que los 3,3V ya son interpretados como un nivel ALTO.

Otro aspecto a tener presente es que para emparejar el módulo HC-05 con el módulo HC-06 debemos asegurarnos que ambos tienen el mismo pin y la misma tasa de baudios (baudrate). Por defecto ambos módulos vienen con el pin “1234” y 9600 baudios.

En realidad en el módulo HC-06 no tendríamos que hacer nada para el emparejamiento ya que con la configuración que viene por defecto (a no ser que la queramos cambiarla) ya nos vale para nuestro propósito.

Otros aspectos que tenemos que tener presentes cuando utilizamos el módulo HC-06 son los siguientes:

    • Viene configurado de fábrica como “Esclavo” y no se puede cambiar.
    • Entra en modo AT sin necesidad de conectar ningún pin a nivel ALTO (3,3V) a diferencia del módulo HC-05 siempre y cuando no se encuentre emparejado a otro dispositivo.
    • Los comandos AT tienen que escribirse en mayúscula.
    • Posee comandos AT limitados y por ejemplo no se puede preguntar los baudios, el pin o el nombre que tiene por defecto aunque si podemos cambiarlos.
    • Desde el monitor serie de Arduino tenemos que configurar “Sin ajuste de línea” y 9600 baudios para enviarle comandos AT.

Aunque como he comentado anteriormente no sería necesario realizar nada en este módulo vamos a proceder a especificar tanto el nombre como el pin del módulo.

Antes de proceder a ejecutar los comandos AT pondremos el módulo HC-06 en la placa de control de la siguiente manera:

Con placa PCB de doble cara de 7×9 cm:

Con protoboard:

 

Una vez puesto el módulo HC-06 en la placa de control cargaremos el siguiente sketch  (descargar) en el Arduino y desde el monitor serie del IDE de Arduino escribiremos los siguientes comandos:

Comando AT Respuesta
AT OK
AT+NAMEHC-06 OKsetname
AT+PIN1234 OKsetPIN

 

Ahora toca hablar del módulo HC-05.

Las características que tenemos que tener presentes al utilizar el módulo HC-05 son las siguientes:

    • Se puede configurar tanto como “Maestro” o como “Esclavo”. En nuestro caso nos interesa configurarlo como “Master”.
    • Posee diferentes modos AT. Para nuestro propósito tenemos que entrar en modo “full-AT”.
    • Para entrar en modo “full-AT” el pin 34 (de dicho módulo) debe estar a nivel ALTO (3,3V) cuando conectamos el módulo y permanecer en nivel ALTO durante todo el proceso.
    • Desde el monitor serie de Arduino tenemos que configurar “Ambos NL &CR” y 9600 baudios para enviarle comandos AT.

Importante:

Como he comentado anteriormente para entrar en modo “full-AT” el pin 34 debe estar a nivel ALTO (3,3V) cuando conectamos el módulo y mantener ese nivel ALTO durante todo el proceso en que estemos enviando los comandos AT. Para conseguir esto lo mejor es que compreis un módulo que tenga el pin “KEY” ya conectado directamente a este pin 34 y por consiguiente bastará conectar este pin “KEY” a los 3,3V del Arduino (nuestra placa de control en versión PCB  ya viene preparada para este propósito).

Muchos módulos vienen con un pin etiquetado como “EN” en vez de “KEY” y  en realidad no está conectado al pin 34 pero poseen un botón que lo que hace es que si lo mantienes pulsado mientras conectas el módulo entra en modo AT (lo que hace el botón es poner a nivel ALTO el pin 34) pero atención, aunque entra en modo AT no se queda en modo “full-AT” , digamos que se queda en un modo AT que no admite todos los parámetros que para para nuestro cometido necesitamos.

Esta versión con el botón es la que más frecuentemente podemos encontrar en las tiendas o por internet (de hecho yo tenía inicialmente esta versión), pues bien no os preocupeis ya que lo podemos utilizar igualmente. Tenéis dos opciones: Ingeniaros un método para poner el pin 34 a nivel ALTO conectando un cable a 3,3V a este pin o mantener apretado el botón cuando ejecutemos ciertos comandos. Esta última opción (que es la que utilicé yo)  implicará tener los comandos preparados para copiarlos y pegarlos y ejecutarlos en la ventana del Monitor Serie del IDE de Arduino y con la otra mano mantener pulsado el botón (yo lo he realizado sin problemas después de varios intentos). También podéis pensar en algo que pueda mantener apretado el botón durante todo este proceso (algún tipo de pinza, por ejemplo). Importante: Los comandos marcados con (*) que veremos en la siguiente tabla son los comandos que tenéis que ejecutar manteniendo pulsado el botón en todo momento. No vale pulsar el botón, ejecutar el comando y soltar y volver a pulsar el botón cuando ejecutemos el siguiente comando. Se deberá mantener pulsado el botón desde que se empiece a ejecutar el primer comando marcado con (*) hasta el último comando marcado con (*) y verificar que el módulo responde OK, eso os dará la confirmación que lo habéis hecho correctamente.

 

Dicho todo lo anterior vamos a proceder a emparejar el módulo HC-05 con el HC-06. Para ello debemos:

    • Poner el módulo HC-05 en la placa de control y prepararlo para entrar en modo “full-AT”.  Si estáis utilizando la versión del módulo que posee el botón y no tiene el pin “KEY” conectado al pin 34 del módulo solo tendréis que poner dicho módulo en la placa y seguir la operativa anteriormente descrita para estos modelos. Si por el contrario tenéis la versión que tiene el pin “KEY” conectado directamente al pin 34 teneis que poner el módulo en la placa y conectar dicho pin a nivel ALTO (en este caso a 3,3V) de la siguiente manera:

Con placa PCB de doble cara de 7×9 cm:

Si utilizamos nuestra placa de control (versión PCB) especialmente diseñada para el proyecto conectaremos los pines señalizados en la siguiente fotografía mediante un mini jumper antes de conectar la alimentación. Lo que haremos con esto es poner a 3,3V el pin “KEY” para estar en modo “full-AT”.

Con protoboard:

Si estáis utilizando la versión en protoboard tendréis que conectar un cable desde el pin de 3V3 del Arduino al pin “KEY” del módulo.

    • Una vez preparado el módulo para entrar en modo “full-AT” conectaremos la alimentación a la placa de control. En este punto el HC-05 habrá entrado en modo “full-AT”. Si estáis utilizando la versión del módulo que posee el botón y no tiene el pin “KEY” conectado al pin 34 del módulo tendréis que mantener pulsado el botón cuando conecteis la alimentación pero como ya comenté anteriormente no estará en modo “full-AT” y tendréis que seguir la operativa anteriormente descrita para estos modelos.
    • Cargaremos el siguiente sketch (descargar) en el Arduino de la placa de control y desde el monitor serie del IDE de Arduino escribiremos los siguientes comandos:
Comando AT Respuesta
AT OK
AT+PSWD=1234 OK
AT+RMAAD OK
AT+ROLE=1 OK
AT+CMODE=1 OK
AT+RESET    (*) OK
AT+INQM=0,5,9    (*) OK
AT+INIT    (*) OK
AT+INQ    (*) Devolverá los dispositivos bluetooth encontrados.

Ejemplo:

+INQ:98B3:32:212F28,1F00,7FFF

En las sucesivas instrucciones se utilizará los números marcados en negrita sustituyendo los  “:” por comas.

AT+RNAME?98B3,32,212F28   (*) +RNAME:HC-06
AT+PAIR=98B3,32,212F28,9  (*) OK
AT+BIND=98B3,32,212F28  (*) OK
AT+CMODE=0   (*) OK
AT+LINK=98B3,32,212F28    (*) OK

NOTA: En negrita aparece la dirección detectada del módulo HC-06. Por tanto tendréis que cambiar este código por el que os salga a vosotros al hacer la detección.

NOTA: Si estáis utilizando un módulo HC-05 con botón tenéis que ejecutar los comandos marcados con (*) manteniendo pulsado el botón en todo momento para mantener el pin 34 a nivel ALTO  (ver operativa descrita anteriormente para estos modelos).

NOTA: En el siguiente enlace tenéis un documento con el listado y explicación de los comandos AT que podemos ejecutar en un módulo HC-05 (descargar).

 

    • Por último quitaremos de la placa PCB el mini jumper y en el caso de haber utilizado la protoboard quitaremos el cable de 3,3V conectado al pin «KEY». Este paso no aplica si estais utilizando un módulo HC-05 con botón.

 

Si todo es OK ya habrá quedado vinculado el módulo HC-05 y el módulo HC-06 y cada vez que se conecten se vincularán de manera automática.

Para saber cómo emparejar ambos módulos me he basado en las explicaciones del blog de Martyn Currey que lo explica genial y no está de más que le deis un vistazo:

http://www.martyncurrey.com/connecting-2-arduinos-by-bluetooth-using-a-hc-05-and-a-hc-06-pair-bind-and-link/

Carga de los programas en la placa de control y en el Escornabot

Ya solo nos falta cargar el programa en la placa de control y su correspondiente en el Escornabot.

Los pasos que hemos tenido que realizar previamente son:

    1. Instalación de los elementos necesarios en el Escornabot.
    2. Creación de la placa de control y estructura vertical con los elementos visuales (anillo de LEDs y TFT) y el altavoz.
    3. Conexionado de todos los elementos.
    4. Adquisición de los identificadores de las tarjetas MIFARE que utilizaremos.
    5. Etiquetado de las tarjetas de movimientos/acciones y de las tarjetas presentes en el tablero.
    6. Creación de los audios en formato MP3 que posteriormente se grabarán en la tarjeta MicroSD que insertaremos en el reproductor MP3.
    7. Emparejamiento de la placa de control con el Escornabot a través de los módulos HC-05 y HC-06.

Las librerías que utilizan los programas y que tendremos que descargar e instalar en el IDE de Arduino son las siguientes:

https://github.com/miguelbalboa/rfid

https://github.com/adafruit/Adafruit-GFX-Library

https://github.com/adafruit/Adafruit-ST7735-Library

https://github.com/adafruit/Adafruit_NeoPixel

https://github.com/DFRobot/DFRobotDFPlayerMini/archive/1.0.3.zip

 

Veamos las modificaciones que tenemos que realizar en los dos programas antes de cargarlos en los diferentes Arduinos.

 

Programa de la placa de control

En el código de la placa de control deberemos poner los 6 identificadores de las tarjetas de movimientos y acciones. Para ello descargaremos el programa específico de la placa de control del siguiente enlace:

Descargar programa de la placa de control

Una vez descargado buscamos el código que se muestra a continuación y pondremos los identificadores que previamente hemos escaneado:

/**************************************************************************
 * Identificadores de tarjeta
**************************************************************************/

// NOTA: Cambiar por los códigos de vuestras tarjetas (6 tarjetas son necesarias)

byte tarjetaGirarIzquierda[4]  = {0x71, 0x9C, 0x07, 0x01};   
byte tarjetaGirarDerecha[4]    = {0xB4, 0xBD, 0xD9, 0x13};
byte tarjetaAvanzar[4]         = {0x01, 0xB5, 0x9A, 0x00}; 
byte tarjetaRetroceder[4]      = {0x71, 0x3C, 0x27, 0x49}; 
byte tarjetaEjecutar[4]        = {0xC3, 0x5B, 0xED, 0x16};  
byte tarjetaResetear[4]        = {0x66, 0x7A, 0xCA, 0x1F};

NOTA: Tenéis que sustituir los códigos que se muestran en el ejemplo anterior por los códigos de vuestras tarjetas.

Ejemplo: Código hexadecimal escaneado: 71 9C 07 01 → {0x71, 0x9C, 0x07, 0x01}

Una vez realizado esto ya podéis grabar el programa en la placa de control.

 

Programa del Escornabot

En el programa del Escornabot deberemos modificar únicamente el fichero de configuración Configuration.h para por una lado añadir el identificador de la tarjeta final de recorrido y por otro lado para definir los pines SS y RST del módulo RFID-RC522 que si lo habéis hecho como explica el tutorial serán el D10 y A1.

NOTA:  Como podéis intuir se ha tenido que añadir código en el firmware oficial del Escornabot para que el robot tenga la funcionalidad que este proyecto describe.

La versión en la que me he basado para realizar este proyecto es la 1.4.3 y por si alguno siente curiosidad solo se ha añadido código en los siguientes ficheros del firmware original:

BluetoothInterface.h

BluetoothInterface.cpp

EventManager.cpp

Escornabot.h

Configuration.h

Por otro lado, además de la modificación de los ficheros originales anteriormente descritos he creado dos archivos más que contienen la clase que permite gestionar la lectura de tarjetas MIFARE por parte del lector RFID-RC522 que hemos instalado en el Escornabot. Los archivos son:

MFRC522Interface.h

MFRC522Interface.cpp

Dicho todo lo anterior vamos a proceder a modificar el fichero Configuration.h para poner todos los parámetros necesarios para el correcto funcionamiento del robot. Para ello descargaremos el firmware oficial del Escornabot modificado del siguiente enlace:

Descargar firmware oficial 1.4.3 del Escornabot modificado

Una vez descargado buscamos el código que se muestra a continuación y pondremos la información requerida:

//////////////////////////////////////////////////////////////////////
///// MFRC522 RFID
//////////////////////////////////////////////////////////////////////

#define USE_MFRC522 true
#define CHECK_RFID_CARDS_UNTIL_END_POINT true
#define MFRC522_SS_PIN  10
#define MFRC522_RST_PIN A1

// Identificador de tarjeta RFID de final de recorrido 
// NOTA: Cambiar por el codigo de vuestra tarjeta
#define UID1 0x11
#define UID2 0x3F
#define UID3 0x8B
#define UID4 0x02

 

Como podéis ver en este caso el código hexadecimal lo hemos divido en 4 partes y a cada parte le hemos asignado una variable.

Ejemplo código hexadecimal escaneado:

11 3F 8B 02 →  UID1 0x11

 UID2 0x3F  

 UID3 0x8B   

 UID4 0x02

NOTA: Tenéis que sustituir el código que se muestra en el ejemplo anterior por el código de vuestra tarjeta.

Como se puede apreciar en el fichero de configuración existe el parámetro USE_MFRC522  que tendrá que estar a true para activar toda la funcionalidad descrita en este tutorial. Si poneis este valor a false el Escornabot se comportará como como si instalarais el firmware oficial sin esta funcionalidad.

Por otro lado el parámetro CHECK_RFID_CARDS_UNTIL_END_POINT podeis ponerlo a false si solo quereis que el robot chequee la tarjeta de final de recorrido ignorando el resto de tarjetas del camino. De esta manera podéis ahorraros de poner las tarjetas que marcan el camino hasta el punto final. Aunque se ponga a false el robot irá “diciendo” todos los movimientos que va ejecutando y simplemente no se parará al no encontrar una tarjeta durante el recorrido pero la tarjeta del punto final si la chequeará.

NOTA: El pin D10 NO puede estar conectado al buzzer ya que este pin al igual que los pines D11,D12 y D13 son utilizados por el bus SPI el cual es necesario para el funcionamiento del lector RFID acoplado al robot. En mi caso he utilizado el pin analógico A0 como alternativa pero podéis utilizar cualquier otro que tengáis libre. Por tanto debemos especificar este cambio en el fichero de configuración:

// buzzer
#define BUZZER_PIN A0

NOTA: No os olvidéis de poner en el fichero de configuración el resto de configuraciones que tengáis para vuestro robot: valores de la lectura de la botonera, etc, para que todo funcione correctamente.

NOTA: Antes de cargar el programa deberemos quitar el módulo HC-06 de la placa para que pueda subir correctamente al Arduino.

Llegados a este punto solo falta cargar el programa en el Escornabot y probar que todo funciona correctamente.

AJUSTES

Dentro del programa de la placa de control podeis modificar dos parámetros para controlar tanto la luminosidad del anillo de LEDs como el volumen del sonido.

Luminosidad del anillo de LEDS. Podéis variar la luminosidad del anillo de LEDs modificando el valor en la siguiente instrucción:

leds.setBrightness(200) (valor comprendido entre 0 y 255);

Modificar este parámetro a un valor más bajo si considerais que el brillo de los LEDs es demasiado elevado y puede molestar a los niños.

Volumen del sonido. Podéis variar la salida del volumen del DFPlayer Mini MP3 Player modificando el valor en la siguiente instrucción:

myDFPlayer.volume(25) (valor comprendido entre 0 y 30)

Este volumen es el que entra al amplificador el cual también posee un pequeño potenciómetro para controlar el volumen de entrada. Modificar este parámetro a un valor más bajo si considerais que el volumen es demasiado alto o que el sonido distorsiona.

« Anterior Siguiente »