Projet de gestion de relais radio

Bonjour à tous,

Je suis tout nouveau sur le forum et je connais pas trop ce matériel, mais quelque chose me dit qu'il pourrait m'apporter beaucoup de solutions que je cherche depuis déjà un petit bout de temps.

Je suis auto-entrepreneur en radiocommunication et je monte des relais radios sur des sites relativement isolés (montagne).
J'ai besoin de pouvoir demandé des informations assez facilement à ces relais pour savoir quelle est la tension de la batterie notamment.
Je me dit qu'un Arduino pourrait très bien faire ça mais je ne sais pas encore comment.

Il me semble que le mode de communication le plus adapté est le 5 tons : un salve de 5 tonalités (normalisées) est envoyée à l'Arduino qui la décode, il analyse la tension de la batterie et renvoie lui même une salve 5 tons que je reçoit sur un poste dédié.

L'Arduino doit donc être capable de :

  • décoder des tonalités (Codes d'appels selectifs)
  • de les reproduire
  • d'analyser une tension batterie
  • de commuter deux relais électromagnétiques ou deux optocoupleurs pour gérer l'alimentation d'appareils externes
  • de savoir si le relais est en émission ou non (front montant ou descendant sur une des broches)

D'autre options pourraient ce greffer la dessus plus tard, mais l'important est là.

En regardant la gamme d'Arduino je suis donc tombé sur l'ARDUINO UNO R3 et son SHIELD AUDIO qui me paraissent tout indiqués pour mon application.

Tout ce qui est parti émission et réception radio ne pose aucun problème et est déjà en place. Il me suffirat de raccoder l'entrée audio et la sortie audio à mon relais.

Qu'en pense les connaisseurs ?
Est-ce que je me lance sur le bon matériel ?
N'est-ce pas un projet un peu ambitieux pour un débutant ? (j'ai du temps à consacrer à ce projet)

Merci à vous

Malo

ARDUINO UNO R3 et son SHIELD AUDIO qui me paraissent tout indiqués

Bonjour Malo,

oui pour l'arduino, non pour le shield audio : fonctionnant uniquement en source, il ne saura pas décoder

je pense que tes relais ont un port rs232 pour la signalisation, ce qui permet de se dispenser de l'antique 5 tons ?

par ailleurs, dans un système de communication, il y a au minimum une autre extrémité, tu ne nous a pas parlé ...

Bonsoir trimarco232,
merci de ta réponse

fonctionnant uniquement en source, il ne saura pas décoder

Tu pourrais m'en dire plus ? le shield sert à rajouter une entrée et une sortie audio à l'Arduino, ce dernier ne pourrait pas décoder ce qu'il "entends" ?

Pas de port RS232 sur les relais. L' "antique 5 tons" est encore utilisé sur une grande partie des réseaux radio analogiques, certes vieux mais très efficace.

Par contre j'ai pensé ce matin que les postes Émetteur et Récepteur qui constitue le relais sont équipés de broches GP qui sortent un état haut ou un état bas en fonction de certains paramètres (modifiable à la programmation du poste) et notamment à la réception d'un code 5 tons prédéfinis. Le décodage pourrait donc ce faire par le poste qui passerait une broche à l'état haut.
Le décodage du 5 tons par l'Arduino offrirait plus de possibilité mais compliquerait le projet.

dans un système de communication, il y a au minimum une autre extrémité, tu ne nous a pas parlé ...

Le relais est une extrémité, le poste qui envoie la commande et qui reçoit l'information qu'envoie l'arduino est une autre extrémité. Pas évident à expliquer mais si tu connais un peu les réseaux radio ça devrait aller, je peux faire un schéma au cas ou.

Est-il possible, pour l'arduino, de produire les tonalités demandées sans le Shield Audio ?

Merci de ton aide.

Bonjour,

ce dernier ne pourrait pas décoder ce qu'il "entends"

du-moins pas celui que j'ai vu. Peux-tu donner un lien ?

équipés de broches GP

Avec 2 signaux on pourra créer autant de messages que l'on veut, en créant un petit protocole. Voir si cela ne risque pas d'indisposer ton client.

Le décodage du 5 tons par l'Arduino offrirait plus de possibilité mais compliquerait le projet.

cela complique le sketch et ajoute un peu d'électronique, mais je n'écarte pas cette possibilité, qui a l'avantage d'être indépendante des E/R. S'agissant de fréquences audio, il "suffirait" de les générer et de les mesurer en digital. Autres difficultés :

  • à la réception : faire la distinction entre un code et la phonie
  • à l'émission : mélanger le code à la phonie

je peux faire un schéma

cela permettra à tout le monde de suivre

le poste qui envoie la commande et qui reçoit l'information qu'envoie l'arduino est une autre extrémité

Ma question concernait ce qui est raccordé à ce poste : un pupitre, un moniteur, un 2ème arduino ? Qu'est-ce qui oblige finalement à utiliser du 5 tons ? Si les E/R peuvent transmettre du DTMF, on trouvera plus facilement des encodeurs/décodeurs ... Cela dépend de la manière dont la phonie est transmise, est-elle analogique linéaire, ou bien triturée par un vocoder propriétaire ?

Est-il possible, pour l'arduino, de produire les tonalités demandées sans le Shield Audio ?

Il y a la fonction Tone, c'est des signaux carrés, la problématique se situera au niveau du décodage à la réception. Prends 2 arduinos, 5€, et fais un essai avec 2 E/R

Voici le schéma :

Petite explication :
Un relais est composé de deux postes, un qui reçoit le signal sur une fréquence et l'autre qui le renvoi sur une autre fréquence à -4.6Mhz.
Le poste à droite c'est le "poste de contrôle" qui envoie le code 5 tons (via le poste récepteur du relais) que l'arduino devra décoder. C'est ce même poste qui recevra l’information que l'arduino enverra via le poste émetteur de relais.

Voici le lien pour le shield audio :
http://www.selectronic.fr/arduino-shield-audio-monte.html

Avec 2 signaux on pourra créer autant de messages que l'on veut, en créant un petit protocole. Voir si cela ne risque pas d'indisposer ton client.

Pourrais tu expliciter ? je souhaiterais que le système reste quand même relativement simple.

  • à la réception : faire la distinction entre un code et la phonie
  • à l'émission : mélanger le code à la phonie

Si on part sur un décodage via l'Arduino, pour la réception, il faut détecter si une seule fréquence passe au dessus d'un certains seuil (tonalité) ou si plusieurs fréquences passent le seuil (phonie).
Pour l'émission, le code ne sera envoyé que si le relais n'est pas en train de transmettre, sinon ça risque de surmodulé, et ça ne va pas trop aller.

Pour la réception du signal envoyé par l'arduino, il n'y a rien de raccordé au poste, le poste est capable de décoder du 5 tons (poste pro Motorola avec afficheur, à droite sur mon schéma).
Pour le DTMF il faudrait que je regarde de quelle manière le poste peux le décoder pour l'afficher sur son écran.

Avec 2 signaux on pourra créer autant de messages que l'on veut

par exemple :
bip : début du message
bop bop .... pop = transmission d'un nombre = nombre de bops
bip bip : fin du message

le nombre transmis pourra être une valeur numérique, ou bien la représentation numérique de plusieurs bits, voire une combinaison des 2

le shield audio

c'est un dictaphone : il pourra envoyer des messages qu'il aura préenregistrés, donc du code 5 tons ou (et) de la phonie
par contre il ne saura pas décoder. Je pense que l'on doit pouvoir décoder le 5 tons directement avec l'arduino. Il faut essayer. Idem pour la génération du 5 tons

ok, donc ce module ne permet pas d'ajouter une entrée et une sortie audio à l'arduino, hélas...
Je vais commander cet Arduino Uno et déjà tester si mon idée d'utiliser les broches GPIO de mon poste marche.

Pour la tension de la batterie, j'ai trouvé ça :

Lien

Pour le protocole, en créer soit même alors qu'il en existe des tous fait... je ne vois pas trop l'intérêt.
Envoyer du 5 tons me semble plus efficace.
Par exemple, j’envoie 12999 à mon poste, l'arduino me répond 12138 si la batterie est à 13.8v, pas besoin de décodage en retour, il suffit de lire les chiffres sur l'écran.
Je ne vois pas la différence entre décoder du 5 tons et décoder des bip "fait maison".
La complexité du DTMF est que 2 fréquences sont envoyés simultanément. Mais les morceaux de codes pour le décoder existe déjà...

On en a pas trop parlé mais est-ce que le UNO suffirait pour cette application ?
Je ne connait pas trop les différences entre les différents modèle, mais apparemment je n'aurais pas besoin de plus gros.

la première étape pour moi, une fois l'arduino reçu, sera de détecter un front montant ou descendant sur une broche (venant du poste radio) et d'allumer une led par exemple. Je n'ai jamais programmer ce genre de matériel électronique.

Bonjour à tous,

L'Arduino Uno est arrivé.
Après quelques utilisation pour la familiarisation avec ce nouveau matériel, je me rend compte qu'un petit écran LCD serait le bienvenue pour afficher certaines informations. J'ai bien un petit écran d'Alcatel 511, un écran de Nokia 5200 et un écran d'Archos, mais pas de datasheet avec. Si quelqu'un à une solution pour l'utiliser, sinon j’achèterais un 2*16 caractères.
je crois qu'en attendant je peux utiliser le retour par le port série pour afficher sur l'écran de l'ordi pour le debug.

Donc mon poste RX m'envoie du 5V sur une de ces broches lorsque qu'il détecte un certain code 5 tons.
Comment puis-je faire pour détecter ce 5 tons sur un des broches de l'Arduino ? Quelle broche sera le plus adapter (Analog ou Digital) ?
Est-ce ça que l'on appelle front montant ?

Merci

une entrée Digitale fera l'affaire, si tu veux provoquer une interruption sur ton UNO utilise la D3 et regarde la fonction attachInterrupt(0, ...., RISING)

merci, donc je met juste l'entrée +5V sur la D3 ?
pas de protection à prévoir ?

il faut aussi relier le GND de l'Arduino au 0v de ta radio
mais il faudrait savoir aussi le signal envoyé le reste du temps (en l'air, à la masse, ???) pour mettre éventuellement une résistance de tirage

0V = GND ?

Je choisit, soit je met 0V sur la broche, soit je met 5V. Donc ce sera à la masse via la masse du poste.

Merci pour la fonction AttachInterrupt, elle me permet d'allumer une led (pour le test) quand j'ai du 5v sur la broche D2 et de l'éteindre quand in redescend à 0V. Mais le phénomène peut-être inversé si l'Arduino démarre et que le 5V est déjà présent sur la broche.
La logique consiste à détecter un changement d'état, quel qu'il soit hors je souhaiterais que ce soit fiable : 5V>Led ON ; 0V>LED OFF

Avez-vous une idée de fiabiliser le résultat ?

Malokoxis:
La logique consiste à détecter un changement d'état, quel qu'il soit hors je souhaiterais que ce soit fiable : 5V>Led ON ; 0V>LED OFF

si tu veux détecter le passage de 0 à 5v il faut utiliser rising dans l'attachInterrupt
il faut voir si tu as des rebonds sur cette entrée (si contact sec ....) et les traiter

Merci, mais le RISING n'inverse l'entrée qu'une fois sur deux.

Broche à 5V > LED ON
Broche à 0V > LED ON
Broche à 5V > LED OFF
Broche à 0V > LED OFF
...

Il faudrait une boucle qui analyse l'entrée. Si l'entrée est à 5V > Action1, si l'entrée est à 0V > Action2.
J'ai essayé de mettre une condition :

 if (state = HIGH)
  {
    digitalWrite(13, HIGH); // la LED reflète l'état de la variable
  }
   else
  {
    digitalWrite(13, LOW); // la LED reflète l'état de la variable
  }

Mais ça ne fonctionne pas, la led reste allumée en permanence.

Du coup j'ai trouvé ce code :

const char RXSalve = 2; //utilisation de la broche numérique numéro 2 comme entrée pour le 5V
const char led_indication = 13; //utilisation de la LED de la carte pour indiquer si l'ILS est activé ou non
unsigned char SALVE = 1; // ou 1, dépend du câblage de l'ILS selon les schémas précédents

void setup()
{
    //définition des broches utilisées
    pinMode(RXSalve, INPUT);
    pinMode(led_indication, OUTPUT);
}

void loop()
{
    if(SALVE) //si c'est le deuxième schéma
    {
        digitalWrite(led_indication, digitalRead(RXSalve)); //la LED est éteinte lorsque l'ILS est au repos
    }
    else //si c'est le premier schéma
    {
        digitalWrite(led_indication, !digitalRead(RXSalve)); //la LED est allumée lorsque l'ILS est au repos
    }
}

ça fonctionne très bien.

J'ai maintenant ajouté ce bout de code au code que j'avais déjà écrit :

Voilà ce que ça donne :

#include "pitches.h"

// notes in the melody:
int CodeAllumage[] = {CODE_9, CODE_1};
int CodeSelect1[] = {CODE_1, CODE_2, CODE_9, CODE_3, CODE_8};

char SortieHP = 9;
char SortieAudio = 8;

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDuration = 64;

//Déclare l'entrée "Réception d'un signal"
const char RXSalve = 2; //utilisation de la broche numérique numéro 2 comme entrée pour le 5V
const char led_indication = 13; //utilisation de la LED de la carte pour indiquer si le 5V est activé ou non
unsigned char SALVE = 1;

void setup() {
  //définition des broches utilisées
  pinMode(12, OUTPUT);    //contact PTT du poste TX
  pinMode(RXSalve, INPUT);
  pinMode(led_indication, OUTPUT);

  //BIP de démarrage
  delay(1000);
  tone(SortieHP, 2600, 100);
  delay(100);
  tone(SortieHP, 2200, 100);
}

void loop() {
  {
    //--Détection de tonalité RX
    if (SALVE)
    {
      digitalWrite(led_indication, digitalRead(RXSalve)); //la LED est éteinte lorsque la broche est à 0V
      // iterate over the notes of the melody:
    }
    else
    {
      digitalWrite(led_indication, !digitalRead(RXSalve)); //la LED est allumée lorsque la broche est à 5V

      // iterate over the notes of the melody:
      for (int thisNote = 0; thisNote < 5; thisNote++) {

        //digitalWrite(12, HIGH);   // PTT ON
        tone(SortieHP, CodeSelect1[thisNote], noteDuration); //Tonalité sur Sortie Audio>Radio (Sortie 8)
        int pauseBetweenNotes = noteDuration * 1;
        delay(pauseBetweenNotes);
        noTone(SortieHP);
        //digitalWrite(12, LOW);    // PTT OFF
      }

    }
  }

  //Clignotement du flash du mât radio
  digitalWrite(13, HIGH);   // allume la LED
  delay(100);
  digitalWrite(13, LOW);    // éteint la LED
  delay(100);
  digitalWrite(13, HIGH);   // allume la LED
  delay(100);
  digitalWrite(13, LOW);    // éteint la LED
  delay(1200);
  //----------------------------------
}

En gros lorsque le 5v est sur la pin 2, envoie de la suite de tonalité.
J'arrive bien à produire la suite de tonalité par exemple dans le setup(), donc pas de soucis au niveau HP et code, mais les tonalités ne sont pas émises lorsque la broche passe à 5V.

J'ai du faire une erreur dans la boucle certainement, mais je ne trouve pas ou...
merci

Malokoxis:
Du coup j'ai trouvé ce code :
....
ça fonctionne très bien.

oui mais ton code n'a ni queue ni tête
ex :

  • on utilise pas un char pour le numéro de pin mais un int ou un byte
  • rien ne modifie la valeur de SALVE donc le if de la loop ne sert a rien, la fonction pourrait tenir dans une seule ligne et le fonctionnement serait le même
  • ....
    il faut apprendre et comprendre les bases de l'arduino plutôt que d'assembler des morceaux de code récupérés ici et la, je te conseille la lecture de ce tuto Redirection vers Un simple bouton

Oula oui effectivement. J'ai modifié cette partie :

void loop() {
  {
    //--Détection de tonalité RX
    SALVE = digitalRead(RXSalve);

    digitalWrite(led_indication, SALVE); //la LED est éteinte lorsque la broche est à 0V

    if (SALVE)
    {

      Time = 0;

    }
    else
    {
      if (Time == 0)
      {
        //digitalWrite(led_indication, SALVE); //la LED est allumée lorsque la broche est à 5V

        // Emettre les tonalités
        for (int thisNote = 0; thisNote < 5; thisNote++) {

          //digitalWrite(12, HIGH);   // PTT ON
          // iterate over the notes of the melody:
          tone(SortieHP, CodeSelect1[thisNote], noteDuration); //Tonalité sur Sortie Audio>Radio (Sortie 8)
          int pauseBetweenNotes = noteDuration * 1;
          delay(pauseBetweenNotes);
          noTone(SortieHP);
          //digitalWrite(12, LOW);    // PTT OFF
          Time = Time + 1;
        }
      }
    }
  }

Voilà qui marche un peu mieux à présent.
Pour la fonction AttacInterrupt, ce n'est pas forcément nécessaire de l'utilisé car l'état haut reste tant que je n'ai pas envoyé une deuxième code à la radio. Donc l'arduino à tout le temps qu'il veut pour le détecter.
Merci pour le lien en tout cas, il est très intéressant, la page en anglais m'avais un peu fait mal au crâne.