Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Communications > Communications sans fil > Commande à distance

Commande à distance

mercredi 25 novembre 2009, par Julien H.

Nous avons déjà vu précédemment :
 comment réaliser une interface de contrôle en ligne de commande
 la théorie des communications entre deux cartes.

Dans cet article, nous passons à la pratique en réalisant une télécommande "nunchuck" pour servomoteurs.

Le pilote et l’exécutant

Le matériel

On dispose donc :

 de deux cartes Arduino
 de deux shields XBee
 d’un shield Easy pour connecter les servomoteurs
 d’un connecteur I2C pour Wii Nunchuck
 de quelques servomoteurs
 d’une alimentation secteur pour la partie "servomoteurs"
 d’une alimentation batterie pour la partie "nunchuck".

La communication

On va utiliser la liaison série sans-fil rendue possible par les Xbee pour communiquer entre les deux cartes. On va simplifier la communication en n’échangeant que des valeurs utiles. En effet, inutile d’envoyer en permanence ce qui se passe sur le Nunchuck si la seconde carte ne va pas utiliser l’information.

L’information

Grandeurs numériques disponibles

Quand on cherche à définir l’information disponible avec un simple Nunchuck, on est vite submergé, et il faut faire un tri. En effet, en prenant en compte les valeurs précédentes et la fréquence de changement, on peut faire de multiples combinaisons.

De base, on dispose déjà (comme vu dans un article précédent) :
 un bouton ’C’ sous l’index : pressé (indication d’action effectuée), appuyé ou relâché (indication d’état)
 un bouton ’Z’ sous le majeur : idem
 un joystick à deux axes sous le pouce : -100 à 100 deux fois
 un angle de roulis (gauche/droite) au poignet : -90 à 90 (on ne compte pas les autres 180° non différentiables)
 un angle de tangage (haut/bas) au coude : -90 à 90 (idem)

Parmi les possibilités de combinaison, il y a déjà 4 positions possibles avec les 2 boutons, mais on pourrait imaginer compter le nombre de fois qu’on appuie sur les boutons (double clic, triple clic, et toutes les combinaisons similaires à l’alphabet Morse). On peut aussi utiliser les boutons pour changer la signification du joystick ou des angles.

Mais si on veut en faire une commande exploitable par un humain qui n’ait pas à penser à chaque instant à ce que font ses doigts, ou pour qui la moindre erreur de manipulation serait désastreuse, alors il faut rationaliser et faire des choix.

Choix de l’information nécessaire et suffisante

Il ne faut pas penser du point de vue technique de l’information disponible à la source (bouton, accéléromètre, joystick) ou de la commande attendue à la destination (angle de servomoteur), mais se poser la question du sens fonctionnel à donner à l’information qui va transiter entre les deux systèmes.

Pour mon projet actuel, j’ai 4 servomoteurs à commander. Je souhaite que :

  1. le premier tourne dans un sens puis dans l’autre à une vitesse variable et son mouvement se déclenche et s’arrête quand je le veux. Exemple : balayage de gauche à droite
  2. le second réagit exactement à la consigne que je lui donne avec 2 positions significatives seulement. Exemple : ouvert ou fermé
  3. le troisième atteint un angle que je lui ai fixé à une vitesse fixe prédéfinie
  4. le quatrième atteint in angle que je lui ai fixé à une vitesse fixe prédéfinie

L’exploitation du Nunchuck va donc être très différente pour chacun des moteurs. Dans certains cas, je dois envoyer des consignes, dans l’autre je dois commander des actions/réactions.

Il n’est donc pas nécessaire d’envoyer chacune des valeurs techniques disponibles de la carte Nunchuck à la carte servomoteurs. Il est suffisant d’envoyer uniquement l’information qui change et qui impacte les moteurs.

Conclusion

Finalement, notre analyse fonctionnelle de l’information échangée montre que notre choix ne consiste pas à privilégier les signaux du nunchuck contre les consignes des servomoteurs ou inversement, mais à faire une réelle transformation de chaque côté, pour avoir des informations qui transitent qui soient cohérentes et qui ait un sens réel.

En résumé, voici un petit tableau qui va faciliter le travail de programmation des deux cartes :

Information du Nunchuck Information transférée
bouton Z enfoncé ordre de démarrage du servo 1
bouton Z relâché ordre d’arrêt du servo 1
fréquence sur 1 seconde du bouton C vitesse de variation du servo 1
joystick centré ordre d’arrêt du servo 2
joystick décentré ordre de démarrage du servo 2
rayon du joystick vitesse de variation du servo 2
angle de roulis consigne de position du servo 3
angle de tangage consigne de position du servo 4

Programmation : première partie

La communication I2C entre le Nunchuck et la carte Arduino a déjà été traitée dans un autre article. On va donc plutôt aborder le format des informations envoyées. Il y a deux approches : minimiser le nombre d’octet en inventant un protocole où toute l’information utile n’utilise que la place nécessaire, ou simplifier la communication en envoyant des caractères ASCII.

Je vous laisse deviner celle que je vais choisir : la seconde bien entendue. Par exemple : ’z’ quand le bouton Z est pressé et ’c’ quand le bouton C est pressé. Voici ce que ça donne sur la carte maître :


void setup()

Serial.begin(9600) ; // par défaut les XBee sont à cette vitesse

// ... + tout le reste des initialisations (WiiChuck, servos, ...)

void loop()

//
chuck.update() ;

// bouton z
if (chuck.zPressed())

Serial.print(’z’) ;

// bouton c
if (chuck.cPressed())

Serial.print(’c’) ;

delay(100) ;

Et voilà ce que ça donne sur la carte esclave : lorsqu’on reçoit ’z’, on change la valeur d’un booléen qui est traité plus loin dans le programme.


void loop()

// réception des consignes
while (Serial.available())
switch (Serial.read())

case ’z’ :
marche = !marche ;
break ;



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.