Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Radio FM DIY au look rétro avec module TEA5767

Composants et fournitures

Arduino Nano R3
× 1
Module radio FM TEA5767
× 1
Compteurs analogiques de l'ancienne radio
× 2
Adafruit Standard LCD - 16x2 Blanc sur Bleu
× 1
potentiomètre stéréo 10k log
× 1
Module amplificateur audio classe D 2x3W
× 1
Haut-parleur :3 W, 4 ohms
× 2
Haut-parleur :0,25 W, 8 ohms
× 2
Encodeur rotatif avec bouton-poussoir
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 4
Condensateur 1microF
× 2
LED (générique)
× 3

Applications et services en ligne

Arduino IDE

À propos de ce projet

La base de ce projet est le code de Rodolfo Broco Manin (RodLophus sur GitHub) qui contient une belle échelle analogique sur LCD 16x2. J'ai modifié son code en ajoutant deux compteurs analogiques pour lire la force et la fréquence du signal, une LED "stéréo" et une LED "recherche automatique/manuelle". De plus, comme détail rétro, j'ai ajouté quatre touches mémoire dont les fréquences sont prédéfinies dans le code, ainsi la radio prend un look complètement antique. Les sorties audio du TEA5767, via un potentiomètre stéréo, sont connectées au module d'amplification de puissance classe D d'une puissance de 2x3w ce qui est largement suffisant à cet effet. À l'amplificateur sont connectés deux haut-parleurs à 2 voies avec une puissance adéquate. Le haut-parleur aigu est séparé du haut-parleur grave-médium par un condensateur de 1 mf. Les compteurs analogiques proviennent d'une vieille radio défectueuse, mais vous pouvez utiliser n'importe quel compteur, et une déviation complète de l'aiguille sera ajustée avec des potentiomètres de réglage. L'appareil est alimenté par deux batteries au lithium en série via un stabilisateur 7805, nous avons donc stabilisé la source 5V.

Vous pouvez trouver la bibliothèque Arduino TEA5767 ici. Le schéma de circuit et le code sont donnés ci-dessous.

Permettez-moi de mentionner que l'aiguille du fréquencemètre est mise à jour séquentiellement pour chaque 1Mhz, ce qui, je pense, est une conséquence de la bibliothèque, mais si quelqu'un trouve une solution au mouvement fluide de l'aiguille, je l'accepterais avec plaisir. La réception est excellente, en particulier pour les stations FM locales puissantes, tandis que dans les stations plus faibles, un commutateur stéréo/mono est nécessaire en raison des interruptions fréquentes du stéréo au mono et vice versa. Dans la prochaine mise à jour du code, je prévois d'insérer des commutateurs "stéréo/mono" et "muet".

L'ensemble est encastré dans le boîtier approprié sur lequel est montée une antenne télescopique, nous avons donc un récepteur FM stéréo complet avec un joli look rétro.

Code

  • code
codeArduino
/*Tuner radio simple utilisant Arduino Leonardo et le module Philips TEA5767 (version Arduino Uno)Remarques :------ La tension d'alimentation maximale du TEA5767 est de 5V. Assurez-vous que votre Arduino ne fournit pas plus de 5 V - Le TEA5767 ne met pas à jour l'indicateur de niveau de signal lors de la lecture. Le niveau du signal ne sera mis à jour que lors du changement de station. Si vous rencontrez des problèmes sur l'encodeur ou sur le bouton-poussoir, utilisez un réseau d'amortissement, comme celui-ci :broche Arduino>----+----/\/\/\ //--------> Encodeur ou broche de commutation | Résistance 100Ohms ----- ----- Capuchon 47nF | --- GNDConnections :------------ Encodeur (avec interrupteur d'arbre « poussable ») : Bouton-poussoir ---> Arduino pin 2Encoder pin "A" ---> Arduino pin 3Encoder pin "B " ---> broche Arduino 4-LCD:D7 ---> broche Arduino 8D6 ---> broche Arduino 9D5 ---> broche Arduino 10D4 ---> broche Arduino 11RS ---> broche Arduino 13RW ---> GNDE ----> broche Arduino 12VO ---> résistance 2k2 à GND (contraste)- module TEA5756 :vue de dessus :+-10--9--8--7--6-+| +------+ ++ || | THÉ | || || | 5767 | || || +------+ ++ |+--1--2--3--4--5-+1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> +5V6 ----> GND7 ----> Sortie audio (canal droit)8 ----> Sortie audio (canal gauche)10 ---> AntenneMerci de votre intérêt.Amusez-vous bien ! [email protected]*/#include #include // Obtenez la bibliothèque TEA5767 sur https://github.com/andykarpov/TEA5767#include // Encodeur 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// Caractères personnalisés#define SCALE_CLEAR 5 // Échelle de cadran radio#define STEREO_CHAR_S " S"#define STEREO_CHAR_T 7 // "T" stylisé// Indicateurs d'état globaux#define ST_AUTO 0 // Mode automatique (basculé par le bouton poussoir)#define ST_STEREO 1 // Le module radio a détecté un pilote stéréo#define ST_GO_UP 2 // L'encodeur est tourné dans le sens des aiguilles d'une montre#define ST_GO_DOWN 3 // L'encodeur est tourné dans le sens inverse des aiguilles d'une montre#define ST_SEARCH 4 // Le module radio effectue une recherche automatique const int LED =0;int analogsignal=0;int analogscale=0;int stereoled=0; Radio TEA5767;fréquence flottante =88;état de l'octet =0;LiquidCrystal lcd (13, 12, 11, 10, 9, 8);/************************ *************************\ * updateScale() * * Déplace "l'aiguille" sur l'échelle radio *\********* ********************************/void updateScale() { int lcdBase =(fréquence - 88) * 4; // Index des pixels de la colonne LCD (0 <=lcdBase <=(16 * 5)) if(lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // Index de caractères LCD (0 <=lcdMajor <=15) int lcdMinor =lcdBase % 5; // Index de colonne de pixels LCD dans le caractère (0 <=lcdMinor <=4) if(lcdMajor> 0) { // L'aiguille de la radio n'est pas à l'extrême gauche :// nettoie le caractère à gauche (pour effacer le précédent position de l'aiguille) lcd.setCursor(lcdMajor - 1, 0); lcd.write(SCALE_CLEAR); } else lcd.setCursor(lcdMajor, 0); lcd.write(lcdMinor); if(lcdMajor <15) // Pas à la position la plus à droite :efface le caractère à droite lcd.write(SCALE_CLEAR);}/************************ ********\ * isrEncoder() * * Capture les interruptions de l'encodeur *\****************************** **/void isrEncoder() { delay(50); // Anti-rebond (pour les encodeurs merdiques) if(digitalRead(ENCODER_B) ==HIGH){ bitWrite(status, ST_GO_UP, 1); } else bitWrite(status, ST_GO_DOWN, 1);}/*******************************\ * isrSwitch() * * Catch switch?s interrupts *\*******************************/void isrSwitch() { delay(50); // Anti-rebond if(bitRead(status, ST_AUTO)) bitWrite(status, ST_AUTO, 0); else bitWrite(status, ST_AUTO, 1);}/******************\ * Arduino Setup() *\*********** ********/void setup() { Serial.end(); pinMode(button_freq1, INPUT); digitalWrite(button_freq1,LOW); pinMode(button_freq2, INPUT); digitalWrite(button_freq2,LOW); pinMode(button_freq3, INPUT); digitalWrite(button_freq3,LOW); pinMode(button_freq4, INPUT); digitalWrite(button_freq4,LOW); pinMode (LED, SORTIE); pinMode (6, SORTIE); pinMode(7,SORTIE); pinMode(5,SORTIE); int je; octet NeedleChar[8]; // Octet "S" stylisé stereoChar1[8] ={ 0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000 } ; lcd.createChar(STEREO_CHAR_S, stereoChar1) ; // Octet "T" stylisé stereoChar2[8] ={ 0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000 } ; lcd.createChar(STEREO_CHAR_T, stereoChar2) ; // Échelle de numérotation octet d'arrière-plan scaleChar[8] ={ 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101 } ; lcd.createChar(SCALE_CLEAR, scaleChar); // Crée un caractère personnalisé pour représenter toutes les (5) positions possibles de l'aiguille for(int j =0; j <5; j++) { for(i =0; i <8; i++) needleChar[i] =scaleChar[i ] | (0b10000>> j); lcd.createChar(j, aiguilleChar); } lcd.begin (16, 2); lcd.clear(); // Dessine l'arrière-plan de l'échelle du cadran pour(i =0; i <16; i++) lcd.write(SCALE_CLEAR); pinMode(ENCODER_SW, INPUT); digitalWrite(ENCODER_SW, HAUT); pinMode(ENCODER_A, INPUT); digitalWrite(ENCODER_A, HAUT); pinMode(ENCODER_B, INPUT); digitalWrite(ENCODER_B, HAUT); attachInterrupt(0, isrSwitch, RISING); attachInterrupt (1, isrEncoder, RISING); // Initialise le module radio Wire.begin(); Radio.init(); Radio.set_fréquence (fréquence);}/******************\ * Boucle Arduino() *\****************** ***/void loop() { unsigned char buf[5]; int stéréo; int signalLevel; int searchDirection; int je; i=0 ; // Mettre à jour l'indicateur Auto/Manuel lcd.setCursor(12, 1); lcd.write(bitRead(status, ST_AUTO) ? 'A' :'M'); if bitRead(status, ST_AUTO) // LED auto/manuelle { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } if (Radio.read_status(buf) ==1) { // Obtenir la fréquence des données radio =étage(Radio.fréquence_disponible(buf) / 100000 + .5) / 10; stéréo =Radio.stereo(buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level(buf) * 100) / 15; analogsignal=map(signalLevel,0,100,0,255); analogscale=map(fréquence,88,114,0,255); stereoled=map(stereo,0.7,1,0,255); analogWrite (5,signal analogique); // Compteur de signal analogWrite (6,analogscale); //fréquencemètre analogWrite (7, stéréo); // LED stéréo // Mettre à jour le cadran radio updateScale(); // Indicateur de niveau de signal lcd.setCursor(0, 1); lcd.écrire(183); // Caractère japonais qui ressemble à une antenne :) if(signalLevel <100) lcd.write(' '); lcd.print(signalLevel); lcd.write('%'); // Indicateur de fréquence lcd.setCursor(6, 1); if(fréquence <100) lcd.write(' '); lcd.print(fréquence, 1); // Indicateur mono/stéréo lcd.setCursor(14, 1); if(stéréo){ lcd.write(STEREO_CHAR_S); lcd.write(STEREO_CHAR_T); } else lcd.print(" "); } if(bitRead(status, ST_SEARCH)) { // La radio effectue-t-elle une recherche automatique ? if(Radio.process_search(buf, searchDirection) ==1) { bitWrite(status, ST_SEARCH, 0); } } if(digitalRead(button_freq2)==HIGH){ //boutons "mémoire" if(fréquence> 94,8) { fréquence=94,8; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_DOWN, 0); } else { fréquence=94,8; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_UP, 0); } precrtajScale(); }if(digitalRead(button_freq1)==HIGH){ if(fréquence> 92) { fréquence=92; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_DOWN, 0); } else { fréquence=92; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_UP, 0); } precrtajScale();}if(digitalRead(button_freq3)==HIGH){ if(fréquence> 97) { fréquence=97; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_DOWN, 0); } else { fréquence=97; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_UP, 0); } precrtajScale(); }if(digitalRead(button_freq4)==HIGH){ if(fréquence> 101,2) { fréquence=101,2; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_DOWN, 0); } else { fréquence=101,2; Radio.set_fréquence(fréquence); bitWrite(statut, ST_GO_UP, 0); } precrtajScale();} // L'encodeur est tourné dans le sens des aiguilles d'une montre (+) if(bitRead(status, ST_GO_UP)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Mode de recherche automatique (uniquement traité si la radio n'effectue pas actuellement de recherche) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up(buf); retard (50); } else { // Mode de réglage manuel if(fréquence <108) { fréquence +=0,1; Radio.set_fréquence(fréquence); } } bitWrite(statut, ST_GO_UP, 0); } // L'encodeur est tourné dans le sens antihoraire (-) if(bitRead(status, ST_GO_DOWN)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Mode de recherche automatique (uniquement traité si la radio est n'effectue pas actuellement de recherche) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN ; Radio.search_down(buf); retard (50); } else { // Mode de réglage manuel if(fréquence> 88) { fréquence -=0,1; Radio.set_fréquence(fréquence); } } bitWrite(statut, ST_GO_DOWN, 0); }} void precrtajScale() { int i; lcd.clear(); for(i =0; i <16; i++) lcd.write(SCALE_CLEAR);}

Schémas


Processus de fabrication

  1. Concevoir avec Bluetooth Mesh :puce ou module ?
  2. Thermostat NEST Virtual Alike DIY avec Node-RED
  3. API de capteur environnemental avec un RPi
  4. Détecteur de pleurs de bébé bricolage facile avec Raspberry Pi
  5. horloge IV9 Numitron DIY la plus simple avec Arduino
  6. Module d'importation en Python avec des exemples
  7. Capturer les gouttes d'eau avec Arduino
  8. Planche à roulettes en réalité virtuelle DIY
  9. Radio FM pour cabine de douche à base d'Arduino