Arduino FM rádio je rozšiřovací modul pro Arduino. Tento modul obsahuje integrovaný obvod Si4703, který slouží pro příjem FM signálu. Na modulu se nachází kromě zmíněného obvodu také konektor 3,5 mm jack, který slouží k připojení sluchátek či reproduktorů. A zařízení připojené právě na tento konektor pak slouží jako anténa pro příjem FM signálu. Arduino deska je zde nutná pro nastavení modulu, tedy pro výběr přijímané frekvence a hlasitosti výstupu.

Pro napájení lze použít pouze napájecí napětí 3,3 V. Proudový odběr by se podle výrobce neměl dostat přes 20 mA.

Arduino FM rádio Si4703

Pro úspěšné propojení FM modulu Si4703 a Arduino desky stačí zapojit celkem 5 vodičů. Propojíme 3.3V s +3,3V Arduina, GND se zemí Arduina, SDIO s pinem A4, SCLK s pinem A5 a RST s pinem D2. Pro pin RST je možné vybrat jiný digitální pin, ale je nutné tuto volbu provést také na začátku programu. Pro piny SDIO a SCLK musíme vybrat vždy I2C piny na námi vybrané desce, u Arduino UNO jsou to právě piny A4 a A5.

Schéma zapojení Arduino FM rádia Si4703

Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu Si4703_Breakout, návod, jak na to, je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven a nastavení čísel propojovacích pinů. Poté následuje inicializace modulu z knihovny a vytvoření proměnných, do kterých budou ukládány informace o modulu.

Podprogram setup obsahuje na začátku zahájení komunikace po sériové lince a poté je vytištěna nápověda, jak ovládat připojený FM modul. Následně je zahájena komunikace s FM modulem a pro bezpečí uživatele nastavena hlasitost na nulu.

V nekonečné smyčce loop vždy kontrolujeme na začátku, zda nemáme ve frontě přijatá data. V případě, že ano, načteme je do proměnné a následně pomocí if podmínek detekujeme známé znaky v přijatých datech. Jako první například detekujeme „n“, při jehož přijetí spustíme hledání stanic směrem nahoru. A při každé splněné podmínce zároveň voláme podprogram zobrazInfo, který vytiskne aktuálně nastavenou frekvenci a hlasitost.

// Arduino FM Rádio Si4703

// připojení potřebných knihoven
#include <Si4703_Breakout.h>
#include <Wire.h>
// nastavení propojovacích pinů
#define resetPin 2
#define SDIO A4
#define SCLK A5
// inicializace modulu z knihovny
Si4703_Breakout radio(resetPin, SDIO, SCLK);
// proměnné pro běh programu
int frekvence;
int hlasitost;
char rdsBuffer[10];

void setup() {
  // zahájení komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
  // vytištění nápovědy
  Serial.println("\n\nSi4703 Radio");
  Serial.println("===========================");
  Serial.println("a b     Oblibene stanice nastavene v programu");
  Serial.println("+ -     hlasitost (max 15)");
  Serial.println("n d     Zmena frekvence nahoru/dolu");
  Serial.println("r       Nacteni RDS dat (15 sekund timeout)");
  Serial.println();
  // zahájení komunikace s modulem
  radio.powerOn();
  // nastavení hlasitosti na nulu
  radio.setVolume(0);
}
void loop() {
  // kontrola sériové linky na příchozí data
  if (Serial.available()) {
    // načteme přijatý znak do proměnné
    char ch = Serial.read();
    // dále pomocí if podmínek hledáme známé znaky pro ovládání činnosti,
    // při každé činnosti je zároveň zavolán podprogram zobrazInfo,
    // který vytiskne aktuální frekvenci a hlasitost po sériové lince
    
    // při znaku n spustíme hledání směrem nahoru
    if (ch == 'n') {
      frekvence = radio.seekUp();
      zobrazInfo();
    }
    // při znaku D spustíme hledání směrem dolů
    else if (ch == 'd') {
      frekvence = radio.seekDown();
      zobrazInfo();
    }
    // při znaku + přidáme hlasitost
    else if (ch == '+') {
      hlasitost ++;
      // maximální hodnota hlasitosti je 15,
      // při větší nastavíme pouze 15
      if (hlasitost == 16) hlasitost = 15;
      radio.setVolume(hlasitost);
      zobrazInfo();
    }
    // při znaku - snížíme hlasitost
    else if (ch == '-') {
      hlasitost --;
      // minimální hodnota hlasitosti je 0,
      // při záporné hodnotě nastavíme 0
      if (hlasitost < 0) hlasitost = 0;
      radio.setVolume(hlasitost);
      zobrazInfo();
    }
    // při znaku a nastavíme oblíbenou stanici,
    // pro kterou je nastavena frekvence níže
    else if (ch == 'a') {
      frekvence = 910; // Radio Beat
      radio.setChannel(frekvence);
      zobrazInfo();
    }
    // při znaku b nastavíme oblíbenou stanici,
    // pro kterou je nastavena frekvence níže
    else if (ch == 'b') {
      frekvence = 1055; // Radio Evropa 2
      radio.setChannel(frekvence);
      zobrazInfo();
    }
    // při znaku r spustíme načítání RDS dat,
    // které bude trvat 15 sekund - lze změnit níže
    else if (ch == 'r') {
      // pomocí funkce readRDS se pokusíme
      // načíst RDS data do proměnné
      // a následně je vytiskneme
      Serial.println("Nacteni RDS dat...");
      radio.readRDS(rdsBuffer, 15000);
      Serial.print("RDS data:");
      Serial.println(rdsBuffer);
    }
  }
}
void zobrazInfo() {
  // vytištění informací z proměnných
  Serial.print("Frekvence:"); Serial.print(frekvence);
  Serial.print(" | Hlasitost:"); Serial.println(hlasitost);
}

Po nahrání ukázkového kódu do Arduino desky s připojeným FM modulem Si4703 dostaneme například tento výsledek:

Si4703 Radio
===========================
a b     Oblibene stanice nastavene v programu
+ -     hlasitost (max 15)
n d     Zmena frekvence nahoru/dolu
r       Nacteni RDS dat (15 sekund timeout)

Frekvence:910 | Hlasitost:4
Frekvence:1055 | Hlasitost:5

Arduino FM rádio Si4703 je zajímavý rozšiřovací modul, s kterým můžeme vytvořit vlastní Arduino-rádio přijímač. Může se tedy hodit do projektů ať už jako samotný rádio přijímač, nebo může být součástí radiobudíku a tak dále. Tento modul dokáže přijímat i RDS data, které vysílají různé FM stanice. Z těchto dat pak lze vyčíst jak název stanice, tak i název hrané písničky. Pro příjem těchto dat je ale nutné mít čistý příjem, pro který je třeba až třímetrový prodlužovací kabel (slouží jako anténa) k reproduktorům či sluchátkům.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

https://dratek.cz/arduino/1492-fm-rds-radio-si4703-modul-tuneru-pro-avr-arm-pic-arduino-kompatibilni-1484133297.html

Pozn. Jak už z názvu modulu vyplývá, tento modul pracuje s analogovým výsíláním v pásmu frekvencí FM. Není tedy kompatibilní s chystající se změnou na digitální rádiové vysílání.
Z principu funkce FM rádio modulu bych ale úplně netvrdil, že je nepoužitelný, protože stále si můžete pomocí jednoduchých volně dostupných zapojení vytvořit i svůj vlastní FM vysílač a vyrobit si tak například domácí chůvičku pro děti, přičemž můžete využít i vysílání RDS pro přenos textových zpráv.
Obecně na FM frekvencích funguje také spousta zařízení, která se například používají ve starších autech, kdy z telefonu pouštíte hudbu do zařízení, které ji vysílá na FM frekvencích, a vy jej můžete naladit na autorádiu nebo například právě pomocí tohoto Arduino modulu.

FB tw

Další podobné články