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.
#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);
/************************************************
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();
}
}
}