Desktop Pal, avec vision « stéréo » au moyen de deux capteurs à ultrasons

Desktop Pal, avec vision « stéréo » au moyen de deux capteurs à ultrasons

Desktop Pal est un ami animatronique, propulsé par un microcontrôleur compatible avec Arduino et un petit assortiment de capteurs de base. Se servant de deux servomoteurs pour bouger, la tête de Pal se déplace de haut en bas et de gauche à droite, en réagissant aux objets se trouvant à proximité. Ceci est la Leçon 5 de la série Desktop Pal. Si vous commencez à peine le projet, vous allez vouloir commencer par la Leçon 1, Fabriquez votre propre Desktop Pal fonctionnant avec Arduino. Dans ce chapitre, vous apprendrez comment programmer le Desktop Pal de manière à ce qu’il combine l’ensemble de ses composants – moteurs, commutateurs et capteurs – pour qu’ils travaillent de concert comme une seule unité.  Vous pouvez télécharger le programme Arduino (« sketch ») correspondant à cette leçon à partir du lien suivant. DesktopPal_Lesson5_Sketches.zip

Obtenir le fichier à télécharger

Téléchargez ce fichier, et extrayez le dossier individuel qu’il contient dans votre sketchbook (« livre de programmes ») Arduino. Important ! Vous devez également télécharger et installer plusieurs bibliothèques Arduino, requises par les programmes de ce chapitre. La Leçon 3 fournit ces bibliothèques, donc si vous avez suivi cette série depuis le début, vous devriez déjà les avoir. Cette leçon ne nécessite pas d’autres bibliothèques que ce que fournit la Leçon 3. À se rappeler Lorsque vous ajouter de nouvelles bibliothèques, vous devez quitter l’IDE d’Arduino s’il est ouvert. Une fois que vous avez copié les fichiers de bibliothèque dans le dossier des bibliothèques du sketchbook Arduino, vous pouvez redémarrer l’IDE Arduino.

Fusion des composants et du code

Dans les chapitres précédents, vous avez appris sur les différents composants du Desktop Pal, et vous avez exécuté le code de test avec ces composants pour en vérifier le fonctionnement. C’est une bonne pratique, quel que soit le projet : tester chaque pièce du puzzle pour s’assurer que tout fonctionne. Construire un robot complet en essayant de tout programmer d’un seul coup peut conduire à des erreurs et à beaucoup de frustration ; la méthode morceau par morceau est au final beaucoup plus facile. Desktop Pal contient les composants de base suivants.

  • Tête en forme de balle de mousse avec deux micro-servos. Un servo fait bouger la tête d’avant en arrière, tandis que l’autre servo incline la tête vers haut et vers le bas. Les servos sont simplement collés ensemble pour former cet agencement panoramique-inclinable ou X/Y.
Les servomoteurs de Desktop Pal sont collés ensemble pour former une paire panoramique-inclinable

Les servomoteurs de Desktop Pal sont collés ensemble pour former une paire panoramique-inclinable

  • Deux capteurs de distance à ultrasons, espacés d’environ 12,7 cm (5 pouces), pour créer une sorte de vision stéréo. En utilisant deux capteurs, le Pal Desktop peut réagir aux objets positionnés à gauche, à droite ou au centre. Pendant le fonctionnement normal, les deux capteurs envoient constamment des impulsions sonores afin de déterminer si quelque chose se trouve à proximité.
  • Un commutateur à bouton-poussoir agit comme contrôleur pour allumer et éteindre Desktop Pal. Le commutateur ne modifie pas dans la réalité l’alimentation de la carte Itead Leonardo ; au contraire, il agit comme sélecteur de mode capable de mettre le robot en «veille». En mode veille, les servos et les capteurs du robot sont désactivés. Enfoncer ce bouton à nouveau permet de sortir du mode veille, et le Desktop Pal se réamine.
  • Un petit capteur infrarouge passif (PIR) détecte les mouvements. Ce détecteur est utilisé pour commander un mode secondaire dit « assoupi ». En mode assoupi, les servos de Desktop Pal s’arrêtent, et ses capteurs à ultrasons mettent en pause leur constante télémétrie. Le mode assoupi se termine lorsque le PIR est déclenché.
  • Parce que la carte de microcontrôleur de Desktop Pal est glissée à l’intérieur d’un boîtier, il n’est pas possible d’utiliser les témoins lumineux de l’Itead Leonardo pour vérifier l’état. À la place, un petit avertisseur sonore électronique autonome est relié à la même broche Arduino que la LED de la broche Pin13 standard. Chaque fois que cette LED clignote, l’avertisseur émet un signal sonore. En plus de servir de remplacement à la LED de la broche Pin13, l’avertisseur sonore est également utilisé pour émettre des sifflements rapides chaque fois que le Desktop Pal détecte un objet.
Principaux composants de Desktop Pal

Principaux composants de Desktop Pal

Teneur du programme PalLookAround

Toutes les différentes fonctions du Desktop Palsont combinées dans le programme PalLookAround.ino. Téléchargez le programme sur votre sketchbook Arduino, ouvrez-le dans l’IDE Arduino, et chargez-le sur votre Desktop Pal. Remarque Pendant le téléchargement, il est normal que la LED de la broche Pin13 clignote – elle indique la progression du téléchargement. Pendant ce temps, le gazouillement de l’avertisseur sonore électronique vous permet de savoir que le téléchargement est en cours. Ensuite, Desktop Pal émet un bip court unique et la LED du commutateur à bouton-poussoir latéral clignote, pour indiquer que le programme est en cours de chargement et prêt à fonctionner. La boucle principale du programme PalLookAround effectue les opérations suivantes :

  • Lorsqu’aucun objet n’est détecté devant le Desktop Pal, le servo panoramique tourne lentement de façon à ce que la tête balaye de gauche à droite. Cela donne l’impression que le robot regarde autour de la pièce.
  • Quand un objet est détecté par l’un des capteurs à ultrasons, le mouvement panoramique lent est temporairement interrompu. Le servo panoramique est positionné vers le capteur à ultrasons qui enregistre la distance la plus proche par rapport à l’objet détecté, et l’avertisseur sonore électronique émet un bref bip pour signaler la détection.
  • Le servo d’inclinaison déplace la tête vers le haut, en tant qu’indice supplémentaire suggérant que Desktop Pal « regarde en levant les yeux » l’objet en face de lui (humain, chat, zombie, peu importe).
  • Une demi-seconde après que l’objet s’éloigne, le lent balayage du servo reprend.

Plusieurs temporisateurs logiciels sont utilisés pour contrôler le fonctionnement du Desktop Pal. Ces temporisateurs sont contenus dans deux bibliothèques complémentaires : SimpleTimer et Metro. Reportez-vous à la Leçon 3 : Intégration des servos, capteurs ultrasoniques, et commutateur pour plus de détails sur la façon dont ces temporisateurs sont mis en œuvre dans le programme du Desktop Pal. Un temporisateur SimpleTimer est utilisé pour contrôler le balayage au ralenti du servo panoramique. Chaque fois que ce temporisateur est déclenché, le servo panoramique bouge (environ) de un degré dans le sens horaire ou antihoraire. Un temporisateur Metro contrôle la direction du servo panoramique. Le temporisateur est configuré pour inverser la direction du servo toutes les sept secondes. Un autre temporisateur Metro contrôle le mode « assoupi » de Desktop Pal. Chaque fois que ce temporisateur est déclenché, il met à jour une variable de comptage qui permet de suivre le nombre de « tics » écoulés. Quand les tics atteignent un certain nombre, Desktop Pal passe en mode assoupi. Il se réveille lorsque le capteur PIR détecte un mouvement à proximité.

Réglage des événements et des retards de temporisation

Dans les chapitres précédents, j’ai montré comment se servir des différents temporisateurs de manière individuelle. Examiner chaque temporisateur pris à part est un moyen utile d’expérimenter avec la façon dont il fonctionne, mais cela ne prend pas en compte les effets combinés de tous les temporisateurs fonctionnant de concert. Cela ne reflète également pas les limites du monde réel lorsqu’on travaille avec du matériel comme les capteurs à ultrasons, qui requièrent un certain temps de réaction minimum pour pouvoir fonctionner correctement. Donc, dans PalLookAround, tous les retards de temporisateur doivent être modifiés par rapport aux exemples des chapitres précédents. Cela permet au système de fonctionner de manière collaborative. Par exemple, plutôt que d’avoir un délai de 50 millisecondes entre chaque mouvement de balayage du servo panoramique, il n’est maintenant que de 1 milliseconde. La principale raison de la remise à zéro des temporisateurs vient des déclenchements multiples des capteurs à ultrasons. Ces capteurs fonctionnent en mesurant l’intervalle de temps entre une rafale sonore sortante et le retour de son écho. Selon la fiche technique des capteurs, le temps d’écho maximal est de 38 millisecondes ; par conséquent le programme doit attendre un minimum de 38 ms avant d’obtenir un résultat fiable. Par ailleurs, j’ai choisi de filtrer les mesures de capteur erronées en effectuant des lectures successives, et en prenant la moyenne des résultats. Comme il y a deux capteurs, le temps qu’il faut pour acquérir plusieurs lectures des deux capteurs définit une ligne de référence minimum pour la boucle principale dans le programme. Le programme ne peut pas exécuter sa boucle plus rapidement que cela. En guise de compromis entre la précision et le fonctionnement animatronique, j’ai choisi de réduire le nombre de lectures ultrasoniques de trois à deux pour le calcul de la moyenne. Avec deux capteurs, et un intervalle de 40 millisecondes entre chaque déclenchement (pour éviter la diaphonie dans les échos retournés), cela conduit à un intervalle de temps minimum – ou « tic » – d’environ 200 millisecondes. Cet intervalle de temps minimum « tic » influence surtout le délai requis pour passer Desktop Pal en mode assoupi, ainsi que la durée de déplacement du servo panoramique. Comme indiqué ci-dessus, le servo panoramique est maintenant déclenché à des intervalles de 1 ms. Le mode assoupi est réglé sur 120 « tics », ou environ 24 secondes. Le délai du mode assoupi est réglé dans cette partie du code :

if (dozer++ >= 120) {
  doze = true;
}

Vous pouvez modifier la durée avant que le Desktop Pal ne s’assoupisse en passant 120 à une autre valeur.

Mappage des positions de servo à partir des distances ultrasoniques

Pour donner à Destop Pal une touche plus anthropomorphique, les lectures des capteurs à ultrasons sont utilisées pour déplacer le servo panoramique approximativement à gauche/à droite/au centre de la position de l’objet détecté. Ceci est accompli avec seulement quelques lignes de code, grâce à la déclaration map d’Arduino. Voici le code correspondant dans le programme :

int sonicValR = getUltrasonic(ultrasonicR);
delay (40);
int sonicValL = getUltrasonic(ultrasonicL);
if (sonicValL < triggerDistance || sonicValR < triggerDistance) {
  int mapper = 0;
  if (sonicValR - sonicValL < 0) {
    mapper = map(sonicValR, 2, triggerRange, panRight, panNeutral);
    makeTone(5, 50);
  } else {
    mapper = map(sonicValL, 2, triggerRange, panLeft, panNeutral);
    makeTone(75, 50);
}
…

Tout d’abord, les mesures de distance sont obtenues à partir des capteurs à ultrasons de droite et de gauche. Ces valeurs sont respectivement stockées dans les variables sonicValR et sonicValL. Remarque Le délai de 40 millisecondes entre les lectures du capteur assure qu’il n’y a pas de diaphonie entre les détecteurs. La ligne

if (sonicValL < triggerDistance || sonicValR < triggerDistance)

vérifie si l’objet détecté est à une distance de déclenchement préréglée, dans ce cas de 50 centimètres. Si l’un des détecteurs enregistre qu’un objet est sous ce seuil, Desktop Pal y réagit. Selon que l’objet est situé plus près du capteur de gauche ou de droite, le programme traite la mesure de distance en utilisant l’une des deux fonctions map. La fonction map d’Arduino traduit un ensemble de valeurs dans un autre ensemble de valeurs. Ceci permet d’établir une corrélation entre les résultats obtenus des capteurs à ultrasons – valeurs comprises entre environ 2 et 50 – aux valeurs de position du servo panoramique. Ces valeurs de position couvrent une plage comprise soit entre 90 degrés (centre ou neutre) et :

  • 60 degrés, si l’objet est enregistré plus près du capteur à ultrasons de gauche, ou
  • 120 degrés, si l’objet est enregistré de plus près du capteur à ultrasons de droite.

Une fois que la nouvelle position du servo panoramique a été calculée, le programme met ensuite à jour à la fois le servo panoramique et celui d’inclinaison avec ce code :

servoTilt.write(tiltBack);
currentPanPosition = mapper;
servoPan.write(mapper);

Prenez note de la ligne

currentPanPosition = mapper;

La variable currentPanPosition contient la position actuelle du servo panoramique quand Desktop Pal balaie lentement d’avant en arrière. En mettant à jour cette variable avec la nouvelle position du servo panoramique, la tête de votre Pal ne bouge pas brusquement lorsque le mode de balayage lent reprend.

Modification de la tonalité de l’avertisseur sonore électronique

Le module de l’avertisseur sonore électronique est conçu pour produire un son à une fréqunece définie. Cela vous permet d’émettre du bruit ne serais-ce qu’en activant ou en désactivant l’avertisseur sonore (régler la broche Pin13 sur HIGH l’active, sur LOW le désactive). En utilisant la modulation de la largeur d’impulsion (PWM : Pulse Width Modulation), vous pouvez modifier dans une certaine mesure la tonalité de l’avertisseur sonore. Ne vous attendez pas à entendre de la musique, mais la variation de fréqunece peut être utilisée pour indiquer les différentes phases ou réactions du Desktop Pal. La PWM fonctionne en changeant le rapport cyclique du signal LOW-HIGH qui commande l’avertisseur sonore. En changeant le rapport cyclique, vous pouvez modifier le ton de l’avertisseur sonore et émettre plusieurs types de sons. Vous savez déjà que pour contrôler un dispositif utilisant de simples signaux LOW-HIGH, vous utilisez l’instruction digitalWrite d’Arduino. Pour commander un appareil en utilisant PWM, vous utilisez l’instruction analogWrite. La syntaxe est :

analogWrite(pin, pwm);

pin est le numéro de broche que vous souhaitez contrôler, et pwm est le rapport cyclique – entre 0 et 255 – de la forme d’onde du signal.

Modulation de la largeur de pulsation

Modulation de la largeur de pulsation

  • 0 = semblable au réglage de la broche à LOW
  • 1 = semblable réglage de la broche à HIGH

Dans le Desktop Pal, l’avertisseur sonore électronique est relié à la broche Pin13. Pour émettre un ton utilisant 50 pour cent du rapport cyclique de la PWM, le code serait :

analogWrite(13, 127);   // 127 is half of 255

Il active le son. Pour le désactiver, vous utiliseriez

analogWrite(13, 255);

J’ai créé une fonction courte dans le programme, makeTone, pour faciliter le contrôle de l’avertisseur sonore électronique. La fonction prend deux arguments : la valeur de la PWM, et une valeur du retard temporel. Par exemple, voici comment régler l’avertisseur sonore à 5 % de la PWM pendant 50 millisecondes :

makeTone(5, 50);

La fonction makeTone est définie comme suit

void makeTone(byte freq, int wait) {
  analogWrite(13, freq);
  delay(wait);
  analogWrite(13, 255);
}

L’argument freq établit le rapport cyclique de la PWM, tandis que l’argument wait règle le délai en millisecondes. Remarque Toutes les broches d’un Arduino ne sont pas capables d’émettre des signaux PWM. Différents modèles de cartes Arduino exposent la fonctionnalité PWM sur différentes broches, de sorte que ce qui fonctionne sur une carte peut ne pas fonctionner sur une autre. La proche Pin13 (sur un Arduino Uno ou Leonardo) est compatible avec PWM. Si vous avez choisi de déplacer l’avertisseur électronique sur une autre broche, vérifiez d’abord que la broche est compatible avec PWM.

Expérimenter avec les paramètres

PalLookAround utilise un certain nombre de variables globales pour définir les paramètres d’aspects comme la rotation minimale ou maximale du servo panoramique, ainsi que la distance maximale de détection d’un objet avec les capteurs à ultrasons. Je vous encourage à expérimenter avec ces valeurs pour un réglage fin de votre Desktop Pal. Les valeurs que j’ai utilisées ont été obtenues expérimentalement, et ne doivent pas être considérées comme idéales ou parfaites. Vous pouvez trouver d’autres paramètres plus à votre goût. Il suffit de modifier une valeur, recompiler, et télécharger le programme modifié. Les paramètres suivants sont parmi les plus utiles à modifier :

int triggerRange = 20;

Définit la plage de déclenchement, en cm, pour les capteurs à ultrasons. La plage de déclenchement est la valeur maximale utilisée pour les fonctions map.

int triggerDistance = 20;

Définit la distance de déclenchement, en cm, pour les capteurs à ultrasons La distance de déclenchement est la distance maximale que Desktop Pal utilise pour la détection d’objets. Seuls des objets situés à une distance inférieure sont vus. Vous pouvez essayer des valeurs différentes pour triggerRange et triggerDistance, bien que la plupart du temps, vous aurez probablement envie de garder les mêmes valeurs.

int tiltNeutral = 85;

Définit la position neutre du servo d’inclinaison. Augmentez-le ou baissez-le pour que votre Pal regarde plus ou moins en hauteur.

int tiltBack = 70;

Définit la position de la tête lorsqu’elle se penche en arrière (en regardant vers le haut).

int panNeutral = 90;

Définit la position neutre, ou intermédiaire, du servo panoramique. Ce réglage fait la tête regarder droit devant. Tous les servos sont un peu différents, et la construction de votre Desktop Pal peut dicter un paramètre différent ici.

int panLeft = 60;

Définit la position extrême gauche du servo panoramique.

int panRight = 120;

Définit la position extrême droite du servo panoramique.

S’amuser avec Desktop Pal

Desktop Pal n’est pas un robot compliqué, mais il manifeste beaucoup des concepts les plus importants de la robotique. Il comporte des servos pour le mouvement, et des capteurs pour détecter son environnement. Et n’oubliez pas tout simplement la possibilité de vous amuser avec lui. Les robots sont parfaits pour l’enseignement et le divertissement. Pour utiliser Desktop Pal, placez-le sur votre bureau ou une table, loin de vous ou d’autres objets de manière à ne pas influnecer ses capteurs. Allumez-le, et attendez que le « bip » indique qu’il a démarré et qu’il est prêt. Le servo panoramique commencera à balayer la pièce. Mettez-vous en face de lui, et regardez sa tête se déplacer rapidement dans votre direction approximative. Éloignez-vous, et tout aussi rapidement, le Pal reprendra le balayage de la pièce. Attendez patiemment pendant environ 25 secondes, et Desktop Pal devient endormi, et entre dans le mode assoupi. Le balayage de gauche à droite s’arrête. Remettez-vous en face du Pal, et il remarquera rapidement votre présence et se réveillera. Lorsque vous ne voulez pas que le Pal interagisse, quand vous avez besoin de dormir, d’étudier, ou tout simplement de regarder la télévision, appuyez sur le commutateur du mode veille sur le côté. Cela arrête tout mouvement et son jusqu’à ce que vous appuyez de nouveau sur ce commutateur de mode

À venir

Dans la leçon suivante, mais aussi la dernière, vous découvrez des caractéristiques facultatives supplémentaires que vous pouvez donner à votre Desktop Pal, notamment une sonorité, une détection du son nettement améliorées et plus encore. Après tout, il y a encore plusieurs broches inutilisées sur la carte Itead Leonardo, donc il y a beaucoup de place pour l’expansion !