Ce projet consiste à réaliser un générateur de code Morse.
Plus précisément, à partir d'un message stocké dans une chaine de caractères (on se limite aux lettres majuscules), le programme doit générer le code Morse lumineux correspondant sur une LED.
Le code Morse des différentes lettres est constitué d'une série d’impulsions courtes (le point) et longues (le tiret). Une impulsion longue fait 3 fois la durée d'une impulsion courte et les impulsions sont séparées par un temps mort de la durée d'une impulsion courte. Entre chaque lettre il y a un temps mort de la durée de 3 impulsions courtes et entre chaque mot un temps mort de la durée de 7 impulsions courtes.
Le montage électronique associé à ce projet est très simple : une LED pilotée par la borne numérique n°2 de la plateforme Arduino.
Nous n'utilisons pas ici la méthode habituelle qui consiste à conserver le code Morse de chaque caractère sous forme de chaine de caractères avec des points et des tirets, mais nous envisageons deux solutions originales pour effectuer le codage numérique du code Morse :
Première méthode de codage d'une lettre en Morse
Les impulsions sont codées selon leur schéma temporel où 1 représente l'impulsion courte et 0 un temps mort.
Par exemple le A(.-) est codé 10111.
Deuxième méthode de codage d'une lettre en Morse
0 représente une impulsion de courte durée et 1 représente une impulsion de longue durée.
Par exemple le A(.-) est codé 01.
L'inconvénient de ce codage est que plusieurs lettres du code Morse sont représentées par le même nombre, par exemple E, H et I sont toutes les trois représentées par la valeur 0. Pour lever l'ambiguïté il faut ajouter une information supplémentaire qui indique pour chaque lettre le nombre d'impulsions.
Au niveau du programme les codages des 26 lettres majuscules de l'alphabet figurent dans un tableau.
Pour la première méthode jusqu'à 13 bits sont nécessaires pour coder une lettre, donc il faut utiliser un tableau de int
:
int codeMorse[]={
0b10111,
0b111010101,
0b11101011101,
...
};
L'utilisation du préfixe 0b
permet de saisir directement dans le code source les nombres en binaire sans les convertir au préalable en base 10.
Pour la seconde méthode, deux tableaux sont nécessaires : un tableau pour le code Morse proprement dit et un tableau dans lequel figurent les nombres d'impulsions.
Chaque donnée de ces tableaux peut être codée sur moins de 8 bits ce qui donne la possibilité d'utiliser des tableaux de byte
:
byte nbImpulsion[]={2,4,4,3, ...};
byte codeMorse[]={
0b01,
0b1000,
0b1010,
0b100,
...
};
Il est intéressant de remarquer que dans les deux méthodes l'occupation en mémoire est strictement la même.
Dans la première méthode il y a un tableau de $26\times 16=416$ bits soit 52 octets.
Dans la deuxième méthode il y a deux tableaux de $26\times 8=208$ bits soit 26 octets, donc au total $2\times 26=52$ octets.