Descripción: Reproductor de audio controlado mediante NFC. Uso escolar a modo de cuentacuentos para fomento del gusto por la lectura.

Materiales necesarios

  • 1 Arduino nano
  • 1 Dfplayer mini (reproductor de wav,mp3).
  • 1 tarjeta miniSD
  • 1 mini Amplificador PAM8403 o similar opcional.
  • 1 Speaker de 3W
  • Lector RFID RC522
  • 20 pegatinas NFC
  • 4 resistencias
  • Led
  • 1 Batería 18650
  • 1 Cargador de batería 18650 (TP4056)
  • 1 Boost converter
  • 1 potenciómetro (opcional).
  • 1 USB Tipo B hembra
  • 1 USB mini macho
  • Tornillos para madera 2x10mm
  • Tornillos y tuercas M3 de 10mm

Esquema electrónico.

Esquema eléctrico

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.

DFPLAYER mini

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.

conexiones SPI

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.

Cargador de batería

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.

Step up

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.

Pegatinas NFC

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.

Detalle de las dos piezas de la ficha.

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.

Icono de la aplicación NFC

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.

Ejemplos de las Id de tarjetas detectadas

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();
    }
  }
}