piątek, 17 marca 2017

Moduł radia FM TEA5767 & Arduino

Popularny i tani moduł radia FM TEA5767 jest pierwszym modułem jaki wziąłem na tapetę. Prawie pierwszym, bo był jeszcze epizod ze znacznie mnie popularnym QN8025. Niestety poległ, zanim zdążyłem go uruchomić, najprawdopodobniej z racji na komunikację po szynie danych I2C z napięciem 5V.  Potem jeszcze nabyłem układ RDA5807M, który chyba jest najwartościowszy z tej trójki, bo posiada wbudowane takie fjuczery jak RDS czy cyfrowa regulacja głośności za porównywalną cenę TEA5767 a jest tańszy od niezbyt popularnego QN8025.

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ń
Dodatkowo użyłem:
  • 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
Połączenia przedstawia rysunek poniżej.  Aby go za bardzo nie gmatwać, nie łączyłem ze sobą linii I2C (SDL i SDC). W praktycznej realizacji, oczywiście należy je ze sobą połączyć. Połączenia (schematy) wzmacniacza audio PAM8403 i kontrolera głośności PT2257 opisane są w innych moich postach. Komunikacja między mikrokontrolerem a modułami odbywa się po szynie I2C, a z LCD po zrealizowanym software-owo SPI.

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
Użycie powyższych bibliotek nie nastręczyło większych problemów. Najtrudniejsza w przyswojeniu okazała się obsługa wyświetlacza (wyświetlanie tekstu i ikonek). Poza tym jego biblioteki zajmują dość dużo miejsca w RAMie o czy boleśnie się przekonałem, napotykając kwiatki w postaci zawieszania się programu i "rozsypanej" zawartości wyświetlacza czy "krzaków" w terminalu PC. Z drugiej strony dają jednak możliwość software'owej realizacji inferfejsu SPI, z czego skorzystałem. Kolejnym plusem jest rozbudowane API dające duże możliwości wpływania na ostateczny efekt pokazywany na ekranie LCD.

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


Źródła:
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

3 komentarze:

  1. będę "grammar nazi" - nie na tapetę tylko na tapet :)
    Mega pochwała za schematy blokowe itp - wyraża to więcej niż kilkanaście linii tekstu :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Fakt, nie zdawałem sobie sprawy z tego, że jest to niepoprawny zapis ;)
      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.

      Usuń
  2. Ciekawy wpis. Warto było tutaj zajrzeć

    OdpowiedzUsuń