Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

DIY-UKW-Radio im Retro-Look mit TEA5767-Modul

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
TEA5767 FM-Radiomodul
× 1
Analogmeter aus altem Radio
× 2
Adafruit Standard LCD - 16x2 Weiß auf Blau
× 1
Stereo-Potentiometer 10k log
× 1
D-Klasse Audioverstärkermodul 2x3W
× 1
Lautsprecher:3 W, 4 Ohm
× 2
Lautsprecher:0,25 W, 8 Ohm
× 2
Drehgeber mit Druckknopf
× 1
SparkFun Drucktastenschalter 12 mm
× 4
1microF Kondensator
× 2
LED (generisch)
× 3

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Die Basis für dieses Projekt ist der Code von Rodolfo Broco Manin (RodLophus auf GitHub), der eine schöne analoge Skala auf 16x2 LCD enthält. Ich habe seinen Code modifiziert, indem ich zwei analoge Messgeräte zum Lesen der Signalstärke und -frequenz, die LED "Stereo" und die LED "automatische / manuelle Suche" hinzugefügt habe. Außerdem habe ich als Retro-Detail vier Speichertasten hinzugefügt, deren Frequenzen im Code vordefiniert sind, damit das Radio einen komplett antiken Look bekommt. Die Audioausgänge des TEA5767 werden über ein Stereo-Potentiometer an das D-Klasse-Endstufenmodul mit der für diesen Zweck ausreichenden Leistung von 2x3W angeschlossen. An den Verstärker sind zwei 2-Wege-Lautsprecher mit ausreichender Leistung angeschlossen. Der Hochtonlautsprecher ist mit einem 1mf-Kondensator vom Tiefmitteltöner getrennt. Analoge Messgeräte stammen von einem alten defekten Radio, aber Sie können jedes Messgerät verwenden, und eine volle Abweichung der Nadel wird mit Trimmerpotentiometern eingestellt. Das Gerät wird mit zwei Lithiumbatterien in Reihe über einen 7805-Stabilisator betrieben, sodass wir eine stabilisierte 5V-Quelle haben.

Hier finden Sie die Arduino-Bibliothek TEA5767. Schaltplan und Code sind unten angegeben.

Lassen Sie mich erwähnen, dass die Frequenzmessernadel sequentiell für alle 1Mhz aktualisiert wird, was meiner Meinung nach eine Folge der Bibliothek ist, aber wenn jemand eine Lösung für die reibungslose Bewegung der Nadel findet, würde ich sie gerne akzeptieren. Der Empfang ist hervorragend, insbesondere bei starken lokalen UKW-Sendern, während bei schwächeren Sendern aufgrund häufiger Unterbrechungen von Stereo auf Mono und umgekehrt eine Stereo/Mono-Umschaltung erforderlich ist. Im nächsten Code-Update plane ich, "Stereo/Mono"- und "Mute"-Schalter einzufügen.

Die gesamte Baugruppe ist in die entsprechende Box eingebettet, auf der eine Teleskopantenne montiert ist, sodass wir einen kompletten FM-Stereo-Receiver mit schönem Retro-Look haben.

Code

  • Code
codeArduino
/*Einfacher Radiotuner mit Arduino Leonardo und dem Philips TEA5767-Modul (Arduino Uno-Version)Hinweise:------ Die maximale Versorgungsspannung des TEA5767 beträgt 5V. Stellen Sie sicher, dass Ihr Arduino nicht mehr als 5 V liefert. Der TEA5767 aktualisiert die Signalpegelanzeige beim Lesen nicht. Der Signalpegel wird nur bei Stationswechsel aktualisiert. Wenn Sie Störungen am Encoder oder am Taster erhalten, verwenden Sie ein Snubber-Netzwerk wie dieses:Arduino-Pin>----+----/\/\/\ /--------> Encoder oder Schaltstift | 100Ohms Widerstand ----- ----- 47nF Kappe | --- GNDConnections:------------ Encoder (mit "schiebbarem" Wellenschalter):Taster ---> Arduino Pin 2Encoder Pin "A" ---> Arduino Pin 3Encoder Pin "B " ---> Arduino-Pin 4-LCD:D7 ---> Arduino-Pin 8D6 ---> Arduino-Pin 9D5 ---> Arduino-Pin 10D4 ---> Arduino-Pin 11RS ---> Arduino-Pin 13RW ---> GNDE ----> Arduino Pin 12VO ---> 2k2 Widerstand zu GND (Kontrast)- TEA5756 Modul:Draufsicht:+-10--9--8--7--6-+| +-----+ ++ || | TEE | || || | 5767 | || || +-----+ ++ |+--1--2--3--4--5-+1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> +5V6 ----> GND7 ----> Audioausgang (rechter Kanal)8 ----> Audioausgang (linker Kanal)10 ---> AntenneVielen Dank für Ihr Interesse. Viel Spaß! [email protected]*/#include #include // Holen Sie sich die TEA5767-Bibliothek unter https://github.com/andykarpov/TEA5767#include // Encoder 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// Eigene Zeichen#define SCALE_CLEAR 5 // Funkskala#define STEREO_CHARized "S 6 // Stylized_S 6 S"#define STEREO_CHAR_T 7 // Stilisiertes "T"// Globale Statusflags#define ST_AUTO 0 // Auto-Modus (umgeschaltet durch die Taste)#define ST_STEREO 1 // Funkmodul hat einen Stereopiloten erkannt#define ST_GO_UP 2 // Encoder wird im Uhrzeigersinn gedreht#define ST_GO_DOWN 3 // Encoder wird gegen den Uhrzeigersinn gedreht#define ST_SEARCH 4 // Funkmodul führt eine automatische Suche durch int LED =0;int analogsignal=0;int analogscale=0;int stereoled=0; TEA5767 Funk;Float-Frequenz =88;Byte Status =0;LiquidCrystal LCD(13, 12, 11, 10, 9, 8);/******************** **********************\ * updateScale() * * Bewegt die "Nadel" über die Funkwaage *\********* *********************************/void updateScale() { int lcdBase =(Frequenz - 88) * 4; // LCD-Spaltenpixelindex (0 <=lcdBase <=(16 * 5)) if (lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // LCD-Zeichenindex (0 <=lcdMajor <=15) int lcdMinor =lcdBase % 5; // LCD-Pixelspaltenindex innerhalb des Zeichens (0 <=lcdMinor <=4) if(lcdMajor> 0) { // Die Nadel des Radios befindet sich nicht ganz links:// das Zeichen links reinigen (um das vorherige zu löschen Nadelposition) lcd.setCursor(lcdMajor - 1, 0); lcd.write (SCALE_CLEAR); } sonst lcd.setCursor (lcdMajor, 0); lcd.write (lcdMinor); if(lcdMajor <15) // Nicht ganz rechts:Zeichen rechts löschen lcd.write(SCALE_CLEAR);}/************************ ********\ * isrEncoder() * * Codierer-Interrupts abfangen *\**************************** **/void isrEncoder () { Verzögerung (50); // Entprellen (für beschissene Encoder) 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); // Entprellen 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, AUSGANG); PinMode (6, AUSGANG); PinMode (7, AUSGANG); PinMode (5, AUSGANG); int ich; Byte-NadelChar[8]; // Stilisiertes "S" Byte stereoChar1[8] ={ 0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000 }; lcd.createChar(STEREO_CHAR_S, stereoChar1); // Stilisiertes "T"-Byte stereoChar2[8] ={ 0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000 }; lcd.createChar(STEREO_CHAR_T, stereoChar2); // Skala-Hintergrundbyte scaleChar[8] ={ 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101 }; lcd.createChar(SCALE_CLEAR, scaleChar); // Benutzerdefiniertes Zeichen erstellen, um alle (5) möglichen Nadelpositionen darzustellen for(int j =0; j <5; j++) { for(i =0; i <8; i++) NeedleChar[i] =scaleChar[i ] | (0b10000>> j); lcd.createChar(j, NadelChar); } lcd.begin(16, 2); lcd.clear(); // Zeichne den Hintergrund der Skalenskala for(i =0; i <16; i++) lcd.write(SCALE_CLEAR); pinMode (ENCODER_SW, INPUT); digitalWrite (ENCODER_SW, HIGH); pinMode (ENCODER_A, INPUT); digitalWrite (ENCODER_A, HOCH); pinMode (ENCODER_B, INPUT); digitalWrite (ENCODER_B, HOCH); attachInterrupt(0, isrSwitch, RISING); attachInterrupt(1, isrEncoder, RISING); // Initialisieren des Funkmoduls Wire.begin(); Radio.init(); Radio.set_frequency(frequency);}/********************\ * Arduino Loop() *\**************** ***/void loop () { unsigned char buf[5]; int-Stereo; int signalLevel; int Suchrichtung; int ich; i=0; // Aktualisieren Sie den Auto / Manual-Indikator lcd.setCursor (12, 1); lcd.write(bitRead(status, ST_AUTO) ? 'A' :'M'); if bitRead (status, ST_AUTO) // Auto/manual LED { DigitalWrite (LED, LOW); aufrechtzuerhalten. Sonst { DigitalWrite (LED, HIGH); } if (Radio.read_status(buf) ==1) {// Abrufen der Funkdatenfrequenz =floor(Radio.frequency_available(buf) / 100000 + .5) / 10; stereo =Radio.stereo(buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level(buf) * 100) / 15; analogsignal=map(signalLevel,0,100,0,255); analogscale=map(Frequenz,88,114,0,255); stereoled=map(stereo,0.7,1,0,255); analogWrite (5, analoges Signal); // Signalmesser analogWrite (6,analogscale); // Frequenzmesser analogWrite (7,stereoled); // Stereo-LED // Aktualisieren Sie die Funkwählscheibe updateScale (); // Signalpegelanzeige lcd.setCursor (0, 1); lcd.write(183); // Japanisches Zeichen, das wie eine Antenne aussieht :) if(signalLevel <100) lcd.write(' '); lcd.print (signalLevel); lcd.write('%'); // Frequenzanzeige lcd.setCursor(6, 1); if(Häufigkeit <100) lcd.write(' '); lcd.print (Frequenz, 1); // Mono / Stereo-Anzeige lcd.setCursor (14, 1); if (stereo) {lcd.write (STEREO_CHAR_S); lcd.write (STEREO_CHAR_T); } sonst lcd.print(" "); } if(bitRead(status, ST_SEARCH)) { // Führt das Radio eine automatische Suche durch? if(Radio.process_search(buf, searchDirection) ==1) { bitWrite(status, ST_SEARCH, 0); aufrechtzuerhalten. Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_DOWN, 0); aufrechtzuerhalten. Sonst { Häufigkeit =94,8; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_UP, 0); } precrtajScale(); } if (digitalRead (button_freq1) ==HIGH) { if (Frequenz> 92) { Frequenz =92; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_DOWN, 0); aufrechtzuerhalten. Sonst { Häufigkeit =92; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_UP, 0); aufrechtzuerhalten. PrecrtajScale ();} if (digitalRead (button_freq3) ==HIGH) { if (Frequenz> 97) { Frequenz =97; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_DOWN, 0); aufrechtzuerhalten. Sonst { Häufigkeit =97; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_UP, 0); } precrtajScale(); } if (digitalRead (button_freq4) ==HIGH) { if (Frequenz> 101,2) { Frequenz =101.2; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_DOWN, 0); aufrechtzuerhalten. Sonst { Häufigkeit =101,2; Radio.set_frequency (Frequenz); bitWrite (Status, ST_GO_UP, 0); } precrtajScale();} // Encoder wird im Uhrzeigersinn (+) gedreht if(bitRead(status, ST_GO_UP)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Automatischer Suchmodus (nur verarbeitet, wenn das Funkgerät gerade keine Suche durchführt) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up(buf); Verzögerung (50); aufrechtzuerhalten. Sonst {// Manueller Abstimmungsmodus if (Frequenz <108) { Frequenz +=0,1; Radio.set_frequency (Frequenz); } } bitWrite (Status, ST_GO_UP, 0); } // Encoder wird gegen den Uhrzeigersinn gedreht (-) if(bitRead(status, ST_GO_DOWN)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Automatischer Suchmodus (wird nur verarbeitet, wenn das Radio ist führt derzeit keine Suche durch) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down(buf); Verzögerung (50); aufrechtzuerhalten. Sonst {// Manueller Abstimmungsmodus if (Frequenz> 88) { Frequenz -=0,1; Radio.set_frequency (Frequenz); } } bitWrite (Status, ST_GO_DOWN, 0); }}void precrtajScale() { int i; lcd.clear(); for(i =0; i <16; i++) lcd.write(SCALE_CLEAR);}

Schaltpläne


Herstellungsprozess

  1. Entwerfen mit Bluetooth Mesh:Chip oder Modul?
  2. DIY Virtual Alike NEST Thermostat mit Node-RED
  3. Umgebungssensor-API mit einem RPi
  4. Einfacher DIY-Baby-Weindetektor mit Raspberry Pi
  5. DIY einfachste IV9 Numitron-Uhr mit Arduino
  6. Modul in Python mit Beispielen importieren
  7. Einfangen der Wassertropfen mit Arduino
  8. DIY Virtual Reality Skateboard
  9. Arduino-basiertes FM-Radio in Duschkabine
  10. Wie man Arduino Mega mit dem NEO-6M GPS-Modul verbindet