Bouton Rotatif et Manipulateur Morse pour Remote SDR

Remote Keys

Remote SDR, application pour le contrôle d’un transceiver depuis un navigateur Web, peut à présent ( version >= 4.1) se connecter en USB à :
– un contrôleur de la fréquence par bouton rotatif
– une interface manipulateur morse
– un bouton poussoir pour passer en émission

Ce système, « Remote Keys », est construit autour d’un microcontrôleur Arduino Nano qui collecte les informations et les transmets via USB à Remote SDR, lequel utilise l’interface « Web Api » comme décrit ici.

L’ensemble est monté dans une boite avec sur le dessus un gros bouton de contrôle de la fréquence et un bouton poussoir pour émettre. Sur le côté, une prise jack permet de connecter un manipulateur de télégraphie à une ou deux palettes.

Matériel

Le bouton de contrôle de la fréquence éclaire alternativement en tournant, 2 capteurs de luminosité qui fournissent 2 signaux numériques sur les entrées D2 et D3 de l’Arduino Nano. Un bouton poussoir entre masse et D4 permet de changer d’état entre émission et réception, à chaque pression. Les entrées D5 et D6 reçoivent les signaux numériques des palettes du manipulateur Morse.

L’arduino Nano est connecté au PC qui exécute Remote SDR dans un navigateur récent comme Chrome ou Edge capable de traiter l’API Web Serial.

L’alimentation de l’ensemble est fournie par l’USB.

Bouton Rotatif (Version perso)

Il existe sur le marché, des boutons rotatifs qui fournissent 2 signaux numériques compatibles d’un Arduino. Malheureusement, ils fournissent en général seulement une vingtaine d’états par tour de 360°. Pour un confort d’utilisation, il faut un grand nombre d’états par tour pour balayer rapidement une bande. De même un bouton lourd, présentant une certaine inertie, permet en le lançant en rotation un balayage rapide.

Capteur de luminosité

Pour ce projet, j’ai construit une roue en époxy de 7 cm de diamètre percée de 16 trous de 6mm en périphérie et d’un trou central de 6mm pour y passer un axe de rotation. Deux LED, au-dessus de deux capteurs de luminosité éclairés ou non suivant la position de la roue, fournissent une sortie à 0 ou 1. Ils doivent être placés judicieusement pour avoir un changement d’état sur chaque capteur alternativement suivant une séquence :

00, 01, 11, 10, 00,… ou 00, 10, 11, 01 , 00… suivant le sens de rotation.


Un réglage par potentiomètre, permet d’ajuster le seuil de luminosité pour le basculement. 0, 1. Les 16 trous permettent 64 changements d’état par tour de 360°.

Bouton Rotatif (Version achetée)

Codeur optique rotatif incrémental

En cherchant un peu on trouve des codeurs optro sur le marché chinois (Aliexpress) à un prix très correct (10€). Prendre le modèle à 300 ou 600 impulsions par tour. Les signaux de sortie (en collecteur ouvert) sont identiques à ceux du modèle perso, à savoir 2 oscillations déphasées qui attaquent directement les entrées D2 et D3. Le bouton est alimenté entre +5V et masse.

Poussoir Émission

Un simple bouton poussoir permet le passage en émission comme le bouton TX Audio On/Off de Remote SDR.

Entrée Manipulateur Morse

Deux entrées numériques (mise à la masse ou non) permettent la connexion d’un manipulateur avec une ou 2 palettes. On utilise une prise Jack de 3.5mm à 3 points.

Logiciel

Le logiciel implanté dans l’Arduino est d’une grande simplicité. Il ne fait que transmettre les changements d’état. Aucune commande n’est reçu depuis Remote SDR. Si l’on ne souhaite pas les 3 fonctions : le bouton, le poussoir et le manipulateur morse, il suffit de mettre à zéro les entrées correspondantes ou de simplifier le code. Je ne vais pas détailler ici, comment développer du code pour Arduino, il existe des centaines de tuto sur le sujet. Je me contente de fournir le source ci-dessous :

/*
  Remote SDR
  Interface Serial-USB 
  - Frequency Tuning
  - TX/RX state change
  - CW Key
  F1ATB 26 December 2021
*/

// digital pin 2 and 3  has a luminosity sensor attached to them.
int Led_A = 2;
int Led_B = 3;
// digital pin 4 has a pusbutton attached to it
int pushButton = 4;
int OldButton = 1;

//CW Key
int LeftKey = 5;
int RightKey = 6;
int OldLeft = 1;
int OldRight = 1;

int Delay = 1;

int total=0;
// the setup routine runs at start up
void setup() {
  // initialize serial communication at 115200 bits per second:
  Serial.begin(115200);
  // make the pushbutton's pin an input:
  pinMode(Led_A, INPUT_PULLUP);
  pinMode(Led_B, INPUT_PULLUP);
  pinMode(pushButton, INPUT_PULLUP);
  pinMode(LeftKey, INPUT_PULLUP);
  pinMode(RightKey, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(Led_A), A_Rising, RISING) ;
  
}

// the loop routine runs over and over again forever to read the button and the morse key:
void loop() {
    Delay = 1;
   
    // Read PushButton
    int Button = digitalRead(pushButton);
    if (OldButton != Button) {
        Serial.println("B"+String(Button));
        OldButton = Button;
        Delay = 10;
    }

    // Read LeftKey
    int kLeft = digitalRead(LeftKey);
    if (OldLeft != kLeft) {
        Serial.println("L"+String(kLeft));
        OldLeft = kLeft;
        Delay = 2;
    }
    // Read RighttKey
    int kRight = digitalRead(RightKey);
    if (OldRight != kRight) {
        Serial.println("R"+String(kRight));
        OldRight = kRight;
        Delay = 2;
    }
    // Total is the sum of impulsions received from the rotating knob
    if (total<0){
       Serial.println("D"+String(total));
       total =0;
       Delay = 10;
    }
    if (total>0){
       Serial.println("U"+String(total));
       total =0;
       Delay = 10;
    }
    delay(Delay);        // delay in between reads for stability
}
void A_Rising() { // Rotating Knob interruption
    int LedStateB = digitalRead(Led_B);
    if (LedStateB ==0){
      total--;
    } else {
      total++;
    }
}

Dans cette nouvelle version du logiciel, le bouton déclenche une interruption sur un front montant de la pin D2. L’Arduino, compte ou décompte les fronts suivant l’état de la pin D3. Le total est envoyé au traitement par la liaison série. L’usage des interruptions permet de bien compter les impulsions lorsque l’on lance le bouton en rotation rapide.

Lorsque le bouton poussoir est enfoncé, l’Arduino envoi « B0 ». Quand il est relaché, « B1 ».

Un appui sur la palette de gauche ou le manipulateur simple, un L0 est envoyé. Au relachement L1. Pour la palette de droite, c’est R0 et R1.

La liaison série est à 115200 bits/seconde pour ne pas prendre trop de délai de transmission.

Réalisation

L’ensemble est monté dans une boite étanche à la lumière pour ne pas perturber le fonctionnement des capteurs de luminosité.

Les composants (Arduino, capteurs de Luminosité) se trouvent sur Ebay ou Aliexpress.

Pour définir le port USB sur lequel il faut se connecter, cliquez sur le bouton en haut à droite.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.