Wygląd modułu z obu stron |
Schemat wyprowadzeń modułu |
W moim układzie prototypowym poza samym TEA5767 znalazły się jeszcze inne niezbędne moduły:
- arduino mini pro z ATmega328 do sterowania całością
- wzmacniacz mocy audio PAM8403 który wzmacnia wyjściowy (z modułu FM) sygnał audio i przekazuje na głośniki
- zasilacz (3,3V)
- wyświetlacz LCD z NOKII 5110, 3310 z interfejsem SPI
- pilot IR NEC do bezprzewodowego sterowania radiem
Schemat blokowy połączeń |
- modułu RTC z dodaną pamięcią EEPROM (nazwa modułu z aukcji: Precyzyjny zegar DS3231 AT24C32 RTC) sterowanego przez I2C (domyślny adres dla DS3231 to 0x68, a dla AT24C32 - 0x57). Używam go do odczytu czasu i temperatury otoczenia (moduł mierzy też temperaturę). Z kolei do EEPROM'a wrzucam dane które mają być pamiętane po ponownym włączeniu radia, np. częstotliwość ostatnio wybranej stacji radiowej. Wybór zewnętrznej pamięci był podyktowany większą trwałością (ilość możliwych zapisów do pamięci). Generalnie RTC nie jest potrzebny oraz można użyć pamięci z ATmegi.
- modułu z kontrolerem głośności PT2257, który daje on możliwość cyfrowego sterowania głośnością głośnika poprzez magistralę I2C (domyślny adres 0x88). Moduł ten można pominąć i użyć tylko modułu wzmacniacza PAM8403 z wbudowanych potencjometrem (zdjęcie takiego modułu można znaleźć w moim poście dedykowanemu temu wzmacniaczowi). Mi osobiście jednak przeszkadzała obecność tego analogowego elementu i skupiłem się na sterowaniu pilotem ;)
- modułu FT232 (nie pokazanego na schemacie) do programowania arduino i komunikacji z terminalem na PC (komunikaty/debugger).
Uruchomiony prototyp |
Schemat elektryczny |
Odnośnie kwestii montażowych i sam moduł TEA5767, to posiada niestandardowy rozkład pól lutowniczych. Użyłem goldpinów lekko wygiętych, a sam układ odwróciłem (pierwszy obrazek z lewej), gdyż z tej strony były większe pola lutownicze.
Cechy modułu z układem TEA5767
- Pasmo UKF: 87,5 - 108MHz
- Sterowanie I2C, adres 0x60
- Zasilanie z przedziału 2,5 - 5V przy zużyciu prądu ok. 15mA
- Wyciszanie sygnału (soft mute), tryb standby
- Tryb automatycznego wyszukiwania stacji
- Tryb wyszukiwania kolejnej (następnej lub poprzedniej) stacji
Funkcjonalność całości
- brak elementów analogowych, sterowanie pilotem IR
- wybór stacji z zaprogramowanej listy (w moim wypadku są to stacje warszawskie)
- pokazywanie nazwy stacji z zaprogramowanej listy
- możliwość wyszukiwania stacji (bez zapamiętywania): następnej, poprzedniej, wszystkich z całego pasma UKF (opcje dostępne z poziomu menu)
- pokazywanie co 5 sekund czasu
- pokazywanie na żądanie (funkcja dostępna pod przyciskiem pilota) daty, godziny, temperatury otoczenia
- pokazywanie siły sygnału FM i głośności głośnika (w rzeczywistości - tłumienia US PT2257)
- pokazywanie typu sygnału: stereo (ST), mono (MN)
- wyciszanie (mute) radia
- wyłączanie (standby) radia
- przywracanie domyślnej, zaprogramowanej listy stacji (przydatne po operacji wyszukiwaniu stacji w paśmie)
- zapamiętywanie ostatnio ustawionej wartości głośności (tłumienia) przez PT2257 i przywracanie jej po ponownym włączeniu radia
- ustawianie czułości automatycznego wyszukiwania stacji (opcja w menu)
Nazwa stacji, częstotliwość, ikonki siły sygnału, rodzaju sygnału (stereo/mono), głośności |
Dane z modułu RTC (godzina, data, temperatura otoczenia) |
Okresowo pokazywana godzina przy odtwarzaniu radia |
Menu |
Pierwowzór
Punktem wyjścia była obsługa modułu radiowego opisana w artykule Complete FM Radio using Arduino, TEA5767 library and LCD Shield i kod tam przedstawiony. Główna modyfikacja dotyczyła użycia innego wyświetlacza (mieszczącego więcej informacji) oraz zmiany sposobu sterowania na pilot IR. Uprościłem też znacznie obwody wyjściowe, zachowując możliwość sterowania cyfrowego głośnością. Idea obsługi w kodzie, oparta o stany, także pozostała, choć sam kod wiele się zmienił z racji na inne/nowe moduły. Po drugie w oryginale o zawroty głowy przyprawiały mnie pozagnieżdżane switche w switchach, na których ciągle się gubiłem.
Ocena działania TEA5767 i całości
- Kiepskie automatyczne wbudowane wyszukiwanie stacji. W praktyce sprawdza się tylko żonglowanie zaprogramowanymi stacjami (częstotliwościami). Być może z racji na kiepską antenę w postaci ok 30cm kabelka. Z drugiej strony dramatu nie ma, bo w praktyce i tak na innych radiach (np w telefonie) słucham zdefiniowanych wcześniej stacji.
- sam moduł radiowy mógłby mieć sterowanie głośnością sygnału wyjściowego i obsługę RDS, zwłaszcza, że konkurencja posiada takie fjuczery
Użyte biblioteki
- moduł radia FM TEA5767
TEA5767 - wyświetlacz LCD
Adafruit-PCD8544-Nokia-5110-LCD-library
Adafruit-GFX-Library - moduł IR
Arduino-IRremote - kontroler głośności PT2257
Evc_pt2257 - DS3231+EEPROM
Arduino-DS3231
AT24CX
Problematyczna też okazała się obsługa pilota IR z racji na zdarzające się dwa różne kody dla tego samego przycisku, choć to już raczej kwestia hardware'u. Więcej o tym problemie we wpisie Pilot IR (NEC) z odbiornikiem HX1838. Obsługa w Arduino.,
Kod źródłowy
Sam program zawiera ponad 1200 linii. Starałem się przede wszystkim zachować czytelność oraz ograniczać zużycie RAMu. Ponadto zapewnić podstawową funkcjonalność, poza obsługą modułu RTC dla którego brakuje ustawiania godziny i daty (nie mniej jednak ten moduł jest tu wstawiony trochę na wyrost, bo można użyć tylko EEPROMU w obudowie DIP, czy też ten wbudowany w atmegę). W praktyce, jeśli używam radia w Warszawie to ustawiam sobie ulubione i wybieram którąś z nich. Tutaj też zaprogramowałem częstotliwości wybranych stacji i pośród nich się poruszam. Zaimplementowane wyszukiwanie kanałów (wszystkich, poprzedniego, następnego) dla mnie jest zbyteczne, zwłaszcza, że jego skuteczność nie rzuca na kolana. Wyszukiwane kanały nie są też zapamiętywane/zapisywane.
Kod zawiera też jeszcze obsługę portu szeregowego, który wykorzystywałem do programowania układu jak i przesyłania informacji na terminal PC (forma debuggera).
Kod, z racji na opisywane wyżej problemy z pamięcią, zawiera też obsługę sprawdzania zajętości RAMU w oparciu o bibliotekę MemoryFree.
Kod (zip) do pobrania
1) Specyfikacja TEA5767
2) Complete FM Radio using Arduino, TEA5767 library and LCD Shield
3) Oryginalny kod zamieszczony w repo modułu radia
4) Obsługa wyświetlacza LCD Nokia 5110
będę "grammar nazi" - nie na tapetę tylko na tapet :)
OdpowiedzUsuńMega pochwała za schematy blokowe itp - wyraża to więcej niż kilkanaście linii tekstu :)
Fakt, nie zdawałem sobie sprawy z tego, że jest to niepoprawny zapis ;)
UsuńZ drugiej strony go nie zmienię, aby nie mieć zarzutu, że zgubiłem literę "ę" i pytań co to jest ten "tapet". Do tego wyszukiwarka google (na tę chwilę) dla zwrotu "wziąłem na tapetę" pokazuje 1970 wyników, a dla "wziąłem na tapet" tylko 488 wyników.
Ciekawy wpis. Warto było tutaj zajrzeć
OdpowiedzUsuń