Les Rubik's Cube sont fascinants, et la rapidité avec laquelle les professionnels (ou speedcubers) les résolvent l’est encore plus. Au moment où j’écris cet article, le record actuel de résolution de Rubik’s Cube 3x3 est de 3,134 s. Mon record personnel étant de 14,91 s, autant dire que mes chances de devenir recordman sont très faibles. Du moins sans la robotique …
Ce projet est un robot capable de résoudre un Rubik’s cube. Les seules interactions humaines sont le placement du cube, une première fois sur le socle servant à la détection des couleurs et une seconde à son emplacement de résolution. Ce robot est décomposé en 2 parties : la partie logique (exécutée par une RaspberryPi4) et la partie commande moteur (celle-ci exécutée par une carte Arduino Mega).
Matériel utilisé :
- 1 RaspberryPi4 8Go
- 1 Arduino Mega 2560
- 1 Module caméra 5Mpx RB-CAMERA-WW
- 1 Shield Ramps 1.4
- 5 Moteurs pas-à-pas 17HS19-2004S
- 5 Drivers A4988
- 4 Servomoteurs (facultatifs)
- 1 Servomoteur AX-12A (d'autres moins chers conviennent aussi)
- 1 Écran LCD 1602
- 1 Alimentation 12V 3A
- 1 Cube 3x3 (de préférence de type Speedcubing)
Mécanique et structure
J'ai d'abord réalisé une modélisation CAO de la structure de mon robot. Celle-ci est faite de panneaux de medium (épaisseur 3 mm) découpés au laser. Par souci de transportabilité, la structure en bois est conçue de sorte à être rigide tout en étant montable sans l’utilisation de vis. D’autres pièces sont imprimées en 3D et assemblées à l’aide de vis.
Seulement 5 moteurs pas-à-pas sont nécessaires à la résolution des 6 faces. En fait, la dernière rotation peut être reproduite par une combinaison des 5 autres. Cela réduit le coût, mais aussi l’encombrement du système. Chaque moteur est désigné par une lettre selon la notation Singmaster : R, L, B, F et D.
La rotation du moteur est transmise au cube par des embouts en forme de fourche insérés au centre de chaque face.
Lors de la phase de reconnaissance des couleurs, le cube est placé sur un socle, de sorte qu’il soit posé sur un de ses coins. De cette manière, en tournant le socle de 180°, on réduit le nombre de rotations et d'images nécessaires à l’obtention du mélange. Seulement deux prises de vue sont nécessaires. Ce socle est mis en rotation par un servomoteur AX-12A.
Les moteurs pas-à-pas des faces latérales sont fixés sur une pièce pouvant glisser horizontalement. Il est possible de rajouter les 4 servomoteurs facultatifs et des biellettes pour automatiser l’avance et le retrait des embouts dans le cube.
Un boitier de commande permet de lancer les différentes étapes et d’afficher des informations sur un écran.
Électronique
Les moteurs pas-à-pas sont commandés par un Shield Ramps 1.4 monté sur un Arduino Mega 2560 avec des drivers A4988. Le shield est alimenté en 12V. Les drivers A4988 ont une limitation de courant de 0,8A.
Pour le module vision, la caméra est connectée à la carte RaspberryPi et le moteur AX-12A au shield.
Logiciel
Le software est composé de deux programmes : l’algorithme de vision et l’algorithme de résolution.
La partie vision est codée exclusivement en Python. J’utilise la bibliothèque OpenCV qui me permet de traiter les 2 images capturées et de récupérer les couleurs. Sur chacune de ces images, l’algorithme traite 27 (9 facettes × 3 faces) zones. En superposant les masques de couleur à chaque zone, on peut déterminer la couleur de la zone en choisissant celle qui est la plus représentée.
L’état du mélange peut être déduit et mis en forme sous une chaîne de caractères :
Une lettre par facette : chaque lettre ne correspond pas à une couleur (White, Yellow, Red …) mais à Down, Up, Right, Left … Par exemple, si la lettre est D, la facette est de la même couleur que le centre de la face du bas. Un cube résolu s’écrit donc :
Ce format est nécessaire pour utiliser l’algorithme de résolution du cube. Il s’agit de l’algorithme de Kociemba implémenté par efrantar. Ce programme fournit une solution en un minimum de 20 mouvements, en notation Singmaster en moins de 1 seconde.
La liste de mouvements est transmise via une communication série entre le Raspberry et l’Arduino, qui se charge ensuite de commander les moteurs correspondants.
Résultat
Le robot que j’ai conçu a parfaitement répondu à mes attentes. À l’exception de deux interventions humaines (pour déplacer le cube et le placer au centre des manipulateurs), il parvient à résoudre un Rubik’s Cube de manière autonome, en passant par les étapes de reconnaissance d’images, de calcul d’une solution et de sa mise en œuvre.
Le temps record que j’aie pu obtenir est de 2,009 secondes (temps moyen 2,378 s). Ce temps ne prend pas en compte le temps de la reconnaissance d’image et du calcul de la solution. En considérant que les speedcubers ont 15 secondes pour observer le cube avant de le résoudre, le temps d’exécution peut être comparable.
Avec mes deux secondes, bien que j’aie pu battre le record mondial, ce n’était pas dans la même catégorie. En comparaison avec d’autres robots, mon temps ne rivalise pas avec le record actuel dans la catégorie « robot », qui est de 0,305 s, décroché par Mitsubishi Electric en mai 2024. Ce temps record de trois dixièmes inclut non seulement la résolution complète du cube, mais aussi son observation.