Dans les épisodes précédents...
Pour rappel, un des problèmes majeurs est de jouer avec le plateau de jeu d’origine de Puissance 4 et en utilisant de vrais jetons, déposés par les deux protagonistes comme dans une partie "normale".
La machine doit donc être en mesure de :
- récupérer des jetons depuis un stockage
- de les lâcher dans la colonne correspondant à l’action de jeu qu’elle a calculée
Par ailleurs, elle doit aussi pouvoir détecteur que l’adversaire a joué son jeton et connaître la nouvelle disposition du jeu, et ce sans qu’aucune indication ne lui soit donnée par un bouton, une interface graphique ou toute autre action non "naturelle".
Il y a donc deux grands sujets à traiter, à savoir :
- l’action
- la perception
Rien de bien nouveau ici, car ce sont deux des trois pôles du triptyque de tout système robotique, à savoir : perception - décision - action
Concernant l’action, on peut la décomposer en plusieurs gros morceaux :
- jouer un jeton
- stocker et distribuer les jetons
Examinons-les donc séparément.
Jouer un jeton
La solution la plus fun
Un bras robotique équipé d’une pince ou de tout autre préhenseur, qui va chercher les jetons dans un conteneur ou à un distributeur, se positionne ensuite au-dessus de la colonne du plateau et y lâche le jeton.
C’est incontestablement la plus waouw 😎 Mais elle est malheureusement très difficile à concrétiser.
Il faut pour commencer disposer d’un bras suffisamment précis pour effectuer les différents mouvements de manière fiable. Les jetons sont relativement petits, ce qui signifie que leur récupération exige un placement très précis là où ils sont stockés, même si on peut s’aider d’un guidage mécanique à ce niveau. Le plus critique cependant est la dépose, car la marge d’erreur au niveau du positionnement au-dessus de la colonne est de l’ordre du millimètre au grand maximum. Faute de quoi, le jeton se coince ou tombe hors du plateau.
On écarte donc d’office tous les bras motorisés par des servos de type radio-commande, car leur précision de positionnement est beaucoup trop grossière étant donné qu’ils ne sont pas faits pour cela. Le recours à des servos numériques tels que les AX12 que nous avons déjà utilisés par le passé améliorerait la situation, mais on ne parle plus des mêmes budgets (de l’ordre de 50 Euros pièce). Il y a d’ailleurs à parier que ces modèles de base ne soient pas suffisants en termes de couple, étant donnée l’élongation dont le bras doit pouvoir disposer pour atteindre toutes les positions de jeu. Le coût de modèles plus musclés nous fait changer d’ordre de grandeur en termes de budget.
A supposer maintenant qu’on trouve des actionneurs suffisamment précis et puissants, encore faut-il que cette précision ne soit pas anéantie par une trop faible rigidité du bras lui-même. Et là encore, on oublie les modèles d’entrée de gamme et la fabrication en matériaux "lourds" (bois, impression 3D,...). Ne reste que l’aluminium ou le carbone, en concevant de plus les pièces pour les alléger au maximum.
Bon, tout cela n’est pas très simple et risque de nous embarquer dans des galères sans fin, avec frustration à la clé.
On met donc cette option de côté, pour le jour éventuel où une société proposant des bras industriels nous en offrira un à titre de sponsoring (appel au peuple même pas déguisé 🙂 )
La solution bestiale
Elle a été envisagée très sérieusement et des plans en ont même été réalisés.
Elle consiste à mettre un distributeur contenant 6 jetons au-dessus de chaque colonne, et à jouer le coup de la machine en poussant un jeton vers la colonne depuis le distributeur correspondant.
Ca donne ceci en schématisant :
Un servo-moteur derrière chaque distributeur actionne un piston (vert) qui pousse le jeton vers la bascule (rose). Celle-ci se redresse à la verticale (les 7 bascules sont solidaires et actionnées par le servo-moteur et haut et à gauche du plateau) pour faire passer le jeton dans la colonne.
Ca fonctionne très bien, et un prototype d’un distributeur a même été réalisé en impression 3D.
Bon, il faut reconnaître que ce n’est pas très élégant. Par ailleurs, la rigidité du système de bascule sur toute la largeur du plateau a de fortes chances de provoquer des migraines et crises de nerfs.
Conclusion : peut mieux faire
La solution "Système D"
Elle a été suggérée par un mécanisme de tête d’impression récupéré sur une imprimante à jet d’encre avant d’en déposer les restes (quelqu’un "qui se la pète" parlerait de "déchets ultimes") à la déchetterie.
Au lieu d’un distributeur au-dessus de chaque colonne, on déplace à la position voulue un mécanisme de dépose dans lequel on a chargé auparavant (chinois) un jeton depuis le stockage.
Par chance, ce mécanisme utilise un moteur pas à pas (malheureusement, de plus en plus d’imprimantes utilisent un moteur CC avec un asservissement de position par lecture optique sur un ruban transparent strié). Or nous avons un peu d’expérience concernant le pilotage de moteurs pas à pas, entre autres épaulé par des drivers intelligents tels que le L6470 de STMicroelectronics, connu aussi sous le doux nom de dSPIN. Nous y avons déjà consacré un article et il a été utilisé massivement dans la restauration du bras robotique Youpi.
Afin de valider l’option, un petit montage expérimental a été réalisé et ça donne ceci en live :
On peut remarquer l’interrupteur de fin de course à l’extrémité gauche du mécanisme, utilisé pour la prise d’origine initiale à l’aide des fonctions intégrées au dSPIN.
Le tout est piloté par un code Python, basé sur la bibliothèque développée pour le bras Youpi.
Le godet mobile
Le dispositif mobile sera constitué d’un godet de transport et de dépose du jeton, fixé sur le chariot mobile du mécanisme de feu l’imprimante et positionné au-dessus du plateau de jeu. Le jeton y est poussé depuis le réservoir de stockage et il se met en position verticale en glissant sur une surface incurvée.
Un petit dessin valant mieux qu’un long discours, le voici en images.
Le jeton est introduit à plat au niveau du coin supérieur gauche de l’image, au niveau de l’échancrure dans le corps (rouge).
Le corps affiché en transparence ci-dessous permet de mieux voir la rampe (orange) qui fait basculer le jeton en position verticale :
Il reste bloqué en position d’attente par un verrou (vert) actionné par un servo-moteur (fixé au support bleu clair), qu’on voit ici en position fermée :
La pièce jaune sert à s’assurer que le jeton descend bien droit vers le tableau de jeu lorsqu’il a été libéré et à le guider au plus proche de l’entrée de la colonne.
Voici maintenant l’ensemble du dispositif imprimé en 3D (certaines pièces ne sont pas encore en place), assemblé et installé sur le chariot mobile.
Le distributeur de jetons
Ce sera un réservoir vertical, tête en bas pour prendre le moins de place verticalement. Les jetons seront donc extraits par le haut, un peu à la façon des distributeurs de bonbons Pez :
En voici le schéma de principe :
Le corps du distributeur (orange) contient les 21 jetons de la machine. Celui du haut de la pile est extrait et envoyé dans le godet de transport par le piston (mauve) actionné par un servo installé sur la monture (bleu sombre). Le "toit" a été rendu en transparent pour permettre de mieux voir le mécanisme.
Comment les jetons sont-ils poussés vers le haut ? On aurait pu imaginer un système actif, conçu comme l’axe Z d’une imprimante 3D. Histoire de faire original, on a préféré à cela un système totalement passif inspiré des horloges comtoires :
Le piston (vert, au bas du réservoir) qui se déplace verticalement est relié par deux câbles aux contrepoids (les "boites de conserve" en l’air) en passant par les poulies (violettes) situées au sommet. La simple gravité pousse donc le piston vers le haut en permanence, la quantité de lest contenue dans les contrepoids ayant été déterminée pour compenser la masse totale d’une pile de 21 jetons.
Une fois les différentes pièces imprimées et assemblées, ça ressemble à ceci :
On remarquera les deux colonnes de guidage des contrepoids, afin d’éviter que ceux-ci ne dansent la gigue pendant le transport. On peut distinguer dans le coin inférieur gauche la boîte de plombs de pêche qui ont servi à lester les contrepoids.
La perception du jeu
Le problème à résoudre ici est de connaître la configuration du plateau en termes de contenu de ses cases, c’est à dire vide, jeton de l’adversaire, jeton de la machine.
Mais avant cela, il faut aussi détecter quand le joueur humain a déposé son jeton, puisque rappelons-le il n’utilise aucun bouton ou autre dispositif pour le signaler.
Idée première
L’approche qui vient intuitivement est l’analyse d’images fournie par une caméra filmant le plateau. Cela reproduit effectivement ce que nous, les humains, faisons : nous analysons en permanence ce que nos yeux voient et sommes capables de détecter les changements et de les interpréter.
En théorie, ça peut marcher. Mais dans la pratique, c’est une autre histoire. Voici en effet les difficultés rencontrées en plus du problème d’analyse d’image lui-même :
- ne pas être perturbé par les changements d’ambiance lumineuse
- ne pas être perturbé par les mouvements autour du plateau (visiteurs qui se déplacent,...)
- ne pas risquer qu’une partie du plateau soit dissimulée par un spectateur
- détecter qu’un jeton a été déposé et a fini sa chute (afin de le situer à la position correcte et pas à une position intermédiaire occupée pendant le mouvement)
- pouvoir positionner la caméra de telle sorte qu’elle capte l’image souhaitée mais sans qu’elle ne présente une gêne pour l’auditoire
- et j’en passe...
Soyons pragmatique
Et appliquons la démarche de l’ingénieur, à savoir, à la différence du théoricien, ne cherchons pas à résoudre le problème dans son intégralité théorique, mais uniquement dans le domaine pratique.
Qu’est-ce que cela signifie dans notre cas ?
Tout simplement qu’analyser l’image globale en permanence est overkill. En effet, il nous suffit de détecter quand un jeton a été introduit dans une colonne. On sait en effet à qui c’est le tour de jouer et on en connait donc la couleur. Par ailleurs, partant d’un plateau vide, on est capable de savoir de proche en proche quel est le contenu de chacune des colonnes (à condition certes de ne rater aucun coup).
Le dispositif à base de caméra et d’analyse d’image peut donc se réduire à un simple détecteur de passage de jeton au niveau de la position au sommet de chaque colonne. Même s’il comporte le risque de rater un coup, cette situation est moins probable qu’un défaut dans la capture ou l’analyse de l’image.
La solution matérielle
Des détecteurs de présence reflex infra-rouge sont installés au niveau de chaque cellule de la rangée supérieure du plateau.
Et réglant leur sensibilité, cela fournit un signal lorsque qu’un obstacle (en l’occurrence un jeton) passe devant. Par commodité, des modules prêts à l’emploi ont été utilisés. Ils sont disponibles sur Amazon pour quelques Euros :
Voici le montage final, sur la face arrière du plateau, une monture sur mesure ayant été imprimée en 3D :