Transmisión de radio FM de corto alcance para uso escolar con frecuencia variable de emisión (70-108MHz), pantalla LCD y selector rotativo. Emplea batería recargable y reproductor de mp3 por USB controlado por 4 pulsadores.
Su alcance depende en gran medida de la antena empleada y trataré de añadir un apartado a este asunto en el tutorial para conseguir mejoras en la distancia. Pero el hecho de ser portátil y no depender de cable para su alimentación permite subsanar esta debilidad pues el rango que persigo conseguir no es demasiado grande (todas las aulas de un colegio), que con una antena unipolar de unos 45cm es más que suficiente.
Materiales necesarios
Alimentación
El sistema se alimenta con una batería de litio 18650 que administra 3.7V que sebe ser manejada por un módulo de carga y para ello emplearé el cómodo TP4056 con entrada de carga de USB mini.
Este elemento incorpora un led azul de carga completa que indica la finalización de este proceso. Además el uso del módulo permite el funcionamiento del sistema durante el periodo de carga y con el cable de alimentación conectado en el zócalo USB.
Para suministrar los 5 voltios necesarios para alimentar el microprocesador usaremos un conversor DC Step-Up Booster MT3608, pues los 3,7 voltios de la batería de litio son insuficientes.
En el módulo encontraremos un tornillo regulador que giraremos con un destornillador de precisión hasta alcanzar el valor adecuado. Suministra 2Amperios máximo.
Colocaremos un pequeño interruptor entre el módulo cargador de la batería y el Step-Up (parte positiva) para apagar el artefacto.
Módulo transmisor en FM
Se trata del FM transmitter v2.0 70-108 Mhz de Elechouse que usa el chip KT0803L. Se comunica por I2C usando los pines SDA y SLC. Se alimenta con 3.3-5V, pues el módulo tiene un regulador para poder usarse a 5V. Tiene conector mini jack para entrada de línea. Dispone de zócalos de soldadura para añadir un mini micrófono directamente sobre él. También cuenta con un zócalo de soldadura para antena (45cm recomendados). Trabaja en el rango de 70Mhz a 108Mhz. Tiene un amplificador de sonido. Autoapagado en detección de sonido. Se auto calibra.
Para modificar sus valores internos he usado la librería del creador Xanto donde encontrarás la librería XantoKT0803-master.zip que requiere a su vez su propia librería de I2C XantoI2C-master.zip.
Además esta librería permite conectar el modulo trasmisor a otros pines que no sean A4 y A5 emulando el I2C. En mi caso usaré SCL en el pin D5 y el SDA en el pin D6.
Si cargas el ejemplo de la librería puedes acceder a la información interna del módulo y también escribir en él.
En el programa de ejemplo puedes escribir en el serial del IDE de Arduino que usa los comandos W para escribir sobre los registros y R para su lectura. El comando P muestra la lectura de todos los registros. el comando M y U realizan la función de mute y unmute. Para cambiar la frecuencia usaremos el comando F seguido de la frecuencia deseada sin decimales (multiplicada por 10).
Los valores por defecto que trae mi módulo son los siguientes como expresa el datasheet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Register address, BIN value, HEX value: 0x00 00010000 0x10 0x01 11000100 0xC4 0x02 01000000 0x40 0x04 00000100 0x04 0x0B 00000000 0x00 0x0C 00000000 0x00 0x0E 11000010 0xC2 0x0F 11111011 0xFB 0x10 10101000 0xA8 0x12 10000000 0x80 0x12 10000000 0x80 0x14 00000000 0x00 0x15 11100000 0xE0 0x16 00000000 0x00 0x17 00000000 0x00 0x1E 00000000 0x00 |
El cambio de frecuencia de emisión debe registrarse en los reg 0, 1 , y 2. en CHSEL que usa 12 bits(de 0 a 11). 8+3+1. El mute será el bits 3 del registro 0x02. Especial interés en el detector de silencio que se encuentra en el bits 7 del registro 0x12, Reg 0x12[7], normalmente con estado activado con el valor 0.
Otra librería que podemos usar con este módulo y que es muy cómoda de usar aunque no permite modificación de los registros es FMTX.h. Esta librería da ciertos problemas con algunos IDE de Arduino y es necesario modificar el archivo FMTX.h como se expone en este foro. Cuya solución pasa por comentar/anular las siguientes líneas de la librería
1 2 3 4 5 6 7 8 9 10 11 12 |
......... #ifndef __TYPE_REDEFINE #define __TYPE_REDEFINE //typedef uint8_t u8; //typedef int8_t s8; //typedef uint16_t u16; //typedef int16_t s16; //typedef uint32_t u32; //typedef int32_t s32; #endif .... |
y luego en el código del programa emplear u8 i,buf[4]; en lugar de uint8_t i,buf[4];
Módulo DFPlayer mini reproductor de Mp3 Wav
Muy utilizado en mis proyectos, este módulo es capaz de funcionar por sí mismo o controlado por Arduino. Funciona a 5 voltios y su comunicación es Serial. Dispone de un lector de tarjetas miniSD donde se almacenan los audios que pueden ser mp3 o wavs. Se le puede añadir una entrada de ficheros por USB (que aprovecharemos en este proyecto).
Si quieres profundizar, te dejo aquí su datasheet, aunque las librerías de arduino sobre este módulo nos facilitan mucho su control sin necesidad de comprender nada de si tecnología.
En resumen, lo fundamental es conocer su forma de conexión para ello te apunto los pines y su función. Ten en cuenta la posición de la muesca de la parte superior del módulo justo encima del led que nos ayudará a no confundir los pines.
Mi intención es controlar el módulo sin pasar por el microcontrolador. Es posible añadiendo algunos pulsadores para comandarlo. Pero si prefieres de la otra manera no te preocupes pues también desarrollo este procedimiento un poco más abajo.
Como se aprecia en el datasheet, aplicando una resistencia de 33K en el pin ADKEY1 y conectándolo a tierra podemos controlar el play/pause con un botón.
IO1 y IO2 controlarán el salto de pista o el volumen si presionamos el botón conectado a tierra sin resistencias durante un corto o largo periodo de tiempo.
Y conectando un pulsador a masa a través de una resistencia de 200K a ADKEY1 conseguimos modificar el modo de reproducción a simple o continua.
En total usaré 4 pulsadores y algunas resistencias.
Otra opción es controlar el módulo de mp3 a través del serial comandado por Arduino. Si prefieres esta opción, en el código añado lo necesario para hacerlo funcionar de esa manera.
Para tal propósito debemos incorporar la versión 1.0.6 de la librería <DFRobotDFPlayerMini.h> además de la conocida <SoftwareSerial.h>, ambas descargables desde el propio IDE de Arduino.
En este caso deberás conectar el pin RX y TX del módulo reproductor de sonido a los pines D11 y D12 como aparecen en el esquema electrónico.
La conexión del USB hembra al módulo DFplayer no tiene mayor misterio
Pantalla LCD
La pantalla LCD utilizar un módulo con el controlador PCF8574, el cual es un expansor de entradas y salidas digitales controlado por I2C. Eso te permite controla la pantalla con tan solo 2 cables con cualquier microcontrolador que conectaremos a A4 y A5.
La dirección I2C por defecto del módulo puede ser 0x27 aunque la puedes cambiar soldando unos pines que están por detrás del módulo.
La pantalla ya incluye el módulo soldado y listo para usar.
Lo alimentaremos con 5 voltios. Hay un jumper para activar o desactivar el led de retroiluminación.
En la zona trasera encontraremos un potenciómetro que regularemos con un pequeño destornillador para controlar el contraste de la pantalla.
La pantalla consta de 16 caracteres dispuestos en 2 filas.
En cuanto al software, usaremos la librería LiquidCrystal_I2C.h que está disponible en el apartado de librerías.
Para atornillar la pantalla a la tapadera de la caja he usado 4 tornillos M3 de 15mm y sus respectivas tuercas.
Encoder rotativo
Un elemento con una teoría apasionante pero que pasaré por alto para indicar que conviene conectar los pines CLK y DT correspondiente al giro a los las interrupciones del microcontrolador, que en nuestro caso al tratarse de un Arduino Nano, deben ser D2 y D3. Aunque estas conexiones pueden realizarse en otros pines, es recomendado hacerlo en las indicadas pues la precisión aumenta considerablemente así como la ausencia de errores de lectura.
Por su parte Vcc debe ir a los 5 voltios y GND a tierra. En cuanto al pulsador SW que incorpora al presionar el eje de rotación lo conectaremos a D0.
Para su control necesitaremos la librería ESPRotary.h que podrás descargar en la sección de librerías.
Pulsadores
Para manejar la reproducción del sonido usaré 4 botones como menciono al principio de esta entrada, conectados directamente al módulo DFPlayer. Pero si decides aplicar el control al microcontrolador he dispuesto el código para desempeñar esta función. Para ello usaré la librería Button2.h que también se encuentra disponible en el área de descarga de las librerías.
Como se aprecia en la fotografía para los pulsadores empleé un módulo reciclado extraído de un antiguo controlador mouse que me ha servido para este proyecto.
Antena
Para el proyecto he usado una antena desplegable de unos 40cm de largo y 7mm de diámetro extraída de un antiguo receptor de radio. No se trata de la mejor opción pero para el caso parece suficiente.
Esquema eléctrico
Este esquema describe la opción de control del reproductor mp3 mediante el microcontrolador. Se corresponde con el código del programa que añado al final del documento.
Carcasa
Es momento de imprimir. Puedes descargar el fichero rar que contiene todas las piezas necesarias para construir el aparato pulsando en el botón de más abajo.
Cuerpo inferior
En ella anclaremos los módulos con tornillos 3×10 autoroscables
La batería será abrazada por la pieza con forma de puente. Los módulos cargador de batería, transmisor FM, USB hembra y la PCB con el controlador y el módulo reproductor de sonido se deben atornillar a la base. El interruptor irá encajado y la antena se atornillará con un tornillo M3 y su respectiva tuerca, usando una arandela soldada al cable que se conectará a la salida de la antena del módulo emisor.
La pieza Muerde_usb.stl es la que aprisiona el módulo cargador miniUSB para garantizar su sujeción.
Frontal
En ella deben colocarse el módulo de pulsadores, la pantalla LCD y el encoder rotativo.
Por último tras asegurarse de que todo funciona como estaba previsto debemos cerrar el artefacto con 8 tornillos 3x10mm autoroscantes.
Código de programación
Recuerda descargar las librerías necesaria en el apartado un poco más arriba. Las librerías que no se encuentren en el archivo, deben añadirse a través del repositorio propio del IDE de Arduino.
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
/************************************************ Descripción del proyecto: Emisora de radio por FM de corto alcance. Con pantalla LCD y selector rotativo de frecuencia. Batería recargable y reproductor de mp3 por USB controlado con 4 pulsadores. Programado por Juan Carlos Pedrajas del Molino Https:\\www.geniero.es pedrajas@geniero.es afelio11@hotmail.com Fecha de inicio: 12/05/2024 Fecha de finalización: 1/06/2024 ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | DFPlayer RX | [ ]RST MOSI/11[ ]~| DFplayer TX | [ ]3V3 +---+ 10[ ]~| Key4 | [ ]5v -| A |- 9[ ]~| Key3 | [ ]GND -| R |- 8[ ] | Key2 | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | Key1 | -| I |- 6[ ]~| SCL FM | [ ]A0 -| N |- 5[ ]~| SDA FM | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| DT encoder | [ ]A3 INT0/2[ ] | CLK enconder SDA LCD_I2C | [ ]A4/SDA RST SCK MISO RX>0[ ] | SW encoder SCL LCD_I2C | [ ]A5/SCL [ ] [ ] [ ] TX<1[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ */ #include <XantoI2C.h> #include "XantoKT0803L.h" #include <EEPROM.h> #include <Button2.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "ESPRotary.h"; #include <SoftwareSerial.h> #include <DFRobotDFPlayerMini.h> SoftwareSerial mySoftwareSerial(11, 12); // RX, TX DFRobotDFPlayerMini myDFPlayer; const uint8_t PIN_SCL = 5; const uint8_t PIN_SDA = 6; XantoKT0803L fm(PIN_SCL, PIN_SDA); #define ROTARY_PIN1 2 #define ROTARY_PIN2 3 Button2 b = Button2(0); Button2 arriba = Button2(7); Button2 abajo = Button2(9); Button2 izq = Button2(8); Button2 der = Button2(10); LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display ESPRotary r = ESPRotary(ROTARY_PIN1, ROTARY_PIN2, 4); //el 4 es por la peculiaridad de mi encoder, que cuenta 4 pasadas en cada salto. float frecuencia = 90; int volumen = 25; boolean pausa = 0; void setup(void) { Serial.begin(9600); Serial.println("Saludos Emisora Escolar 2024"); EEPROM.get(0, frecuencia); // Leemos la última frecuencia utilizda la última vez. lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Emisora Escolar"); lcd.setCursor(0, 1); lcd.print("Marenostrum 2024"); delay(1000); fm.mute(1); //fm.write(W 0x12 0x00); Desactiva la detección de silencio. Por defecto el valor debe ser 0X80 en el registro 0x12 lcd.setCursor(0, 0); lcd.print("Frec.: "); lcd.setCursor(6, 0); lcd.print(frecuencia); lcd.print(" "); lcd.setCursor(12, 0); lcd.print(" MHz "); r.setLeftRotationHandler(showDirection); r.setRightRotationHandler(showDirection); b.setTapHandler(click); arriba.setTapHandler(click); abajo.setTapHandler(click); izq.setTapHandler(click); der.setTapHandler(click); delay(100); mySoftwareSerial.begin(9600); delay(50); myDFPlayer.begin(mySoftwareSerial); // myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK); // myDFPlayer.enableDAC(); myDFPlayer.volume(volumen); //Set volume value. From 0 to 30 lcd.setCursor(0, 1); lcd.print("---Sin emitir---"); } void loop() { r.loop(); b.loop(); arriba.loop(); abajo.loop(); izq.loop(); der.loop(); } void click(Button2& btn) { if (btn == b) { EEPROM.put(0, frecuencia); fm.mute(0); fm.setFrequency(frecuencia * 10); lcd.setCursor(0, 1); lcd.print("Emitiendo:"); lcd.print(frecuencia); lcd.print(" "); // Serial.println("boton1"); } if (btn == arriba) { volumen = volumen + 1; if (volumen > 30) { volumen = 30; } myDFPlayer.volume(volumen); // Serial.println(volumen); } if (btn == abajo) { volumen = volumen - 1; if (volumen < 0) { volumen = 0; } myDFPlayer.volume(volumen); //Serial.println(volumen); } if (btn == izq) { pausa = !pausa; if (pausa == 0) { myDFPlayer.pause(); // Serial.println("Pausa"); } else { myDFPlayer.start(); // Serial.println("Play"); } } if (btn == der) { myDFPlayer.next(); pausa = 1; // Serial.println("Siguiente Canción"); } } void showDirection(ESPRotary& r) { if (r.getDirection() == 1) { //255 a izquierda -- 1 a derecha. frecuencia = frecuencia + 0.1; } if (r.getDirection() == 255) { frecuencia = frecuencia - 0.1; } if (frecuencia < 87.5) { frecuencia = 108; } if (frecuencia > 108) { frecuencia = 87.5; } lcd.setCursor(6, 0); lcd.print(frecuencia); lcd.print(" "); } |
Finalizado el domingo 2 de junio de 2024