Arduino

 

Par Michel Vonlanthen

 


Pour mémoire: Les PIC's
 

Diduino, l'avatar suisse de l'Arduino

 

L'Arduino est une plateforme de développement open-source bon-marché et facile à mettre en oeuvre. Tout le soft est en libre-service sur le net, le système de développement, des librairies et des milliers d'applications. Nativement la documentation de l'Arduino, dont les cartes sont développées/fabriquées en Italie, est en anglais. Mais on trouve des sites dans d'autres langues, par exemple le site Mon-club-elec.fr pour le français.

 


L'Arduino UNO                              et                                      le Diduino
 

 

En Suisse, Jean-Daniel Nicoud a développé le 100% compatible Diduino (DIDel-ArdUINO) et le commercialise via son entreprise Didel. L'avantage de cette version, c'est son orientation "expérimentation", son prix et la disponibilité du hardware nécessaire pour développer des applications. Une version spécifique pour la robotique existe aussi. Tout ceci est décrit sur le site de Didel.

 

Par rapport à d'autres plateformes PIC, l'Arduino a l'avantage de ne pas de nécessiter de programmateur. La carte se relie à un PC par un câble USB et c'est tout. L'alimentation se fait par ce câble. Le programme est écrit en langage Arduino, proche du langage C,  à l'aide de l'environnement de développement Arduino, librement téléchargeable sur le net.

 

En pratique, il faut écrire le programme sur le PC, le tester afin d'y déceler des erreurs de syntaxe, le compiler et le télécharger sur la carte Diduino (ou Arduino. Pour la suite nous emploierons indifféremment l'un ou l'autre terme). Une fois l'Arduino nourri, il démarrera automatiquement avec ce programme lors de chaque mise sous tension, le programme ne s'efface pas lorsqu'on dés-alimente la carte.

 

 

 

La documentation livrée avec le Diduino consiste en une page "Montage Diduino" et une page "Mise en route et premières expériences".

 

 

Le montage est fort simple car la carte est livrée fonctionnelle, avec les composants implantés. Il n'y a qu'à souder les connecteurs pour fils et fixer la plaque "sans soudures" à l'aide de 2 vis M1.6. Tout cela est bien documenté et décrit.

 

 

En plus de ces éléments-là, le Diduino est livré avec 4 fils colorés et une trentaine de composants destinés aux premières expériences. Les premiers pas du "Diduiniste" sont donc facilités au maximum.

 

Test:
Branche l'Arduino au PC à l'aide du câble USB (non-fourni). Au bout d'un moment, la Led 13 va se mettre à clignoter à la fréquence de 1 Hz ce qui indiquera que le Diduino fonctionne correctement. Il exécute le programme blink.ino à la mise sous tension. C'est celui-là qui a été chargé par Didel pour tester la carte avant son expédition.

 

 

 

Il faut tout d'abord télécharger l'environnement de développement Arduino ici: http://arduino.cc/forum/index.php?topic=61764.0

Sans autre indication, Windows téléchargera ce fichier ZIP dans le répertoire Favoris/téléchargements du disque C:. C'est là que tu retrouveras le répertoire arduino-1.0-windows.zip avec son sous-répertoire arduino-1.0. Il suffit alors de cliquer sur l'option "Extraire tous les fichiers" du menu Windows, en haut de la fenêtre, pour que ce répertoire se remplisse des fichiers décompressés. Tout est là.

 

Libre à toi, ensuite, de déplacer ce répertoire arduino-1.0 et son contenu à une autre place du disque C (ou autre) afin qu'il soit visible dans l'arborescence du disque. Il faut encore mettre un raccourci vers le fichier arduino.exe sur le bureau afin que l'environnement Arduino soit accessible par un simple clic sur cette icône. C'est tout.

 

Connecte maintenant le Diduino au PC avec le câble USB (déconnecte-le et reconnecte-le s'il était déjà branché). Le PC répond par le bip de connexion habituel et indique que le driver se charge.

 

Ceci fait, clique sur l'icône "Arduino" sur le bureau afin de démarrer l'environnement de développement. Là il faut lui indiquer le type de carte ainsi que le port de communication.

 

  • Va dans le menu "Tools, Board" et coche la carte Arduino Duemillanove w/ATmega 328

  • Va dans le menu "Tools, Serial port" et coche le port COM 5 (en principe le dernier)

Ceci peut varier en fonction de la version du soft Arduino, mais c'est ce que j'ai en janvier 2012 avec ma version de Diduino.

Tout est prêt maintenant pour passer à la phase de la première programmation !

 

Le driver Arduino peut poser quelques problèmes. Si c'est le cas, tu peux trouver des explications ici: http://www.ladyada.net/learn/arduino/lesson1.html

 

 

  1. Mon Diduino se bloquait à-peu-près une fois sur trois lorsque je faisais un upload. J'ai résolu le problème en faisant un reset hardware (bouton sur l'Arduino) avant chaque upload. Succès à 100%.
     

  2. Je n'arrivais pas à charger un driver qui fonctionne avec ma carte Arduino. Suite au test de ma carte que j'ai fait à la première soirée de cours, j'ai révolu le problème: j'avais laissé la version précédente du logiciel dans un autre répertoire sur mon PC. Une fois ce répertoire effacé, le driver s'est correctement chargé (Windows se trompait de répertoire) et ma carte Arduino est maintenant programmable. Attention, lorsque Windows demande le répertoire où se trouve le driver, il faut donnes "drivers" du répertoire Arduino mais pas un de ses sous-répertoires.

 

 

 

Pour ton premier programme, charge le code source celui qui est dans l'Arduino: blink.ino:

 

  • Option "File, Open" du menu

  • Va dans le répertoire où tu as mis l'environnement Arduino, dans mon cas C:\Arduino-1.0

  • Ensuite dans "Examples", "1. Basics", puis "Blink". C'est là que tu trouveras Blink.ino
    Ouvre ce fichier. Tu obtiens ceci:

 

 

C'est le code source du programme qui se trouve présentement dans ton Diduino.

 

Dans le setup. on voit que la pin 13 est initialisée en tant que SORTIE (la Led du Diduino lui est déjà connectée sur la carte). Le programme principal, quant-à lui, de contente de mettre cette pin à un niveau HAUT, attend 1000ms, la met à l'état BAS, attend 1000ms, et recommence la boucle. En conséquence, la Led 13, rouge, clignote à une fréquence de 2 Hz.

 

Sans entrer dans les détails de cette programmation:

  • Remplace les deux valeurs 1000 qui s'y trouvent par 100, ce qui va faire clignoter la led 10 x plus rapidement.

  • Ensuite clique sur le bouton   (compile)

  • Après un court instant, pendant lequel le logiciel transforme le code source que tu viens de modifier en code machine  compréhensible par le microprocesseur de la carte, le message ci-dessous apparaît dans la fenêtre du bas: Binary sketch size: 1026 bytes (of a 30720 byte maximum), ce qui nous indique que la compilation a réussi (donc pas d'erreur de syntaxe) et que le code machine fait 1026 bytes.

  • Il ne reste plus maintenant qu'à uploader ce code dans le microprocesseur avec l'aide du bouton (upload).
    Les led TX et RX de l'USB clignotent et la led 13 prend sa nouvelle cadence de 0,2 Hz suite à la modification du programme que nous venons de faire. C.Q.F.D.

 

 

Il faudra maintenant se plonger dans la mini référence pour se lancer dans ses premières applications, puis, l'expérience venant, dans  la référence standard, pour terminer avec la référence étendue. Et bien-sûr piocher dans les exemples qui se trouvent dans ton répertoire Examples ainsi que sur le net.

 

Apprentissage par l'exemple: http://arduino.cc/fr/Main/Apprendre

 

 


La suite, c'est déjà la création du groupe de travail Arduino à Lausanne (1er février 2012)
Un cours à Lausanne
 


L'extraordinairement léger et petit Arduino-Film
Tout à droite l'affichage LCD oled

 

 


La séance d'information proposée par Frédéric Benninger a eu lieu en présence de 25 participants, bien plus que prévu.

 


 

Afin que tous les fans de ce concept puissent communiquer, j'ai créé une liste de distribution d'E-mails. Elle s'appelle Arduino_Suisse pour la différentier des autres groupes Arduino existants. A ma connaissance, c'est le seul groupe Arduino de langue française. A chaque fois que vous donnerez l'adresse de la liste comme destinataire de votre E-mail, celui-ci sera transmis à tous les abonnés de la liste.

 

 

Adresse où envoyer ses messages:             arduino_suisse@yahoogroupes.fr
 

Pour s'inscrire, envoyez un message vide à: arduino_suisse-subscribe@yahoogroupes.fr

 

Page d'accueil du groupe:                           http://fr.groups.yahoo.com/group/arduino_suisse/

 

 


 

Afin de me faire la main, j'ai relié quelques composants à mon Diduino, en les programmant les uns après les autres. Au final. j'ai:

  • 1 affichage LCD de 1 ligne de 16 caractères (4 pins datas + RS et Enable. + potentiomètre de 10k entre +5V et la masse pour régler la luminosité de l'affichage)

  • 1 buzzer sur la pin OUT 6 (en série avec une résistance de 820 Ohms)

  • 1 servo-moteur de type Prafa RS 3000 sur la pin OUT 9 (plus le +5V et la masse)

  • 1 potentiomètre de 10 k sur la pin AN0 14

  • 1 bouton-poussoir entre pin IN 10 et masse (avec résistance pull-up de 8,2k vers le +5V)

Ce programme se sert à rien, si ce n'est de me faire la main sur ce genre de composants.

 

Au démarrage, il affiche "Azimuth: sur l'affichage LCD ainsi que l'angle du servo-moteur (jusqu'à 180 degrés) de la dernière position avant la coupure du courant.  Cet angle est mémorisé dans une mémoire flash non-volatile. En plus, les lettres "AZ" pour "Azimuth" est donné auditivement en code morse par le buzzer.

 

Sur la pression du bouton, le servo-moteur se déplace à la nouvelle valeur donnée par le potentiomètre. Cette dernière est affichée sur le LCD et mémorisé en mémoire flash.

 

 


Physiquement, c'est un joyeux bordel, comme tout prototype, mais cela fonctionne

 

 

 

Le programme

 

/* **************
* SERVO ET LCD *
****************

 

Un potentiomètre donne l'angle du servo-moteur
La LCD affiche l'angle
 

LE CIRCUIT
 

LCD:
LCD RS pin to digital pin 12
LCD Enable pin to digital pin 11
LCD D4 pin to digital pin 5
LCD D5 pin to digital pin 4
LCD D6 pin to digital pin 3
LCD D7 pin to digital pin 2
LCD R/W pin to ground
 

10K resistor:
ends to +5V and ground
wiper to LCD VO pin (pin 3)
 

Potentiomètre:
Entre le +5 et la masse.
Curseur sur l'entrée analogique A0 (pin 14)
 

Poussoir:
Pin IN 10
*/
 

// Inclu les librairie:
#include <LiquidCrystal.h>
#include <Servo.h>
#include <EEPROM.h>
 

int SensorPin = A0;
int SensorValue = 0;
int Azimuth=0;
int ads = 0;
 

Servo myservo; // create servo object to control a servo
 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 

void setup() {
 

// définit le nombre de colonnes et de lignes du LCD:
lcd.begin(16, 1);
 

// Ecrit sur LCD:
lcd.print("Azimuth:");
 

myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(10,INPUT);
}

 

void loop() {
 

//Lit dernier azimuth en mémoire
Azimuth=EEPROM.read(0);
 

//Ecrit la valeur de l'angle sur la LCD
lcd.setCursor(9,0);
lcd.print(Azimuth);
 

//Erit la valeur de l'angle sur le servo
myservo.write(Azimuth);
delay(50);
 

do // tourne tant que bouton pas pressé
{
} while (digitalRead(10)); // bouton entrée dig 10 pas pressé
 

//Efface la valeur précédente
lcd.setCursor(9, 0);
lcd.print(" ");
 

//Lit la valeur du potentiomètre (entre 0 et 1023)
SensorValue =analogRead (SensorPin);
 

//Convertit la valeur lue en angle (entre 0 et 179 degres)
Azimuth=map(SensorValue,0,1023,0,179);
 

//Ecrit la valeur de l'angle sur la LCD
lcd.setCursor(9,0);
lcd.print(Azimuth);
 

//Mémorise l'angle
EEPROM.write(ads,Azimuth);
 

//Erit la valeur de l'angle sur le servo
myservo.write(Azimuth);
delay(50);
 

/* // HI en morse
 

tone(6,800,100);
delay(200);
tone(6,800,100);
delay(200);
tone(6,800,100);
delay(200);
tone(6,800,100);
delay(300);
tone(6,800,100);
delay(200);
tone(6,800,100);
delay(200);
*/
 

// AZ en morse
tone(6,800,100); //passe à l'instruction suivante mais le ton continue
delay(200); //= 100ms ton et 100ms silence
tone(6,800,300);
delay(500);
tone(6,800,300);
delay(400);
tone(6,800,300);
delay(400);
tone(6,800,100);
delay(200);
tone(6,800,100);
delay(200);

}

 

 

 

 

 

 

 

J'ai plusieurs projets en tête, qui utiliseront les mêmes composants, poussoirs, potentiomètre, encodeur, led, affichage LCD. J'ai donc fabriqué cette platine et câblé ce qu'il y a de commun. Ca me fera gagner du temps pour la suite.

 


Première application
Pilotage d'un module Comtech

 

Le cours Arduino de Frédéric Benninger s'est bien passé et maintenant ça "arduine" dans les chaumières...

 

Après les exercices du cours, pilotage d'une Led en PWM, mesure de température en One-wire, alignement d'un servo-moteur sur un point lumineux grâce à deux photorésistances, communication série entre Arduino et PC, pilotage d'un moteur pas-à-pas avec accélérations-décélérations, mémorisation des données d'un capteur dans un fichier, etc., je me suis attaqué au pilotage en I2C d'un module Comtech (synthétiseur de fréquences 1200 MHz) afin d'en faire un émetteur ATV.

 

Mais je bloque depuis plusieurs jours sur le fait que je n'arrive pas à communiquer avec ce module. Son adresse est "0xC2" et mon Diduino refuse d'envoyer le bit de poids fort. Voir les 2 photos ci-dessous:

 

La ligne du haut est SCL, l'horloge du bus I2C,
et celle du bas SDA, les datas
J'ai écrit l'adresse "0x40" sur
le bus, on voit que le bit 4 à "1".
A droite c'est le ACK final.
Là j'ai écrit l'adresse "0x80"
et ce bit (de poids fort) n'est
pas envoyé.

 

Je pense qu'on en rira d'ici quelques jours, lorsque cette question sera réglée. Mais pour le moment j'enrage... J'ai posé des questions sur la liste "Arduino-suisse" et reçu des solutions, mais pas encore définitives pour ce problème-là. Mais on voit là l'utilité d'une telle liste lorsqu'on est seul chez soi à sécher sur un problème. Il se trouve toujours quelqu'un pour proposer des solutions qui, si elle ne résolvent pas le problème, mettent sur la piste. De mon point de vue, dans un groupe d'actifs comme le nôtre, ce genre de liste est une aide indispensable.

 

Lorsqu'on développe quelque chose, et si on sèche à plus forte raison, la place de travail devient vite un gros capharnaüm... C'est le cas chez moi et je n'ai pas résisté à la tentation de l'immortaliser. Et comme d'habitude, un "malheur n'arrivant jamais seul et toujours au mauvais moment", loi de la tartine oblige, mon oscilloscope est tombé en rade (plus de trigger) et j'ai dû le dépanner. Ceci fut fait mais j'ai laissé le capot du Tektronix ouvert par précaution, on ne sait jamais...

 

Au fait, si quelqu'un a un Tektroniks analogique de course à vendre (2 canaux, 150 MHz minimum, pas trop gros, pas trop ancien (transistors et IC), éventuellement à mémoire mais pas tout numérique) , je suis preneur. Je sens que le mien ne va pas tarder à me lâcher (du moins je me méfie) et je ne voudrais pas prendre le risque de perdre "mes yeux électroniques".

 

Je vais le garder jusqu'à ma mort cet engin car il m'a servi sans faillir depuis mes débuts chez les Américains, il y a presque 35 ans (!), et je l'aime. Avec lui et de simples schémas, je dépannais des mini-ordinateurs sur site au niveau des composants. Ca ne peut plus se faire maintenant et cet engin est un vestige de ma "grandeur" passée.

 

Lorsque je raconte ça à des jeunes, ils n'arrivent même pas à comprendre que ce soit possible. Ouvrir un mini-ordinateur OEM dans une banque ultra-sécurisés de Genève, sur un système Swift (échanges électroniques d'argent entre banques) alors que les opérateurs piaffent d'impatience derrière mon dos (chaque seconde d'immobilisation leur fait perdre de l'argent), faire des mesures à l'oscillo, compulser les schémas, grailler dans sa caisse à malices à la recherche du composants de rechange, miraculeusement le trouver (on est obligé de croire en Dieu quelquefois...), le souder à la place du défectueux, contrôler que tout marche, faire un test (= passer les tests automatiques et me transférer un million de dollars sur mon  compte pour voir si a marche (hélas seulement en mode test), refermer la bête et la remettre en mains du chef de service, le regard éperdu de reconnaissance (lui, pas moi).

 

Et pendant que le travail reprend, nettoyer toutes les traces de mon passage, vieux reste du scoutisme de mon enfance: "lorsqu'on quitte un camp, on laisse 1) un bon souvenir, 2) rien !".

 

Et ce n'est pas fini: reprendre ma voiture parquée n'importe-comment (sur le trottoir) sur le Quai des Bergues à Genève, récupérer le billet rose coincé sous l'essuie-glace, passer au commissariat pour tenter de parlementer et s'entendre dire par la contractuelle qui m'avait amendé: "Mais oui, je vous l'enlève votre amende, c'est la première fois que quelqu'un vient me le demander si gentiment !". Ca ne s'invente pas ! C'était ça le dépannage d'ordinateurs OEM dans les années 80.

 


Le bordel qu'on vous dit !

 

Mauvais signe: le ventre à l'air... L'application sur laquelle je sèche

 

 

Un mois après, tous les problèmes sont résolus et l'
émetteur ATV 1200 MHz
est opérationnel

 

Il couvre toute la bande 23 cm, de 1200 à 1300 MHz et plus. Les sorties de bande sont inhibées, sauf en position "test". Un bouton rotatif "MHz" incrémente ou décrémente la fréquence par bonds de 1 MHz. Le poussoir "kHz" incrémente la fréquence de 125 kHz. La résolution est donc de 125 kHz, le pas unitaire du synthétiseur.

Le module Comtech sort 25-30 mW sur sa prise SMA. Pour le moment, j'utilise un PA externe (brique) qui pousse la puisssance à 25 Watts HF. Le modulateur du Comtech est utilisé et il délivre, en plus de la TV FM analogique, 2 canaux son FM, un à 5,5 et l'autre à 6,5 MHz. La qualité est bonne.

Par contre, pour pallier à la préaccentuation folklorique du module, une préaccentuation complémentaire a été ajoutée, la solution de F4DAY. La qualité est ainsi acceptable.

J'ai encore un problème de faiblesse des tops synchro à résoudre mais le tout est déjà utilisable tel-quel.

Le boîtier est un Plessey en fonte d'alu de 185 x 120 x 55mm. Il est très compact mais il y a encore de la place pour un modulateur vidéo plus élaboré (pour les versions 2400 MHz et 10 GHz).

On y voit le Diduino en bas à gauche, le module Comtech en haut. La sonde de température se trouve au bout du fil rouge qui pend. Elle sera collée sur l'amplificateur de puissance, une brique de 2-3 Watts, qui prendra place prochainement sur la partie arrière du boîtier. L'émetteur sera ainsi totalement indépendant et pourra être utilisé tel-quel pour attaquer le relais ATV de la Dôle HB9IBC.

La fréquence affichée est mémorisée en permanence dans une mémoire EEPROM non-volatile. 5 canaux sont à disposition, atteignables avec le poussoir "ch". La fréquence est immédiatement et automatiquement mémorisée lors de chaque  changement.

La fréquence et le No de canal sont affichés sur une LCD de 1 ligne de 16 caractères.

En position "test" (accessible par le poussoir blanc), la température du PA ainsi que la tension d'alimentation sont affichées.

Un ventilateur sera démarré sitôt que la température dépassera une cinquantaine de degrés. En cas de surchauffe, une alarme auditive retentira (+ indication sur la LCD) et l'émetteur sera coupé.

Si la tension d'alimentation monte trop haut, L'émetteur sera coupé par l'intermédiaire du relais anti inversion de polarité que j'installe sur toutes mes réalisations (expérience d'un vieux briscard des équipements bousillés par inattention...)

 

Le schéma et le logiciel de ce montage seront publiés dès que possible, mais pas dans l'immédiat car j'arrive dans une zone d'occupation maximum du point de vue professionnel. Je serai donc un Arduiniste un peu moins actif ces prochains temps.

 

 


 

Festival robotique 2012
Lausanne EPFL 5 mai

 

 

 


 


Links
 

 

Copyright texte et photos Michel Vonlanthen

 

Retour