MacGyvering le défi de corde à sauter Mario Odyssey

Super Mario Odyssey est probablement mon jeu Mario préféré. À tel point que j'ai fait tout mon possible pour relever chaque dernier défi. Mais l'un d'eux m'a posé plus de problèmes que tous les autres réunis: Jump-Rope Genius dans le royaume métropolitain.

Vous n'avez même pas besoin de bouger. Il vous suffit de sauter avec succès 100 fois de suite. Mais le truc est que tous les cinq sauts, il accélère jusqu'à 50, jusqu'à ce que vous sautiez presque deux fois par seconde. Appuyez sur saut trop tôt et vous échouez. Appuyez sur saut trop tard et vous échouez. Appuyez sur saut trop longtemps et… vous l'avez deviné, vous échouez.

Après quelques dizaines de tentatives infructueuses, j'ai commencé à plaisanter en disant que je construisais juste quelque chose pour le battre pour moi ... et au fil des jours et que je n'avais toujours pas terminé le défi, ma blague est devenue plus sérieuse et j'ai commencé à me demander comment faire fais le.

Ma première pensée a été simplement de programmer un Arduino pour relier les connecteurs du bouton de saut sur un contrôleur Switch, mais heureusement, j'ai d'abord vérifié le démontage iFixit car les contrôleurs Nintendo depuis la Wii utilisent des commutateurs à dôme au lieu des tampons en caoutchouc conducteurs, ce qui rend cela impossible (pour une lecture amusante, voyez l'évolution des contrôleurs Nintendo au fil des ans).

J'étais mentalement ballotté entre l'achat d'un ancien contrôleur GameCube (avec adaptateur) qui serait facile à pirater, ou l'utilisation d'un solénoïde pour appuyer physiquement sur un bouton d'un contrôleur Switch, les deux semblaient être des solutions viables, mais après avoir été surenchéri sur les premiers. Contrôleurs GameCube vendant sur eBay, je me suis installé sur la route du solénoïde.

Après avoir terminé 835 des 836 défis uniques de Mario, j'ai reporté toute mon attention sur la dernière lune. Afin de programmer quelque chose pour le battre, je devais d'abord mesurer le timing, donc mon intention était d'enregistrer l'écran et de compter les images. Avant d'installer une caméra, j'ai mis quelques séances d'entraînement et, à ma grande horreur, j'ai battu la chose légitimement.

Ayant passé deux semaines à dire à tout le monde que je savais que j'allais programmer quelque chose pour le battre (et que la plupart d'entre eux se moquent) de perdre l'excuse de le faire était assez décevant.

Cependant, étant adulte, j'ai réalisé que je n'avais pas vraiment besoin d'une excuse pour perdre mon temps et mon argent (c'est à peu près tout ce que nous faisons), alors express a commandé un Arduino et les composants nécessaires pour démarrer mon projet.

La première étape a été de trouver comment utiliser un Arduino, ce qui… était assez simple en fait, l'éditeur en ligne et les tutoriels sont super faciles, et après avoir programmé quelques LED clignotantes, je me suis senti prêt à partir. Le plus gros obstacle était de trouver un câble USB-B, car honnêtement, qui les utilise encore?

La deuxième étape consistait à déterminer le timing, et je me suis rendu la tâche extrêmement difficile. Je pensais que j'étais intelligent en enregistrant à partir de la vue de dessus et que je pouvais utiliser le pied de la femme pour aligner les images, quand sa main touchait son pied, j'appellerais ça une révolution, et j'ai minutieusement parcouru QuickTime en appuyant sur les touches fléchées pour faire un pas. image par image et en comptant un, deux, trois… soixante-huit, soixante-neuf, soixante-dix .

La deuxième étape et demie consistait à réaliser que le nombre de sauts était une mesure plus fiable et que Final Cut Pro me montrerait le temps et le nombre d'images, me permettant de parcourir très rapidement la vidéo.

Faites ceci 50 fois… et mettez tous les résultats dans une feuille de calcul et vous avez le secret du succès de Jump-Rope. Ces 50 derniers sauts? Vous devez en faire une toutes les 0,58 secondes.

Une fois les chronométrages terminés, j'ai tourné mon attention vers la moitié électronique du problème, et heureusement, quelqu'un qui comprend l'électronique (je ne le sais certainement pas) avait déjà partagé comment contrôler un solénoïde avec un Arduino.

Pour ceux qui ne le savent pas, un solénoïde n'est en réalité qu'une bobine cylindrique de fil qui, lorsque vous faites passer un courant, produit un champ magnétique. Le nom est interchangeable avec quelques choses qui utilisent des solénoïdes (la partie bobine) pour faire quelque chose de plus complexe, dans ce cas, poussez une petite tige métallique. Allumez l'alimentation et la tige pousse, éteignez-la et le ressort la recule.

J'ai câblé un circuit avec un simple interrupteur et un solénoïde, et j'ai écrit un programme qui ferait une boucle et le déclencherait, raccourcissant progressivement le timing au fur et à mesure qu'il progressait. Le basculement de l'interrupteur déclencherait la boucle, le désactiver la réinitialiserait.

Cela me permettrait de lancer manuellement Mario en position et de basculer l'interrupteur pour démarrer, et me donnerait également un moyen facile de réessayer si je gâchais (ce que je prévoyais serait souvent). Après quelques heures (et quelques conseils de mon frère) j'avais un circuit de travail!

À ce stade, j'avais essentiellement supposé le succès, puis la réalité a commencé (ou plutôt m'a donné un coup de pied). Dans ma naïveté, j'avais supposé que le solénoïde serait capable d'appuyer de manière triviale sur un bouton Switch, celui que j'ai acheté était un solénoïde 5V capable de bouger de 3 mm et d'appliquer 80 grammes de force, cela semblait beaucoup (c'est en fait moins d'un simple newton).

Je l'ai tenu contre le contrôleur et… rien. Aucun mouvement, le bouton a refusé le bougé. Rechercher sur Google la force nécessaire pour appuyer sur un contrôleur Switch n'a donné aucun résultat, et dans ma maison, je n'avais pas de bons outils pour le mesurer.

Donc, sans bons outils, je suis parti à la recherche de mauvais.

Et les mesures de cuisson? J'ai rempli 1/3 de tasse d'eau et équilibré cela au-dessus d'un bouton, aucun mouvement. J'ai rempli 1/2 tasse d'eau et ça a déprimé. Voilà donc votre réponse, un bouton Joy-Con a besoin entre un tiers et une demi-tasse d'eau.

En les transformant en unités réelles, 1 tasse = 250 ml et la chose facile à propos du système métrique est que le poids est dérivé du volume d'eau. 250 ml font 250 grammes, donc mon Joy-Con avait besoin entre 83 grammes et 125 grammes pour déprimer.

Soudain, mon solénoïde de 80 grammes ne semblait pas si sous-alimenté, et si je… le maîtrisais? Je lui donnais les 5 volts qu'il demandait, mais j'avais une alimentation 9 volts. La force magnétique d'un solénoïde augmente avec la tension (en fait elle monte avec le carré de la tension) donc à 9 volts mon solénoïde devrait s'appliquer plus près de 250 grammes, ou comme j'aime à y penser, 1 tasse d'eau!

La quatrième étape consistait à attacher le solénoïde au contrôleur. Compte tenu du peu de réflexion que j'avais consacrée à la planification de cette partie, il n'était pas surprenant de constater à quel point la solution s'est avérée inélégante. Quelques morceaux de bois le soulevaient au-dessus des autres boutons, quelques morceaux de ruban isolant maintenaient le bois en place et un élastique maintenait le solénoïde en place.

J'étais enfin prêt à tout mettre à l'épreuve, je me suis dirigé vers le royaume métropolitain, j'ai relevé le défi et je me suis préparé à profiter de la douce gloire de mon succès suffisant.

Et presque immédiatement échoué… Mon timing était faux. J'ai modifié manuellement quelques-uns des horaires de mon code et j'ai rapproché Mario, de nouveau et de plus près encore, jusqu'à ce qu'il puisse atteindre de manière assez fiable 86.

À ce stade, au lieu de modifier au hasard les choses, je l'ai enregistré en cours de lecture et je suis retourné à Final Cut Pro pour raconter les images (cette fois en me concentrant sur le nombre d'images plus proches / plus éloignées de la corde par segment de 5 sauts), et pendant que j'étais un peu en retrait à quelques endroits, comme Mario atteignait toujours 50 ans, la seule chose à changer était le timing 50+. Je l'ai réduit à un saut toutes les 35,2 images et j'ai réessayé.

Succès! 261 sauts. Cela ressemblait à une énorme victoire, vous pouvez voir dans la vidéo qu'elle a facilement battu mon maigre effort humain de 102 sauts. Je suis immédiatement allé réveiller ma femme et j'ai essayé d'expliquer à quel point c'était cool, et quand cela ne m'a pas fait beaucoup d'adulation, j'ai eu recours à mon frère qui était beaucoup plus impressionné.

Cependant, c'est un robot, pourquoi 261 devrait-il être une limite? Pourquoi cela ne peut-il pas être parfait? J'ai analysé à nouveau les cadres et j'ai remarqué que la corde rattrapait Mario très lentement, il avait besoin d'aller plus vite!

La réduction du timing d'un saut toutes les 35,2 images à une toutes les 35,15 images (un changement de seulement 0,14%) a abouti à un Mario beaucoup plus réussi.

Un tel succès qu'il a pu jouer le défi exaspérant Mario Jump-Rope pendant 35 minutes et 21 secondes avant d'échouer… établissant un nouveau score élevé (pour moi) de 3613.

Au début, j'ai supposé que cela avait échoué parce que mon timing était encore imperceptiblement décalé, mais en regardant de plus près la vidéo, elle est restée parfaitement synchronisée jusqu'à ce qu'elle ... longtemps appuyée! Quelle erreur humaine pour un ordinateur à faire, au lieu de faire un petit saut rapide il a tenu le bouton trop longtemps et a envoyé Mario trop haut, il a sauté au bon moment mais a atterri en retard.

En réalité, je pense que c'était que le mauvais solénoïde surchauffait, plus tôt dans la nuit, alors que je jouais avec des timings, il avait également cessé de fonctionner, je pense que le conduire à presque deux fois la tension était problématique. Dans la vidéo, vous pouvez même voir qu'il a appuyé une deuxième fois pendant le saut au bon moment.

Quant au code? C'était la partie la plus simple. À peine 76 lignes de code peuvent jouer à Mario mieux que moi

Pour simplifier, j'ai mesuré tous les temps en combien d'images entre les sauts, je pouvais facilement compter les images dans la vidéo, puis diviser simplement par 60 pour transformer cela en secondes.

Le code calcule tout en utilisant l'estime à l'estime à partir du moment où le défi a commencé, j'ai supposé que les imprécisions dans le déclenchement d'un seul saut seraient en moyenne. À chaque boucle, le code calcule le nombre de millisecondes qui se sont écoulées avant le prochain saut et si ce seuil est atteint active le solénoïde; il y a une courte durée pendant laquelle le solénoïde reste allumé avant la réinitialisation (il fallait peut-être qu'il soit plus court pour éviter une pression longue).

Et c'est tout… presque stupidement simple, à juste titre, étant donné la nature du défi de saut d'obstacles.

Je pourrais réessayer, mais à près de 40 minutes par tentative, je ne suis tout simplement pas assez intéressé. De plus, j'ai découvert depuis que quelqu'un a fait un pas de mieux que moi, bien que dans une direction légèrement différente.

Au lieu d'appuyer physiquement sur un bouton de leur contrôleur, ils utilisent une bibliothèque pour simuler le fait d'être un contrôleur leur permettant d'envoyer des signaux de manière triviale. Quand ils ont rencontré le même défi de chronométrage que moi (obtenir seulement quelques centaines de sauts avant d'échouer - ils utilisaient la constante 35.18 pour leurs derniers sauts), ils ont résolu cela en surveillant par programme le signal vidéo, en vérifiant la région de score et quand elle change. faire un autre saut. Avec cette méthode, ils peuvent atteindre le score maximum de 99 999!

Vous penseriez avec tout cela que j'aurais l'un des scores les plus élevés du jeu ... vous vous trompez! Il y a à peine une semaine, je serais probablement dans le top 100, mais un bogue a été découvert dans le jeu qui permet à n'importe qui de relever ce défi, pour presque aucun effort, vous pouvez obtenir des sauts illimités et plus de 10000 personnes l'ont maintenant fait. Peut-être que si Nintendo corrige cela et réinitialise le tableau de score, je dépoussiérerai à nouveau mon solénoïde, je pense que si vous pouvez construire quelque chose pour jouer au jeu en utilisant uniquement le contrôleur lui-même, alors c'est un peu légitime.