Sauvetage d'un moteur d'antenne Radio-amateur par Arduino

Sauvetage d’un rotor d’antenne.

  S’applique sur des modèles de rotors utilisés dans le passé pour diriger des paraboles TV, d’un poids d’environ 2.5 Kg, la liaison entre le pupitre et le moteur est en 3 fils.

Objectif

Modifier le pupitre de commande d’un moteur d’antenne (rotor).

La partie mécanique, le petit bloc faisant basculer les contacts ainsi que le système de mise à l’arrêt de la rotation du mécanisme sont défaillants.

Mécanisme inverseur

 

Schéma du pupitre et moteur

 

L’antenne étant visible depuis la station par une caméra,

Une caméra Ip et un navigateur suffisent, voir sur ce site des exemples de caméras IP.

 

 Le besoin d’avoir un répétiteur de la direction d’antenne sur le pupitre de commande n’est plus une obligation, en conséquence toute la mécanique nécessaire au suivi du positionnement peut être supprimée, une solution toute électronique est envisageable.

 

Un bouton poussoir pour aller dans le sens horaire.

Un bouton poussoir pour aller dans le sens anti-horaire.

Chaque bouton poussoir commande un relais.

L’un effectuant la connexion 0 et 1. (voir photo mécanisme inverseur)

L’autre effectuant la connexion 0 et 2. (voir photo mécanisme inverseur).

 

La mise sous et hors tension du primaire du transfo (conso 3W à vide) n’est pas gérable par le montage qui va suivre, l’ensemble de la station étant mise hors tension lorsqu’elle n’est pas utilisée le secteur n’alimentera plus le pupitre.

Constatations  voir Note

 

La solution :   V1

Le matériel

 Un Arduino Nano sur support (connexion par vis).  Volume réduit.

Une mini alimentation 5v (provenant d’un chargeur phone) cette alimentation est permanente tout comme le primaire du transfo.

 2 relais Arduino.

2 boutons poussoir.

2 diodes led.

2 résistances de 270 ohms.

 

 

Le schéma

câblage Arduino nano 1

 

Le code commenté explique les fonctions.

//Sketch relais2_2.ino pour Arduino nano

// déclaratives

// *****************************************************

 

// DCL Bouton1 branché sur la broche 3 et Grd

int bouton1 = 3;

// DCL Bouton2 branché sur la broche 7 et Grd

int bouton2 = 7;

 

// DCL du relais1  branché sur la broche 4 de la carte

int relais1 = 4;

 

// DCL du relais2  branché sur la broche 8 de la carte

int relais2 = 8;

 

// DCL pour stocker la valeur du bouton1

int bouton1v;

 

// DCL our stocker la valeur du bouton2

int bouton2v;

 

// DCL pour stocker la valeur  led jaune

int ledjaunev;

 

// DCL our stocker la valeur led verte

int ledvertev;

// --------------------------------------------------------------------

// Cette boucle setup n'est exécutée seulement au démarrage du programme

// mise sous tension ou reset

// Configure  les entrées sorties

// --------------------------------------------------------------------

 

void setup() {

// Configure la broche de bouton1  en entrée,

pinMode(bouton1,INPUT_PULLUP);   //pour éviter rebonbs

 

// Configure la broche de bouton2  en entrée,

pinMode(bouton2,INPUT_PULLUP);   //pour éviter rebonbs

 

// Configure la broche relais1 en sortie.

pinMode(relais1,OUTPUT);

 

// Configure la broche relais2 en sortie.

pinMode(relais2,OUTPUT);

}

 

// ----------------------------------------------------------------------

// Le programme principal s’exécute par une boucle infinie appelée Loop ()

// ----------------------------------------------------------------------

void loop() {

 

// lit l'état de la broche en entrée bouton1

// et met le résultat dans la variable bouton1v

bouton1v = digitalRead(bouton1);

 

// lit l'état de la broche en entrée bouton2

// et met le résultat dans la variable bouton2v

bouton2v = digitalRead(bouton2);

 

       // test bouton1

 

// si le bouton1v = 1 alors on execute l'operation active le relais sinon

// on maintient le relais au niveau bas

if (bouton1v == HIGH )

 

  {

    // écrit la valeur HIGH (=1) sur la broche du relais1

    // ce qui active le relais   

    digitalWrite(relais1, HIGH);

   }

else

  {

 

   // écrit la valeur LOW (=0) sur la broche du relais1

   // ce qui desactive le relais

  digitalWrite(relais1, LOW); 

  }

 

        //test  bouton2

  // si le bouton2v = 1 alors on execute l'operation active le relais sinon

  // on maintient le relais au niveau bas

if (bouton2v == HIGH )

 

  {

    // écrit la valeur HIGH (=1) sur la broche du relais2

    // ce qui active le relais   

    digitalWrite(relais2, HIGH);

   }

else

  {

 

   // écrit la valeur LOW (=0) sur la broche du relais2

   // ce qui desactive le relais

  digitalWrite(relais2, LOW); 

  }

}

 

 Lors de l’incorporation du montage dans le pupitre de commande initial, il s’avère que la place vienne à manquer, le moteur servant à la recopie ne sert à rien, uniquement faire du bruit lorsque que l’on appuie sur un bouton de commande, donc suppression, à noter ce moteur est identique à celui qui est dans le rotor, (pourrait remplacer ce dernier en cas de faiblesse). 

 

 

   Lors du maintien de l’appui sur l’un des boutons poussoir, la led bleue indique que l’on est dans le sens de rotation des aiguilles d’une montre, la led rouge indique que l’on est en anti-horaire. Contrôler en même temps la vidéo pour gérer le positionnement mais surtout la butée au Nord pour ne pas fatiguer le moteur.

 

 

Le pupitre se trouvant un peu éloigné de l’écran une solution par télécommande pouvait être étudiée.

Ce qui mène à :

La solution :   V2

 Ce qui change

Utilisation d’un émetteur (télécommande IR) réception sur le pupitre de commande par Led IR.

Pour mémoire il n’est pas possible de maintenir enfoncée une touche de télécommande, pour annuler une commande il faut passer une autre commande.

La mise sous tension du moteur (via relais) est commandée par une touche et l’arrêt par une autre touche. (visualisation de cette mise sous tension  par une Led) ce qui règle le problème constaté avec la V1.Voir Note

La rotation dans le sens horaire (via relais comme dans solution V1) est commandée par une touche, et l’arrêt par une autre touche. (visualisation du sens de rotation par une Led)

La rotation dans le sens anti-horaire (via relais comme dans solution V1) est commandée par une touche, et l’arrêt par une autre touche. (visualisation du sens de rotation par une Led)

 

Précaution.

Le sens horaire et le sens anti-horaire ne doivent jamais être activés en même temps, il va falloir gérer dans le programme.

Difficultés.

Trouver une télécommande IR qui soit en mesure de dialoguer avec l’Arduino, que ce soit avec le circuit TL1838 ou la diode TSOP4838 a été un véritable problème, la télécommande et le circuit 1838 (livrés ensemble) ne sont capable que d’envoyer des FFFFFFFF  ou recevoir des FFFFFFFF, aussi bien  sur « Nano » que sur « Uno », j’ai testé une dizaine de télécommandes,  j’en ai trouvé enfin une (celle de mon  décodeur satellite)  qui est en mesure d’échanger des chaînes de caractères sur 4 digits.

 

Le schéma

 

Le code

//Ce sketch pour Arduino nano old bootloader

// permet de mettre sous tension un rotor d'antenne

//de faire tourner dans un sens ou dans l'autre

//un moteur alternatif (2 bobines)

//via un récepteur IR situé dans le pupitre de commande

// et une télécommande manuelle

// a noter pour les relais, au repos

// mettre "HIGH" et au travail "LOW"  pourquoi ?

// les précautions sont mises en œuvre

// pour éviter de fausses manipulations ou oubli.

// les lignes pour impression sont en commentaires,

// utilisées pour la mise au point.

// Pierre Schuster F5BQV  Juin 2023

#include <IRremote.h>

//declaratives

int IR_Recv = 12;      //IR Receiver Pin 12

int whitePin = 3;      //led présence tension

int relaisPwPin = 4;   //relais mise sous tension

int bluePin = 5;       //led rotation sens horaire

int relaisHoPin = 6;   //relais rotation sens horaire

int redPin = 7;        //led rotation sens anti-horaire

int relaisAhoPin = 8;  //relais rotation sens anti-horaire

unsigned long currentTime = 0; //depuis la mise sous tension Arduino

unsigned long previousTime = 0;

IRrecv irrecv(IR_Recv);

decode_results results;

void setup() {

  Serial.begin(9600);                //start serial communication

  irrecv.enableIRIn();               //Start the receiver

  pinMode(whitePin, OUTPUT);         //set output  Power on

  pinMode(bluePin, OUTPUT);          //set output  sens horaire

  pinMode(redPin, OUTPUT);           //set output sens anti horaire

  pinMode(relaisPwPin, OUTPUT);      //relais power on

  pinMode(relaisHoPin, OUTPUT);      //relais sens horaire

  pinMode(relaisAhoPin, OUTPUT);     //relais sens anti horaire

  digitalWrite(relaisPwPin, HIGH);   //au démarrage relais Pwr au repos

  digitalWrite(relaisHoPin, HIGH);   //au démarrage relais Ho au repos

  digitalWrite(relaisAhoPin, HIGH);  //au démarrage relais Aho au repos

}

void loop() {

  //limite la mise sous tension après une minute de non utilisation

  currentTime = millis();

  if ((currentTime - previousTime) > 60000) {   // 1 minute

    digitalWrite(whitePin, LOW);

    digitalWrite(relaisPwPin, HIGH);

    //Serial.print("fin ");

    //Serial.println(currentTime);

    previousTime = currentTime;   // remet à zéro le décompte

   

  }

  //decode input infrarouge

  if (irrecv.decode(&results)) {

    long int decCode = results.value;

    //Serial.println(results.value);  //affiche la valeur du bouton

    //switch case to use the selected remote control button

    switch (results.value) {

      case 3695300350:  //when you press the Pwr button  Pwr On

        previousTime = currentTime;

        digitalWrite(whitePin, HIGH);

        digitalWrite(relaisPwPin, LOW);

        //Serial.print("début ");

        //Serial.println(currentTime);

        break;

      case 2367684446:  //when you press the Exit button Pwr Off

        digitalWrite(whitePin, LOW);

        digitalWrite(relaisPwPin, HIGH);

        digitalWrite(bluePin, LOW);

        digitalWrite(relaisAhoPin, HIGH);

        digitalWrite(redPin, LOW);

        digitalWrite(relaisHoPin, HIGH);

        break;

      case 3259726329:                    //bouton 1 moteur sens horaire 

        digitalWrite(redPin, LOW);        //stop anti-horaire précaution

        digitalWrite(relaisAhoPin, HIGH); // stop moteur ah

        delay(150);                       //tempo pour changement

        digitalWrite(bluePin, HIGH);      //start horaire

        digitalWrite(relaisHoPin, LOW);

        break;

      case 1144174750:    //press the 4 button  moteur Off sens horaire

        digitalWrite(bluePin, LOW);

        digitalWrite(relaisHoPin, HIGH);

        break;

      case 1705371970:                    //when you press the 2 button

        digitalWrite(bluePin, LOW);       //stop horaire par précaution

        digitalWrite(relaisHoPin, HIGH);  //stop horaire par précaution

        delay(150);                       //tempo pour changement

        digitalWrite(redPin, HIGH);

        digitalWrite(relaisAhoPin, LOW);

        break;

      case 1223520442:  //when you press the 5 button

        digitalWrite(redPin, LOW);

        digitalWrite(relaisAhoPin, HIGH);

        break;

    }

    irrecv.resume(); //Receives the next value from the button you press

  }

  delay(100);

}

 

 

La mise en place dans le boitier de commande est un peu plus délicate.

 

 

 Quel confort ; ne plus avoir à allonger le bras pour appuyer sur un bouton tout en se tordant le cou pour suivre la rotation sur l’écran, cette V2 est une belle avancée malgré les problèmes rencontrés, certainement liés à l’utilisation de clones d’Arduino.

 

  En cas d’oubli d’arrêt du moteur (touche  Exit sur ma télécommande) le moteur s’arrête au bout de 60 secondes, permet de limiter la fatigue du moteur en butée, à éviter quand même….

 

 

Note :  après avoir laissé l’ensemble sous tension quelques heures il s’avère que le transformateur soit légèrement chaud, (conso 3 W à vide , 40 W moteur en route)  prévoir un système de mise hors tension (débrancher) lorsque le rotor n’a pas besoin d’être utilisé est une solution économique et citoyenne.

 

Après avoir trouvé une alimentation 5v pouvant tenir dans le pupitre de commande,  le couvercle peut être clos.

Ci- dessous la réalisation.

 

Titre : Pupitre de commande rotor

 

Pierre Schuster F5BQV                                        le 31 mai 2023 et 3 juillet 2023

 

Retour à la page d’accueil   http://f5bqv.fr