Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Radio FM Retro Look DIY dengan Modul TEA5767

Komponen dan persediaan

Arduino Nano R3
× 1
Modul radio FM TEA5767
× 1
Pengukur analog dari radio lama
× 2
Adafruit LCD Standar - 16x2 Putih di Atas Biru
× 1
logo potensiometer stereo 10k
× 1
Modul penguat audio kelas D 2x3W
× 1
Speaker:3W, 4 ohm
× 2
Speaker:0,25W, 8 ohm
× 2
Rotary Encoder dengan Tombol Tekan
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 4
1 kapasitor mikroF
× 2
LED (generik)
× 3

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Dasar dari proyek ini adalah kode Rodolfo Broco Manin (RodLophus di GitHub) yang berisi skala analog yang indah pada LCD 16x2. Saya memodifikasi kodenya dengan menambahkan dua meter analog untuk membaca kekuatan dan frekuensi sinyal, LED "stereo", dan LED "pencarian otomatis / manual". Juga, sebagai detail retro, saya menambahkan empat tombol memori yang frekuensinya telah ditentukan sebelumnya dalam kode, sehingga radio mendapatkan tampilan yang benar-benar antik. Output audio TEA5767, melalui potensiometer stereo, terhubung ke modul power amplifier kelas D dengan kekuatan 2x3w yang cukup untuk tujuan ini. Untuk amplifier dihubungkan dua speaker 2 arah dengan daya yang memadai. Speaker nada tinggi dipisahkan dari speaker bass-midrange dengan kapasitor 1mf. nalog meter berasal dari radio tua yang rusak tetapi Anda dapat menggunakan meteran apa saja, dan penyimpangan penuh jarum akan disesuaikan dengan potensiometer pemangkas. Perangkat ini ditenagai oleh dua baterai lithium secara seri melalui penstabil 7805, jadi kami telah menstabilkan sumber 5V.

Anda dapat menemukan perpustakaan TEA5767 Arduino di sini. Diagram sirkuit dan kode diberikan di bawah ini.

Izinkan saya menyebutkan bahwa jarum pengukur frekuensi diperbarui secara berurutan untuk setiap 1Mhz, yang menurut saya merupakan konsekuensi dari perpustakaan, tetapi jika seseorang menemukan solusi untuk kelancaran pergerakan jarum, saya akan dengan senang hati menerimanya. Penerimaan sangat baik, terutama untuk stasiun FM lokal yang kuat, sementara di stasiun yang lebih lemah diperlukan sakelar stereo/mono karena seringnya interupsi stereo ke mono dan sebaliknya. Dalam pembaruan kode berikutnya, saya berencana untuk memasukkan sakelar "stereo/mono" dan "mute".

Seluruh unit tertanam dalam kotak yang sesuai yang dipasangi antena teleskopik, jadi kami memiliki penerima stereo FM lengkap dengan tampilan retro yang bagus.

Kode

  • kode
kodeArduino
/*Penala radio sederhana menggunakan Arduino Leonardo dan modul Philips TEA5767 (versi Arduino Uno)Catatan:------ Tegangan suplai maksimum TEA5767 adalah 5V. Pastikan Arduino Anda tidak menggunakan sumber lebih dari 5V- TEA5767 tidak memperbarui indikator level sinyal saat dibaca. Level sinyal hanya akan diperbarui pada perubahan stasiun- Jika Anda mendapatkan beberapa gangguan pada encoder atau tombol tekan, gunakan jaringan snubber, seperti ini:Pin Arduino>----+----/\/\/\ //--------> Encoder atau pin sakelar | Resistor 100Ohm ----- ----- tutup 47nF | --- GNDConnections:------------ Encoder (dengan saklar poros "pushable"):Tekan tombol ---> Arduino pin 2Encoder pin "A" ---> Arduino pin 3Encoder pin "B " ---> Pin Arduino 4- LCD:D7 ---> Pin Arduino 8D6 ---> Pin Arduino 9D5 ---> Pin Arduino 10D4 ---> Pin Arduino 11RS ---> Pin Arduino 13RW ---> GNDE ----> Arduino pin 12VO ---> 2k2 resistor ke GND (kontras)- modul TEA5756:Tampilan atas:+-10--9--8--7--6-+| +------+ ++ || | TEH | || || | 5767 | || || +------+ ++ |+--1--2--3--4--5-+1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> +5V6 ----> GND7 ----> Audio out (saluran kanan)8 ----> Audio out (saluran kiri)10 ---> AntenaTerima kasih atas minat Anda. Selamat bersenang-senang! [email protected]*/#include #include // Dapatkan perpustakaan TEA5767 di https://github.com/andykarpov/TEA5767#include // Encoder pin#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// Custom character#define SCALE_Skala panggil S"#define STEREO_CHAR_T 7 // Stylized "T"// Bendera status global#define ST_AUTO 0 // Mode otomatis (dialihkan oleh tombol tekan)#define ST_STEREO 1 // Modul radio mendeteksi pilot stereo#define ST_GO_UP 2 // Encoder diputar searah jarum jam#menentukan ST_GO_DOWN 3 // Encoder diputar berlawanan arah jarum jam#menentukan ST_SEARCH 4 // Modul radio melakukan pencarian otomatis int LED =0;int analogsignal=0;int analogscale=0;int stereoled=0; TEA5767 Radio;frekuensi float =88;status byte =0;LiquidCrystal lcd(13, 12, 11, 10, 9, 8);/****************** ***********************\ * updateScale() * * Memindahkan "jarum" di atas skala radio *\********* **********************************/void updateScale() { int lcdBase =(frekuensi - 88) * 4; // Indeks piksel kolom LCD (0 <=lcdBase <=(16 * 5)) if(lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // indeks karakter LCD (0 <=lcdMayor <=15) int lcdMinor =lcdBase % 5; // Indeks kolom piksel LCD di dalam karakter (0 <=lcdMinor <=4) if(lcdMajor> 0) { // Jarum dial radio tidak berada di posisi paling kiri:// bersihkan karakter di sebelah kiri (untuk menghapus karakter sebelumnya posisi neddle) lcd.setCursor(lcdMajor - 1, 0); lcd.write(SCALE_CLEAR); } else lcd.setCursor(lcdMajor, 0); lcd.write(lcdMinor); if(lcdMajor <15) // Tidak di posisi paling kanan:hapus karakter di sebelah kanan lcd.write(SCALE_CLEAR);}/********************** ********\ * isrEncoder() * * Tangkap interupsi encoder *\****************************** **/void isrEncoder() { delay(50); // Debouncing (untuk encoder jelek) if(digitalRead(ENCODER_B) ==HIGH){ bitWrite(status, ST_GO_UP, 1); } else bitWrite(status, ST_GO_DOWN, 1);}/******************************\ * isrSwitch() * * Catch switch?s interupsi *\******************************/void isrSwitch() { delay(50); // Debouncing if(bitRead(status, ST_AUTO)) bitWrite(status, ST_AUTO, 0); else bitWrite(status, ST_AUTO, 1);}/*********************\ * Arduino Setup() *\************ ********/pengaturan batal() { Serial.end(); pinMode(button_freq1, INPUT); digitalWrite(button_freq1,LOW); pinMode(button_freq2, INPUT); digitalWrite(button_freq2,RENDAH); pinMode(button_freq3, INPUT); digitalWrite(button_freq3,RENDAH); pinMode(button_freq4, INPUT); digitalWrite(button_freq4,LOW); pinMode(LED, OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(5,OUTPUT); di aku; byte needleChar[8]; // Stylized "S" byte stereoChar1[8] ={ 0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000 }; lcd.createChar(STEREO_CHAR_S, stereoChar1); // Stylized "T" byte stereoChar2[8] ={ 0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000 }; lcd.createChar(STEREO_CHAR_T, stereoChar2); // Dial scale background byte scaleChar[8] ={ 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101 }; lcd.createChar(SCALE_CLEAR, scaleChar); // Buat karakter khusus untuk mewakili semua (5) kemungkinan posisi jarum for(int j =0; j <5; j++) { for(i =0; i <8; i++) needleChar[i] =scaleChar[i ] | (0b10000>> j); lcd.createChar(j, needleChar); } lcd.begin(16, 2); lcd.clear(); // Gambar latar belakang skala dial untuk(i =0; i <16; i++) lcd.write(SCALE_CLEAR); pinMode(ENCODER_SW, INPUT); digitalWrite(ENCODER_SW, TINGGI); pinMode(ENCODER_A, INPUT); digitalWrite(ENCODER_A, TINGGI); pinMode(ENCODER_B, INPUT); digitalWrite(ENCODER_B, TINGGI); attachInterrupt(0, isrSwitch, RISING); attachInterrupt(1, isrEncoder, RISING); // Inisialisasi modul radio Wire.begin(); Radio.init(); Radio.set_frequency(frekuensi);}/******************\ * Arduino Loop() *\*************** ***/void loop() { char buf yang tidak ditandatangani[5]; int stereo; int tingkat sinyal; int searchDirection; di aku; saya=0; // Perbarui indikator Otomatis / Manual lcd.setCursor(12, 1); lcd.write(bitRead(status, ST_AUTO) ? 'A' :'M'); if bitRead(status, ST_AUTO) // Auto/manual LED { digitalWrite(LED, LOW); } else { digitalWrite(LED, TINGGI); } if (Radio.read_status(buf) ==1) { // Dapatkan frekuensi data radio =lantai(Radio.frequency_available(buf) / 100000 + .5) / 10; stereo =Radio.stereo(buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level(buf) * 100) / 15; analogsignal=peta(tingkat sinyal,0,100,0,255); analogscale=peta(frekuensi,88,114,0,255); stereoled=peta(stereo,0.7,1,0,255); analogWrite (5,sinyal analog); // Pengukur sinyal analogWrite (6,analogscale); //pengukur frekuensi analogWrite (7,stereo); //stereo LED // Perbarui radio dial updateScale(); // Indikator level sinyal lcd.setCursor(0, 1); lcd.write(183); // Karakter Jepang yang terlihat seperti antena :) if(signalLevel <100) lcd.write(' '); lcd.print(tingkat sinyal); lcd.write('%'); // Indikator frekuensi lcd.setCursor(6, 1); if(frekuensi <100) lcd.write(' '); lcd.print(frekuensi, 1); // Indikator mono / stereo lcd.setCursor(14, 1); if(stereo){ lcd.write(STEREO_CHAR_S); lcd.write(STEREO_CHAR_T); } else lcd.print(" "); } if(bitRead(status, ST_SEARCH)) { // Apakah radio melakukan pencarian otomatis? if(Radio.process_search(buf, searchDirection) ==1) { bitWrite(status, ST_SEARCH, 0); } } if(digitalRead(button_freq2)==HIGH){ //"memori" tombol if(frekuensi> 94,8) { frekuensi=94.8; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_DOWN, 0); } else { frekuensi=94,8; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_UP, 0); } precrtajScale(); }if(DigitalBaca(button_freq1)==TINGGI){ if(frekuensi> 92) { frekuensi=92; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_DOWN, 0); } else { frekuensi=92; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_UP, 0); } precrtajScale();}if(digitalRead(button_freq3)==TINGGI){ if(frekuensi> 97) { frekuensi=97; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_DOWN, 0); } else { frekuensi=97; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_UP, 0); } precrtajScale(); }if(DigitalBaca(button_freq4)==TINGGI){ if(frekuensi> 101.2) { frekuensi=101,2; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_DOWN, 0); } else { frekuensi=101,2; Radio.set_frequency(frekuensi); bitWrite(status, ST_GO_UP, 0); } precrtajScale();} // Encoder diputar searah jarum jam (+) if(bitRead(status, ST_GO_UP)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Mode pencarian otomatis (hanya diproses jika radio sedang tidak melakukan pencarian) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up(buf); penundaan (50); } else { // Mode penyetelan manual if(frekuensi <108) { frekuensi +=0,1; Radio.set_frequency(frekuensi); } } bitWrite(status, ST_GO_UP, 0); } // Encoder diputar berlawanan arah jarum jam (-) if(bitRead(status, ST_GO_DOWN)) { if(bitRead(status, ST_AUTO) &&!bitRead(status, ST_SEARCH)) { // Mode pencarian otomatis (hanya diproses jika radio aktif sedang tidak melakukan pencarian) bitWrite(status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down(buf); penundaan (50); } else { // Mode penyetelan manual if(frekuensi> 88) { frekuensi -=0,1; Radio.set_frequency(frekuensi); } } bitWrite(status, ST_GO_DOWN, 0); }}void precrtajScale() { int i; lcd.clear(); untuk(i =0; i <16; i++) lcd.write(SCALE_CLEAR);}

Skema


Proses manufaktur

  1. Mendesain dengan Bluetooth Mesh:Chip atau modul?
  2. DIY Virtual Alike NEST Thermostat dengan Node-RED
  3. API sensor lingkungan dengan RPi
  4. Detektor tangisan bayi DIY yang mudah dengan Raspberry Pi
  5. Jam IV9 Numitron DIY paling sederhana dengan Arduino
  6. Impor modul dengan Python dengan Contoh
  7. Mengambil Tetesan Air Dengan Arduino
  8. Skateboard Realitas Virtual DIY
  9. Radio FM Kabin Shower Berbasis Arduino
  10. Cara Menghubungkan Arduino Mega dengan Modul GPS NEO-6M