Arduino : monter un générateur de code Morse

arduino_hamradioMonter un générateur de code Morse (CW) à base d’Arduino en seulement 10 minutes !

F0GXR

Tout d’abord, bonne et heureuse année 2016 à toutes et tous !

Introduction

Tout comme je suis novice en bidouille électronique « old school » (dernière bidouille en date, un générateur 1750 Hz),  je le suis aussi comme nouvel adepte dans l’utilisation de la célèbre platine (carte) électronique Arduino (en langage clair, une platine Arduino est pratiquement un mini ordinateur au format carte de crédit!).

Je ne dirais rien sur l’origine d’Arduino (hormis que c’est un outil destiné aux étudiants !), une grande majorité de radioamateurs connaissent déjà depuis quelques années les milles et une choses possibles en matière de montage et construction à base d’Arduino.

Je ne présenterai dans cette notice qu’un montage ultra simple et rapide touchant néanmoins au radio-amateurisme et pouvant être utile pour bons nombres de nouveaux radioamateurs F4.

Enfin, sachez que le montage suivant a été fait 1 heure après la réception de ma platine compatible Arduino Uno r3 ! Un vrai jeu d’enfant !!

Balise-CW_F0GXR_ArduinoUnoClonePlatine (carte) électronique UNO Chinoise compatible Arduino Uno r3.

Ou trouver une carte Arduino ou compatible Arduino à bas prix ?

Je ne dispose que de moyens financiers limités pour la pratique de ma passion, hors une platine Italienne Arduino Uno r3 « officielle » vaut 20 euros minimum, plus les frais de port.

https://store.arduino.cc/product/GBX00066

Pour pratiquement le même prix avec les frais de port inclus, vous pouvez directement avoir un compatible « Arduino starterkit » complet venant de Chine !

http://www.ebay.fr/itm/UNO-R3-Starter-Kit-1602-LCD-Dot-Matrix-Breadboard-LED-Resistor-for-Arduino-JK-/262234844509?hash=item3d0e6a2d5d:g:7EYAAOSwa-dWk4Fl

J’ai ainsi comme d’habitude chercher sur Ebay un moyen de découvrir le fabuleux univers de l’Arduino à moindre frais grâce aux entreprises chinoises.

Un clone Arduino Uno r3 chinois vaut moins de 3 euros avec les frais de port inclus !!

http://www.ebay.fr/itm/UNO-R3-ATmega328P-development-board-microcontroller-for-Arduino-/291654105559?hash=item43e7f079d7:g:DMsAAOSwofxUdSgS

Une fois la fameuse platine en main, c’est le moment de passer à l’action.

Objectif : monter une balise Télégraphique !

Étape 1 :

L’installation du driver pour reconnaître la platine UNO Chinoise sur mon NetBook sous Windows XP ne présente aucun soucis.

http://www.microcontrols.org/arduino-uno-clone-ch340-ch341-chipset-usb-drivers/

Tout comme l’installation de la dernière version du logiciel Arduino IDE de programmation (et de compilation) en langage C, Arduino Genuino 1.6.7.

https://www.arduino.cc/en/Main/Software

Il ne reste désormais qu’à choisir le bon port com, dans le logiciel Arduino.

arduinoUDE

Si l’apprentissage du langage C demandera un peu de temps, l’utilisation du logiciel ci-dessus est vraiment un jeu d’enfant, même pour un novice !

Étape 2 :

Ne sachant pas encore programmer en langage C, j’ai du chercher sur le Web, un « code source » correspondant à mon attente, pour monter mon petit projet de balise CW.

Après 20 minutes de recherchent diverses et quelques essais foireux, j’ai pu trouver le code source d’un programme fonctionnant du premier coup.

Un grand merci au radioamateur américain KI6STK ! :-)

En voici le listing.. (libre à vous de le modifier pour votre usage!)

/*

Radio Fox Transmitter

by Nathanael Wilson KI6STK

This transmits a long tone, followed by a call in morse code. It then waits an ammount of time then transmits it again. This transmits by connecting to a radio’s ptt and mic input.

*/

#define tonehz 300 //the aproxamite frequency of the tones in hz, in reality it will be a tad lower.

#define dit 64 //the length of the dit in milliseconds. The dah and pauses are derived from this.

#define rest 60000 //the ammount of time between transmits in milliseconds

#define longlength 15000 //length of long tone in milliseconds

#define tx 11 //the pin of the board then keys the radio

#define audio 12 //the pin of the board then outputs the audio

int code[] = { 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1, 0 }; // 1 id dih, 2 is dah, 0 is pause

int codelength = sizeof(code) / 2; //Divide the length that the array responds with by 2.

//Not sure why it returns 2 times the ammaount of info stored, but it does.

int length;

int duration;

int note = 1000000 / tonehz; //converts the frquency into period

void setup(){ //set the pins to output mode

pinMode(tx, OUTPUT);

pinMode(audio, OUTPUT);

pinMode(13, OUTPUT); //this is to see how the code looks with an led

}

void loop(){

digitalWrite(tx, HIGH); //starts the radio transmitting

playtone(longlength);

delay(250);

playcode();

digitalWrite(tx, LOW); //Stops the radio’s transmission

delay(rest);

}

void playtone(int note_duration){

long elapsed_time = 0;

if (note_duration > 0){

digitalWrite(13, HIGH); //See when it is making a tone on the led

while (elapsed_time < note_duration){

digitalWrite(audio, HIGH);

delayMicroseconds(note / 2);

digitalWrite(audio, LOW);

delayMicroseconds(note / 2);

elapsed_time += note / 1000;

}

digitalWrite(13, LOW);

}

else{ //if it’s a pause this will run

delay(dit * 2);

}

}

void playcode(){

for (int i=0; i < codelength; i++){

length = code[i];

if (length == 0){ //See if it’s a pause

duration = 0;

}

else if (length == 1){ //See if it’s a dit

duration = dit;

}

else if (length == 2){ //See if it’s a dah

duration = dit * 3;

}

playtone(duration);

delay(dit); //makes a pause between sounds, otherwise each letter would be continuous.

}

}

KI6STK_modif_F0GXR

Après avoir branché sur ma platine UNO chinoise une simple led sur les broches Ground et 13 (PWM), je peux déjà voir clignoter celle-ci en code Morse, c’est déjà bien amusant.

Mais, j’aimerais surtout entendre un signal audio… Pour cela, rien de plus simple, je branche un petit haut-parleur sur les broches Ground et 12 (PWM), j’entends désormais parfaitement bien des dit dah dit dah.

Étape 3 :

Il ne reste à faire que des essais de décodage de la balise CW improvisée pour conclure ce montage  ultra simple et très rapide  à faire !!

Exemple de décodage CW avec le logiciel Multipsk :

decod-CW_F0GXR_arduino

Une fois les premiers essais de décodage via câble Jack directement sur l’ordinateur de terminé (prévoir une résistance de 10 Kohm pour la protection de la carte son de votre PC), je conclu ma première expérience dans l’utilisation d’Arduino vs Ham radio, en branchant ma platine UNO à un émetteur-récepteur PMR 446 Mhz (ne pouvant le faire directement sur fréquence radioamateur dans l’immédiat) durant 5 minutes…

À la réception, tout est OK sur mon récepteur scanner VHF/UHF.

73 et vive la pratique de l’électronique ! Arduino is fun !

Ce contenu a été publié dans Informatique, Technique. Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Arduino : monter un générateur de code Morse

  1. Ping : Arduino : monter un générateur de code Morse

  2. David dit :

    Bonjour,
    Merci pour cet article.
    Je pense qu’il serait assez simple de rajouter un tableau de correspondance ASCII => Morse pour pouvoir rentrer directement les caractères a émettre dans le source code.
    ça peut être une deuxième étape.
    Je me pose personnellement la question de directement générer du morse à l’aide d’un petit clavier azerty portable et un processeur ATMEL ( en arduino ou non), mais je n’ai pas trouvé de clavier facile a connecter pour le moment.
    David.

Répondre à David Annuler la réponse.