Nous allons présenter ici un cas complet, tout en image, permettant de réaliser un éviteur d’obstacle très très minimaliste.
Le cahier des charges
On souhaite avancer en ligne droite, mais si on rencontre un obstacle à droite ou à gauche, on tourne dans la direction opposée puis on continue en ligne droite.
Attention, le robot ne reprendra pas sa trajectoire d’origine ! Il avancera de nouveau en ligne droite dès que l’obstacle ne sera plus visible (soit qu’on l’ait contourné, soit qu’il soit disparu par lui-même).
L’utilisation d’un tel programme convient très bien pour un robot en mode ’animal fou’ contrôlé par vos mains : dès qu’il vous détectera, il se frottera contre vous jusqu’à vous contourner.
Le "matériel" utilisé
Le programme que nous allons réalisé utilise les blocs graphiques du logiciel Ma-vin. Les copies d’écran présentent la version 2.0 beta 2 de juillet 2008, au cas où cela changerait d’ici que vous passiez sur cette page.
On va utiliser uniquement les briques suivantes :
- START : bloc obligatoire en début de programme
- END : bloc obligatoire en fin de programme
- REPEAT : bloc permettant de revenir à une étape précédente, bouclant ainsi un nombre défini ou infini de fois (voir images ci-dessous pour son paramétrage)
- PHOTO : bloc de type "input" interprétant la lecture des capteurs infra-rouge
- MOTOR : bloc de type "output" modifiant la commande des moteurs
Didacticiel de programmation graphique
Démarrer le logiciel
On démarre le logiciel, tout va bien pour l’instant, si l’installation s’est bien déroulée bien entendu.
Par défaut, un nouveau programme est déjà ouvert contenant uniquement la brique START.
Premiers blocs
La partie gauche de l’écran affiche par défaut 4 briques de commande logique, mais d’autres onglets permettent d’accéder aux autres briques : entrées, sorties, blocs personnalisés.
La première étape est d’ajouter une brique END. Cliquez sur ce bloc dans la partie gauche (le réservoir de blocs), gardez le bouton appuyé et faites glisser vers la partie principale (le programme)
Puis sélectionnez par clic droit la sortie de la brique START.
En maintenant le bouton droit de la souris appuyé, on "tire" le connecteur vers la brique cible.
En approchant par-dessus la brique cible (ici, bloc END), les points de connexion s’affichent, et on relâche le bouton droit au-dessus d’une entrée de la brique END.
La flèche noire qui symbolisait la future connexion disparait et laisse place à un trait rosé définitif.
Bien entendu, nous ne voulons pas d’un programme qui ne fait que START et END, donc il va falloir supprimer cette connexion !
Sélection des briques
Pour cela, il faut sélectionner le groupe de blocs en traçant un cadre avec le bouton gauche de la souris appuyé. Un cadre vert se dessine.
Quand on relâche le bouton gauche de la souris, les deux blocs sont encadrés de vert, ce qui indique leur sélection.
Pour supprimer des blocs ou des connexions, on dispose de deux icônes "poubelles" selon la suppression.
Ici, on veut supprimer les connexions donc poubelle de droite.
Hop, les briques sont restées en place mais notre connexion créée quelques pas plus haut n’existe plus, on peut reprendre la création de notre programme éviteur d’obstacles.
Construire le programme
Ajouter toutes les briques nécessaires
Maintenant que vous maitrisez les opérations de base, ajoutez toutes les briques dont nous avons besoin :
2 blocs PHOTO (pour détecter à droite et détecter à gauche)
3 blocs MOTOR (pour la réaction à droite, la réaction à gauche et le cas par défaut)
1 bloc REPEAT
Cela fait beaucoup de monde dans la fenêtre ! Il va falloir réduire la vue pour garder l’ensemble du programme sous les yeux.
La loupe ’-’ va réduire les blocs, dégradant leur lisibilité mais permettant de conserver tout sous la main, ce qui est pratique pour les connexions et la réflexion d’ensemble. Bien entendu, la loupe ’+’ vous permettra ensuite de revenir à une vue plus claire, plus aérée lorsqu’il faudra configurer chacun des blocs.
Créer les connexions
On va ensuite créer les connexions une à une. Ici, faisons une pause pour expliquer le fonctionnement de notre programme selon le cahier des charges énoncé en début d’article.
Tout d’abord, comment fonctionne une brique "input" ? elle a deux entrées et deux sorties.
Les entrées n’ont pas de rôle particulier, on peut venir de n’importe quel autre bloc de notre programme, que ce soit
du début ou d’une boucle, voire même d’une sortie.
Les sorties sont particulières : la brique "input" donne une réponse à la question posée par son paramétrage. Cette
question est fermée : on ne peut y répondre que par oui ou non, vrai ou faux, true or false, T ou F (qui sont les deux
lettres associées chacune à une sortie).
Si l’on sort par la sortie T, c’est que la réponse à la question est "oui", alors que si l’on sort par la sortie F, c’est que notre test (notre "question") n’a pas réussi et que la brique répond "non". On va donc faire suivre ces deux sorties d’une réaction différente à chacune de ces deux réponses. Et les deux sorties doivent obligatoirement être reliées au reste du programme.
Reprenons notre cahier des charges : on veut toujours avancer, sauf si on a un obstacle à droite ou un obstacle à gauche. Il y a donc deux questions :
- est-ce que j’ai un obstacle à gauche ?
- est-ce que j’ai un obstacle à droite ?
Attention, je vous attends au tournant, vous allez me demander pourquoi on n’a pas une seule question "ai-je un obstacle à droite ou à gauche" ? Et bien ce n’est pas possible de poser cette question avec les briques. Et tant mieux car ça évite des noeuds au cerveau. Comme je l’ai dit la réponse est fermée.
Continuons. Ces deux questions vont être posées chacune par une brique PHOTO, avec bien entendu un paramétrage différent.
Mais que devient la première partie du cahier des charges : "on veut toujours avancer" ? Il n’y a pas de brique PHOTO pour elle ? Et bien non, et c’est là que repose toute la logique de cette programmation. Alors soyez rassurez, c’est une logique très commune qu’on retrouve dans tous les programmes informatiques, pas seulement sur le Ma-vin : une boucle continue gère le cas par défaut, et les cas particuliers sont traités par des branches spécifiques en début de boucle (on appelle cela parfois des "interruptions").
S’il n’y a que deux briques PHOTO, il y a par contre trois briques MOTOR, puisque nous avons quand même trois actions différentes :
- avancer en ligne droite
- contourner par la gauche quand l’obstacle est à droite
- contourner par la droite quand l’obstacle est à gauche
Vous l’aurez remarqué, la brique MOTOR peut servir à commander les deux moteurs en même temps. On va donc
n’utiliser qu’une brique derrière chacun des trois cas
question n°1, réponse "vrai"
question n°2, réponse "vrai" (si la réponse n°1 était fausse)
dernier cas, par défaut, si aucune des deux questions n’avait de réponse "vrai"
On a donc maintenant notre logique complète, et on peut donc terminer notre programme en faisant une boucle vers le début.
Le cas de la boucle est particulier. On fait une boucle infinie en paramétrant le nombre de tours à 0 (pas logique mais très classique, ne vous en étonnez pas), mais il faut quand même connecter la deuxième sortie sur la brique END, alors qu’on sait bien qu’on n’ira jamais.
Note : toujours relier la deuxième sortie. Et ben c’est obligatoire pour respecter la cohérence d’écriture de n’importe quel programme : si jamais le nombre de tours de boucle n’est plus infini, il faut bien que le cas échéant soit programmé.
Le programme terminé
Le programme est désormais dessiné entièrement, avec toutes ses briques et toutes ses connexions, en tout cas celles auxquelles on a pensé :)
Le paramétrage
Chaque brique fait changer la partie basse de l’écran quand elle est sélectionnée, faisant apparaitre des paramètres différents selon sa nature.
Bon, le cas trivial : pas de paramétrage pour une brique START, ni END :
Et le paramétrage pour PHOTO :
On remarque qu’il n’y a que deux critères :
"Sensor Direction", avec les deux seules valeurs FORWARD ou BACKWARD qui permet de sélectionner la
rangée de capteur devant ou dessous le robot Ma-vin
"Sensor Status", qui pose la ’question’ correspondant aux cases à cocher que vous allez sélectionné.
Ainsi, si on sélectionne uniquement la case ’R’ (pour Right = Droite), la question correspondante sera : "ai-je une détection à droite mais ni devant ni à gauche ?". Relisez 10 fois cette question. Il est bien question de la case cochée, mais aussi des deux cases non cochées !!!! Car il ne s’agit pas de réagir "si on a quelque chose à droite quoi qu’il se passe sur les deux autres", mais bien de tenir compte des 3 capteurs en même temps. Toute la compréhension de la brique PHOTO repose dans cette distinction.
Listing du paramétrage pour l’évitement d’obstacles
Dans notre exemple simple, voici les paramètres à appliquer :
PHOTO 1 : forward / R (question "est-ce que j’ai un obstacle à droite et rien ailleurs)
MOTOR 1 : default / forward / R / vitesse 15
PHOTO 2 : forward / L (c’est l’inverse)
MOTOR 2 : default / forward / L / vitesse 15
MOTOR 3 : default / forward / both / vitesse 5
Comme c’est une boucle continue, la vitesse sera 5 sur les deux moteurs tout le temps, mais montera à 15 sur une roue ou l’autre selon le capteur qui détecte. Dès que l’obstacle disparaitra, la vitesse redesendra à 15. Il faut bien noter que la vitesse de l’autre roue sera restée à 5 pendant ce temps.
REPEAT : comme expliqué plus haut, 0 pour boucle infinie
Compilation
Même si vous n’avez pas réellement écrit de programme au sens où on l’entend habituellement (en utilisant un langage formé d’expressions syntaxiques spécifiques et d’une grammaire permettant d’enchainer des expressions mathématiques), vous avez quand même terminé la partie de réalisation de votre programme.
Il va donc falloir maintenant transformer votre diagramme de blocs en un exécutable binaire (composé de 0 et de 1) compréhensible par le microcontrôleur (Atmel AVR ATmega128) contenu dans le robot Ma-vin.
Pour cela, il faut cliquer sur l’icône des "outils" (marteau et tournevis) situé dans la barre de menu.
La première étape de compilation consiste à vérifier que vous avez bien relié les blocs correctement : que les blocs sont tous reliés entre eux, qu’il y a bien un bloc START et un bloc END, que le bloc REPEAT a ses deux sorties connectées, etc..
Une fois ce test logique terminé ("logic check completed"), c’est la compilation proprement dite (vous n’avez rien à faire, elle démarre automatiquement quand vous cliquez sur OK après la première étape).
Les blocs sont convertis en un code en langage C puis transmis à un compilateur C (il s’agit de AVR-GCC, une édition spécique aux microcontrôleurs Atmel basé sur le cross-compilateur GNU, c’est-à-dire un outil libre capable de faire une compilation pour une cible spécifique sur un hôte différent (ici, un PC qui compile pour un AVR), d’où le terme de croisé ("cross").
La compilation peut prendre un certain temps la première fois, mais après cela devrait aller plus vite.
Le bandeau en bas à gauche de la fenêtre du logiciel vous indique l’historique des événements, y compris vos ajouts et suppressions de blocs ou de liens, et bien sûr les étapes de compilation.
Nous verrons dans un prochain article le téléchargement dans le robot et les tests.
Enregistrement
Pensez à enregistrer régulièrement votre travail. Cliquez sur l’icône disque bleue simple (pareil, nous verrons plus tard - sur demande - les autres enregistrements).
Un répertoire vous est proposé : c’est ici et pas ailleurs qu’il faut enregistrer votre travail.
Si ce n’est pas la première fois que vous enregistrez, il vous faut confirmer l’enregistrement avec le même nom :
Et voilà, vérifiez dans votre arborescence avec l’explorateur de fichiers que le programme a bien été créé :
Conclusion
Et c’est la fin de notre premier exemple ! Bravo d’avoir lu l’article en entier, et nous espérons sincèrement qu’il vous aura été utile. Si vous avez des questions, n’hésitez pas, nous complèterons cet exemple au fur et à mesure.
Nous organisons des compétitions de robots Ma-vin pour tous ceux qui veulent s’initier. Nous sommes ouverts à toutes les inscriptions, mais aussi à vos dons pour continuer à proposer des évènements publics de plus en plus nombreux et à investir dans du matériel que nous documentons (en français !) par des articles détaillés.