samedi 8 octobre 2016

Reflex.ino

Petit exemple pour illustrer la facilité de prise en main d'un Arduino (nano v3.0) (avec un microcontrôleur Atmel ATmega328P). Après en avoir acquis un auprès d'un revendeur officiel ou d'un vendeur de clones chinois, installer le package Arduino sur Ubuntu avec votre gestionnaire de paquets favori (par exemple, Synaptic ou 'sudo apt-get install arduino'). Connectez l'Arduino sur un port USB, lancez l'IDE Arduino sur le PC (via les menus ou 'arduino' en ligne de commandes). Configurez le bidule ([Outils]->[Type de cartes]->[Nano v3.0] et [Outils]->[Port série]..., quelque chose comme /dev/ttyUSB0, /dev/ttyS0,... (regarder la fin de 'dmesg(1)' après avoir connecté le port USB).

Tester si cela fonctionne : [Fichier]->[Exemples]->[0.1 Basic]->[Blink]. En principe, c'est l'application qui tourne déjà quand on achète un Arduino, après peu de temps, une LED clignote ('blink' en anglais) dès que l'on met la carte sous tension. Il faut donc modifier un peu les timings pour observer un changement. Par exemple, remplacer le 1000 millisecondes par 200. Compiler et télécharger avec les boutons de l'IDE ('V' et '->'). Et voilà!...

Maintenant, ce serait bien de faire quelque chose d'original... Par exemple, un truc simple, c'est de tester nos 'réflexes' ('temps de réaction' est plus correct). Le scénario est le suivant : on va allumer la LED du blink après un temps aléatoire et mesurer le temps qu'il faut pour presser un bouton. On a besoin de connecter un bouton à la carte. On met le bouton entre le port 7 (par exemple) et la masse (GND). Pour éviter que le port ne soit 'flottant' (indéterminé), en plus de le programmer en entrée, on y écrit un état haut pour activer la pull-up intégrée au port.

Note : pour pouvoir connecter des fils au 'nano' ou l'utiliser sur un breadboard, il faut souder...

Fritzing (également disponible sous Ubuntu) nous permet de réaliser le schéma suivant :
On voit que c'est la simplicité même : deux fils, un bouton. On utilise les pins D7 (port 7) et GND (masse). La LED est celle qui équipe déjà la carte.

Reste à écrire le programme... Un petit tour sur https://www.arduino.cc/en/Reference/HomePage ou sur les exemples locaux pour savoir ce que nous avons à disposition. Typiquement, 'Serial.begin()' pour configurer l'impression via le lien série/USB sur une console sur le PC, random() pour générer un temps aléatoire et 'Serial.println()' pour afficher le temps.

/*
**  Reflex
**        la LED s'allume après un délai variable
**        on mesure le temps qu'il faut pour appuyer sur un bouton
*/
 
int led = 13;        /* port de la LED sur des cartes Arduino */
int bouton=7;        /* port connecté au bouton connecté à la masse */

void setup()
        {                
        pinMode(led, OUTPUT);
        pinMode(bouton, INPUT);
        digitalWrite(bouton, HIGH); /* activation de la pull-up */
        Serial.begin(9600);
        }

void loop()
        {
        int cnt;        /* ms entre l'allumage et le clic */

        digitalWrite(led, LOW);    /* démarrage LED éteinte */
        delay(random(2000,5000));  /* delai aléatoire 2..3 seconds */
        digitalWrite(led, HIGH);   /* allumage de la LED */
 
        for (cnt = 0; cnt < 2000; cnt++)
                { /* comptage en millisecondes */
                delay(1);
                if (digitalRead(bouton) == LOW)
                        break;     /* interruption de la boucle si le bouton est pressé */
                }
        Serial.println(cnt);       /* affichage du nombre de millisecondes */
        }


Reste à tester le programme. On le compile, on le charge. On a maintenant besoin d'une console, un terminal connecté au microcontrôleur. [Outils]->[Moniteur série]. On vérifie qu'il est sur le bon /dev/ttyUSB0 (ou autre; c'est le même que celui qui sert à programmer l'Arduino et que la vitesse est celle programmée dans le programme (ici, 9600 bauds). Il ne nous reste plus qu'à appuyer sur le bouton lorsque la lumière s'allume.



On peut aussi utiliser un autre moniteur comme 'minicom(1)' ou 'screen(1)', enregistrer ces résultats et faire des statistiques, calculer des moyennes, des écarts-types, faire des graphes, des histogrammes,... Le faire à différents moments de la journée, après avoir bu du café ou du vin, en téléphonant histoire de vérifier tout ce que l'on nous raconte sur la sécurité routière. On peut aussi tester si notre vigilance diminue après 2 minutes ou deux heures, quelle est notre endurance. Comparer les résultats avec ceux d'autres personnes, des amis, des membres de notre famille. Est-ce que l'entraînement apporte quelque chose? Est-ce que la situation se dégrade avec le temps? On est peut-être plus fringant à 20 ans qu'à 60... Et, est-ce que, si on déplace le bouton vers le pied, le temps s'allonge? (Dans les voitures le frein est aux pieds et l'influx nerveux a plus de chemin à parcourir pour aller de la tête aux pieds que de la tête à la main; les grands sont-ils moins réactifs?) Bref, on peut faire plein de choses avec ces deux bouts de fils et ces 20 lignes de code. Et, dans ce cas précis, je ne connais pas de produit du commerce accessible qui me permettent d'obtenir pareil résultat. L'imagination est la seule limite. (NB: dans ce cas-ci, une application sur PC ou smartphone pourrait le faire, mais ici, on peut remplacer le bouton par un capteur ou augmenter sensiblement la précision)

Le programme est, bien sûr, primitif. Il faut savoir que quand il affiche 2000, c'est qu'on n'a pas appuyé sur le bouton et que s'il affiche 0, c'est que l'utilisateur a appuyé avant d'avoir vu la LED s'allumer... Et, pour être sûr, il faudrait peut-être aussi l'étalonner.

Comme test extrême, vous pouvez imiter Gaston Lagaffe qui teste un nouveau type d’alcootest qu'il vient d'inventer. Il arrive au bureau avec plein de bouteilles d'alcool et augmente la dose afin que son invention, une cigarette-alcootest, vire au rouge... (planche 658; album 10 1977 "Le Géant de la Gaffe" page 5)