Morse Beacon - un projet Arduino Morse pour Radio Amateur

Il y a quelques semaines, nous avions reçu la demande d'un Radio Amateur qui voulait annoncer un message en morse de façon répétée.
Dans la demande.
  1. Produire du son morse avec un buzzer
  2. Avoir un relais fermé pendant la communication
  3. Avoir un second relais qui pulse le morse
  4. Attendre 30 secondes puis recommencer le cycle.
Un projet follement amusant qui à débouché sur une bibliothèque Morse Arduino + exemples, ce qui au final était très amusant et instructif.

Le montage Arduino de base pour tester l'émetteur morse est très simple :
Montage d'exemple - Arduino Morse
Et le code de test tout aussi simple (il y a plus de commentaire que de code) :-)
/***************************************************************************
  This is a library for the ArduinoMorse
      Demonstrate the basic usage for sending a character, a string, 
        an array with special chars. 
  Designed specifically to work with the LED and Piezo Buzzer
  ----> https://shop.mchobby.be/senseur-divers/57-piezo-3232100000575.html
  ----> https://shop.mchobby.be/senseur-divers/1334-piezo-buzzer-large-3232100013346.html
  ----> https://shop.mchobby.be/minikits/66-assortiment-leds-5mm-mini-kit-3232100000667.html
  The driver use 2 required pins (one PWM for the buzze and one for digital I/O).
  Schematic on github 
  ----> https://github.com/mchobby/MCHobby_ArduinoMorse_library
  MC Hobby SPRL invests time and resources providing this open source code,
  please support MC Hobby and open-source by purchasing products
  from MC Hobby! shop.mchobby.be
  Written by Meurisse D. for MC Hobby SPRL.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/
#include <MCHobby_ArduinoMorse.h>

#define morseOutPin  11  // Digital output placed HIGH when emitting dot or Dash.
                         //    wire a LED + R 1K on that output 
#define piezoPin      8  // output audio on pin 8
                         //    wire a Piezo + R 100 on that output

MCHobby_ArduinoMorse morse = MCHobby_ArduinoMorse(piezoPin, morseOutPin);
// -OR- 
// the default contructor using piezo_pin=8 & led_pin=11
// MCHobby_ArduinoMorse morse = MCHobby_ArduinoMorse();

void setup() {
  // put your setup code here, to run once:
  morse.begin();
  //morse.morse_speed( 200 ); // decrease default speed which is 100 
  //morse.morse_tone( 1500 ); // Higher tone than default 1200
}

// String accept escape sequence like \r \n \\ 
char stringToMorse[] = "Hello from MCHobby Belgium!";
int end_of_msg[] = { END_OF_TRANSMISSION, INVITE_ANY_STATION };

void loop() {
  // put your main code here, to run repeatedly:
  morse.morse_char( BEGIN_OF_TRANSMISSION );
  morse.morse_string( stringToMorse );
  morse.morse_chars( end_of_msg ); 

  // At the end of the string long pause before looping and starting again
  delay( 8000 );   

}

Le code ne prévoit pas seulement la prise en charge de l'alphabet mais également de messages spéciaux comme BEGIN_OF_TRANSMISSION, END_OF_TRANSMISSION, etc.

Un exemple audio
Le GitHub du projet Arduino Morse contient également un fichier MP3 avec le résultat produit par la bibliothèque.
Le morse généré suit les conventions suivantes:
  • dotLen = temps d'un point en millisecondes. 100ms par défaut.
  • dashLen = temps d'un trait. 3 x temps d'un point
  • interDotLen = temps de silence entre deux points ou point et trait durant la transmission d'un caractère morse. Silence = temps d'un point.
  • interLetterLen = temps de silence entre deux lettres durant la transmission d'un mot en morse. Silence = 3 x temps d'un point (temps entre deux caractère d'un mot)
  • interWordLen = temps de silence entre deux mots durant la transmission d'une phrase en morse. Silence =  5 x temps d'un point (temps entre le dernier caractère du mot précédent et premier caractère du mot suivant)
MorseBeacon - version finale
Dans la version finale du projet, une broche est activée durant toute l'émission du code morse (entre le début et la fin de transmission).
Le projet inclus également un bouton pour passer en mode de configuration et deux potentiomètres de réglage.
L'exemple Morse Beacon - MC Hobby

Le bouton de configuration permet de répéter un "A" pendant de l'on fixe la vitesse et la tonalité avec les potentiomètres.

Le corps du code est tout aussi limpide.

void loop() {
  // put your main code here, to run repeatedly:

  if( digitalRead( configPin )==LOW ){
    morse.morse_speed( readSpeed() );
    morse.morse_tone( readTone() );
    beaconMsg();
  } 
  else {
    beaconCfgMode(); 
    delay( 100 );
  }
}

void beaconMsg(){
  /* Normal Beacon Message */

  digitalWrite( commPin, HIGH ); 
  delay( 1000 );
  morse.morse_char( BEGIN_OF_TRANSMISSION );
  morse.morse_string( line1ToMorse );
  morse.morse_string( line2ToMorse );
  morse.morse_char( END_OF_TRANSMISSION );
  digitalWrite( commPin, LOW );
  delay( 30000 ); // attendre 30 sec
}

void beaconCfgMode(){
  /* Configure the beacon parameter */
  morse.morse_speed( readSpeed() );
  morse.morse_tone( readTone() );
  morse.morse_char( 'A' );
}

Conclusion
Un projet très amusant et très instructifs sur le plan de la programmation. Les caractères morses sont stockés sous forme de chaîne de caractère dans la FLASH Arduino (à l'aide de PROGMEM).
C'était une approche très intéressante sur le plan technique.

const MorseRecord MorseTable[70] PROGMEM = {
  { 'A', ".-"   },
  { 'B', "-..." },
  { 'C', "-.-." },
  { 'D', "-.." },
  ...

Ce code est distribué dans l'esprit open-source. Si vous aimez notre travail alors soutenez nous en faisant vos achats chez MC Hobby.

MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible. 

SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.