Notre robot Nono est équipé d’une carte Arduino à micro-contrôleur AVR. Ses capacités de communication sont les bus I2C et SPI et la liaison série UART.
Cette dernière est connectée en USB. Sur les dernières versions, la puce d’adaptation entre le µC AVR et le port USB est reprogrammable : par défaut, c’est une liaison série qui est prévue, permettant ainsi une programmation via un bootloader, mais il est également possible d’activer un mode USB différent, comme l’HID ou le MIDI.
Plusieurs choix s’offrent à nous pour piloter le robot depuis une carte hôte USB (PC, mobile Androïd, carte Linux embarquée). Nous en étudions plusieurs mais l’objet de cet article est de présenter la liaison série simple, à travers la bibliothèque "Firmata" côté Arduino et à travers la bibliothèque "Arduino" de Processing côté hôte.
Nous avons déjà pratiqué Firmata à travers Pure Data, un environnement graphique de contrôle multimedia (des blocs reliés entre eux). Le protocole permet d’accéder à quasiment toutes les ressources de l’Arduino : les GPIO en entrée/sortie, génération de PWM, pilotage de Servo, le bus I2C, etc.
L’installation dans l’Arduino est simple :
- on ouvre l’environnement de développement,
- on sélectionne l’exemple Firmata / Standard Firmata,
- on sélectionne sa carte et son port de sortie,
- on clique sur le bouton de téléchargement du programme compilé dans la carte.
C’est fini ! Il ne reste plus qu’à connecter la carte à un ordinateur qui a un programme qui envoit des ordres compatibles Firmata.
Côté hôte (PC dans notre cas pour le développement, puis Raspberry Pi pour l’exécution), il faut lancer l’environnement Processing et écrire un petit programme Java :
/**
* Contrôle de Nono utilisant la bibliothèque Arduino (Firmata)
*/
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
void setup() {
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[0], 57600);
arduino.pinMode(9, Arduino.OUTPUT);
arduino.pinMode(10, Arduino.OUTPUT);
arduino.pinMode(11, Arduino.OUTPUT);
arduino.pinMode(12, Arduino.OUTPUT);
arduino.pinMode(13, Arduino.OUTPUT);
}
void draw() {
arduino.digitalWrite(9, Arduino.HIGH);
arduino.digitalWrite(10, Arduino.HIGH);
arduino.digitalWrite(11, Arduino.HIGH);
arduino.digitalWrite(12, Arduino.HIGH);
arduino.digitalWrite(13, Arduino.HIGH);
delay(1000);
arduino.digitalWrite(9, Arduino.LOW);
arduino.digitalWrite(10, Arduino.LOW);
arduino.digitalWrite(11, Arduino.LOW);
arduino.digitalWrite(12, Arduino.LOW);
arduino.digitalWrite(13, Arduino.LOW);
delay(1000);
}
Avec un code un peu plus complexe mais n’utilisant que les fonctions ci-dessus, voici le test simple qu’on peut faire :
Le robot Nono fonctionne avec Arduino / Firmata... par JulienPobot