SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

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:

  1. #include <SparkFunSi4703.h>
  2. #include <Wire.h>
  3.  
  4. #define PIN_SI_RESET       2
  5. #define PIN_SI_SDIO       A4
  6. #define PIN_SI_SCLK       A5
  7.  
  8. Si4703_Breakout radio(2, A4, A5);
  9.  
  10. void setup()
  11. {
  12.   // Inicjalizacja
  13.   radio.powerOn();
  14.  
  15.   // Ustawienie glosnosci
  16.   radio.setVolume(10);
  17.  
  18.   // Wybor kanalu 93.0MHz
  19.   radio.setChannel(930);
  20. }
  21.  
  22. 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.

  1. #include <SparkFunSi4703.h>
  2. #include <Wire.h>
  3.  
  4. #define PIN_SI_RESET       2
  5. #define PIN_SI_SDIO       A4
  6. #define PIN_SI_SCLK       A5
  7.  
  8. Si4703_Breakout radio(2, A4, A5);
  9.  
  10. char rdsBuffer[16];
  11.  
  12. void setup()
  13. {
  14.   Serial.begin(9600);
  15.  
  16.   // Inicjalizacja
  17.   radio.powerOn();
  18.  
  19.   // Ustawienie glosnosci
  20.   radio.setVolume(10);
  21.  
  22.   // Wybor kanalu 93.0MHz
  23.   radio.setChannel(930);
  24.  
  25.   // Odczytanie komunikatu RDS do bufora
  26.   // Maksymalny czas oczekiwania 5s
  27.   Serial.print("RDS: ");
  28.   radio.readRDS(rdsBuffer, 500);
  29.   Serial.println(rdsBuffer); 
  30. }
  31.  
  32. void loop() { }

Reklama

Komentarze Komentarze
Avatar 1
SpeX Windows / Mozilla Firefox 43.0
03 January 2016 - 18:04 Kraków

A kojarzysz jakiś komponent, który pomoże mi odbierać radio w rejonie 470Mhz?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
26 April 2016 - 23:51 Bytom

Było coś takiego jak HamShield lub DRA818U

Avatar 1
DEX23 Android 4.4 / Safari 537.36
17 April 2016 - 07:20 Brak informacji

Dongle na RTL2832. Od 20MHz do 1.2GHz.

Avatar 1
Kalvis Windows 7 / Safari 537.36
09 August 2016 - 17:08 Brak informacji

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.

Avatar 1
hej hej Mac OS X / Mozilla Firefox 49.0
07 November 2016 - 21:10 Warszawa

Witam, radyjko super, ale jak wyciagnac na int`a wskaznik stereo/mono oraz poziom sygnalu ? :)

Avatar 1
Rgilu Windows / Safari 537.36
03 November 2017 - 22:40 Warszawa

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???