Balise CW à base de micro-contrôleur Arduino

Ca fait un petit moment que je pensais écrire une suite à l’article de vulgarisation autour de la platine Arduino que j’avais fait pour Radioamateur Magazine. Je ne présente plus le concept Arduino si ce n’est en disant que c’est une plateforme complète (matériel, IDE, librairies…) qui permet de développer simplement et rapidement des circuit autour de micro-contrôleurs Atmel MegaAVR.

Balise CW à partir d'une platine Arduino Nano (http://capheda NULL.files NULL.wordpress NULL.com/2011/06/100_3005 NULL.jpg)Je voulais montrer une application simple de l’usage d’un micro-contrôlleur dans le cadre d’une activité radioamateur. Sans partir dans l’accès à des circuits externes comme un écran LCD qui tout en restant simple alourdissent le code et limite la compréhension pour le débutant, il restait peu de possibilités pratiques : un manipulateur Iambic ou une balise CW. Finalement c’est sur le deuxième projet que je me suis reporté sur le deuxième car j’avais un besoin propre pour des essais de propagation sur 80m et 40m que je veux faire en automne.

En avant-première voici le code (très simple) et une photo du montage. A noter que pour le codage de l’alphabet Morse je me suis inspiré du code fait par Hans G0UPL et Steve G0XAR pour le contrôleur de la balise QRSS (http://www NULL.hanssummers NULL.com/qrsskeyer NULL.html). C’est de loin le plus élégant et le plus efficace que j’ai vu. Une description complète et didactique accompagnée d’un code dûment commenté suivra dans un prochain numéro de Radioamateur Magazine dès que j’aurai eu le temps d’écrire un article au propre…

// Balise CW Arduino
// Vitesse variable par potentiomètre entrée A0, commande transistor pin D12 et LED pin D13
// 29/06/2011 par Yannick DEVOS XV4Y
// Codage de l'alphabet par Hans Summers G0UPL et Stephen Farthing G0XAR

// Définition de l'alphabet sous forme binaire
// 0 = dot, 1 = dash
const int A	=	0b11111001;
const int B	=	0b11101000;
const int C	=	0b11101010;
const int D	=	0b11110100;
const int E	=	0b11111100;
const int F	=	0b11100010;
const int G	=	0b11110110;
const int H	=	0b11100000;
const int I	=	0b11111000;
const int J	=	0b11100111;
const int K	=	0b11110101;
const int L	=	0b11100100;
const int M	=	0b11111011;
const int N	=	0b11111010;
const int O	=	0b11110111;
const int P	=	0b11100110;
const int Q	=	0b11101101;
const int R	=	0b11110010;
const int S	=	0b11110000;
const int T	=	0b11111101;
const int U	=	0b11110001;
const int V	=	0b11100001;
const int W	=	0b11110011;
const int X	=	0b11101001;
const int Y	=	0b11101011;
const int Z	=	0b11101100;
const int _SPC	=       0b11101111;
const int _0	=	0b11011111;
const int _1	=	0b11001111;
const int _2	=	0b11000111;
const int _3	=	0b11000011;
const int _4	=	0b11000001;
const int _5	=	0b11000000;
const int _6	=	0b11010000;
const int _7	=	0b11011000;
const int _8	=	0b11011100;
const int _9	=	0b11011110;
const int _BRK	 =      0b11010010;
const int _WAIT  =	0b10000000;

// Format du message : 1er nombre = longueur, Caractères utilisent les constantes pour une équivalence binaire
const int msg[] = {26, X, V, _4, Y, _BRK, B, _SPC, X, V, _4, Y, _BRK, B, _SPC, _1, _0, W, _SPC, P, S, E, _SPC, R, P, T, _WAIT};

const long intervalle = 60000; // (60 secondes ou 1 minute entre chaque transmission)

// Déclaration et initilisation des variables
byte msgIndex = 1;
byte inc_bit = 8;
byte character = _SPC;
boolean start = false;

int vitesse = 100;

byte key = 0;
byte etat = 0;
long dern_trans = 0;
long maintenant = 0;

void setup()  { 
  // on declare les pattes 12 (transistor) & 13 (LED intégrée) comme sorties
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
} 

void loop()  { 

  msgIndex = 1;

  while (msgIndex < msg[0]+1) {
    vitesse = 50 + round(analogRead(A0)/8);

    character = msg[msgIndex];

    inc_bit = 8;

    if (character == _SPC) {
        delay (9*vitesse); //
        inc_bit = 0;
    }
    if (character == _WAIT) {
        while (maintenant < (dern_trans + intervalle)) {
          maintenant = millis();
          delay (100);
        };
        dern_trans = millis();
        inc_bit = 0;
    }

    while (inc_bit) {

      etat = bitRead(character,inc_bit-1);

      if (start) {
        if (etat)
          key=3;
        else
          key=1;

        while (key) {
          digitalWrite(12, HIGH);
          digitalWrite(13, HIGH);
          delay (vitesse);
          key--;
        }

        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
        delay (vitesse);
      }

      if (!etat && !start) start=true;

      inc_bit--;

    }
    delay (2*vitesse);

    start = false;
    msgIndex++;

  }

}

7 comments for “Balise CW à base de micro-contrôleur Arduino

  1. Pingback: Balise CW à base de micro-contrôleur Arduino | RADIOAMATEURS-ONLINE.FR (http://www NULL.radioamateurs-online NULL.fr/2011/07/balise-cw-a-base-de-micro-controleur-arduino/)
  2. Fred F4EED (http://www NULL.fouilla-docteur NULL.org)
    7 octobre 2011 at 17:45

    Bonjour, super idée, je ne suis pas fort en schéma y a t’il moyen d’avoir un bout de schéma de montage, ici je le tenterais bien sur ma carte duamilove

    amitiés
    fred F4EED

    • yan
      9 octobre 2011 at 15:30

      Bonjour Fred,
      Rien de bien compliqué mais je n’ai pas encore eu le temps de faire le schéma. Si tout va bien je devrais écrire l’article pour RaM dans les semaines qui viennent et faire le schéma qui va avec. Je vous l’enverrai alors.

      73,
      Yan.

      • fred F4EED (http://www NULL.fouilla-docteur NULL.org)
        9 octobre 2011 at 20:07

        Bonjour,

        merci de la réponse, je vais déjà jeter un coup d’œil au code source question de commencer a regarder comment fonctionne l’arduino ….

        Fred F4EED

  3. Eric (HB9EOY)
    21 mars 2013 at 21:59

    Bonjour cher OM.
    Félicitations pour votre site, c’est une mine d’information que je consulte très régulièrement.
    Si vous me permettez j’ai une petite question concernant le code de la balise ce Arduino. Je suis un tout débutant dans le domaine Arduino et votre code me sert de champ d’expérimentation! Comment convertissez vous l’alphabet en code binaire? Si vous avez un petit instant pour répondre ce serait fort sympathique.
    Dans l’attente de vous lire recevez mes meilleures salutations.
    Eric HB9EOY

    • yan
      22 mars 2013 at 13:56

      Bonjour Eric,

      L’encodage des caractères est inspiré de celui de G0UPL pour sa balise.
      Chaque signe est encodé sur un octet (8bits) avec 1 pour un dah et 0 pour un dit. Les espaces sont ajoutés automatique, 1 espace long entre les caractères et un espace court entre dah/dit. Un signe spécial existe pour l’espace entre mots (3 dahs).

      La seule particularité c’est que les premiers 1 (ceux de poids fort) ne sont que du bourrage et le premier 0 qui les suit est une marque de départ.
      Par exemple B s’écrit 1000, mais il sera stocké 11101000 car on a ajouté 3x 1 de bourrage et le 0 de start.

      73,
      Yannick.

  4. Eric (HB9EOY)
    25 mars 2013 at 17:38

    Merci pour votre réponse.

    Bonne suite.
    Eric