Il y a deux ans et demi, j'ai acheté le kit Lego Mindstorms EV3 pour faire mes premiers pas en robotique. Après avoir roulé l'assemblage ev3dev sur le contrôleur et joué suffisamment avec le moteur SSH et le contrôle du capteur, j'ai refroidi pour un achat pendant deux ans. La raison en était que je n'avais pas assez d'imagination pour le rendre possible: après plusieurs modèles assemblés de Lego Technics (à la fois en boîte et faits maison), j'étais déjà habitué à des miracles comme des jouets télécommandés et de simples robots comme
les modèles de Lego présentés à l'
exposition de Cracovie, comme une personne qui travaillait sur un système de télémécanique, n'inspiraient plus assez d'inspiration. Je ne voulais pas vraiment répéter l'expérience d'un autre.
En fin de compte, cela m'est apparu: une horloge à coucou pouvait devenir un modèle assez complexe, intéressant, pratique et pas trop galvaudé. Inspiré par cette idée, je me suis mis au travail.
Selon mon idée, le modèle devait devenir non seulement un jouet, mais un appareil entièrement fonctionnel. C'était tout à fait possible: l'horloge est accrochée à mon mur et affiche l'heure actuelle en mode 24/7. Je ne me suis pas donné pour tâche de reproduire le mécanisme de l'original dans tous les détails - par exemple, les flèches sont indépendantes, le son est reproduit via le haut-parleur du contrôleur, et les poids et le pendule sont utilisés exclusivement pour l'environnement. Ayant donc transféré tout le travail principal à la partie logicielle, j'ai assemblé le mécanisme dans la version la plus simple possible. Je n'ai pas documenté l'ensemble du processus d'assemblage, je ne peux donc pas réassembler le modèle sous la même forme; Néanmoins, les principes de base de l'association des logiciels et de la mécanique sont tels que le programme devrait fonctionner avec des modifications minimes sur d'autres modèles assemblés selon un principe similaire.
Des montres sous différentes formes sont présentées dans la vidéo que j'ai postée sur Youtube:
Des informations de base sur le modèle sont présentées dans la vidéo. Ci-dessous, je vais vous parler un peu plus en détail de la mécanique, du logiciel, ainsi que des problèmes survenus lors du montage et du fonctionnement de cette conception.
La mécanique
L'assemblage de la partie mécanique a pris 6 jours. Après avoir disposé les boîtes Lego sur la table, pendant les vacances du Nouvel An, j'ai assemblé un mécanisme qui ne diffère de la version finale que dans les portes derrière lesquelles vit le coucou (voir ci-dessous). Je n'ai pas de compétences particulières en conception, donc la montre est une boîte rectangulaire à deux aiguilles et un cadran marqué de points sur le devant. Dans la partie supérieure de la montre, un compartiment fermé par deux portes, dans lequel le coucou s'est installé, et dans la partie inférieure, un pendule schématique et deux poids. Les pièces ont été prises de plusieurs ensembles Lego: un
Lego Mindstorms EV3 (31313) , deux
niveleuses Volvo (42030) , un
camion Mercedes avec une flèche pneumatique (42043) et un
camion-grue (42009) . Malgré l'abondance d'ensembles, il y avait à peine assez de détails pour un modèle de cette taille - le couvercle de la montre est assemblé à partir de bandes de différentes couleurs, ce qui, cependant, n'attire pas l'attention, car avec une installation murale, il est au-dessus du niveau des yeux.
En tant qu'aiguille des minutes, la barre standard Lego Technics pour 15 unités est utilisée. Il est placé sur l'axe, le reliant fermement au moteur. Ainsi, la précision du réglage de l'aiguille des minutes s'est avérée suffisante pour qu'elle puisse être utilisée pour déterminer le temps précis en minutes. L'aiguille des heures est plus courte et montée sur un mécanisme pivotant. Il est connecté au moteur par plusieurs engrenages, il y a donc un jeu assez sensible - cependant, pas assez grand pour causer des problèmes avec la détermination de l'heure.
Les aiguilles sont entraînées par deux gros moteurs (LM). De plus, jumelée à chacune des aiguilles externes, une autre fonctionne, celle interne - pour l'aiguille des minutes, elle est fixée sur le même axe que la première, et pour l'horloge, le mécanisme rotatif est dupliqué à l'intérieur de la montre. Le but des flèches intérieures est d'appuyer sur le bouton (capteur tactile) tout en faisant passer les flèches extérieures en position haute. Ainsi, le contrôleur a la capacité de déterminer la position des flèches immédiatement après la mise sous tension et de définir leur position correcte en fonction de l'heure du système, évitant à l'utilisateur d'avoir à saisir manuellement les flèches.
Les poids ont une fonction purement décorative. Au départ, j'ai pensé à faire un poids, qui s'abaisserait lentement (comme dans une montre normale), puis remonterait rapidement en position haute (analogue au remontage manuel d'une pendule). J'ai par la suite refusé cette option pour plusieurs raisons. Premièrement, le mécanisme de commutation du rapport de transmission entre le moteur et le poids a ajouté une complexité supplémentaire au modèle (et l'entraînement du pendule à partir du même moteur n'a fait que l'augmenter). Deuxièmement, un eye-liner rapide, quoi que l'on puisse dire, sera une opération bruyante, mais je voulais que la montre fonctionne aussi silencieusement que possible. Troisièmement, dans un coucou conventionnel, il y a généralement deux poids (l'un fournit l'horloge, le second - le coucou), et placer immédiatement au bas de la montre deux roues pivotantes pour la chaîne entraînerait une augmentation encore plus importante de la taille du modèle.
Partant de là , j'ai pris un chemin plus simple: j'ai en fait installé deux poids sur la montre, mais je les ai placés sur un circuit commun projeté sur une seule roue motrice. Dans cette version, les poids se déplacent toujours dans des directions anti-météo, descendant à leur tour. Ce comportement n'a pas grand-chose à voir avec les horloges à pendule réelles, mais il semble assez intéressant.
La chaîne est constituée de garnitures ordinaires de trois unités utilisant une combinaison d'axes et de pistons: un piston glissant est une pièce assez rare, et j'ai utilisé les axes pour doubler la longueur de la chaîne résultante. Ce n'était pas si facile de fabriquer une roue qui déplace une telle chaîne sans glissement ni panne, mais au final, c'était possible.
En ce qui concerne le changement de direction du mouvement des poids, ma première idée a été de le rendre purement mécanique: lors du levage vers la paroi inférieure du boîtier de la montre, le grand axe monté directement au-dessus du poids appuie sur la plaque à travers laquelle la chaîne est passée et fait tourner la roue. J'allais utiliser l'élément de commutation de la même manière que, par exemple, la
grue 42009 : la roue motrice, en mouvement, entre dans l'embrayage avec le voisin droit ou gauche. Cette idée n'a cependant pas volé: le plateau de pression a amené la partie coulissante en position centrale lorsqu'elle n'était engagée ni avec le voisin droit ni avec le voisin gauche, le couple a cessé de venir à la roue et l'interrupteur a gelé en position centrale.
Pour corriger cette situation, j'ai décidé d'ajouter un triangle mobile à ce circuit, dont les deux côtés auraient une longueur fixe, et le troisième serait représenté par une pièce coulissante à ressort utilisée dans la suspension de la même grue de camion. Le sens de cette conception était que le triangle est toujours du côté du panneau de pression qui correspond au poids de levage: lorsque le poids atteint le sommet, le panneau appuie sur le triangle, le ressort se comprime, le triangle passe par la position d'équilibre puis «jette» de l'autre côté, libérant énergie emmagasinée par une source. Cette énergie, selon mon plan, était censée déplacer le commutateur de vitesse dans la position d'équilibre, le traduisant immédiatement dans la position opposée.
Cependant, je n'ai pas réussi à stabiliser ce système. Par la taille de l'horloge, vous pouvez comprendre que les mécanismes miniatures ne sont pas mon truc, mais avec une augmentation de la taille du nœud, les distorsions qui en résultent entraînent des frottements, qui consomment la plupart de l'énergie de commutation. Après avoir été tourmenté par ce mécanisme, j'ai finalement décidé de transférer tout le sale boulot au microcontrôleur en installant un bouton au-dessus des panneaux poussoirs (capteur tactile) au lieu d'une mécanique complexe.
Un peu d'arithmétique simple. L'EV3 possède quatre entrées et quatre sorties. Deux entrées et deux sorties étaient déjà occupées respectivement par des boutons et des moteurs fléchés. L'ajout à ce circuit d'un moteur faisant tourner la roue à chaîne et de deux boutons signifiait que, premièrement, je n'avais pas de ports libres pour connecter le capteur de position du coucou (je pensais utiliser un télémètre optique à cet effet), et deuxièmement, que les nœuds restants (coucou et pendule) n'ont qu'un seul moteur. J'ai envisagé l'option où les deux panneaux poussoirs au-dessus des poids seraient connectés à un bouton commun, mais je l'ai refusé, car si au moment d'allumer l'horloge, l'un des poids serait en position supérieure, en maintenant le bouton, la montre n'aurait pas assez d'informations pour sélectionner sens de déplacement de la chaîne.
Comme le pendule était plus facile à associer au mécanisme de mouvement de la chaîne qu'au coucou (à la fois en termes de nature de mouvement et d'emplacement), j'ai placé un autre gros moteur dans la partie inférieure du corps, qui, tout d'abord, entraîne le pendule d'avant en arrière (1 révolution du moteur se traduit par une oscillation complète du pendule), et d'autre part - grâce à un réducteur, la roue tourne, ce qui entraîne la chaîne. Un tel système présente l'inconvénient qu'en inversant le sens de déplacement de la chaîne et, par conséquent, la rotation du moteur, le pendule modifie également le sens de déplacement, même s'il se trouve dans une position intermédiaire, qui peut paraître moche. Cependant, changer la direction du mouvement des poids est une opération assez rare, j'ai donc négligé ce problème. Un autre inconvénient de mon montage est le jeu plutôt remplaçable de l'entraînement du pendule, c'est pourquoi lorsqu'il se déplace lentement, le pendule s'arrête à un point inférieur pendant une fraction de seconde pour un œil perceptible. J'étais trop paresseux pour résoudre ce problème.
En parlant de la vitesse du pendule. Après l'avoir expérimenté, j'ai choisi une valeur de 30 degrés du moteur par seconde. Cela signifie que le pendule oscille complètement en 12 secondes. C'est beaucoup, cependant, avec l'augmentation de la vitesse, le moteur a commencé à hurler, et la perspective d'écouter continuellement sa chanson ne me sourit pas du tout. C'était trop paresseux pour passer par le mécanisme et introduire un overdrive, j'ai donc opté pour un format aussi «lunaire». Les rapports de vitesse entre le moteur et la roue d'entraînement de la chaîne sont tels que le poids passe de la position inférieure à la position supérieure en 40 à 50 minutes.
Restant libre après toutes les manipulations précédentes, le port EV3 occupait le moteur central (moteur moyen), qui entraîne le coucou. Le coucou lui-même est assemblé à partir de parties des mêmes techniques Lego. En hauteur, l'oiseau atteint 11 unités et est placé sur une barre rétractable (sur ceux-ci dans la grue de camion susmentionnée, des arrêts à distance ont été placés). Un mécanisme miniature introduit une transmission entre les ailes de l'oiseau et sa queue, à travers laquelle j'ai jeté un câble fixé à l'intérieur de la montre. La longueur du câble est choisie de sorte que le coucou part complètement avec ses ailes baissées et seulement à la toute fin du mouvement les écarte légèrement. Il s'est avéré atmosphérique - juste au niveau de la mécanisation de modèles de montres simples. L’absence de capteur de position est compensée par le fait que l’entraînement du coucou est activé par le mécanisme de glissement - il aide à ne pas endommager le moteur, même s’il essaie de déplacer le coucou au-delà des points limites. Les portes sont étroitement reliées à la planche sur laquelle l'oiseau est fixé, et s'ouvrent simultanément avec le départ du coucou lui-même.
Au départ, j'ai utilisé des panneaux 11 par 5 pour 1 unité comme portes, mais cela s'est avéré être une mauvaise idée: leurs bords n'étaient pas arrondis et les portes, accrochées aux parties adjacentes, souvent bloquées, laissant le coucou à l'intérieur. La vidéo montre la deuxième version de l'ensemble de porte - les garnitures ordinaires aux bords arrondis ne causent pas un tel problème. De plus, la version «planche» de la porte s'ouvre et se ferme beaucoup plus silencieusement.
La montre est montée sur un bracelet boulonné au mur. L'ensemble de la structure pèse plus d'un kilogramme.
Sur cela, la description de la partie mécanique se termine en principe. Il ne reste plus qu'à mentionner que le modèle est assemblé à 100% à partir de Lego Mindstorms et Lego Technics, et la seule partie qui ne s'applique pas à ces ensembles est le cordon d'alimentation, que j'ai soudé à mon EV3, de sorte que je n'ai pas eu à changer les piles tout le temps. Ce fil va à l'alimentation branchée sur la prise.
Le programme
L'assemblage ev3dev fournit des liants pour de nombreux langages de programmation. Afin de ne pas avoir de difficultés avec l'assemblage, j'ai décidé de me limiter à un script Python. Ce script est disponible
dans le référentiel GitLab . Ci-dessous, je passerai brièvement en revue ses fonctionnalités.
Le code qui déplace les flèches est relativement simple - il recalcule les minutes et les heures en degrés de rotation des moteurs en utilisant des données sur le nombre de degrés du moteur par tour de flèche et le décalage initial de la flèche par rapport à la position verticale. Tout le plaisir commence lorsque le programme essaie d'obtenir ces données.
Comme je l'ai déjà dit, il a été décidé d'abandonner la connexion manuelle du tireur. Au lieu de cela, au démarrage, la montre effectue un étalonnage en déterminant les paramètres de géométrie. L'étalonnage est effectué pour les deux mains indépendamment l'une de l'autre.
L'algorithme d'étalonnage est le suivant. Tout d'abord, le moteur commence à tourner à une vitesse relativement élevée (j'utilise une valeur empirique de 180 degrés par seconde) jusqu'à ce qu'un signal de confirmation vienne du bouton qui fixe la position supérieure de la flèche. Après cela, le moteur réinitialise la vitesse à 30 degrés par seconde et continue de faire tourner la flèche dans le sens des aiguilles d'une montre (le sens de rotation du moteur est cousu dans le programme) jusqu'à ce qu'il soit séparé de 70 degrés du point de la dernière ouverture du bouton. Après cela, la flèche passe par la position supérieure dans le sens opposé, fixant la première fermeture et la dernière ouverture des contacts (le bouton peut cliqueter dans les positions de bord). S'éloignant de la dernière ouverture des mêmes 70 degrés, la flèche change à nouveau la direction du mouvement en ligne droite, et la procédure d'enregistrement du premier circuit et du dernier circuit est répétée.
On pense que la position supérieure de la flèche correspond à la moyenne arithmétique entre les quatre valeurs ainsi obtenues. La pratique montre que cette approximation est assez bonne - l'écart de la position cible de l'aiguille des minutes par rapport à la valeur réelle est rarement supérieur à 1 pas et ne dépasse presque jamais deux pas. (La vidéo montre des écarts plus importants en raison du fait que dans le but de la prise de vue, j'ai traduit l'heure du système et que les aiguilles se sont déplacées plus rapidement qu'en fonctionnement normal, ce qui augmente l'erreur de correction à chaque tour, voir ci-dessous.) mais l'algorithme, bien sûr, utilise le même.
Après avoir calculé la position supérieure de la flèche et la différence entre le premier allumage du capteur et en fait la position supérieure de la flèche (cette valeur sera requise pour la correction, voir ci-dessous), l'algorithme d'étalonnage augmente à nouveau le régime moteur à 180 degrés par seconde et répète la recherche de la position supérieure. La différence entre deux positions supérieures consécutives détermine la longueur d'un tour complet de la flèche en unités de rotation du moteur. La procédure de recherche de position supérieure est répétée cinq fois, ce qui nous permet de faire la moyenne des valeurs obtenues et d'augmenter légèrement la précision.
Une fois l'étalonnage terminé, les aiguilles passent au mode d'affichage de l'heure actuelle. De plus, sur chaque cercle de la flèche, l'algorithme fixe la position de fermeture du disjoncteur. La différence entre les angles de rotation réels et attendus du moteur à ce moment est la quantité de correction; Ainsi, même si la longueur totale du cercle n'a pas été calculée correctement au stade de l'étalonnage (la sortie de débogage montre que l'écart dépasse rarement 1 degré), la correction sur chaque cercle ne permet pas à la flèche de se déplacer en raison de l'accumulation d'erreurs.
Veuillez noter que la seule information sur le rapport du moteur et de la flèche, qui est explicitement cousue dans le programme, est le sens de rotation du moteur (avant ou arrière) correspondant au mouvement vers l'avant de la flèche. Grâce aux capteurs de position, le besoin de données sur le rapport de vitesse et la position initiale de la flèche disparaît. Ainsi, si vous récupérez une montre pour laquelle, en plus de l'heure et des minutes, une trotteuse sera également présentée, l'algorithme vous permettra de l'utiliser en ajoutant seulement quelques lignes, sans perdre de temps à compter les dents.
Ce qui manque dans le programme de déplacement des flèches, c'est une protection contre le débordement ou la perte de précision. Je n'ai pas enquêté sur la question de ce qui se passera plus tôt: la profondeur de bits de l'angle de rotation du moteur débordera ou les flèches commenceront à se déplacer saccadées en raison du départ de la précision dans les chiffres supérieurs du nombre à virgule flottante. Cependant, la pratique montre qu'à des moments de l'ordre de plusieurs semaines, rien de tel ne se produit. Si jamais je rencontre ce problème, je vais probablement ajouter une commande de réinitialisation du moteur à chaque tour, avec la correction correspondante des angles dans le programme.
Si la classe Hand de mon programme est responsable du mouvement des flèches, alors la classe LedIndication s'allume, puis éteint les LED du panneau avant de l'EV3. Je sais que le même effet peut être obtenu avec une seule équipe, mais initialement cette fonctionnalité a été conçue pour suivre les plantages de programmes, puis elle est restée. Il n'y a rien de plus intéressant dans cette classe.
La classe Pendule est responsable du mouvement des poids et d'un pendule.
L'algorithme démarre simplement le moteur dans une direction et le fait tourner à vitesse constante jusqu'à ce que le bouton correspondant à la levée complète de ce poids soit bloqué; après cela, le sens de déplacement du moteur est inversé.Dans cette classe, en passant, la protection contre les plantages de programmes est présentée, ce qui consiste en ce que le moteur ne démarre que pendant 2 secondes avec une période de mise à jour des commandes de 1 seconde. Si j'allumais le moteur en mode de rotation constante, puis lorsque le programme plantait, en appuyant sur le bouton, je continuerais à monter, ce qui pourrait entraîner une surcharge du moteur, un glissement des vitesses ou même des dommages au mécanisme. La protection vous permet d'éviter ce problème.Enfin, la classe Cuckoo exécute le coucou chaque fois qu'une valeur de 59 minutes est remplacée par une valeur de 0 minute. Tout d'abord, le coucou est poussé à fond, puis le coucou une fois, reproduisant le son à travers le haut-parleur EV3, puis se cachant à nouveau dans le boîtier de la montre. Le mouvement est répété en fonction de l'heure actuelle - de 1 à 12 fois. Le son a été extrait de la bibliothèque gratuite FreeSound et modifié pour mieux sonner sur EV3. (Je ne peux pas dire que j'étais satisfait du résultat, car la basse est presque inaudible lorsque le marteau est frappé au printemps.)Le délai entre la commande de suppression du coucou et la commande de reproduction du son est sélectionné expérimentalement afin que le son soit entendu à peu près au moment où le coucou atteint sa position extrême. Cependant, ev3dev a un léger problème: à cause du chargement du système, le son est périodiquement en retard, surtout s'il y a une connexion SSH à l'horloge à ce moment. Le délai peut aller jusqu'à plusieurs secondes. Je ne sais pas si c'est un problème pour mon contrôleur, la construction elle-même ou les mises à jour reçues du réseau (après avoir installé ev3dev, j'ai utilisé par habitude la commande apt get upgrade, même si je n'aurais probablement pas dû le faire), mais en moyenne, le coucou semble normal, donc Je ne vais pas déboguer cette question.Soit dit en passant, un bug était lié au retard du son dans l'une des premières versions du programme, alors que je n'avais pas encore ajouté l'attente de la fin de la lecture: si le coucou a réussi à se cacher et à réapparaître pendant le temps de retard, le son suivant a été "avalé" et le nombre de "coucous" n'a pas correspondu nombre d'heures. Plus tard, j'ai modifié le programme pour que le coucou s'attende à ce que le son se termine dans la position extrême et qu'il ne soit ensuite parti que pour le cycle suivant.Les intervalles d'une demi-heure sont exprimés par un seul signal obtenu à partir du même son d'origine. Le coucou n'apparaît pas.La vitesse de rotation du moteur qui entraîne le coucou et l'angle de rotation sont cousus dans le programme. Au début du programme, le coucou est tiré dans le boîtier - compte tenu de l'engrenage coulissant installé sur l'axe du moteur, cette opération est sûre, mais elle a un effet si le coucou était en dehors du boîtier au moment du démarrage de l'horloge.Afin de ne pas gêner le sommeil, les coucous coucous ne se produisent que pendant la journée. Sa journée de travail commence à dix heures du matin et la dernière fois qu'elle s'exprime est minuit. J'ai également désactivé le coucou à un moment où j'ai des appels hebdomadaires sur Skype, afin de ne pas interférer.Le programme est installé en tant que service et démarre au démarrage de Debian. Ainsi, il suffit d’allumer l’horloge et ils font tout plus loin eux-mêmes. Le temps est pris sur Internet - dans mon EV3, il y a un dongle WiFi. Après le démarrage de l'horloge, je déconnecte généralement le réseau, afin de ne pas créer de charge supplémentaire sur le processeur.Le programme est disponible sous licence BSD. Si vous avez envie de construire un modèle similaire et d'utiliser mon logiciel, je n'en serai que content.