Le TP se déroule sous Linux mais vous pouvez tout à fait utiliser la version Windows ou OS/X d'Arduino
Arduino est une plateforme de développement open-source qui se compose d'une carte microcontrôleur et d'un environnement de développement associé. La carte Arduino UNO se compose de :
Le schéma de cette carte est visible sur: http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf
Pour plus d'informations, vous reporter à http://arduino.cc/
Il existe des cartes compatibles arduino que vous pouvez acheter pour 4 euros par exemple sur: http://www.ebay.com/itm/NEW-UNO-R3-ATmega328P-CH340-Mini-USB-Board-Compatible-Arduino-/311155383820?pt=LH_DefaultDomain_0&hash=item48724e5e0c
Il existe aussi des kits tels que: https://www.dx.com/fr/p/funduino-uno-r3-lcd-1602-keypad-shield-v2-0-lcd1602-expansion-board-building-blocks-deep-blue-315276?tc=EUR&gclid=CJ_Hvd645b4CFaXHtAod-1MA4A#.VMRAaTVrpwH
Il est également possible d'utiliser un outils en ligne pour développer sur arduino sans rien installer sur votre machine: https://codebender.cc/
La carte Arduino se branche au PC via un des ports USB disponibles en façade. Le connecteur côté Arduino est de type USB-A mâle et le connecteur côté PC est de type USB-B femelle. Avant de passer à la suite, connectez la carte au PC à l'aide du câble fourni.
La carte Arduino n'étant pas protégée, il est préférable de vérifier que la table de TP est libre de tout objet métallique afin d'éviter les court-circuits !
Le système d'exploitation utilisé lors des TP de bus de communication est Debian (basé Linux). Sous Linux le lancement des utilitaires peut se faire de deux manières:
Pour lancer l'application Arduino au travers de la ligne de commande, suivez la suite d'instructions suivante :
Dans l'onglet “Outils”, accédez au menu “Port Série” et cliquez sur la valeur /dev/ttyACM0 ou /dev/ttyUSB0. Accédez aussi eu menu “Carte” et vérifiez que la valeur sélectionnée est “Arduino Uno”.
Maintenant que l'éditeur est lancé, nous pouvons entrer dans la fenêtre le programme suivant
int led = A2; //si le shield RS232 est présent //int led = 13; //si le shield RS232 n'est pas présent, pour utiliser la led de la carte UNO // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
Copier coller le contenu dans votre fichier et cliquez sur le bouton “Vérifier” pour le compiler.
Les erreurs de compilation apparaissent en rouge (et en anglais) dans la fenêtre de compilation en bas de l'IDE.
Une fois que la compilation ne génère plus d'erreurs, chargez le fichier sur la carte Arduino (préalablement connectée sur le port USB) en cliquant sur le bouton “Téléverser”
A partir de ce point, si votre code est correct, la led numérotée 13 sur la carte arduino (ou RTS de la carte d'extension RS232) doit clignoter.
Sauvegarder vos fichiers en LOCAL sur la machine dans le dossier /home/IUT/“login”/Arduino/ et copier ces fichiers vers le disque réseau /mnt/ponsan…./ A CHAQUE FIN DE SEANCE!!!
Nous allons utiliser la librairie Serial pour échanger des caractères ASCII entre le PC et la carte Arduino de manière bidirectionnelle. Vous pouvez accéder au descriptif de cette librairie en sélectionnant le menu “Aide” puis le menu “Référence”.
Le debogage de votre application pourra se faire à l'aide d'affichage vers la console MAIS il faut tenir compte du fait que le code ainsi modifié ne sera pas exactement le même code que celui sans les appels d'affichage.
Egalement, vous pourrez utiliser des broches du microcontroleur pour indiquer l'entrée ou la sortie d'une portion de code, afin de tester précisement le timing.
Repérer sur le schéma électrique de la carte les broches réservées pour la communication série. Ces brôches ne devront pas être utilisées pour une autre fonction!
L'application à programmer implémente le comportement suivant :
Pour des formats de trames autres que 8N1, vous trouverez les valeurs de paramètres adaptés à la méthode Serial.begin à l'adresse: http://arduino.cc/en/Serial/Begin
void setup() { Serial.begin(9600); Serial.println("Hello, world?"); // Envoi de la chaîne terminée par un saut de ligne } void loop() { char car ; if (Serial.available()>0){ car = Serial.read(); if ( (car>='a') && (car<='z') ) car=car+'A'-'a'; Serial.write(car); } }
L'IDE arduino dispose d'une console série permettant de visualiser les caractères envoyés par l'Arduino sur son port périphérique matériel. Pour accéder à la console série, il suffit de cliquer sur la loupe en haut à droite de l'éditeur de code.
Une console série apparaîtra alors sous la forme suivante.
Il suffit alors de configurer le baudrate de la communication à l'aide la liste déroulante en bas à gauche.
Pour envoyer des caractères à l'application, il suffit de les rentrer dans la zone de texte en haut de de la fenêtre, puis de cliquer sur “Envoyer”.
Les caractères émis par l'UART HARD du Arduino doivent ensuite s'afficher dans la partie basse de la fenêtre.
Vérifier la communication avec la carte Arduino en utilisant le programme chargé précédemment.
Les fonctions Arduino pinMode(…) et digitalWrite(…) sont compatibles avec différentes cartes équipées de différents microcontroleurs. Ceci permet d'écrire des programmes Arduino compatibles avec différentes cartes mais représente un coût non négligeable en terme de vitesse d’exécution, ce qui peut conduire à de la gigue (Jitter: the deviation from true periodicity of a presumably periodic signal) lorsque l'on souhaite construire un signal à l'aide du microcontroleur.
Analyser les fichiers suivants pour repérer comment les fonctions d'accés aux broches sont implémentées pour le ATMEGA328P:
/usr/share/arduino/hardware/arduino/cores/arduino/wiring_digital.c /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h /usr/share/arduino/hardware/arduino/variants/standard/pins_arduino.h
En vous aidant de la doc de l'ATMEGA328P et de ces fichiers, repérer les registres du microcontroleur permettant l’accès direct aux broches. Attention, les registres de ce microcontroleur ne sont pas adressables bit par bit, il faut donc effectuer des opérations logiques (& | ^ …) et des masques pour intervenir individuellement sur une broche.
Ecrire un programme le plus simple possible permettant de générer un signal carré de rapport cyclique 50% et de période la plus courte possible. On autorisera ici à écrire une boucle while(1) dans la fonction loop(). Afin d'obtenir un rapport cyclique de 50%, vous pourrez faire appel à l'instruction suivante qui génère un délai de 62.5ns (soit 1 cycle à 16Mhz):
__asm__("nop\n\t");
La gestion du temps peut se faire généralement de deux manières:
N.B. Pour des facteurs de division non entiers, il est possible de rattraper l'erreur en ajoutant ou retranchant de temps en temps une valeur comme on le fait avec le 29 février pour les années bissextiles.
Dans le cas de l'utilisation d'un timer servant à déclencher l'exécution d'une tâche périodique, il est possible de mettre en oeuvre deux approches:
Dans un premier temps, modifier votre programme précédent pour générer un signal de rapport cyclique 50% et de période 624us à l'aide de la fonction delayMicroseconds(…). Vérifier à l'oscilloscope le signal obtenu et adapter votre programme.
Ensuite, générer le même signal en faisant appel à l'interruption TIMER. Conseil: utiliser le timer 2 et lire la documentation de l'ATMEGA328P pour sa configuration.
Le signal numérique a générer sur la broche est généralement issu d'une valeur sur plusieurs bits qui est sérialisée. Ceci revient, à chaque période bit, à extraire la valeur du bit (depuis une variable par exemple) et a appliquer un signal dépendant de ce bit sur la broche.
//macro à activer pour afficher des infos de debug dans le programme, la commenter sinon //#define DEBUG //int led = A2; //si le shield RS232 est présent int led = 3; //si le shield RS232 n'est pas présent, pour utiliser la led de la carte UNO // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); Serial.begin(9600); Serial.println("Hello, world?"); // Envoi de la chaîne terminée par un saut de ligne } unsigned int compteur=0; // the loop routine runs over and over again forever: void loop() { /* compteur=compteur+1; digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(3); Serial.println("+"); // Envoi de la chaîne terminée par un saut de ligne //if (false)// wait for a second { digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(200); // wait for a second Serial.println("."); // Envoi de la chaîne terminée par un saut de ligne } Serial.println(compteur); */ #ifdef DEBUG Serial.println("je debuggue"); #endif /* char car; if (Serial.available()>0){ car = Serial.read(); if ((car%2)==0) //est ce que le code ascii est pair? digitalWrite(led, HIGH); else digitalWrite(led, LOW); } */ /* génère un signal de fréquence 102kHz) digitalWrite(led, HIGH); digitalWrite(led, LOW); */ //la broche 3 de l'arduino est connectée au bit 3 du port D /* génère un signal de fréquence 841.5kHz) PORTD|=0x8; // met à 1 le bit 3 du port D PORTD&= ~0x8; // met à 0 le bit 3 du port D */ /* génère un signal de fréquence 2,664MHz) while(1){ PORTD|=0x8; // met à 1 le bit 3 du port D PORTD&= ~0x8; // met à 0 le bit 3 du port D } */ // génère un signal de rapport cyclique 50% de fréquence 2MHz) while(1){ PORTD|=0x8; // met à 1 le bit 3 du port D __asm__("nop\n\t"); __asm__("nop\n\t"); PORTD&= ~0x8; // met à 0 le bit 3 du port D } }