ТЕА5767 FM радио с Arduino и управление с бутони
/kn34pc.com/конструкции/...

Целта, която си поставих беше да експериментирам програмни кодове, които управляват настройката на ФМ радио с модул TEA5767 под управление на Arduino, използвайки тактилни бутони. От друга страна не исках да има повтаряне на идеите и обясненията, които вече бяха дадени в статиите на подобна тематика от колегата Веско, LZ2WSG, чиито разработки на тази тема може да видите накрая в цитираната литература. През времето на еволюцията на моите идеи, той беше непрекъснато в течение на тяхното развитие и както се казва "подхвърляше" идеи.

Тук ви представям една принципна схема на свързване на повечето модули и елементи, които използвах за тези експерименти. Схемата е обща, обхваща по-голямата част. Тоест, за конкретния програмен код, просто излишното се премахва, като за целта би следвало да разгледате съдържанието на кода. Например: за програмен код с два тактилни бутона премахвате от схемата бутон "AUTO", а ако кодът не съдържа аналогова система за измерване на силата на сигнала, то премахвате и нея. Същото е валидно за LED диода STEREO/MONO.


ТЕА5767 FM радио с Arduino и управление с бутони

Всички кодове са експериментирани първо с Arduino UNO, а при завършването им с Arduino NANO V.3. При това не се наблюдават разлики. тъй като основата на двете Arduino платки е процесорът AtMega328.

Експериментите ми имаха следните направления:
   - разлики в базисния код за управление на радиомодула
   - въвеждане на цифров измерител на силата на сигнала с цифри или бар-граф на дисплея LCD16x2
   - въвеждане аналогова система за измерване на силата на сигнала, подобно на ретро тунерите
   - индикация за стереосигнала на цифровия дисплей
   - индикация на стереосигнала посредством визуализация с LED светодиод, например червен.

Естествено, първо потърсих в интернет готови кодове, с които да започна своето самообучение. Не пропуснах и вече публикуваните статии на сайта.

Открих две основни групи кодове, в едната основата на кода е с автоматично сканиране, а в другата - с ръчно. Втората не е така популярна и почти не се среща. Всички кодове си приличаха и причина за това е отдавна създадената библиотека TEA5767-master, която е в тяхната основа.

Повечето кодове са примерни, включително кодът в библиотеката. Беше доста изненадващо и малко разочароващо от факта, че някои не заработваха и се налагаха корекции. Но от друга страна, това ми помогна при моите експерименти.


В повечето примерни кодове стартът на приемането започва с иницииране на начална честота, примерно:

    float frequency = 87.0;

За всички кодове с които се срещнах, изведените данни на дисплея са едни и същи и изглеждат по следния начин:



1_TEA5767_EEPROM_2_Buttons_no_graph

Първият ми експеримент беше избягването от стартовата фиксирана честота, а това можеше да стане, ако дадена честота се запомни в EEPROM, откъдето при пускането на FM радиото да се прочете и зареди. По този начин радиото започва да работи с честотата на последната приемана станция преди изключването му. И тук експериментирах три метода за обръщане към EEPROM вграден в Arduino при запис и четене, след което избрах един от тях, който поне на мен ми се стори по-разбираем и обясним.

За моите експерименти беше от значение да не повтарям вече направеното и публикувано на страниците на сайта и независимо, че използвам подобни функции, то те се отличават по код и начин на прилагане. Затова обръщането към вградения EEPROM е различно от вече познатото от kn34pc.com.


Но какво е FM радио без сигнал индикатор! Използването на бар-граф също вече сме го видяли, но за мен остана да експериментирам различна организация на кода и на масива с който се изчертава.

Примерно в [5] графа се изчертава в 16-чен код:

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, //1 line

Но на мен по-разбираем ми се вижда изчертаване в двоичен код, при който се задава всеки един пиксел с "0" или "1":

    byte a1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};

И ако по първия метод по-горе данните за бар графа се задават с масив, то при втория метод всеки един се описва с негов собствен byte, а всеки пиксел с "0" или "1", което ми е по-прегледно от практическа гледна точка. Разбира се, извикването на всеки ред, дали от масив или байт по байт се извършва с различен код, което ще видите в скечовете, които прилагам.

Извеждането на данните на LCD16x2 (или LCD20x4) е според желанието на всеки от нас. На следващата снимка ще видите начина по който съм подредил информацията на дисплея в моите кодове:



2_TEA5767_Analog_Signal_EEPROM_2_Buttons_Graph
 

И ако до сега експериментирах код с два бутона с бързо търсене по честота надолу или нагоре, към който добавих запаметяване на последната приемана станция и бар-граф като индикатор за силата на приемания сигнал, сега се съсредоточих в увеличаване на броя на командите и съответно бутоните. Например по-долу може да видите част от експеримент с четири бутона, които позволяват командите SCAN, UP, DOWN и SAVE. Последната е за запаметяване на приеманата станция.



3_TEA5767_MEMO_4_Buttons_No_Graph
 

След като завърших този експеримент без бар граф като индикатор на силата на сигнала, тогава към този код го добавих и се получи естествена еволюция в програмния код:



4_TEA5767_MEMO_4_Buttons_Graph
 

За да мога да събера повече полезна информация на дисплей LCD16x2, намалих броя на баровете в индикатора за силата на сигнала. Най-често използвах четири или пет вместо осем, както други колеги, публикували подобни кодове.

Архив Arduino sketches [zip,ino,cpp,h][13kb]


Литература:
1. New TEA5767 Sketches to Make an FM Radio with Arduino
2. Radio FM cu TEA5767 si... Arduino
3. FM радио на Arduino
4. FM приемник на TEA5767 (Arduino)
5. FM радиоприемник с ИС TEA5767 под управление на Arduino
6. FM радиоприемник с ИС TEA5767 и дистанционно управление под управление на Arduino

Валери Терзиев
24 юли 2021 година