Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Radio FM de estilo retro DIY con módulo TEA5767

Componentes y suministros

Arduino Nano R3
× 1
Módulo de radio FM TEA5767
× 1
Medidores analógicos de radio antigua
× 2
LCD estándar Adafruit - 16x2 blanco sobre azul
× 1
potenciómetro estéreo 10k log
× 1
Módulo amplificador de audio clase D 2x3W
× 1
Altavoz:3 W, 4 ohmios
× 2
Altavoz:0,25 W, 8 ohmios
× 2
Codificador rotatorio con pulsador
× 1
Interruptor de botón SparkFun de 12 mm
× 4
condensador 1microF
× 2
LED (genérico)
× 3

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

La base de este proyecto es el código de Rodolfo Broco Manin (RodLophus en GitHub) que contiene una hermosa escala analógica en una pantalla LCD de 16x2. Modifiqué su código agregando dos medidores analógicos para leer la intensidad y frecuencia de la señal, LED "estéreo" y LED de "búsqueda automática / manual". Además, como detalle retro, agregué cuatro teclas de memoria cuyas frecuencias están predefinidas en el código, por lo que la radio adquiere un aspecto completamente antiguo. Las salidas de audio del TEA5767, a través de un potenciómetro estéreo, están conectadas al módulo amplificador de potencia de clase D con una potencia de 2x3w, que es suficiente para este propósito. Al amplificador se conectan dos altavoces de 2 vías con la potencia adecuada. El altavoz de tono alto está separado del altavoz de medios y graves con un condensador de 1 mf. Los medidores analógicos son de una vieja radio defectuosa, pero puede usar cualquier medidor y se ajustará una desviación completa de la aguja con potenciómetros de ajuste. El dispositivo funciona con dos baterías de litio en serie a través de un estabilizador 7805, por lo que hemos estabilizado la fuente de 5V.

Puede encontrar la biblioteca Arduino TEA5767 aquí. El diagrama y el código del circuito se dan a continuación.

Permítanme mencionar que la aguja del medidor de frecuencia se actualiza secuencialmente para cada 1Mhz, lo que creo que es una consecuencia de la biblioteca, pero si alguien encuentra una solución para el movimiento suave de la aguja, la aceptaré con mucho gusto. La recepción es excelente, especialmente para las estaciones de FM locales fuertes, mientras que en las estaciones más débiles existe la necesidad de un interruptor estéreo / mono debido a las frecuentes interrupciones de estéreo a mono y viceversa. En la próxima actualización de código, planeo insertar interruptores "estéreo / mono" y "silencio".

Todo el conjunto está incrustado en la caja correspondiente en la que está montada una antena telescópica, por lo que tenemos un receptor estéreo FM completo con un bonito aspecto retro.

Código

  • código
código Arduino
 / * Sintonizador de radio simple que usa Arduino Leonardo y el módulo Philips TEA5767 (versión Arduino Uno) Notas:------ El voltaje de suministro máximo del TEA5767 es de 5V. Asegúrese de que su Arduino no obtenga más de 5V:el TEA5767 no actualiza el indicador de nivel de señal en la lectura. El nivel de señal solo se actualizará en el cambio de estación:si tiene algunos fallos en el codificador o en el botón, use una red de amortiguación, como esta:Pin Arduino> ---- + ---- / \ / \ / \ / ---------> Pin codificador o interruptor | Resistencia de 100Ohms ----- ----- 47nF cap | --- GNDConnections:------------ Codificador (con interruptor de eje "empujable"):Pulsador ---> Pin 2 de Arduino Pin "A" del codificador ---> Pin 3 de Arduino Pin "B del codificador "---> Pin Arduino 4- LCD:D7 ---> Pin Arduino 8D6 ---> Pin Arduino 9D5 ---> Pin Arduino 10D4 ---> Pin Arduino 11RS ---> Pin Arduino 13RW ---> GNDE ----> Pin 12VO de Arduino ---> Resistencia 2k2 a GND (contraste) - Módulo TEA5756:Vista superior:+ - 10--9--8--7--6- + | + ------ + ++ || | TEA | || || | 5767 | || || + ------ + ++ | + - 1--2--3--4--5- + 1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> + 5V6 ----> GND7 ----> Salida de audio (canal derecho) 8 ----> Salida de audio (canal izquierdo) 10 ---> Antena Gracias por tu interés. ¡Que te diviertas! [email protected]*/#include  #include  // Obtenga la biblioteca TEA5767 en https://github.com/andykarpov/TEA5767#include  // Codificador pins # define ENCODER_SW 2 # define ENCODER_A 3 # define ENCODER_B 4 # define button_freq1 A0 # define button_freq2 A1 # define button_freq3 A2 # define button_freq4 A3 // Caracteres personalizados # define SCALE_CLEAR 5 // Escala del dial de radio # define STEREO_CHAR_S 6 // Estilizado S "#define STEREO_CHAR_T 7 //" T "estilizada // Indicadores de estado global # define ST_AUTO 0 // Modo automático (activado por el botón pulsador) #define ST_STEREO 1 // El módulo de radio detectó un piloto estéreo # define ST_GO_UP 2 // El codificador se gira en el sentido de las agujas del reloj # define ST_GO_DOWN 3 // El codificador se gira en el sentido contrario a las agujas del reloj # define ST_SEARCH 4 // El módulo de radio está realizando una búsqueda automática int LED =0; int analogsignal =0; int analogscale =0; int stereoled =0; TEA5767 Radio; frecuencia flotante =88; estado de byte =0; LiquidCrystal lcd (13, 12, 11, 10, 9, 8); / ******************** *********************** \ * updateScale () * * Mueve la "aguja" sobre la escala de radio * \ ********* ********************************** / void updateScale () {int lcdBase =(frecuencia - 88) * 4; // Índice de píxeles de la columna LCD (0 <=lcdBase <=(16 * 5)) if (lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // Índice de caracteres LCD (0 <=lcdMajor <=15) int lcdMinor =lcdBase% 5; // Índice de la columna de píxeles de la pantalla LCD dentro del carácter (0 <=lcdMinor <=4) if (lcdMajor> 0) {// La aguja del dial de radio no está en la posición más a la izquierda:// limpia el carácter de la izquierda (para borrar el anterior posición neddle) lcd.setCursor (lcdMajor - 1, 0); lcd.write (SCALE_CLEAR); } else lcd.setCursor (lcdMajor, 0); lcd.write (lcdMinor); if (lcdMajor <15) // No en la posición más a la derecha:borra el carácter en el lcd derecho.write (SCALE_CLEAR);} / ********************** ******** \ * isrEncoder () * * Capturar interrupciones del codificador * \ ************************** ** / void isrEncoder () {retraso (50); // Eliminación de rebotes (para codificadores de mierda) if (digitalRead (ENCODER_B) ==HIGH) {bitWrite (status, ST_GO_UP, 1); } else bitWrite (estado, ST_GO_DOWN, 1);} / **************************** \ * isrSwitch () * * Catch interrupciones del interruptor * \ **************************** / void isrSwitch () {retraso (50); // Eliminación de rebotes if (bitRead (estado, ST_AUTO)) bitWrite (estado, ST_AUTO, 0); else bitWrite (estado, ST_AUTO, 1);} / ******************* \ * Configuración de Arduino () * \ *********** ******** / void setup () {Serial.end (); pinMode (button_freq1, ENTRADA); digitalWrite (button_freq1, LOW); pinMode (button_freq2, ENTRADA); digitalWrite (button_freq2, LOW); pinMode (button_freq3, ENTRADA); digitalWrite (button_freq3, LOW); pinMode (button_freq4, ENTRADA); digitalWrite (button_freq4, LOW); pinMode (LED, SALIDA); pinMode (6, SALIDA); pinMode (7, SALIDA); pinMode (5, SALIDA); int i; byte agujaChar [8]; // Byte "S" estilizado stereoChar1 [8] ={0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000}; lcd.createChar (STEREO_CHAR_S, stereoChar1); // Byte "T" estilizado stereoChar2 [8] ={0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000}; lcd.createChar (STEREO_CHAR_T, stereoChar2); // Marcar el byte de fondo de la escala scaleChar [8] ={0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101}; lcd.createChar (SCALE_CLEAR, scaleChar); // Crea un carácter personalizado para representar todas las (5) posiciones posibles de la aguja para (int j =0; j <5; j ++) {for (i =0; i <8; i ++) needleChar [i] =scaleChar [i ] | (0b10000>> j); lcd.createChar (j, agujaChar); } lcd.begin (16, 2); lcd.clear (); // Dibuja el fondo de la escala del dial para (i =0; i <16; i ++) lcd.write (SCALE_CLEAR); pinMode (ENCODER_SW, ENTRADA); digitalWrite (ENCODER_SW, HIGH); pinMode (ENCODER_A, ENTRADA); digitalWrite (ENCODER_A, HIGH); pinMode (ENCODER_B, ENTRADA); digitalWrite (ENCODER_B, HIGH); attachInterrupt (0, isrSwitch, RISING); attachInterrupt (1, isrEncoder, RISING); // Inicializa el módulo de radio Wire.begin (); Radio.init (); Radio.set_frequency (frecuencia);} / ****************** \ * Arduino Loop () * \ *************** *** / void loop () {unsigned char buf [5]; int estéreo; int signalLevel; int searchDirection; int i; i =0; // Actualiza el indicador Auto / Manual lcd.setCursor (12, 1); lcd.write (bitRead (estado, ST_AUTO)? 'A':'M'); if bitRead (estado, ST_AUTO) // LED automático / manual {digitalWrite (LED, LOW); } else {digitalWrite (LED, HIGH); } if (Radio.read_status (buf) ==1) {// Obtener la frecuencia de datos de radio =piso (Radio.frequency_available (buf) / 100000 + .5) / 10; estéreo =Radio.stereo (buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level (buf) * 100) / 15; analogsignal =map (signalLevel, 0,100,0,255); analogscale =map (frecuencia, 88,114,0,255); stereoled =map (estéreo, 0,7,1,0,255); analogWrite (5, señal analógica); // Medidor de señal analogWrite (6, analogscale); // medidor de frecuencia analogWrite (7, estéreo); // LED estéreo // Actualiza el dial de radio updateScale (); // Indicador de nivel de señal lcd.setCursor (0, 1); escritura en pantalla (183); // Carácter japonés que parece una antena :) if (signalLevel <100) lcd.write (''); lcd.print (signalLevel); lcd.write ('%'); // Indicador de frecuencia lcd.setCursor (6, 1); if (frecuencia <100) lcd.write (''); lcd.print (frecuencia, 1); // Indicador mono / estéreo lcd.setCursor (14, 1); if (estéreo) {lcd.write (STEREO_CHAR_S); lcd.write (STEREO_CHAR_T); } else lcd.print (""); } if (bitRead (status, ST_SEARCH)) {// ¿La radio está realizando una búsqueda automática? if (Radio.process_search (buf, searchDirection) ==1) {bitWrite (estado, ST_SEARCH, 0); }} if (digitalRead (button_freq2) ==HIGH) {// botones de "memoria" if (frecuencia> 94,8) {frecuencia =94,8; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_DOWN, 0); } else {frecuencia =94,8; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq1) ==HIGH) {if (frecuencia> 92) {frecuencia =92; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_DOWN, 0); } más {frecuencia =92; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_UP, 0); } precrtajScale ();} if (digitalRead (button_freq3) ==HIGH) {if (frecuencia> 97) {frecuencia =97; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_DOWN, 0); } else {frecuencia =97; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq4) ==HIGH) {if (frecuencia> 101.2) {frecuencia =101.2; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_DOWN, 0); } más {frecuencia =101,2; Radio.set_frequency (frecuencia); bitWrite (estado, ST_GO_UP, 0); } precrtajScale ();} // Codificador girando en el sentido de las agujas del reloj (+) if (bitRead (status, ST_GO_UP)) {if (bitRead (status, ST_AUTO) &&! bitRead (status, ST_SEARCH)) {// Modo de búsqueda automática (solo procesado si la radio no está realizando una búsqueda actualmente) bitWrite (estado, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up (buf); retraso (50); } else {// Modo de sintonización manual if (frecuencia <108) {frecuencia + =0.1; Radio.set_frequency (frecuencia); }} bitWrite (estado, ST_GO_UP, 0); } // Codificador girando en sentido antihorario (-) if (bitRead (status, ST_GO_DOWN)) {if (bitRead (status, ST_AUTO) &&! BitRead (status, ST_SEARCH)) {// Modo de búsqueda automática (solo se procesa si la radio está actualmente no está realizando una búsqueda) bitWrite (estado, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down (buf); retraso (50); } else {// Modo de sintonización manual if (frecuencia> 88) {frecuencia - =0.1; Radio.set_frequency (frecuencia); }} bitWrite (estado, ST_GO_DOWN, 0); }} void precrtajScale () {int i; lcd.clear (); para (i =0; i <16; i ++) lcd.write (SCALE_CLEAR);} 

Esquemas


Proceso de manufactura

  1. Diseñar con Bluetooth Mesh:¿Chip o módulo?
  2. Termostato NEST virtual de bricolaje con Node-RED
  3. API de sensor ambiental con un RPi
  4. Fácil detector de llanto para bebés con Raspberry Pi
  5. El reloj IV9 Numitron más simple de bricolaje con Arduino
  6. Módulo de importación en Python con ejemplos
  7. Capturando las gotas de agua con Arduino
  8. Patineta de realidad virtual DIY
  9. Radio FM de cabina de ducha basada en Arduino
  10. Cómo conectar Arduino Mega con el módulo GPS NEO-6M
  11. Voltímetro de bricolaje con Arduino y una pantalla Nokia 5110