mercredi, février 12, 2025
Activités RadioArduinoAtelier "Jeunes"ElectroniqueRéalisations

Arduino et la radio 9éme partie.

Notre récepteur possède maintenant un scanner automatique.

Par NOAM

Voir notre article précédent ICI (construction du récepteur)

Affectation des boutons poussoirs au démarrage.
1) Diminue la fréquence du pas choisi (-12,5 Khz)
2) Augmente la fréquence du pas choisi (+12,5 Khz)
3) Passage du Squelch de 0 à 1 et inversement
4) Lancement du scanner (144.300 à 145.800 modifiable)

Si le scanner est en fonction balayage sur des fréquences libres.
1) Stoppe le scan pour une reprise manuelle
Les autres boutons sont sans objet.

Si le scanner est stoppé sur une fréquence occupée.
1) Stoppe le scan pour une reprise manuelle
Les autres boutons sont sans objet.

c’est déjà sur papier que l’algorithme est posé !

Le scanner, comment ça marche ?
Comme la LED s’éclaire en présence d’une émission, nous avons mesuré les tensions aux bornes de la LED et de la résistance de 470 ohms.
En lecture directe sur la borne analogique A0 de l’Arduino, elle passe de 800 en l’absence de signal à 300 sur présence d’émission avec le squelch activé.
Nous partons donc du principe que la fréquence est occupée si une tension < 500 est mesurée, et libre dans le cas contraire.

Par rapport à la version précédente, nous avons juste ajouté une connexion entre la LED et la borne A0 de l’Arduino.

/////////////////////////////////
// Recepteur avec scanner auto //
/////////////////////////////////

// Ajouter librairie de gestion de l'écran LCD: 
# include <LiquidCrystal.h>
 // initialisation des broches à utiliser pour l'écran LCD.
 LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// Initialisation des variables
int Bouton_1 = 2; // Notre bouton 1 utilisera la borne 2 de l'Arduino
int Bouton_2 = 3; // Notre bouton 2 utilisera la borne 3 de l'Arduino
int Bouton_3 = 4; // Notre bouton 1 utilisera la borne 4 de l'Arduino
int Bouton_4 = 5; // Notre bouton 2 utilisera la borne 5 de l'Arduino
int Borne_Tension = A0; // Nous lirons la tension présente sur la borne A0
int Tension_Lue;
 

float Frequence_Reception,Frequence_Emission, Pas_Frequence, Niveau_Squelch, Volume_Son; //initialisation des variables

 void setup() {

   // Préparation de notre afficheur qui comporte 16 colonnes sur 2 lignes
   lcd.begin(16, 2);
   // Afficher sur l'écran LCD.
      lcd.setCursor(0, 0);
      lcd.print("FREQUENCE:");

   pinMode(Bouton_1, INPUT_PULLUP); // Nous utilisons Bouton_1 comme une entrée digitale
   pinMode(Bouton_2, INPUT_PULLUP); // Nous utilisons Bouton_2 comme une entrée digitale
   pinMode(Bouton_3, INPUT_PULLUP); // Nous utilisons Bouton_3 comme une entrée digitale
   pinMode(Bouton_4, INPUT_PULLUP); // Nous utilisons Bouton_4 comme une entrée digitale


   
   Frequence_Reception = 145750, Frequence_Emission = Frequence_Reception;     //Fréquence favorite.
   Pas_Frequence = 12.5;
   Niveau_Squelch = 1;
   Volume_Son = 3;
   
   lcd.setCursor(2, 1);
   lcd.print((Frequence_Reception/ 1000), 4);
   envoyer_info_vers_SA818 ();
 }
 void loop() {
int a; // variable servant à répondre à un if
 
lcd.setCursor(2, 1);
  if (digitalRead(Bouton_1) == LOW) //reduire la fréquence
  {
    if(a == 0) { 
      // si a = 1 le bouton 1 est utilisé par la partie SCANNER 
      // donc l'action contenue dans le if ne sera pas executée
      
      delay(200);
      Frequence_Reception=Frequence_Reception-Pas_Frequence;
      lcd.print((Frequence_Reception / 1000), 4);
      envoyer_info_vers_SA818 ();
    }
  }
  if (digitalRead(Bouton_2) == LOW) //augmenter la fréquence
  {
    delay(200);
    Frequence_Reception = Frequence_Reception + Pas_Frequence;
    lcd.print((Frequence_Reception / 1000), 4);
  envoyer_info_vers_SA818 ();
  }
  if (digitalRead(Bouton_3) == LOW) //régler le niveau du squelch a 1 ou 0
  {
    if(Niveau_Squelch > 0) 
    {
      Niveau_Squelch = Niveau_Squelch - 1; //squelch = 0
      envoyer_info_vers_SA818 ();
      delay(200);
      } else {
        Niveau_Squelch = Niveau_Squelch + 1; //squelch = 1
        envoyer_info_vers_SA818 (); //envoie des infos
        delay(200);
      }
  }
  Tension_Lue = (analogRead(Borne_Tension)); 
  
     //La tension est lue sur la LED du récepteur sur la borne A0
     
  if (digitalRead(Bouton_4) == LOW) 
      //On active le scanneur
  {
    a = 1; 
    
    // a est mis a 1 donc le button 1 ne pourra pas être utilisé 
    // pour diminuer la fréquence mais stopper le scanneur
    
    while(digitalRead(Bouton_1) == HIGH){
       
       //Gestion des limites de bandes
       
      if (Frequence_Reception > 145800) { 
          Frequence_Reception = 144300;
          envoyer_info_vers_SA818 ();
      }
      Frequence_Reception = Frequence_Reception + Pas_Frequence;
      
      envoyer_info_vers_SA818 ();
      delay(100);
      
      Tension_Lue = (analogRead(Borne_Tension)); 
      
      //voir si la fréquence est occupée grâce à la tension
      
      lcd.setCursor(2, 1);
      lcd.print((Frequence_Reception / 1000), 4);
      
      if(Tension_Lue>500) 
      
      // tension supérieur à 500 = fréquence libre
      
      {lcd.setCursor(11,1);
          lcd.print("libre");
              } else { 
                
         //sinon fréquence = occcupée donc arrêt sur la fréquence
         
         while(Tension_Lue < 500 && digitalRead(Bouton_1) == HIGH) 
         
         //boucle scrutant si la fréquence est devenue libre donc redemarre le scanneur
         //et si le bouton 1 est pressé on sort de la boucle
         {  
          
          lcd.setCursor(11,1);
          lcd.print("occup");
          Tension_Lue = (analogRead(Borne_Tension));
         }
       }
     }
     
    delay(300);
    
    a = 0; 
    
    // fin du programme bouton 4 donc a = 0, 
    // le bouton 1 peut à nouveau être utlisé pour reduire le fréquence
  }
  
  
   if(Tension_Lue>500)
   
   // si tension supérieur à 500 = la fréquence est libre 
   // donc affichage: libre
  {
    lcd.setCursor(11,1);
    lcd.print("libre  ");
  } else {
    lcd.setCursor(11,1);
    lcd.print("occupée"); 
    
    //fréquence inférieur à 500 donc fréquence occupée
  }
  
  
}
void envoyer_info_vers_SA818 ()
//  envoyer les informations au module SA818
{
  Serial.begin (9600);
  Serial.println ("AT+DMOCONNECT"); // connexion
  Serial.println("");
  Serial.println ("");
  delay (100);
  
  Serial.print ("AT+DMOSETGROUP=");
  Serial.print ("0");
  Serial.print (",");
  Serial.print (Frequence_Emission / 1000, 4);
  Serial.print (",");
  Serial.print (Frequence_Reception / 1000, 4);
  Serial.print (",");
  Serial.print ("0000");
  Serial.print (",");
  Serial.print (Niveau_Squelch,0);
  Serial.print (",");
  Serial.println ("0000");
  Serial.println("");
  Serial.println ("");
  delay (100);

  Serial.println ("AT+SETFILTER=0,0,1");
  Serial.println ("");
  delay (100);
  
  

  Serial.print ("AT+DMOSETVolume_SonUME=");
  Serial.println (Volume_Son,0);
  Serial.println ("");
  delay (100);
 }

Prochaines évolutions, affichage du noms des principaux répéteurs locaux.

Passage en émission avec gestion du décalage relais (600khz)

Merci à NOAM pour l’excellent travail de programmation documenté