Descripción: Reproductor de audio controlado mediante NFC. Uso escolar a modo de cuentacuentos para fomento del gusto por la lectura.
Materiales necesarios
Esquema electrónico.
Reproductor mp3 y wav
Para la reproducción del audio, usaremos el versátil DFPLAYER mini que funciona a 5V y requiere una comunicación serie con arduino usando 2 pines (Rx,Tx) unidos a este mediante unas resistencias de 1K.
Los mp3 se almacenarán en la tarjeta miniSD con la precaución de nombrarlos con 3 dígitos de la forma (000,001,002, etc).
La salida de sonido la enviaremos a un mini amplificador que alimentará a un speaker de 3W mediante el pin DAC_R y GND.
En caso de no querer usar amplificador podremos conectar el parlante a la salida SPK_1 y GND.
Más adelante haremos un orificio en la carcasa para poder extraer la tarjeta SD y poder añadir audio sin abrir la caja.
RFID RC522
Es el lector de radio frecuencia con el que identificaremos las pegatinas NFC que irán dentro de unas fichas.
Recordar que el módulo se debe alimentar a 3.3V detalle a tener en cuenta para no dañarlo. Esta cuestión no debe importarnos demasiado pues ardunio nano posee un pin que suministra dicha tensión.
El módulo se comunica con ardunio a través del protocolo SPI. Es este caso usaremos los pines D9, D10, D11, D12, y D13.
Alimentación
Usaremos una pila 18650 conectada a un cargador TP4056 o similar. Este módulo tiene una entrada mini USB para la carga de la batería, por ese motivo dejaremos un orificio en la carcasa para poder conectarlo.
Este conjunto nos suministra una tensión de 3.7V insuficiente para nuestra pretensión, por lo que necesitaremos un Boost converter o también nombrado Step up que nos permitirá alcanzar los 5V necesarios para alimentar todo el sistema.
Un led indicará el encendido del artefacto mediante un interruptor que tendrá un hueco en la carcasa para introducirlo.
Control de volumen
De forma opcional y mediante software se ha contemplado la opción de controlar el volumen del sistema. Hay planteada una conexión para tal efecto para un potenciómetro, pero en el proceso de creación he decidido suprimirlo aunque consta en el esquema electrónico.
Soporte inferior de la caja
La tapa inferior de la caja sujetará casi toda la electrónica con tornillos de 2mm. Contará con 4 patas que la elevarán del suelo unos milímetros y que irán atornilladas con tornillos M3.
Además, se deben imprimir las abrazaderas para la pila y el speaker que para evitar vibraciones y mejorar la sujeción es preciso añadir cinta adhesiva de doble cara.
En la parte rotulada con «Datos» colocaremos el USB tipo B hembra que permitirá la programación del arduino sin abrir la caja. Se trata de un pequeño alargador a la entrada el microprocesador tal y como se explica en la entrada en la que se describe su fabricación.
Carcasa superior de la caja
En ella irá anclado el lector de tarjetas mediante dos piezas que harán de soporte y se atornillarán a esta carcasa con tornillos de 2mm como se muestra en las imágenes inferiores.
Aquí además hay que encajar el interruptor de encendido y cuenta con las aberturas destinadas a la carga de la pila, el led de encendido y la tarjeta que contiene los audios SD.
En la parte superior, se ha dejado un hueco rectangular que permite el uso de tarjetas NFC en lugar de las pegatinas. Para usarlas con pegatinas de 25mm de diámetro y fichas como las que propongo es necesario añadir el adaptador para hacer encajar estas pichas destinadas a albergar las pegatinas.
Ficha activadora
Las fichas que activarán el audio estará compuesta por dos piezas, entre ellas irá la pegatina RFID. Pegaremos las dos piezas con pegamento para finalizar.
Cada una de las pegatinas RFID almacena un número identificativo (NUID) proporcionado por el fabricante. Esta característica será de lo que no valgamos a la hora de programar y asignar un audio a cada tarjeta.
Estas fichas poseen en la parte superior una muesca que permite colocarles una cartulina o cartón que tenga un dibujo sobre el contenido del audio o cuento.
Existen varias maneras de leer el NUID, aquí tienes una aplicación para móviles android que la muestra, se llama MIFARE classic tool. Sería cuestión de ir pasando todas las pegatinas cerca del móvil e ir apuntando sus números para utilizarlos más adelante en la programación.
Actualización: He mejorado el diseño de las fichas que contienen las pegatinas RFID dándoles un carácter más personal con forma de columna. Descarga los STL pinchando en el enlace de abajo.
Las columnas están compuestas por tres piezas. La superior se encaja a la intermedia y ésta se enrosca en la base conteniendo en su interior la pegatina RFID.
Otro método para descubrir las ID de las tarjetas es a través del propio artefacto. Para ello usaremos el siguiente programa que se basa en la librería MFRC522.h que encontrarás en el enlace que contiene las librerías.
Con este pequeño programa podremos mostrar a través del monitor serial las ID de las pegatinas que tenemos. Para ello pasa estas cerca del lector de tarjetas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 //Pin 9 para el reset del RC522 #define SS_PIN 10 //Pin 10 para el SS (SDA) del RC522 MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto para el RC522 void setup() { Serial.begin(9600); //Iniciamos la comunicación serial SPI.begin(); //Iniciamos el Bus SPI mfrc522.PCD_Init(); // Iniciamos el MFRC522 Serial.println("Lectura del NUID"); } void loop() { // Revisamos si hay nuevas tarjetas presentes if ( mfrc522.PICC_IsNewCardPresent()) { //Seleccionamos una tarjeta if ( mfrc522.PICC_ReadCardSerial()) { // Enviamos serialemente su NUID Serial.print("Tarjeta ID:"); for (byte i = 0; i <4; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Terminamos la lectura de la tarjeta actual mfrc522.PICC_HaltA(); } } } |
Este es un ejemplo de cómo se mostrarán. Recuerda apuntarlas todas, o guardarlas en un documento de texto, para más adelante asignar a cada una de ellas el audio correspondiente.
Programa definitivo
Usaremos las librerías mencionadas en el apartado anterior.
La programación es relativamente fácil pues en las variables tar1, tar2, tar3 y tar4 copiamos los datos obtenidos en la lectura de las tarjetas con el programa del apartado anterior que debimos copiar precedidos de 0x.
Luego, en el loop, mediante las funciones: if (isEqualArray(mfrc522.uid.uidByte, tar1, 4)), llamamos a la reproducción del audio correspondiente con la función: myMP3.play(2);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
/************************************************ Descripción del proyecto: Cuentacuentos escolar con RFID Programado por Juan Carlos Pedrajas del Molino Https:\\www.geniero.es afelio11@gmail.com pedrajas@geniero.es Fecha de inicio: 28/09/2022 Fecha de finalización: 19/03/2023 ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | SCK | [ ]IOREF MISO/12[ ] | MISO | [ ]RST MOSI/11[ ]~| MOSI | [ ]3V3 +---+ 10[ ]~| SDA | [ ]5v -| A |- 9[ ]~| RST | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| Rx DFPlayer Mini | [ ]A0 -| N |- 5[ ]~| Tx DFPlayer Mini | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ ******************************************************************** */ #include <SPI.h> #include <MFRC522.h> #include <DFPlayerMini_Fast.h> const int RST_PIN = 9; // Pin 9 para el reset del RC522 const int SS_PIN = 10; // Pin 10 para el SS (SDA) del RC522 MFRC522 mfrc522(SS_PIN, RST_PIN); // Crear instancia del MFRC522 byte tar1[4] = { 0x53, 0xDD, 0x53, 0x03 }; //Bella y Bestia byte tar2[4] = { 0x53, 0xDE, 0x53, 0x03 }; //Los 3 cerditos byte tar3[4] = { 0x53, 0xDC, 0x53, 0x03 }; //El Gato con botas byte tar4[4] = { 0x53, 0xE7, 0x53, 0x03 }; //El flautista de Hamelín #if !defined(UBRR1H) #include <SoftwareSerial.h> SoftwareSerial mySerial(5, 6); // RX, TX #endif DFPlayerMini_Fast myMP3; //Función para comparar dos vectores bool isEqualArray(byte* arrayA, byte* arrayB, int length) { for (int index = 0; index < length; index++) { if (arrayA[index] != arrayB[index]) return false; } return true; } void setup() { Serial.begin(9600); SPI.begin(); // Iniciar SPI mfrc522.PCD_Init(); // Iniciar MFRC522 delay (50); Serial.println ("Iniciando máquina de cuenta cuentos"); #if !defined(UBRR1H) mySerial.begin(9600); myMP3.begin(mySerial, true); #else Serial1.begin(9600); myMP3.begin(Serial1, true); #endif Serial.println("Ajustando el volumen"); myMP3.volume(25); //Parece que el máximo volumen es 30 } void loop() { // Detectar tarjeta if (mfrc522.PICC_IsNewCardPresent()) { //Seleccionamos una tarjeta if (mfrc522.PICC_ReadCardSerial()) { // Comparar ID con las claves válidas if (isEqualArray(mfrc522.uid.uidByte, tar1, 4)) { Serial.println("La Bella y la bestia"); myMP3.play(2); } if (isEqualArray(mfrc522.uid.uidByte, tar2, 4)) { Serial.println("Los tres cerditos"); myMP3.play(3); } if (isEqualArray(mfrc522.uid.uidByte, tar3, 4)) { Serial.println("El gato con botas"); myMP3.play(4); } if (isEqualArray(mfrc522.uid.uidByte, tar4, 4)) { Serial.println("El flautista de Hamelín"); myMP3.play(1); } // Finalizar lectura actual mfrc522.PICC_HaltA(); } } } |