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.
(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++; } }