Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

Domotica Device Arduino Progetti

From Aino Wiki

Jump to: navigation, search

Implementazioni

Radio FM

Con modulo Si4703

E' un utile esercizio anche se sinceramente la qualità della ricezione è decisamente scarsa, l'antenna è praticamente nelle cuffie e sembrerebbe non ci sia possibilità di migliorare con un allacciamento specifico.
Il progetto base l'ho copiato da maker.pro / Scott Hatfield portando poi mie modifiche. Il dispositivo che ho usato è del produttore HiLetgo, questo (preso su Amazon con 14,50€ ne ho presi 2), ma c'è anche un altra scheda con lo stesso chip della SparkFun, questo ma decisamente più costoso.

Radio FM S14703 01.jpeg

Rispetto al progetto originario (Su maker.pro di Scott Hatfield), che consiglio come primo step, qui ho aggiunto 5 pulsanti per alzare e diminuirre il volume, cercare le stazioni e per impostare una stazione preferita.

Radio FM S14703 02.jpeg

Come si usa Arduino

Lo scrivo anche se è una precondizione, Arduino si interfaccia con la scheda che ha a bordo il chip Si4703 per pilotarlo. Arduino ha bisogno di programmazione per interagire con questo chip e lo fa mediante un programma (si chiamano sketch). Nella prima versione dello sketch si può integragire con la radio solo attraverso un PC e l'IDE di Arduino, nello specifico i comandi si inviano ad Arduino attraverso un tool chiamato "Serial Monitor".
Per rendere indipendente l'assemblaggio Arduino-Scheda con la radio ho aggiunto dei pulsanti e cambiato lo sketch per lavorare con i pulsanti messi sulla bradboard accando Arduino.

Libreria

Prima di caricare o programmare qualsiasi sketch occorrerà installare una libreria specifica per lavorare col chip Si4703. Segue la procedura di installazione:

  • Scaricare la liberia "Si4703_Breakout.zip" da sparkfun.com
  • Installarla. Se la libreria non è già inclusa nel set predisposto da Arduino, si scaricherà la libreria che è in un file .zip essa conterrà cartelle e files in una configurazione riconosciubile dal compilatore C++ di Arduino.
    • Si scarica il file .zip in una cartella temporanea o la stessa cartella di default dei downloads.
    • Dall' IDE di sviluppo, Arduino IDE, cliccare su Sketch\Include Library\Include .Zip Library...
    • Selezionare il file dalla cartella in cui è stato riposto prima. Nelle finestra "Output" si avrà conferma della installazione.
  • Nel file di default creato nell'IDE basta aggiungere in testa il riferimento alla libreria:
#include <Si4703_Breakout.h>
#include <Wire.h>

void setup()
{
}
void loop()
{
}
  • A questo punto si prova a compilare lo sketch cliccando sul pulsante "Verify".
  • Si procederà all'implementazione del programma principale ma se fosse già pronto basta "Uplodarlo" sul dispositivo Arduino cliccando sul pulsante "Upload". NOTA non impegnare mai i pin digitali 0 e 1 mentre si fa l' upload.

Mio progetto

Il seguente schema realizzato con ThinkerCAD è una variante di quello originale, il vantaggio è che i pulsanti inseriti, con la tecnica "Pull Down" (video di Paolo Aliverti, qui), rendono il dispositivo complessivo indipendentemente dal PC ovvero si posson usare direttamente i pulsanti per la ricerca canali (i primi due da SX), per alzare o abassare il volume (pulsanti 3 e 4) e per una sola stazione preferita.

Arduino con Radio FM Si4703.jpg

Mio Sketck

Il seguente codice è un mio adattamento per comandare la radio senza l'uso del Monitor dell'IDE di Arduino.

/* 
DESCRIPTION:  
  This sketch for the Arduino Uno controls a simple FM radio using an Si4703 radio
  receiver. The sketch allows control of the system and feedback to the user over
  serial. The system can seek radio stations, store three favorited radio stations,
  adjust volume, and print RDS information.
 
HARDWARE CONNECTIONS:
  * Si4703 VCC --> 3.3V
  * Si4703 GND --> GND
  * Si4703 SDIO --> A4
  * Si4703 SCLK --> A5
  * Si4703 RST --> D2
  * Si4703 GPIO2 --> D3
*/
 
#include <Si4703_Breakout.h>    // Load the SparkFun Si4703 library < https://cdn.sparkfun.com/assets/learn_tutorials/2/7/4/Si4703_Breakout.zip >
#include <Wire.h>
 
int resetPin = 2; // The Si4703 breakout RST pin connects to the Arduino D2 pin
int SDIO = A4;    // The Si4703 breakout SDIO pin connects to the Arduino A4 pin
int SCLK = A5;    // The Si4703 breakout SCLK pin connects to the Arduino A5 pin
 
// Initialize the Si4703_Breakout object
Si4703_Breakout radio(resetPin, SDIO, SCLK);
int channel;
int volume = 5;
char rdsBuffer[10];
 
// Favorite stations
int favA = 1076;    // Radiopopolare
int favB = 1067;    
int favC = 930;     //
//1025  1036  
 
void setup()
{
  // The Arduino communicates with the computer via serial
  Serial.begin(9600);
  // Si attende che la porta seriale sia pronta... necessaria da Arduino R4 in su
  while(!Serial);
  Serial.println("\n\nSi4703_Breakout Basic Radio");
  Serial.println("\n\nControls:");  
  Serial.println("a, b, c     Favourite stations");    // In the configuration above, you can set three favorite stations
  Serial.println("+, -     Volume (max 15)");
  Serial.println("u, d     Seek up / down");
  Serial.println("r,       Print RDS Data (15 sec timeout)");
  Serial.println("\n\n");
 
  radio.powerOn();    // Enable the Si4703
  radio.setVolume(5); // Set the starting volume to 5 (out of 15)
  // Mie aggiunte, uso pulsanti
  pinMode(13, INPUT); // Ricerca canale UP
  pinMode(12, INPUT); // Ricerca canale DOWN  
  pinMode(10, INPUT); // Volume +
  pinMode(9, INPUT); // Volume -  
  pinMode(7, INPUT); // Preferito 1
}
 
void loop()
{
  //---- Pulsanti ----
  //--SINTONIZZAZIONE
  if (digitalRead(13) == HIGH) {    
      channel = radio.seekUp();
      displayInfo();
      delay(500);
  } else if (digitalRead(12) == HIGH) {
      channel = radio.seekDown();
      displayInfo();
      delay(500);
  }
  //--VOLUME  
  if (digitalRead(10) == HIGH) {
      volume ++;
      if (volume == 16) volume = 15;
      radio.setVolume(volume);
      displayInfo();
      delay(800);
  } else if (digitalRead(9) == HIGH) {
      volume --;
      if (volume < 0) volume = 0;
      radio.setVolume(volume);
      displayInfo();
      delay(800);
  }
  //--PREFERITI
  if (digitalRead(7) == HIGH) { 
      radio.setChannel(favA);
      displayInfo();
      delay(500);
  }
  // Listen for serial commands
  if (Serial.available())
  {
    char ch = Serial.read();    
    if (ch == 'u') {        // u = seek up
      channel = radio.seekUp();
      displayInfo();
    } else if (ch == 'd') { // d = seek down
        channel = radio.seekDown();
        displayInfo();
    } else if (ch == '+') { // + = increase volume
      volume ++;
      if (volume == 16) volume = 15;
      radio.setVolume(volume);
      displayInfo();
    } else if (ch == '-') { // - = decrease volume
      volume --;
      if (volume < 0) volume = 0;
      radio.setVolume(volume);
      displayInfo();
    } else if (ch == 'a') { // a = favorite station a
      channel = favA;
      radio.setChannel(channel);
      displayInfo();
    } else if (ch == 'b') { // b = favorite station b
      channel = favB;
      radio.setChannel(channel);
      displayInfo();
    } else if (ch == 'c') { // c = favorite station c
        channel = favC;
        radio.setChannel(channel);
        displayInfo();
    } else if (ch == 'r') { // r = print RDS information
        Serial.println("RDS listening...");
        radio.readRDS(rdsBuffer, 15000);
        Serial.print("RDS info: ");
        Serial.println(rdsBuffer);      
    }
  }
}
 
// The displayInfo function prints the current channel and volume over serial
void displayInfo()
{
   Serial.print("Channel:"); Serial.print(channel); 
   Serial.print(" Volume:"); Serial.println(volume); 
}

Con modulo TEA5767

Progetti ispiratori:

NOTE

  • la libreria <TEA5767N.h> di Marcos R. Oliveira (scaricata da https://github.com/mroger/TEA5767) da per scontato il collegamento del modulo TEA5767 sui pin I2C ed usa l'indirizzo 0x60 (è una costante, TEA5767_I2C_ADDRESS, cablata nel file "TEA5767N.h").
 

Info utili

Utilità

Visualizzazione Codice C++
Modalità 1

while (!Serial);

Modalità 2

while (!Serial)

Mappa e Link


Arduino indice | Arduino | Arduino Integrazioni tipiche


C++ Info fondamentali | Dizionario Elettronica | Elettronica | Elettronica Appunti


Parole chiave:

Author Giuseppe AINO