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.

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é