Projets:Perso:2012:ArduiKeyer

Page référencée dans Passion : Radio Radios logicielles, transmissions numériques, expérimentations HF

Projet de réalisation d'un Shield Arduino destiné à transformer un "Mega" en manipulateur morse électronique perfectionné.



But de l'opération
Prétexte électronique pour inciter les "hardeux canal historique" tendance dure à s'intéresser un petit peu à la programmation. Pour ce faire, les branchement originels de K3NG ont été notablement modifiés, ce qui poussera l'impétrant électronico-programmeur à plonger dans le code, apprendre superficiellement ce qu'est un paramètre et une fonction, dans le but de faire fonctionner l'appareil.

La structure des programmes destinés à l'Arduino est minimaliste et se limite en gros à 3 étapes :

- appel de bibliothèques de fonctions,

- déclarations des entrées/sorties reliées à un élément extérieur à la carte Arduino (afficheur, écran, extension mémoire, ports de communication série...)

- programme principal qui boucle ad vitam eaternam

C'est donc à la porté de tout joueur de fer à souder

Description de l'appareil et de son jeu de commandes
Il s'agit d'un développement Arduino effectué par K3NG de manipulateur électronique morse totalement automatisé. Diverses réalisations, donc certaines semi-commerciales tel que le boitier de DJ0MY, proposent la même chose si l'on possède un numéro de carte bleu.

Mais acheter "tout fait" est moins drôle que de bricoler soi-même un "shield" (module d'extension Arduino). En outre, j'avais envie de tâtonner un peu de langage de programmation et de simili langage C. Enfin, DJ0MY utilise une base Arduino Nano qui ne peut accepter l'intégralité du programme...

Car le soft de K3NG est conséquent. Il rempli les fonctions suivantes :

- Vitesse allant du QRSS (télégraphie lente, traits de 6 secondes) au "high speed keying" (255 mots/minute)

- Manipulation en Curtiss iambique A, B, Ultimate (pour les mutants), semi-auto "vibroplex" et même pioche classique pour les vieux routiers

- Extension clavier (pour les tricheurs en CW) essentiellement pour émettre en Hellschreiber et paramétrer/piloter le keyer.

- Pondération des espaces entre lettres (farnsworth)

- Mode apprentissage CW

- Inversion des palettes par soft (pour le gauchers)

- Pilotage au double contact en l'absence de clavier (paramétrage du keyer : vitesse, modes, mémoires etc)

- Emission en HellSchreiber

- Mode balise (V V V de ON4BB) (Tout le monde connait ON4BB)

- 12 mémoires

- Sidetone intégré

- vitesse programmable via clavier et/ou manipulateur, et ajustable par un potentiomètre

- LCD d'affichage du statu courant du manipulateur

- 3 sorties de pilotage d'émetteur, extensibles à 6

- Trainer CW émulant le système Winkeyd'entrainement au morse sous Windows

Rien n'interdit d'utiliser ce Shield avec un Arduino Duemillanove ou Uno, mais l'espace mémoire des microcontroleurs utilisé forcera l'usager à éliminer certaines fonctions annexes (mode apprentissage, gestion d'un clavier AZERTY, affichage LCD...)

Ci-après, les trois "modes commande" du manipulateur électronique. Le "mode commande" normal s'obtient en appuyant sur le bouton "commande" et en tappant la lettre au manipulateur.

A – Mode Iambique A

B – Mode Iambique B

D – Mode Ultimatic

F – Fréquence sidetone

G – Mode semi-auto

I – TX activé / désactivé

J – Réglage du rapport Dah / dit

N – Inversion des palettes

O – Sidetone Marche/Arret

P# – Programmation mémoire

T – Mode Tune

V – Active/Désactive potentiomètre de Vitesse

W – Change la vitesse (mots minute

X – Sortie du mode commande mode

Z – Autospace Marche/Arrêt

"#" – Lit la mémoire sans transmettre

\? Aide

\# Lit la mémoire #

\a Mode Iambique A

\b Mode Iambique B

\c Passe en CW (depuis Hell)

\d Mode Ultimatic

\e#### Configure Serial Number ####

\f#### Fréquence Sidetone #### Hertz

\g Mode semi-automatique

\h Passe en Hellschreiber

\i Active/désactive la transmission

\j### Rapport Dah / dit (300 = 3.00)

\k Entrainement indicatifs Callsign

\l## Paramètre de poids (50 = normal)

\m### Paramètre vitesse Farnsworth

\n Inversion des palettes

\o Sidetone Marche/Arrêt

\p# Programmation de la mémoire #

\q## Mode QRSS mode, longueur du dit ## secondes

\r Retour à la vitesse normale

\s Status

\t Tune

\u Passage manuel en émission (PTT)

\v Active/Désactive potentiomètre de Vitesse

\w### Vitesse (mots/minutes)

\x# Bascule sur l’émetteur #

\y# Espace inter-mots à # élements (# = 1 à 9)

\z Autospace Marche/Arret

\+ Création d’un prosign

\!## Relire la mémoire##

\|#### Paramètre de répétion mémoire (millisecondes)

\* Toggle paddle echo

\^ Active l’attente du “Retour” pour envoyer la / ou envoie la CW immediatement

\~ Reset

F1 à F12 – lit les mémoires 1 à 12

SHIFT-F1, F2. – Programme la mémoire 1, 2 ..

ALT-F1, F2,.. – répète la mémoire 1, 2…

CTRL-F1, F2, F3… – bascule sur émetteur 1, 2, 3…

Flèche haute – augmente CW de 1 mot/mn

Flèche basse – décroit CW de 1 mot/mn

Page Up – augment frequence sidetone

Page Down – décroit frequence sidetone

Flèche droite – augmente rapport Dah / Dit

Flèche gauche – décroit rapport Dah / Dit

Home – restaure le rapport Dah / Dit

Tab – pause

Del – efface dernier caractère du buffer

Esc – arrêt de l’émission, vide le buffer.

Scroll Lock – démarre un prosign

Shift – Scroll Lock – bascule la ligne PTT

CTRL-A – Iambique A

CTRL-B – Iambique B

CTRL-D – Ultimatic

CTRL-E – paramètre le Serial Number

CTRL-G –Mode semi-auto

CTRL-H – Hellschreiber

CTRL-I – sortie TX Line active/inactive

CTRL-M – Vitesse Farnsworth

CTRL-N – Inversion des palettes

CTRL-O – Active/désactive Sidetone

CTRL-T – Tune

CTRL-U – PTT Manuel

CTRL-W – Vitesse (en mots/minute)

CTRL-Z – Autospace Marche/Arrêt

- Le "Mode commande" de base est obtenu en appuyant sur le bouton "commande" du keyer puis en tappant au manip la lettre correspondant à l'ordre ou paramètre que l'on souhaite exécuter.

- Le mode "Commande en mode Terminal" consiste simplement à envoyer les ordres via l'émulateur de terminal série de l'interface de programmation de l'Arduino. C'est essentiellement un mode réservé à la vérification des principales fonction car elle nécessite la présence d'un ordinateur connecté à l'arduino via sa prise USB.

- Le mode "Interface Clavier" est de loin le plus souple et pratique. Il utilise le clavier PS/2 pour expédier les ordres et paramètres à l'Arduino.

Un mode de figure pas sur cette liste : c'est le mode "pioche". Il ne se paramètre pas en mode commande et ne s'initialise que d'une façon : en appuyant sur la palette de droite (Dah) durant un reset ou un branchement.

Ce mode pioche est nécessaire si l'on souhaite connecter sur le boitier un manipulateur "semi-automatique" mécanique de type BK100 ou Vibroplex. Rien n'interdit non plus d'y brancher une pioche genre J45. La génération automatique des Dah et des dit est alors inopérante, mais l'on conserve toutes les fonctions évoluées du keyer : mémoires, commutations d'émetteur, mode Helschreiber, balise etc.

Projet
Comme tout le travail de développement a déjà été réalisé par K3NG, il ne reste plus qu'à se faire les dents sur le "hard". Le projet consiste à fabriquer un "shield" arduino qui soit compatible avec un Arduino Mega, seul modèle capable d'accepter tout le code compilé.

le pcb en question devra être compatible avec l'empreinte connecteur d'un "shield" Arduino Mega (ou plus petit modèle, moyennant des limitations du logiciel). Le shield en question doit pouvoir affleurer une face avant regroupant toutes les commandes (potentiomètre, boutons de commande et mémoires, prise clavier, prise manipulateur, entrée alimentation 13,8 V, afficheur, sorties de commande d'émission)

Il devra être associé à un plan de perçage destiné à faciliter l'intégration du shield dans un boitier.

Coté soft, les modifications par rapport aux programme original sont absolument minimes.

Rappelons tout d’abord que le source du programme est disponible sur Sourceforge. La bibliothèque de fonction spécifique au clavier est également sur ce même dépôt. Elle doit être téléchargée et ne peut être remplacée par la lib "PS2Keyboard.h" que l'on trouve sur le site Arduino... K3NG y a apporté quelques modifications.

- la cartographie du clavier a été adaptée à nos interfaces gauloises. Un fichier francisé peut être téléchargé sur le Wiki de l'Electrolab

- les numéros de lignes qui sont fournis au fil de ce chapitre ne sont donné qu'à titre indicatif. L'auteur du programme améliore et modifie chaque jour son logiciel et l'environnement matériel autour de l'Arduino, il est donc préférable de jouer un peu avec la fonction "rechercher" de votre éditeur préféré.

Note importante : N'utilisez pas le fichier PS2Keyboard pour d'autres bricoles Arduino, les résultats seraient pour le moins bizaroides : en morse, on  ne connait pas la notion de "retour chariot" ou de "saut de ligne". En outre, certains signaux bizarres (dits "prosign") n'ont pas d'équivalent dans le monde numérique (les couples BT, AS ou VA par exemple). Bref, le morse, ça n'est pas de l'Ascii et les équivalences que l'on pourrait trouver sont trompeuses

Le câblage de l'afficheur ne respecte pas l'implantation originelle de K3NG. Pour que votre afficheur fonctionne, modifiez les lignes 258 à 266 avec les variables globales suivantes :

#ifdef FEATURE_LCD_4BIT //lcd pins #define lcd_rs 11 #define lcd_enable 10 #define lcd_d4 9 #define lcd_d5 8 #define lcd_d6 7 #define lcd_d7 6 #endif //FEATURE_LCD_4BIT

n'oubliez pas, si vous utilisez un afficheur 4 lignes et 20 caractères comme cela a été le cas sur le proto, de changer les variables des lignes 306 et 307

#define lcd_columns 20 #define lcd_rows 4

(par défaut, l'afficheur est configuré pour un LCD en 16x2)

Dernière modification importante : pour simplifier le dessin général du circuit imprimé, il a été décidé de regrouper les lignes de sortie du signal CW et TX/RX en utilisant les E/S numérotés de 20 à 35 sur la platine Arduino Mega.

Rappelons que l'Arduino-morse peut piloter au moins 6 émetteurs-récepteurs (selectionnés soit au clavier, soit par une commande sérielle via un programme d'émulation de terminal, soit au clavier PS/2). Pour chaque émetteur, il existe une sortie du signal morse, et une éventuelle sortie de commande de passage émission/réception (pour certains vieux appareils à lampe ne possédant pas une gestion automatique de cette fonction)

A partir de la ligne 236, modifiez le source avec les variables globales suivantes :

#define tx_key_line_1 22      // (high = key down/tx on) #define tx_key_line_2 26 #define tx_key_line_3 28 #define tx_key_line_4 0       // renseigner chaque ligne si un émetteur y est raccordé #define tx_key_line_5 0       // laissez la variable à zéro si la sortie n'est pas utilisée #define tx_key_line_6 0

Ces sorties sont celles du signal de commutation CW. Rien ne vous interdit, en fonction du nombre de transistors que vous installerez sur cette partie de la carte, d'utiliser également les sorties 24, 30, 32, 34 et 36.

Si vous possédez un appareil ancien, ou un émetteur qui ne possède pas de temporisation de "semi break-in" (passage en réception automatique entre les signaux morse), vous disposez, lignes 247 et suivantes, des variables servant à désigner les lignes qui seront utilisées pour la commutation émission-réception.

#define ptt_tx_2 0             //   Can be used for keying fox transmitter, T/R switch, or keying slow boatanchors #define ptt_tx_3 0             //   These are optional - set to 0 if unused #define ptt_tx_4 0 #define ptt_tx_5 0 #define ptt_tx_6 0

Si vous activez ces lignes, n'oubliez surtout pas de régler également les temps de "retombée" en mode réception (voir la doc de K3NG)

D'autres modifications du programme source sont suggérées par l'auteur et se limitent en général à "dé-commenter" une variable globale pour que soit activée telle ou telle fonction. Par défaut, si l'on souhaite exploiter le manipulateur électronique dans sa version Kicad actuelle et avec un Arduino Mega, il faut ainsi modifier les lignes 5 et 6

#include         #include 

et à partir des lignes 169 les variables suivantes :

#define FEATURE_SERIAL #define FEATURE_COMMAND_LINE_INTERFACE       // this requires FEATURE_SERIAL #define FEATURE_COMMAND_BUTTONS // this is now required for the regular buttons and command mode #define FEATURE_SAY_HI #define FEATURE_MEMORIES #define FEATURE_MEMORY_MACROS //#define FEATURE_WINKEY_EMULATION   // this requires FEATURE_SERIAL - //#define OPTION_WINKEY_2_SUPPORT    // requires FEATURE_WINKEY_EMULATION #define FEATURE_BEACON #define FEATURE_CALLSIGN_RECEIVE_PRACTICE #define FEATURE_POTENTIOMETER // do not enable unless you have a potentiometer connected, #define FEATURE_SERIAL_HELP #define FEATURE_HELL #define FEATURE_PS2_KEYBOARD  // also uncomment PS2Keyboard line below and PS2Keyboard.h include at the top (requires FEATURE_SERIAL) //#define FEATURE_DEAD_OP_WATCHDOG //#define FEATURE_AUTOSPACE #define FEATURE_FARNSWORTH //#define FEATURE_DL2SBA_BANKSWITCH // Switch memory banks feature as describedby dl2sba #define FEATURE_DISPLAY                           // LCD display support (include one of the hardware options below) #define FEATURE_LCD_4BIT                          // classic LCD display using 4 I/O lines //#define FEATURE_LCD_I2C                             // I2C LCD display using MCP23017 at addr 0x20 (Adafruit)

Dans cette configuration, le "keyer" intègre

- un mode "balise", - un protocole de communication en mode série avec un émulateur de terminal relié au port com vituel émulé via la liaison USB de l'Arduino (si connectée),

- une prise en charge d'un clavier PS/2

- une fonction "bonjour" avec l'indicatif de l'opérateur (fonction Say_Hi)

- intègre une balise

- un outil de perfectionnement de la lecture au son avec un exercice de décodage d'indicatifs (US) aléatoires

- un réglage de la vitesse par potentiomètre

- une aide en ligne

- un module d'émission en mode Hellschreiber (

- et enfin l'affichage des commande sur un LCD 16x2 ou plus.

Schéma Kicad
Le fichier SCH sous Kicad est assez éloigné du shéma de principe de K3NG, puisqu'il intègre notamment :

- la totalité des boutons d'appel mémoire - l'afficheur 2x16 backlite (ou plus, selon les fonds de tiroir... il n'y a que deux params row et col à changer) - une alimentation externe un peu plus puissance que celle d'origine sur l'Arduino destinée d'une part à alimenter directement en 5V les composants ou éléments les plus énergivores -afficheur et son rétro-éclairage, clavier PS/2-, et le microcontroleur d'autre part. Le régulateur embarqué n'est pas utilisé. Cette disposition oblige l'usager soit à débrancher l'Arduino, soit à couper le courant du keyer s'il désire télécharger un nouveau firmware.

Le schéma d'origine de l'auteur est très... schématique, et un certain nombre d'éléments ont été éludés pour faciliter la compréhension des fonctions. Ce schéma, en revanche, contient tous les composants nécessaires pour que le manipulateur électronique fonctionne : les 12 boutons d'appel de mémoire ainsi que la touche de mode "commande", l'afficheur au standard d'adressage HD44780, et 4 sorties CW doublées de 4 commandes PTT pour passer d'un émetteur à un autre(4X) sans avoir à débrancher ou brancher quoi que ce soit.

La bibliothèque Arduino utilisée est l'oeuvre de Nicolas C. Lewis, travail superbe comprenant tous les modèles d'Arduino "carte" (Uno, Duemillanove, Mega...). Ces libs, ainsi que les modèles 3D qui ont permis la perspective cavalière du chapitre suivant, peuvent être téléchargées sur Thingiverse

Attention : la totalité des trous de pastilles ont été réduits à 0,4 mm, ce "shield" étant étudié pour être réalisé en gravure "DIY" sans vias métallisés. Le diamètre de 0,4mm facilite le centrage du foret et laisse assez de métal autour du perçage pour garantir une bonne prise de la brasure.



.

la platine
La réalisation présente deux ou trois légères difficultés :

La première est de concevoir un pcb qui servira de réceptacle à un Arduino Mega branché en "piggy back", platine sur laquelle viendra reposer les différents connecteurs "arrière" du manipulateur : alimentation, sorties de pilotage d'émetteur, connecteur clavier, ainsi que certains composants encombrants (notamment le haut-parleur du sidetone). La densité des connexion d'un shield Arduino avec des moyens techniques "home made" peut en rebuter certains.

La seconde est de réaliser un second pcb relié en "L" sur la platine principale et supportant l'IHM : potentiomètre de réglage de vitesse, afficheur 2x16, boutons de commande et d'appels de mémoires, jack d'entrée CW. Une partie des connecteur (jack manip, connecteur clavier, sortie TX, entrée alim) sont des composants "volants à fil" et ne sont donc pas représentés par la modélisation CAO

La troisième et dernière difficulté est de faire en sorte que les deux circuits soient gravés en "simple face/face aveugle" pour ne pas avoir à imposer la pose de vias (traversées) d'une face du pcb à l'autre.

Comme pour tout projet Electrolab, les fichiers CAO (sous Kicad) sont disponibles en téléchargement libre. (ndla : quelques très légères modifications de formats de composants cms retardent cette mise à disposition. Date de diffusion prévue : 1 septembre au plus tard.)





Assemblage
On trouve, sur différents sites de vente en ligne, des boitiers "pupitre" assez peu coûteux. Il est également envisageable de se fabriquer un boitier avec des plaques de circuit imprimé vierge (voir ci-après)





On peut câbler les sorties CW sur des jacks mono ou stéréo. Un jack stéréo peut acheminer vers un émetteur à la fois le signal CW et le signal de passage en émission/réception (PTT ou TX/RX)