Radio FM Arduino

Le projet

On trouve de nombreuses radios dans le commerce mais j'avais envie de créer une radio pour mon atelier bois avec un boitier en bois et un look vintage mais de conception moderne.

Le projet

Le microcontrôleur qui gère l'affichage et la radio est un Atmega328. C'est le microcontrôleur de la carte Arduino Uno. Il ne restait plus qu'à me procurer les 2 composants suivant :

L'écran Nokia 5110

 

Le module radio TEA5767 avec son antenne

Pour le développement j'ai réalisé le montage ci-dessous et j'ai ajouté 2 boutons poussoirs pour la synthonisation :

Il ne reste plus qu'à placer dans l'arduino le programme Radio_fm.ino

 

 

 

 

 

 

 

 

 

 

 
		/* Arduino Digital FM Radio with build in speakers */
                    

//Libraries:
#include < SPI.h >
#include < Adafruit_GFX.h >
#include < Adafruit_PCD8544.h >
#include < TEA5767.h >
#include < Wire.h >
#include < Button.h >

//Constants:
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3 ); //Pinout:(SCLK, DIN, DC, CS, RST)
TEA5767 Radio; //Pinout SLC and SDA - Arduino pins A5 and A4
Button btn_forward(11, PULLUP); //Search station up button
Button btn_backward(12, PULLUP);//Search station down button

//Variables:
double old_frequency;
double frequency;
int search_mode = 0;
int search_direction;
unsigned long last_pressed;
unsigned char buf[5];
int stereo;
int signal_level;
double current_freq;
unsigned long current_millis = millis();


void setup () {
  //Init
  Wire.begin();
  Radio.init();
  Radio.set_frequency(95.2); //On power on go to station 95.2
  display.begin();
  display.setContrast(100);
  display.clearDisplay();
}

void loop () {

  if (Radio.read_status(buf) == 1) {
    current_freq =  floor (Radio.frequency_available (buf) / 100000 + .5) / 10;
    stereo = Radio.stereo(buf);
    signal_level = Radio.signal_level(buf);

   display.setTextSize(2);
   display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.print(display.print(current_freq));
   display.setCursor(47,15);
   display.print("MHz");
   display.setCursor(0,20);
   display.setTextSize(1);
   display.setTextColor(BLACK);
   //Strereo or mono ?
   if (stereo) display.print("STEREO"); 
   else display.print("MONO");
   // display level of FM signal..
   display.setCursor(0,35);
   display.setTextSize(1);
   display.setTextColor(WHITE, BLACK);
   display.print(signal_level);
   display.print("/15 ");
   display.display();
   delay (500);
   display.clearDisplay(); 
   //Draw a signal level triangle...
   display.drawLine(80, 30, 80, 45, BLACK);
   display.drawLine(80, 45, 50, 45, BLACK);
   display.drawLine(50, 45, 80, 30, BLACK);
   //Fill triangle with signal strength
   int sl = signal_level;
   for (int x = 0; x < sl; x++)
   { 
   display.drawLine(50+2*x, 45, 50+2*x, 45-x, BLACK);
   }
  }
  //When button pressed, search for new station
  if (search_mode == 1) {
      if (Radio.process_search (buf, search_direction) == 1) {
          search_mode = 0;
      }
  }
  //If forward button is pressed, go up to next station
  if (btn_forward.isPressed()) {
    last_pressed = current_millis;
    search_mode = 1;
    search_direction = TEA5767_SEARCH_DIR_UP;
    Radio.search_up(buf);
    delay(1000);
  }
  //If backward button is pressed, go down to next station
  if (btn_backward.isPressed()) {
    last_pressed = current_millis;
    search_mode = 1;
    search_direction = TEA5767_SEARCH_DIR_DOWN;
    Radio.search_down(buf);
    delay(1000);
  } 
   delay(100);
}
		
Tout devrait fonctionner sans problème, avec la recherche d'une station en appuyant sur les boutons poussoirs.

L'EDI d'arduino a besoin des bibliothèques suivantes : Adafruit_GFX.h, Adafruit_PCD8544.h, TEA5767.h.
On utilisera le gestionnaire de bibliothèques ou réalisera un chargement sur GitHub.

La réalisation

Utiliser une carte de prototypage Arduino Uno pour la placer dans un boîtier avec l'écran, les boutons poussoir et le module radio ne me semblait pas satisfaisant. J'ai donc décidé d'utiliser un Atmega328 seul. La carte Arduino Uno permet de le programmer, ensuite il suffit de l'extraire et de le placer dans le montage ci-dessous :

L'afficheur M1 avec les connecteurs K1 K2, les 2 boutons poussoirs S1 S2 et l'Atmega328 sont placés sur un circuit imprimé. Le module radio est relié à la carte avec le connecteur à 4 contacts K3. Le bornier K4 permet l'alimentation du circuit en 12 V. Un régulateur 5V, CI2 fournit la tension à l'Atmega.

S1 et S2 sont placés sur des connecteurs SIL femelle à 3 picots pour permettre de les réhausser par rapport à l'écran.

Pour mettre un nouveau Atmega328 sur la carte Arduino Uno contenant un bootloader, je vous propose 3 méthodes.

La mise en boitier

Dans mon atelier bois j'ai réalisé un boîtierr avec les montants en frêne, la face avant et arrière en contre-plaqué de peuplier. L'assemblage est à queues d'arronde. Le look vintage est assuré ainsi que la solidité.
j'ai ajouté un petit amplificateur stéréo de 3W et des fiches de sortie pour relier la radio à 2 enceintes.

Quelques photos