Tuner FM z układem Si4703
Si4703 jest jednym z popularniejszych układów scalonych, które znajdziemy w przeróżnych modułach pełniących funkcję tunera FM. Układy te z pełnym sukcesem będziemy mogli wykorzystać w swoich projektach z wykorzystaniem Arduino, np. w radiobudziku opartym o zegar RTC DS3231.
W ofercie sklepu Kamami znajdziemy dwa warianty produktów, który wykorzystują wspomniany układ Si4703 - jeden w postaci płytki ewaluacyjnej, drugi jako samodzielny moduł do wykorzystania w końcowym projekcie.
Moduły różnią się budową, ponieważ płytka ewaluacyjna została wyposażona dodatkowo w specjalizowany wzmacniacz słuchawkowy TPA6111 firmy Texas Instruments oraz samo gniazdo słuchawkowe (czego nie doświadczymy w samodzielnym module). Wzmacniacz ten przy zasilaniu 5V oraz rezystancji słuchawek 32Ω potrafi oddać moc na poziomie 90mW. Ponieważ moduł zasilany jest napięciem 3.3V, dlatego moc oddawana do tych samych słuchawek będzie mieściła się w granicy 35mW na kanał.
Evaluation Board
Basic Breakout
Wybór pomiędzy nimi nie jest do końca oczywisty, ponieważ w "bogatszej" wersji, wejście antenowe układu Si4703 zostało połączone z ekranem wyjścia słuchawkowego, co czyni z podłączonych słuchawek automatycznie antenę. Nie znajdziemy zatem na płytce pinu odpowiedzialnego za podłączenie zewnętrznej anteny. Nie jest to oczywiście niemożliwe do wykonania, ponieważ bardziej zręczni majsterkowicze będą mogli przeciąć odpowiednią ścieżkę i podpiąć się własną anteną. Nie zmienia to jednak faktu, że płytka ewaluacyjna przeznaczona jest głównie do nauki i poznania możliwości układu Si4703. Podejrzewam, że dla większości z nas, bardziej praktycznym okaże się "goła" płytka z samym układem.
Si4703 nieco bliżej
Układ Si4703 może komunikować się z mikrokontrolerem za pomocą magistrali I2c lub SMBus. Jednak pomimo tego, że sam układ może być zasilony zarówno napięciem 3.3V jak i 5V to już komunikacja musi odbywać się w logice 3.3V. Jeśli więc planujemy podłączyć moduły do Arduino UNO, konieczne będzie zaopatrzenie się w konwerter poziomów stanów logicznych.
Za pomocą Si4703 będziemy mieli możliwość odbierania sygnału FM w szerokim zakresie częstotliwości 76 - 108MHz oraz odbierać komunikaty RDS/RBDS nadawane przez stacje radiowe. Układ posiada również wbudowany regulator LDO, który pozwala na bateryjne zasilenie układu. Specjalne rejestry pozwolą nam na automatyczne wyszukiwanie stacji radiowych, ręczne strojenie, kontrolę głośności, odczytywanie komunikatów RDS itp.
Schemat typowej aplikacji układu Si4703 (moduł bez wzmacniacza TPA6111):
Aby posiadać możliwość komunikacji I2c (2-wire), konieczne jest podciągnięcie rezystorami 10kΩ linii RST do masy oraz do zasilania linii SEN. Linie sygnałowe SCLK i SDIO podciągnięte są do zasilania rezystorami 4.7kΩ. Taka, a nie inna konfiguracja wynika z wybranej formy komunikacji 2-wire, zamiast 3-wire.
Powyższy schemat zawiera również zewnętrzny rezonator kwarcowy 32.768 kHz, filtry zasilania oraz filtry przeciwzakłóceniowe wejścia antenowego i wyjścia audio.
Zwróćmy uwagę na linię zasilania, która została podłączona do Va (Analog Supply Voltage), Vd (Digital Supply Voltage) oraz Vio (Interface Supply Voltage). Wszystkie zostały zmostkowane, a ponieważ Vio maksymalnie toleruje napięcie 3.6V, musimy zasilić nasz moduł napięciem 3.3V.
Podłączenie modułu pod Arduino UNO
Jak już wiemy, linia sygnałowa modułu radiowego FM operuje w logice 3.3V. O ile nie ma problemu zasilenie modułu takim napięciem, to już wykorzystanie I2c z Arduino UNO będzie stanowić problem. Rozwiązać go możemy za pomocą konwertera poziomów logicznych, np.: PCA9306. Jest to jeden z moich ulubionych i najmniej problematycznych konwerterów. Jego ogromną zaletą jest szeroki zakres konwertowanych napięć. Cała "zabawa" polega na wyborze poziomu zasilania strony "niskiej" od 1V do 3.6V i strony "wysokiej" od 1.8V do 5.5V. W naszym przypadku, zasilamy nasz konwerter od strony "niskiej" napięciem VREF1 3.3V, a od strony "wysokiej" napięciem VREF2 5V i przepuszczamy przez niego nas sygnał.
PCA9306 Breakout
Do uruchomienia modułu wymagana jest także obsługa pinu RST, dlatego sygnał z Arduino połączymy przez dzielnik napięcia 1.8kΩ / 3.3kΩ.
Zmontowany układ prezentuje się następująco:
Program
Oczywiście producent modułu przygotował gotową bibliotekę FM_Tuner_Basic_Breakout-Si4703, którą wystarczy pobrać i zainstalować w katalogu bibliotek Arduino. Biblioteka ta udostępnia wszystkie niezbędne funkcje, które pozwolą nam obsłużyć układ:
- powerOn() - inicjalizacja modułu
- seekUp() - automatyczne strojenie "w górę" od obecnej stacji
- seekDown() - automatyczne strojenie "w dół" od obecnej stacji
- setVolume() - ustawienie głośności 0-15
- setChannel() - ręczny wybór częstotoliwości, pomnożony przez 10. Dla 93.0MHz, podajemy wartość 930
- readRDS() - odczytanie komunikatu RDS
Przykładowy program do odsłuchiwania stacji RMF FM:
- #include <SparkFunSi4703.h>
- #include <Wire.h>
- #define PIN_SI_RESET 2
- #define PIN_SI_SDIO A4
- #define PIN_SI_SCLK A5
- Si4703_Breakout radio(2, A4, A5);
- void setup()
- {
- // Inicjalizacja
- radio.powerOn();
- // Ustawienie glosnosci
- radio.setVolume(10);
- // Wybor kanalu 93.0MHz
- radio.setChannel(930);
- }
- void loop() { }
Gdybyśmy chcieli odczytać komunikat RDS stacji, będziemy musieli odrobinę zmodyfikować program dodając funkcję readRDS(). Jako pierwszy parametr podajemy bufor do którego zostanie odczytana wiadomość, jako drugi parametr podajemy maksymalny czas oczekiwania na komunikat w milisekundach. Nie należy przesadzić z tą wartością, ponieważ na ten czas, działanie programu zostanie zatrzymana. W testowych warunkach, w zależności od jakości odbieranego sygnału, czas ten wynosił od 1s do 5s.
- #include <SparkFunSi4703.h>
- #include <Wire.h>
- #define PIN_SI_RESET 2
- #define PIN_SI_SDIO A4
- #define PIN_SI_SCLK A5
- Si4703_Breakout radio(2, A4, A5);
- char rdsBuffer[16];
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizacja
- radio.powerOn();
- // Ustawienie glosnosci
- radio.setVolume(10);
- // Wybor kanalu 93.0MHz
- radio.setChannel(930);
- // Odczytanie komunikatu RDS do bufora
- // Maksymalny czas oczekiwania 5s
- Serial.print("RDS: ");
- radio.readRDS(rdsBuffer, 500);
- Serial.println(rdsBuffer);
- }
- void loop() { }
Reklama
Komentarze
A kojarzysz jakiś komponent, który pomoże mi odbierać radio w rejonie 470Mhz?
Było coś takiego jak HamShield lub DRA818U
Dongle na RTL2832. Od 20MHz do 1.2GHz.
Ciekawy układ dopasowania anteny. W jakiej nocie aplikacyjnej występuje? I jak się sprawdza. Obecnie walczę z wyciśnięciem maksymalnej czułości i selektywności tego modułu tak aby mógł konkurować z tymi w telefonach komórkowych ale na razie wychodzi kiepsko. Może dało by się coś poprawić właśnie poprzez zmianę obwodu dopasowania. Ma działać na kawałku kabla.
Witam, radyjko super, ale jak wyciagnac na int`a wskaznik stereo/mono oraz poziom sygnalu ? :)
Cześć.
Radio fajnie gra - niestety u mnie nie zczytuje info z RDS - dostaje pusty CHAR. Podłączam di Arduino Mega.
Może ktoś pomoże???