Un plateau tournant contrôlable par USB

Un plateau tournant contrôlable par USB

Il y a quelque temps, on nous a mis au défi de construire un plateau tournant motorisé du genre de ceux qu'utilisent les photographes pour prendre des objets en photos sous tous les angles. L'idée étant évidement de contrôler la position du plateau à l'aide de modules Yoctopuce. C'était un projet assez ambitieux dans la mesure où il y a plus de mécanique que d'électronique, mais on a malgré tout accepté le défi...



La partie mécanique

Le défi imposait d'utiliser comme base mécanique un plateau tournant de la société Française FANTASTIC Motors. Ce plateau se présente sous la forme de deux gros disques d'acier de 12 cm de diamètre qui tournent l'un par rapport a l'autre. A l'intérieur il y a une grande roue dentée qui entraîne un des disques. Ce truc minuscule peut supporter jusqu'à 150kg. Par contre, il n'est pas trop conçu pour être piloté: il sert normalement à faire tourner des objets en exposition dans une vitrine.


le dessus  le dessous
La base mécanique du plateau tournant


On a commencé par supprimer le moteur et la boîte d'engrenage d'origine qui ne sont, parait-il, pas très fiables. On a mis à la place un moteur fortement réducté, l'idée étant de pouvoir tourner très lentement. Les photos d'objets sur plateau tournant sont souvent prises au flash, et il faut que le flash ait le temps de se recharger entre deux photos. Au niveau de l'alimentation, faire tourner le plateau, même à pleine charge, ne demande que quelques centaines de mA, une plaisanterie pour le Yocto-Motor-DC.

Le  nouveau moteur à côté de celui d'origine
Le nouveau moteur à côté de celui d'origine


Pour connaître la position du plateau on a fixé un capteur angulaire sur l'axe central du plateau. Ce capteur, qui fonctionne grâce à un effet hall, a une précision de l'ordre du 0.1°. Il a une sortie 4-20mA et est donc facile à lire avec un Yocto-4-20mA-Rx.

Le capteur d'angle
Le capteur d'angle


Le Yocto-Motor-DC et le Yocto-4-20mA-Rx sont reliés à un Micro-USB-HUB. On a choisi une tension d'alimentation de 5V, ainsi on peut utiliser le même convertisseur 250VAC vers 5V pour alimenter à la fois le moteur et le Micro-USB-HUB. Cela permettra d'utiliser le plateau au bout d'un très long câble USB.

Le schéma de l'installation
Le schéma de l'installation



Pour maintenir le moteur, le capteur et le plateau ensemble on a imprimé un support sur mesure. On a placé le tout dans une boîte en aluminium, dans laquelle on a fraisé les ouvertures nécessaires. On a ajouté un petit ventilateur pour aérer le contenu de la boite et éviter une éventuelle surchauffe en cas d'utilisation intensive. On se retrouve donc avec une boite facilement transportable qu'il suffit de raccorder au 220V et à un ordinateur pour la mettre en service.


La partie mécanique La partie électronique
Le plateau tournant terminé
 Il suffit de brancher l'USB et le 220V



La partie software

A priori on pourrait se dire que la partie software est triviale: il suffit de mettre en marche le moteur et de lire en boucle la valeur du capteur d'angle. Mais c'est une erreur. Imaginez que vous ayez une tâche à accomplir et que votre chef vous téléphone toutes les minutes pour savoir où vous en êtes. Il y fort à parier que vous allez passer plus de temps au téléphone qu'à réellement avancer dans votre travail. Il vaut mieux que ce soit vous qui téléphoniez à votre chef pour rendre compte des avancements significatifs de votre travail. Ce raisonnement s'applique aussi aux modules Yoctopuce: si vous les interrogez dans une boucle trop rapide, ils vont passer plus de temps à vous répondre qu'à réellement faire leur travail. Le software de contrôle du plateau a donc été écrit en utilisant les callback de l'API, sans jamais faire un seul get: c'est le capteur de position qui mène la danse, pas le soft de contrôle.

Il y a une seconde difficulté technique: comme le plateau est susceptible de faire tourner des charge très lourdes, il faut absolument éviter de faire varier brutalement sa vitesse sous peine d'endommager les engrenages du système d'entrainement à cause de l'inertie. Un arrêt brutal d'une masse de 100Kg en rotation risque en effet d'être dévastateur.

L'idée est de créer une classe à laquelle on demanderait faire tourner le plateau à une vitesse constante et d'appeler un callback défini par utilisateur tout les X degrés. Ce callback servira typiquement à commander un appareil photo. Voici un exemple typique d'utilisation de cette classe, notez qu'on a utilisé Python, ce n'est probablement pas le meilleur langage pour faire du temps réel, mais il était imposé.

def TakeAPictureCallback(angle):
    photorelay.pulse(200)  # prend une photo
    # arrête le plateau quand on a fait 1 tour complet
    photocount += 1
    if (photocount >=36): turntable.setPower(0,None,0)

#création de l'objet TurnTable qui contôle le plateau
turntable =  TurnTable()
# demarre le plateau à 30% et appelle TakeAPictureCallback tout les 10°
turntable.setPower(30,TakeAPictureCallbac,10)
# attend que que le plateau s'arrête
turntable.waitUntilIdle()



On a donc écrit une classe qui tire partie des "TimedCallback" et des "valueCallBack". Un TimedCallback est appelé 5 fois par seconde par le capteur de position et sert à ajuster progressivement la vitesse du plateau en fonction de ce qu'il est en train de faire: accélérer, freiner, stopper etc .. Voici le squelette du callback en question:

def _powerCompute(self,func,data):
    position =  data.get_averageValue()

    if  self._mode == self._MoveMode.ABSPOSITION:
        # mode position:  ajuster progressivement la vitesse
        # pour qu'elle tombe à zéro juste à la bonne position
        ...

    if  self._mode == self._MoveMode.SPEEDCTRL:
        # mode contrôle de vitesse: ajuster progessivement
        # la vitesse qu'a la valeur requise
        ...

    if  self._mode == self._MoveMode.STOPPING:
        # Arrêt du système: diminuer progressivement
        # la vitesse jusqu'à zéro
        ...



Le valueCallBack, quant à lui, est appelé à chaque fois que la valeur du capteur de position change de manière significative, en pratique à peu près tous les 0.1 degrés. Ce callback vérifie si on a atteint une position pré-calculée, dans l'affirmative il appelle le callback utilisateur et calcule la position suivante.

def _PositionChangeCallBack(self,fct,sposition):
  if self._positionCallback is None : return
  position = float(sposition)

  if self._powertarget>0 and position>=self._positionCallbackNext:
    self._positionCallback(position)
    self._positionCallbackNext = self._positionCallbackNext \
    + self._positionCallbackPeriod

  if self._powertarget<0 and position<self._positionCallbackNext:
    self._positionCallback(position)
    self._positionCallbackNext = self._positionCallbackNext \
    - self._positionCallbackPeriod



La dernière difficulté est liée au fait qu'on a été contraint de placer le moteur juste à côté du capteur d'angle. Ce capteur est basé sur un effet hall: en gros il y a aimant qui tourne à l'intérieur et le capteur mesure le champ magnétique de cet aimant pour déterminer la position. Mais il se trouve que le moteur contient lui aussi des aimants permanents qui perturbent légèrement le capteur, on a observé des différences de -4 à +2° degrés entre les mesures et les positions réelles. Comme cette perturbation dépend essentiellement de l'angle du plateau, on a ajouté une fonction qui compense cette erreur de mesure.

L'erreur de mesure constatée (en bleu) et la fonction utilisée pour la compenser (en rouge)
L'erreur de mesure constatée (en bleu) et la fonction utilisée pour la compenser (en rouge)



Voilà, on a plus ou moins fait le tour de la question. On a créé un dispositif qui permet de faire automatiquement une série de photos d'un objet qu'on peut par la suite assembler pour faire de jolies animations à 360° comme celle-ci:

Une manière un peu fun de présenter les produits Yoctopuce :-)
Une manière un peu fun de présenter les produits Yoctopuce :-)



Vous noterez que le GIF animé n'est pas forcément la méthode la plus subtile pour créer ces animations :-) En guise de conclusion, voici une petite vidéo qui montre le plateau en fonctionnement.

  



Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.