Table des matières:
- Étape 1: Liste des pièces
- Étape 2: schéma de circuit
- Étape 3: Théorie
- Étape 4: Notes de conception
- Étape 5: Logiciel
- Étape 6: Opération
- Étape 7: Résumé
Vidéo: Décodeur Binary Tree Morse : 7 étapes (avec photos)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:05
Cette instructable explique comment décoder le code Morse à l'aide d'un Arduino Uno R3.
Le décodeur, qui s'adapte automatiquement à la vitesse d'envoi, est capable de décoder le morse jusqu'à au moins 80 mots par minute.
Le code entrant est affiché sous forme de texte sur votre moniteur série Arduino (ou écran TFT si installé)
Un oscillateur de tonalité a été inclus si vous souhaitez vous entraîner à envoyer du morse.
Le décodeur comprend:
- un module d'affichage TFT 320 x 240 [1]
- un filtre passe-bande numérique Goertzel pour séparer les signaux indésirables.
- un « Binary Morse Tree » pour décoder le signal
- suivi de vitesse automatique
- une sortie audible lors de la pratique du morse
- le texte entrant et sortant est affiché.
Les caractères et symboles suivants sont reconnus:
- [A.. Z]
- [0..9]
- [., ? ' ! / () &:; = + - _ " @]
Le coût estimé du bouclier du décodeur morse, moins l'écran TFT, est de 25 $. [1]
Images
- La photo de couverture montre une unité entièrement assemblée
- La vidéo montre le décodeur en fonctionnement
Remarques
[1]
- Le module d'affichage TFT est facultatif car tout le texte est envoyé à votre « Moniteur série » Arduino.
- Le module TFT est décrit dans mon instructable
Étape 1: Liste des pièces
Les pièces suivantes ont été obtenues à partir de
1 seul prototype de shield pour Arduino UNO R3, pas de 2,54 mm
Les pièces suivantes ont été obtenues localement:
- 1 seul ampli op double LM358
- 1 seule LED verte
- 1 seul clip LED
- 1 seule capsule de microphone à électret
- 1 seul bouton poussoir normalement ouvert
- 1 seule prise DIP 8 broches
- 2 résistances de 330 ohms seulement
- 2 seules résistances 2K2
- 5 résistances seulement 10K ohm
- 2 résistances de 56K ohm seulement
- 2 seulement 1uF condensateur
- 1 seul condensateur 10uF
Les pièces suivantes sont facultatives:
- 1 seul module d'affichage LCD TFT SPI 2,2 pouces 240*320 ILI9341 avec emplacement pour carte SD pour Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
- Clé Morse / bouton poussoir
- 1 seul transistor BC548 NPN
- 1 seul haut-parleur de 1 pouce
- 1 seule résistance de 33K ohm
- 1 seule prise mono 3,5 mm (pour clé morse)
- 1 seule prise mono 3,5 mm (pour clé morse)
- 3 entretoises en nylon taraudé M3 de 9 mm seulement
- 1 seul boîtier en plastique ABS 130 x 68 x 44 mm
- 5 connecteurs à angle droit à 2 broches uniquement
Le coût estimé du bouclier du décodeur morse, moins l'écran TFT en option, est de 25 $. [1]
Remarques
[1]
La liste des pièces du module d'affichage TFT 320 x 240 en option est répertoriée dans mon instructable
[2]
Une clé morse ou un bouton-poussoir robuste est nécessaire si vous souhaitez utiliser l'expéditeur.
Étape 2: schéma de circuit
Images
La photo 1 montre le schéma de circuit du décodeur morse. La résistance de 330 ohms en série avec la clé morse limite le courant de sortie du D4 en cas de court-circuit accidentel à la terre… augmenter sa valeur diminue la sortie audio du haut-parleur. Pour cette raison, je ne l'ai pas ajouté au bouclier mais je l'ai attaché directement à la prise clé morse pour faciliter le réglage
La photo 2 montre un bouclier assorti. Le bouclier provient de mon instructable https://www.instructables.com/id/Arduino-TFT-Grap… auquel j'ai ajouté l'amplificateur de microphone et l'oscillateur de tonalité. [1]
La photo 3 montre le bouclier terminé attaché à un Arduino. Aucun autre composant n'est requis si le texte doit être affiché sur votre "Serial Monitor" Arduino
La photo 4 montre le décodeur partiellement emballé. Un trou a été découpé dans le couvercle pour visualiser l'écran. Le haut-parleur et le microphone ont été collés à chaud sur le boîtier. Percez des trous de haut-parleur dans le couvercle avant de monter le haut-parleur. La prise centrale sur le couvercle est pour une extension de microphone… sans cela le décodeur doit être placé près du haut-parleur ce qui n'est pas toujours possible
La photo 5 montre l'écran TFT. Du ruban électrique noir a été fixé sur les bords de l'écran… ce ruban empêche les fuites de lumière et masque tout désalignement entre l'écran et l'ouverture du couvercle
Important
[1]
Les Arduinos avec un grand connecteur USB nécessitent une couche de ruban électrique entre le connecteur USB et le blindage Arduino. Les courts métrages accidentels sont possibles sans la bande car l'espace libre est petit. La bande n'est pas requise pour les Arduinos qui ont de petits connecteurs
Étape 3: Théorie
Chaque lettre du code morse comprend une série de tonalités de courte et de longue durée appelées « points » et « tirets ».
- un point (.) mesure 1 unité de longueur
- un tiret (_) a une longueur de 3 unités
- l'espace entre les éléments des lettres est de 1 unité
- l'espace entre les lettres est de 3 unités
- l'espace entre les mots est de 7 unités
Nous pouvons déterminer si la tonalité entrante est un point ou un tiret en comparant sa durée avec une tonalité de référence de 2 unités de longueur.
- un point est inférieur à 2 unités
- un tiret est supérieur à 2 unités
Il existe deux méthodes distinctes pour décoder le motif entrant de points et de tirets:
- recherche linéaire
- arbre binaire (également connu sous le nom de recherche dichotomique)
Recherche linéaire
Une méthode courante consiste à créer un tableau de caractères et leurs motifs morses correspondants. Par exemple, chacun des caractères suivants serait enregistré sous:
- UNE. _
- B_…
- C_. _.
- 0 _ _ _ _ _
- 1. _ _ _ _
- 2.. _ _ _
Chaque lettre nécessite 6 cellules… 1 pour la lettre elle-même et 5 pour les (.) et (_). Pour ce faire, nous avons besoin d'un tableau de caractères letter[36][6] avec un total de 216 cellules. Les cellules inutilisées sont normalement remplies d'un zéro ou d'un blanc.
Pour décoder les points et tirets entrants, nous devons comparer le motif point/tiret de chaque lettre entrante avec nos motifs de caractères de référence.
Bien que cette méthode fonctionne, elle est extrêmement lente.
Supposons que nous ayons 26 lettres ('A',..' Z') et les chiffres ('0', … '9') stockés dans un tableau, alors nous devons effectuer 36 recherches, chacune avec jusqu'à 5 sous-recherches, soit un total de 36*5=180 recherches pour décoder le chiffre '9'.
Arbre binaire
Une recherche binaire est beaucoup plus rapide car aucune recherche n'est requise.
Contrairement à la recherche linéaire, qui nécessite à la fois le caractère et les motifs morses à stocker, l'arbre binaire ne stocke que les caractères, ce qui signifie que la taille du tableau est plus petite.
J'ai divisé mon arbre binaire (photo1) en deux moitiés (photos 2 et 3) pour le rendre plus lisible.
Pour trouver un caractère, nous déplaçons un pointeur vers la gauche chaque fois que nous entendons un point et le déplaçons vers la droite chaque fois que nous entendons un tiret. Après chaque mouvement, nous réduisons de moitié la distance du pointeur pour le prochain mouvement… d'où le nom d'arbre binaire.
Décoder la lettre ‘9’ (tiret, tiret, tiret, tiret, point) nécessite 5 déplacements… 4 vers la droite, et 1 vers la gauche qui laisse le pointeur directement sur le ‘9’.
Cinq mouvements est nettement plus rapide que 180 recherches !!!!!
Le tableau de caractères binaires est également plus petit… 26 lettres et 10 chiffres ne nécessitent qu'un tableau de 64 x 1 ligne. J'ai choisi de créer un tableau de 128 caractères pour pouvoir décoder la ponctuation.
Étape 4: Notes de conception
Le morse est difficile à décoder en présence de signaux parasites. Les signaux indésirables doivent être rejetés… cela nécessite une sorte de filtre.
Il existe de nombreuses possibilités:
- Boucles à verrouillage de phase
- Filtres inducteurs-condensateurs
- Filtres actifs résistance-condensateur
- Traitement numérique du signal tel que la transformée de Fourier rapide ou le filtre de Goertzel.
Les méthodes 1, 2, 3 nécessitent des composants externes encombrants.
La méthode 4 ne nécessite aucun composant externe… les fréquences sont détectées à l'aide d'algorithmes mathématiques.
Transformée de Fourier rapide (FFT)
Une méthode pour détecter la présence d'une tonalité dans une forme d'onde complexe consiste à utiliser la transformée de Fourier rapide
La photo 1 montre comment la FFT (Fast Fourier Transform) divise le spectre audio en « bins ».
La photo 2 montre comment les « bacs » FFT répondent à un signal… dans ce cas 800Hz. Si un deuxième signal de, disons, 1500 Hz était présent, nous verrions deux réponses… une à 800 Hz et une autre à 1500 Hz.
En théorie, un décodeur de code morse peut être réalisé en surveillant le niveau de sortie d'une case de fréquence FFT particulière … un grand nombre représente la présence d'un point ou d'un tiret … un petit nombre représente l'absence de signal.
Un tel décodeur de code morse pourrait être réalisé en surveillant « bin 6 » sur la photo 2, mais il y a un certain nombre de problèmes avec cette approche:
- nous ne voulons qu'un seul bac de fréquence … le reste est des calculs gaspillés
- les cases de fréquence peuvent ne pas apparaître exactement sur la fréquence d'intérêt
- c'est relativement lent (20mS par boucle Arduino()
Une autre méthode consiste à utiliser un filtre Goertzel.
Filtre Goertzel
Le filtre de Goertzel est similaire au FFT mais n'a qu'un seul bac de fréquence.
La photo3 montre la réponse en fréquence d'un filtre Goertzel à des pas audio discrets.
La photo 4 est un balayage du même filtre sur la même gamme de fréquences.
J'ai décidé d'"aller" avec l'algorithme de Goertzel comme:
- Le temps de boucle Arduino () à l'aide de l'algorithme de Goertzel était de 14 mS (millisecondes) contre 20 mS (millisecondes) pour une solution FFT utilisant la bibliothèque Arduino "fix_FFT".
- Il est facile de régler la fréquence centrale d'un filtre passe-bande Goertzel.
- La bande passante est d'environ 190 Hz.
La photo 5 montre la sortie numérique d'un filtre Goertzel à 900 Hz lorsqu'une tonalité est détectée. J'ai réglé mon seuil de tonalité à une valeur de 4000 … les valeurs supérieures à 4000 indiquent une tonalité.
En théorie, il vous suffit de régler votre filtre sur une fréquence d'écoute confortable. Malheureusement, la sortie audio de mon haut-parleur de contrôle de 1 pouce chute rapidement en dessous de 900 Hz. Pour éviter tout problème, j'utilise une fréquence de filtre de 950 Hz. Les formules nécessaires pour calculer les fréquences de filtre alternatives se trouvent dans mon en-tête de code.
Décodage
Décoder les points et les tirets n'est pas aussi facile qu'il n'y paraît au premier abord.
Le morse parfait est défini comme:
- point = 1 unité
- espaces à l'intérieur de la lettre = 1 unité
- tiret = 3 unités
- espace entre les lettres = 3 unités
- espace entre les mots = 7 unités
Pour décoder le morse parfait, nous avons simplement besoin d'une durée de référence de 2 unités
- point < 2 unités
- espace élément < 2 unités
- tiret > 2 unités
- lettre _espace > 2 unités
- word_space > 6 unités (c'est-à-dire 3 x unités de référence)
Cela fonctionne pour la machine morse mais dans le « monde réel »:
- la vitesse d'envoi varie
- la durée de chaque point varie
- la durée de chaque tiret varie
- les lettres E, I, S, H, 5 ne contiennent que des points dont la moyenne correspond à la durée du point
- les lettres T, M, O, 0 ne contiennent que des tirets dont la moyenne correspond à la durée du tiret
- les mots vides peuvent ne pas arriver
- l'évanouissement crée des erreurs dont le décodeur doit se remettre.
- signaux corrompus en raison d'interférences
Les lettres contenant uniquement des points et des tirets sont partiellement résolues si:
nous estimons la durée de référence jusqu'à ce que nous ayons reçu un point et un tiret valides. J'utilise 200 millisecondes, ce qui est valable si la vitesse d'envoi est comprise entre 6 WPM (mots par minute) et 17 WPM. Vous devrez peut-être augmenter cette valeur si vous apprenez le morse. Un tableau des vitesses est inclus dans le logiciel
Les variations de vitesse sont résolues si:
- nous effectuons une moyenne mobile sur chaque point et chaque tiret et
- recalculer la durée de référence après réception de chaque symbole
Les écarts de mots et les écarts de mots qui n'arrivent pas sont résolus si nous:
- mémoriser l'heure de la dernière transition de bord de fuite (ton à pas de ton),
- redémarrer l'algorithme après chaque lettre,
- calculer le temps écoulé en attendant la prochaine transition de bord d'attaque (pas de tonalité à tonalité) et
- insérer un espace si 6 unités de temps ont été dépassées.
Oscillateur Morse
J'ai d'abord essayé quelques buzzers Piezo mais j'ai trouvé:
- la fréquence a été fixée
- la fréquence de sortie était trop élevée pour une écoute prolongée
- les piézos avaient tendance à sortir de la bande passante de Goertzel
J'ai ensuite essayé de piloter un transducteur acoustique avec une onde carrée de 750 Hz, mais j'ai trouvé qu'il avait une résonance qui filtrait les 1er et 3e harmoniques. La photo 6 montre la sortie de l'amplificateur du microphone vers une onde carrée de 750 Hz … nous voyons la 5ème harmonique !!!
J'ai alors eu recours à un petit haut-parleur. La photo 7 montre la sortie du microphone vers une onde carrée de 750 Hz qui a été envoyée à un petit haut-parleur… cette fois, nous voyons la fondamentale… pas la 5e harmonique. Le filtre de Goertzel ignore les harmoniques.
Remarques
[1]
en.wikipedia.org/wiki/Goertzel_algorithm
www.embedded.com/the-goertzel-algorithm/
Étape 5: Logiciel
Installation
- Téléchargez le fichier joint MorseCodeDecoder.ino [1]
- Copiez le contenu de ce fichier dans une nouvelle esquisse Arduino
- Enregistrez le croquis sous le nom "MorseCodeDecoder" (sans les guillemets)
- Compilez et téléchargez le croquis sur votre Arduino
Mise à jour du logiciel 23 juillet 2020
Les fonctionnalités suivantes ont été ajoutées au fichier joint "MorseCodeDecoder6.ino"
- une fenêtre "Exact Blackman" [2]
- un "Noise_blanker"
Ajustement:
- augmentez le niveau audio de votre récepteur jusqu'à ce que la LED commence à clignoter puis reculez
- réglez maintenant votre récepteur jusqu'à ce que la LED clignote en même temps que le morse entrant
- le Noise_blanker a été configuré pour ignorer les rafales de bruit jusqu'à 8 mS (un temps de boucle)
- le seuil de bruit peut être ajusté en définissant Debug=true et en regardant votre Serial Plotter
Noter
[1]
Réglez votre moniteur série Arduino sur 115200 bauds si vous souhaitez également afficher le texte.
[2]
- Photo 1 … Fenêtre de Blackman exacte
- Photo 2 … Filtre Goertzel sans fenêtre Exact Blackman
- Photo 3,,, Filtre Goertzel avec fenêtre Exact Blackman appliquée
Étape 6: Opération
Décodeur
Placez l'appareil à côté de votre haut-parleur lorsque vous écoutez du morse.
- La capsule du microphone à électret capte le signal morse de votre haut-parleur.
- La sortie du microphone à électret est ensuite amplifiée 647 fois (56dB) avant d'être transmise à l'Arduino pour traitement.
- Un filtre passe-bande numérique Goertzel extrait le signal morse du bruit.
- Le décodage se fait à l'aide d'un arbre binaire.
- La sortie du décodeur est affichée sous forme de texte sur un écran TFT de 320 x 240 pixels. Il est également envoyé à votre "Serial Monitor" Arduino si vous ne souhaitez pas utiliser d'écran.
Expéditeur Morse
Un expéditeur morse a également été inclus. Cela vous permet de vous entraîner à envoyer du morse et fonctionne comme suit:
- Une tonalité audible constante est générée sur la broche Arduino 4.
- Nous entendons cette tonalité via le haut-parleur du décodeur chaque fois que nous appuyons sur la touche morse.
- La tonalité est réglée sur la même fréquence que le filtre Goertzel qui trompe le décodeur en lui faisant croire qu'il écoute du vrai morse… tout ce que vous envoyez apparaîtra sous forme de texte imprimé sur l'écran.
Votre envoi s'améliorera au fur et à mesure que le décodeur détecte les erreurs courantes telles que:
- trop d'espace entre les symboles. (exemple: Q épinglé comme MA)
- trop d'espace entre les lettres (exemple: MAINTENANT imprimé comme NO W)
- code incorrect
Étape 7: Résumé
Décodeur
Cette instructable décrit comment faire un décodeur morse qui convertit le code morse en texte imprimé.
- Le décodeur est capable de décoder le morse jusqu'à au moins 80 WPM (mots par minute)
- Le décodeur suit automatiquement les variations de la vitesse d'envoi reçue.
- Le texte est affiché sur votre moniteur série (ou sur un module d'affichage TFT 320 x 240 si installé) [1]
Expéditeur
Un expéditeur morse a également été inclus
- L'expéditeur vous aide à améliorer la qualité de votre envoi en morse.
- Le décodeur confirme que ce que vous avez envoyé est correct
Coût des pièces
Le coût estimé du bouclier du décodeur morse, moins l'écran TFT en option, est de 25 $.
Cliquez ici pour voir mes autres instructables.
Deuxième prix au Challenge Audio 2020
Conseillé:
LabDroid : Encodeur/décodeur de code Morse : 4 étapes
LabDroid : Encodeur/décodeur de code Morse : Remarque : Cette instruction ne peut pas être réalisée 1:1 dans la dernière version de LabDroid. Je le mettrai à jour bientôt. Ce projet vous montrera ce que vous pouvez faire avec LabDroid. Puisqu'un Hello World est normalement fait à base de texte, de lumière ou de son, j'ai pensé pour LabDr
DÉCODEUR À DISTANCE IR UTILISANT ARDUINO. : 4 étapes (avec photos)
DÉCODEUR À DISTANCE IR UTILISANT ARDUINO. : Il s'agit d'un autre didacticiel convivial pour créer un décodeur à distance IR très simple à l'aide d'un Arduino et d'un récepteur IR. Ce didacticiel couvrira tout, de la configuration du logiciel à l'utilisation du récepteur IR et au décodage des signaux. Ces
Boîte de décodeur de salle d'évasion : 7 étapes (avec photos)
Boîte de décodeur de salle d'évasion : les salles d'évasion sont des activités incroyablement amusantes qui sont très engageantes et idéales pour le travail d'équipe. Avez-vous déjà pensé à créer votre propre salle d'évasion ? Et bien avec ce boitier décodeur vous pouvez être sur la bonne voie ! Mieux encore, avez-vous pensé à utiliser es
Décodeur Basys 3 Morse : 11 étapes
Décodeur Basys 3 Morse : Il s'agit d'un projet pour une classe universitaire. Ce projet est écrit en VHDL dans un programme appelé Vivado. Les tâches pour créer tous les modules nécessaires à la mise en œuvre d'un décodeur Morse à l'aide de la carte Basys 3. Le tableau est utilisé pour saisir le code morse d'un swi
Décodeur de bande magnétique Arduino : 4 étapes (avec photos)
Décodeur de bande magnétique Arduino : cette instructable montre comment utiliser un code disponible gratuitement, un arduino et un lecteur de bande magnétique standard pour numériser et afficher les données stockées sur les cartes à bande magnétique telles que les cartes de crédit, les cartes d'étudiant, etc. J'ai été inspiré pour poste ceci après