Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos robots > Robots du club > Robots à roues > Hitec Mavin (2008) > Premier exemple : Ma-vin évitement d’obstacles

Premier exemple : Ma-vin évitement d’obstacles

mercredi 20 août 2008, par Julien H.

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.

Vue par défaut du logiciel

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)

Relier deux blocs ensemble

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.

Choisir le bloc 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.

Liaison établie

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 :

  1. est-ce que j’ai un obstacle à gauche ?
  2. 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.

Vos commentaires

  • Le 11 octobre 2008 à 14:23, par ? En réponse à : Premier exemple : Ma-vin évitement d’obstacles

    Bonjour , serait il possible d’avoir des exemples de programme complexe pour ma-vin qui ne sont pas facile pour un débutant

    • Le 12 octobre 2008 à 11:04, par Julien H. En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Bonjour,

      Je n’ai pas très bien compris. Si c’est pour un débutant, il faut commencer avec des exemples simples.

      Si c’est pour mesurer les possibilités du robot Ma-vin, il existe des exemples de suivi de ligne qui sont déjà suffisamment complexes. Est-ce que cela vous conviendrait ? Nous avons justement un concours de suivi de ligne avec robot Ma-vin donc présenter un programme complexe mais élémentaire de suivi de ligne pourrait être faisable.

      Sinon, dès qu’il y a une réelle complexité algorithmique, on peut programmer le Ma-vin avec le langage C et un environnement de compilation pour AVR que nous allons présenter d’ici peu donc là vous aurez toute la complexité souhaitée :)

    • Le 12 octobre 2008 à 13:24, par ? En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Avis aux amateurs , proposer un programme pour ma-vin pour essayer de ce sortir d’un labyrinthe

    • Le 13 octobre 2008 à 18:47, par ? En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Bonjour que me conseillez vous comme livre pas trop compliqué pour apprendre à programmer en langage C pour ma-vin

    • Le 13 octobre 2008 à 20:26, par Julien H. En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Il y a un manuel en français écrit par Christian Tavernier (une référence dans le domaine) et édité par Dunod (éditions ETSI) que nous avons pour nos adhérents débutants. Ce n’est pas sur le langage C mais ça explique les bases du "microcontrôleur AVR" (titre du livre) qui équipe le robot Ma-vin.

    • Le 16 octobre 2008 à 18:33, par ? En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Bonsoir ,pour apprendre à programmer peut on commencer par le c ++ et surtout quel livre choisir pour un débutant

    • Le 27 octobre 2008 à 21:27, par Julien H. En réponse à : Premier exemple : Ma-vin évitement d’obstacles

      Je ne connais pas de livre sur le C++ car ce langage est plutôt évolué par rapport au C et fait appel à des concepts objets qui n’ont pas d’application sur le type de robot qu’on traite ici.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.