Tout d’abord, je tenais à vous souhaiter, à tous, d’excellentes fêtes de fin d’années. J’espère que Noël a été l’occasion pour vous, de recevoir vos gadgets et robots préférés 😉
Comme promis, j’ai fais quelques petites vidéos des premiers pas de Daryl. La première vidéo montre Daryl évoluer en complète autonomie. L’algorithme d’évitement des obstacles est des plus simple. L’algorithme peut être schématisé de la manière suivante:
Finalement, j’ai décidé de laisser la partie algorithme de déplacement dans la partie micro-contrôleur de l’arduino Uno (contrairement à mon idée de départ qui était de déployer cet algo de déplacement dans mon programme Java). En effet, cela m’a paru plus simple, et m’évitera par la suite des problèmes de latence par exemple…
Dans mon interface Java, j’ai donc, au final, deux boutons:
– Un bouton ‘Manual Mode’ qui, lorsque l’on clique dessus, envoi une information à l’arduino Uno pour lui indiquer qu’il faut passer en mode manuel.
– Un bouton ‘Automatic Mode’ qui, lorsque l’on clique dessus, envoi une information à l’arduino Uno pour lui indiquer qu’il faut passer en mode automatique.
Pour l’instant, le scanne de la tourelle ne sert pas à grand chose, mais je vais faire évoluer mon algo afin de l’utiliser, et orienter Daryl suivant la configuration de son environnement éloigné (le capteur ultrasons Ping peut détecter des obstacles dans les 3m)
Voici une petite vidéo du mode automatique:
Ci-dessous, une petite vidéo du mode manuel: Je peux désormais détacher le Viliv S5, et commander Daryl à distance grâce au bluetooth.
Une petite vidéo du mapping des capteurs IR avec les LineBars de mon application Java:
Dans cet article, nous allons voir comment utiliser le contrôleur de servomoteurs Pololu Micro Maestro.
Je partage cet article car j’ai vraiment eu beaucoup de difficultés à mettre en place la configuration du contrôleur. Pour ne rien vous cacher, j’ai même réussi à cramer les deux servomoteurs d’origines de la tourelle ^^
Le contrôleur Pololu Micro Maestro permet de contrôler jusqu’à 6 servomoteurs grâce à sa connexion série (pins RX/TX).
Il dispose d’une sortie +5V permettant d’alimenter un module externe. Le contrôleur peut être alimenté depuis l’arduino Uno, via la pin VIN, ou bien depuis le connecteur external power. Bien entendu, il est recommandé d’utiliser ce connecteur afin de pouvoir assurer les pics de puissance des servomoteurs. Mes servomoteurs travaillant sur du 6V, j’ai mis en place un diviseur de tension en sortie de la batterie (12V vers 6V). Je l’ai acheté sur Ebay pour quelques Euros.
Si comme moi, vous souhaitez alimenter le Micro Maestro grâce au connecteur external power, sachez qu’il est possible de faire un pont dans le but d’auto alimenter le contrôleur, tout simplement en tirant un fil du + du connecteur external power au VIN du contrôleur (Voir photos ci-dessous).
Pour la tourelle, j’ai acheté un petit kit tilt/pan sur Ebay. Ce kit sert normalement à clipser une petite caméra, et est vendue avec deux petits servomoteurs.
J’ai dû découper, puis poncer les éléments en plastique permettant de clipser la caméra.
Ensuite, j’ai fabriqué un triple support (capteur IR, capteur ultrasons, et webcam) grâce à deux supports en aluminium anodisé. J’ai par la suite collé ce support sur la partie poncée de la tourelle.
Enfin, il ne reste plus qu’à brancher les servomoteurs sur le contrôleur. Channel 0 pour le pan et channel 1 pour le tilt. De plus, on connecte la pin TX du contrôleur à la pin RX de l’arduino Uno, et la pin RX du contrôleur à la pin TX de l’arduino Uno (Attention de ne pas se tromper).
Il est possible de connecter la pin RST du contrôleur à la pin reset de l’arduino Uno afin que le Micro Maestro soit réinitialisé au reset de l’arduino Uno.
C’est maintenant que les problèmes commencent…
Au début, j’ai pensé qu’il était possible de contrôler directement et facilement les servomoteurs depuis l’arduino Uno. C’est bien le cas. On peut contrôler les servos en envoyant une séquence de données précise au travers du port série. Seulement il ne faut pas envoyer n’importe quelles données! On trouve sur le site de Pololu ce bout de code permettant d’envoyer la fameuse séquence :
target = map(target, 0, 180, min*4, max*4);
maestro.write(0xAA); //Byte indiquant le début de la séquence (toujours la même chose)
maestro.write(0x0C) ; //Byte indiquant le device id du contrôleur (reprendre la valeur affichée dans le soft Pololu)
maestro.write(0x04); //Byte indiquant la commande à envoyer (toujours la même chose)
maestro.write(servo); //Byte indiquant le channel du servomoteur
maestro.write(target & 0x7F);
maestro.write((target >> 7) & 0x7F); //Byte indiquant la target à envoyer pour le servomoteurs
Mon grand soucis a été de trouver la valeur de la target. La fonction map permet de mapper la valeur target ayant une valeur entre 0 et 180° avec la valeur min et max. Seulement, ne sachant pas trop quoi mettre au départ, j’ai mis des valeurs min et max au hasard. Erreur!!
Pourquoi ne pas mettre n’importe quoi…
Pour bien comprendre, il faut savoir que les servomoteurs, en général, n’ont pas un degrés de liberté infini (sauf sur certains servos modifiés qui permettent une rotation continue): Il est possible d’aller de 0 à 180°. Avant, et au delà, le servo est muni de taquets lui permettant de ne pas dépasser ces limites.
Aussi, il faut savoir que le positionnement d’un servomoteur (angle de rotation) est régi par une durée d’impulsion (ici la fameuse target). En mettant n’importe quelle valeur, je suis donc totalement sorti des valeurs min et max admissibles par mes servomoteurs. On connait la suite: ils sont rentrés en résistance avec le taquet (bruit comme si l’on forçait le moteur), puis ils ont chauffé puis cramé… Malheureusement, j’ai compris tout cela bien trop tard…
Ma méthode (pas pour les cramer, mais pour éviter le carnage):
Le Pololu Micro Maestro est doté d’un port micro USB permettant la configuration du contrôleur. Pour pouvoir configurer le contrôleur, il faut installer les drivers, télécharger le Pololu Maestro Control Center, puis brancher le contrôleur au PC. Enfin, on lance le soft Pololu Maestro Control Center.
1/ Dans l’onglet Serial Settings, il faut tout d’abord sélectionner l’option UART, Fixed baud rate et renseigner le baud rate que l’on indiquera dans le code arduino par la suite.
2/ On relève le Device Number (12 par défaut). Le device number doit être renseigné dans le code arduino (dans la séquence vu plus haut).
3/ Ne pas oublier de faire Apply Setting afin d’enregistrer la config au sein du contrôleur.
4/ Dans l’onglet Channel Settings, on va indiquer le nombre de servos connectés au contrôleur, 2 dans mon cas.
5/ Il est possible de renseigner un nom pour chacun des channels; De plus, on s’assure d’avoir sélectionné le mode Servo.
6/ Ensuite, il faut trouver les valeurs min et max possibles pour les servos . Pour cela, je vous conseille de mettre des valeurs comme min=500 et max=4000, puis de sauvegarder pour que le contrôleur les prennent en compte.
7/ Ensuite on va aller dans l’onglet Status, coché la checkbox Enabled du servomoteur à tester pour activer le curseur.
8/ Maintenant on va doucement bouger le curseur sur la droite afin de trouver la valeur max (180°). Allez-y doucement afin de ne pas cramer le servo. Lorsque vous allez arriver au max, le servo va émettre un bruit (comme s’il forçait où était bloqué). Dans ce cas, revenez doucement en arrière (sur la gauche) afin de trouver la dernière target ‘stable’.
9/ Ensuite, on effectue la même opération pour trouver la valeur min. On va doucement bouger le curseur sur la gauche afin de trouver la valeur min (0°). Allez-y doucement afin de ne pas cramer le servo. Lorsque vous allez arriver au min, le servo va émettre un bruit (comme s’il forçait où était bloqué). Dans ce cas, revenez doucement en arrière (sur la droite) afin de trouver la dernière target ‘stable’.
10/ Une fois les valeurs min et max trouvées, on retourne dans l’onglet Channel Settings afin de renseigner les valeurs min et max pour chaque servos. On ne touche pas aux autres valeurs. Si les valeurs min et max n’ont pas été atteintes, il faut répéter l’opération depuis l’étape 6 en indiquant des valeurs min/max plus importantes.
11/ Il est possible d’indiquer le comportement des servos lors de l’alimentation du contrôleur, grâce à la colonne On startup:
– Soit indiquer au contrôleur de donner une valeur target par defaut aux servomoteurs -> Go to + valeur de la target.
– Soit indiquer de ne rien faire -> Off
12/ Ne pas oublier de faire Apply Setting afin d’enregistrer la config au sein du contrôleur.
Pour information, si on laisse connecté le Micro Maestro au PC lorsqu’il est piloté depuis l’arduino, on peut constater en temps réel le mouvement des targets.
Maintenant que nous connaissons les valeurs min et max des targets, il suffit tout simplement de les renseigner dans notre code arduino:
target = map(target-43, 0, 100, 608*4, 2224*4);
Attention, il est nécessaire de multiplier ces valeurs par 4, en effet les targets sont en quart de microsecondes.