1. Introduction

Le code morse est un code de communication utilisant des points et des traits. Il est difficile de voir quelle lettre correspond à une séquence et le but est de déterminer automatiquement le caractère correspondant. La limitation de ce projet est qu’on ne cherchera pas à décrypter des phrases entières mais seulement d'afficher une lettre, car déchiffrer des phrases demande des connaissances que je n'ai pas. L’enjeu est de construire un panneau LEDs 5x5 relié à un bouton sur lequel on appuiera pour jouer la séquence d’une lettre.

2. Matériel et méthodes

2.1 Matériel

Pour cela, on aura besoin du matériel suivant :
- Un Raspberry Pi
- Une breadboard
- 25 LEDs rouges
- 20 résistances 120 Ω
- 89 câbles de liaison
- 1 Pi Wedge à 40 pins
- Une plaque percée pour placer les LEDs
- Un bouton pression
Et du logiciel suivant :
- Python 3

2.2 Méthode

Hardware

En premier, on place les LEDs sur la plaque de manière à avoir 5 lignes et 5 colonnes. Ensuite, on connecte des câbles à chaque extrémité des LEDs et on branche ces câbles de manière à ce que les LEDs de la première et dernière colonne soit reliés à un même PIN de la breadboard et tel que toutes les autres LEDs soient connectées indépendamment à un PIN. On place une résistance entre chaque LED et le « ground ». Une photo n'aurait pas d'utilité particulière car il est difficile de comprendre le câblage tant il y a de câbles qui se chevauchent. Également, j'estime qu'il n'est pas difficile de se représenter un panneau LED.
Maintenant que toutes les LEDs sont connectées correctement, on passe à la partie programmation.

Software

Pour la partie logicielle, on aura besoin du module « time » qui permet au Raspberry Pi d'utiliser le temps dans le code ainsi que du module « RPi.GPIO », qui permet au Raspberry d'interagir avec les PINs qui lui sont attribués. Il faut imaginer un système qui permet de détecter la longueur d'une pression sur le bouton (court ou long). Pour cela, on récupère le temps au moment de l'appui du bouton ainsi qu'au relâchement du bouton et on fait la différence entre les deux. Pour cela, on utilise la fonction « time.time() », qui donne le temps Unix, qui correspond au nombre de secondes entre le 1er janvier 1970 et le moment où la fonction est appelée. Selon la valeur, la pression sera interprétée comme courte ou longue.

if GPIO.input(BUTTON) == 1 and etat == 0: #lance le timer sur appui du bouton
    etat = 1
    start_time = time.time()
elif GPIO.input(BUTTON) == 0 and etat == 1: #arrete le timer sur lacher du bouton
    end_time = time.time()
    etat = 0

Le changement de la variable « etat » est nécessaire, sans quoi la variable « start_time » serait continuellement réinitialisée sur la valeur de « time.time() », et de même pour « end.time ». On répète cela 4 fois afin d'avoir notre séquence en morse (une lettre n'est jamais composée de plus que 4 points ou traits). Comme certaines lettres ont moins que 4 caractères, si le bouton ne reçoit aucune entrée pendant 4 secondes, le programme passera automatiquement à l'affichage de la lettre.
Il faut maintenant afficher la lettre sur le panneau LED. On commencera par créer 26 fonctions qui géreront chacune l'affichage d'une lettre. Après cela, il faut appeler la fonction dont la lettre correspond à la séquence. Pour cela, on considérera la séquence morse comme un nombre de 4 chiffres où un point vaut 1 et un trait vaut 2, sinon le programme va confondre les séquences qui diffèrent d'un point au début (par exemple les séquences . _ _ _ et _ _ _ qui sont respectivement J et O).

if end_time-start_time <= 1: #impulsion courte -> 1
    nombre = 10*nombre + 1
elif end_time-start_time > 1: #impulsion longue-> 2
    nombre = 10*nombre + 2

3. Résultats

Le programme arrive très bien à faire la différence entre une longue pression et une courte pression. Également, le programme affiche systématiquement la lettre qui correspond à la séquence morse. Cependant, il y a parfois quelques soucis au niveau de l'allumage des LEDs.

4. Discussion

Certaines LEDs s'allument avec moins d'intensité que d'autres pour deux raisons principales. La première, est que j'ai pris la plupart de mes LEDs dans mon matériel personnel et non celui fourni par le gymnase et par conséquent, certaines sont légèrement défectueuses. La deuxième est que les résistances doivent être parfaitement enfoncées dans la breadboard, et il y a constamment des LEDs qui ressortent suffisamment pour que la LED s'éteigne. On pourrait régler ces problèmes en remplaçant les LEDs défectueuses par des LEDs qui fonctionnent parfaitement et en soudant les résistances à la breadboard. Cependant, il aurait été très fastidieux de recâbler toutes les LEDs défectueuses et je n'aurai pas pu souder les résistances car la breadboard ne m'appartient pas.
Il y a également un soucis au niveau du courant dans le bouton. En appuyant sur celui-ci, on fait passer un courant à travers, et le programme détecte une tension haute entrante. Mais le problème est que même une très petite tension compte comme tension haute pour le programme. Ceci implique que parfois, il y a des phénomènes électriques et magnétiques qui génèrent un minuscule courant, mais qui est suffisant pour que le programme détecte un appui sur le bouton, bien que celui-ci ne soit appuyé.

5. Conclusion

Un panneau LED de 25 lampes n'offre pas beaucoup de possibilité au niveau de l'affichage. En disposant d'un panneau suffisamment grand pour afficher des mots voire des phrases entières, on pourrait coupler ce projet avec un programme qui décrypte des phrases écrites en morse. On pourrait au final avoir un système qui nous permet d'écrire des phrases en morse entières et les afficher instantanément sur un panneau.

Références

- Module « time » : https://youtu.be/Q9qp4CVngKE
- Chronomètre : https://youtu.be/a8aW3P3A-jI