Je l'ai fait avec toio! Tomo no Kai (non officiel) présidait, M. Kato a postulé pour TMMF2020 et a gagné! , Je participerai également à cause de la relation. Tokyo Maker Faire a participé en tant qu'invité à plusieurs reprises, mais c'est sur cette histoire que je voulais exposer un jour! (Vers la fin janvier 2020), cela doit sauter.
Cliquez ici pour la deuxième partie
Bien que nous ayons pu exposer, nous n'avions pas décidé quoi publier. Quant au matériel que j'ai, je l'ai fait avec toio! Tomo no Kai (Unofficial) annoncé lors de la réunion LT "toio de Bundodo »,« Passer àio 3 fois plus vite », mais je souhaite quand même créer du nouveau matériel. Cependant, puisque c'est la première fois que nous exposons, il n'y a rien de mal à essayer trop techniquement et à échouer, ou si ce n'est pas terminé à la journée. J'ai donc décidé de penser avec le concept suivant.
En particulier, la commande de contrôle du moteur pour spécifier les coordonnées de la valeur cible de la nouvelle fonction ne nécessite pas le contrôle de la rotation du moteur tout en surveillant en permanence la position du tapis côté hôte comme par le passé, donc la quantité de communication BLE entre le cube core toio et l'hôte On peut s'attendre à ce qu'il soit réduit. Dans un environnement tel que Maker Faire, où la communication sans fil sur la bande 2,4 GHz est susceptible d'être encombrée, cela contribue à un fonctionnement stable et, surtout, améliore la durée de vie de la batterie.
Je voulais que cela ressemble à un jeu pour les enfants, j'ai donc décidé de le rendre aussi simple que de tirer sur un cube de base toio en mouvement avec quelque chose comme une arme à feu et de le vaincre. Mettez quelque chose comme -like
Étant donné que la configuration de l'appareil est BLE intégrée en tant que machine hôte, Raspberry Pi 3B (ci-après abrégé en RasPi) est utilisé, RasPi et le PC portable sont directement connectés par LAN câblé, une adresse IP fixe est attribuée et tera du côté du PC portable. On suppose que le programme est démarré et terminé en se connectant avec ssh à partir de term etc. J'aurais pu attacher quelque chose comme un bouton de démarrage au RasPi pour l'exécuter, mais comme il y aurait divers problèmes, je me suis simplement connecté et j'ai laissé un humain exécuter le programme. De plus, RasPi est équipé d'un haut-parleur pHat pour la sortie d'effet sonore et d'un module LCD2USB pour afficher le score et l'état.
Quoi qu'il en soit, [[Commande de contrôle du moteur pour spécifier les coordonnées de la valeur cible](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B] ajouté dans le firmware de toio core cube ver.2 % AE% E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF Regardons% E3% 83% BC% E5% 88% B6% E5% BE% A1). Selon les spécifications, il existe les deux types suivants.
Cette fois, le cube principal de toio cible est un mouvement fugitif (en tant que mouvement, [Galaga](https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%] A9% E3% 82% AC), [GAPLUS](https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%97%E3%83%A9% E3% 82% B9) Je voulais faire le mouvement jusqu'à la formation de la formation immédiatement après le début du jeu), donc le deuxième "[Spécifiez plusieurs coordonnées cibles Type de contrôle moteur 0x04](https: //toio.github. io / toio-spec / docs / ble_motor #% E8% A4% 87% E6% 95% B0% E7% 9B% AE% E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB % 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% 83% BC% E5% 88% B6% E5% BE% A1) "est plus adapté à l'utilisation Cela semble convenir. Il semble se déplacer en cousant plusieurs coordonnées cibles dans l'ordre.
"[Plusieurs coordonnées cibles ont spécifié le type de commande de moteur 0x04](https://toio.github.io/toio-spec/docs/ble_motor#%E8%A4%87%E6%95%B0%E7%9B%AE%" E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% Afin de confirmer le mouvement réel de "83% BC% E5% 88% B6% E5% BE% A1)", je l'ai fait avec toio! Tomo no Kai (non officiel) bibliothèque python tomotoio utilisée dans la démo de la réunion LT (tomotoio / tree / master / tomotoio) est légèrement modifié pour pouvoir sortir des paquets de contrôle moteur de type 0x04.
tomotoio/cube.Ajouter une méthode comme celle-ci à la classe Cube de py
def setMotor4(self, ctrlid: int, goals, writemode:int, timeout: int = 0, movingtype: int = 0, maxspeed: int = 0, speedtype: int =0):
Le nom est "setMotor4 ()" sans aucune torsion. Eh bien, tout ce que vous avez à faire est de spécifier plusieurs positions de destination (x, y, Θ) pour les objectifs et de les encoder dans un paquet de contrôle moteur 0x04 et de l'envoyer. "[Plusieurs coordonnées cibles ont spécifié le type de commande de moteur 0x04](https://toio.github.io/toio-spec/docs/ble_motor#%E8%A4%87%E6%95%B0%E7%9B%AE%" E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% Selon "83% BC% E5% 88% B6% E5% BE% A1)", il est possible de spécifier jusqu'à 29 positions cibles, donc si vous pouvez spécifier autant de positions, vous pouvez le déplacer dans une trajectoire compliquée. est.
Puisqu'il est possible de spécifier plusieurs positions, il est nécessaire de créer un tableau de positions pour se déplacer le long de cette position. Cependant, il n'y a pas de moyen élégant de calculer mathématiquement toutes les positions d'une orbite compliquée (j'ai sauté les mathématiques ...), donc les humains spécifient les positions à la main. J'ai écrit un script qui lit les coordonnées lorsque le cube core toio est fermement appuyé sur le tapis et que le bouton du bas est allumé, l'envoie du côté hôte, enregistre les coordonnées dans l'ordre du côté hôte, puis le vide dans le texte. Utilisez-le pour prendre quelques coordonnées des points sur l'orbite que vous souhaitez déplacer. Cette fois, je prévois de déplacer les deux cubes core toio en même temps pour m'échapper, mais je vais créer manuellement une trajectoire où les deux cubes core toio sont susceptibles de se heurter et de ne pas entrer en collision.
Répartissez quelques coordonnées en fonction de la trajectoire que vous souhaitez déplacer. Si vous spécifiez de déplacer tout en changeant de direction au lieu de passer à la suivante après avoir changé de direction, la trajectoire ne sera pas linéaire mais sera courbée dans une certaine mesure.J'ai mis le tableau de coordonnées créé dans setMotor4 () et j'ai essayé de le déplacer, mais cela ne fonctionne pas. Je me suis demandé pourquoi, et quand il s'agissait d'une communication RasPi (raspbian) BLE, la taille standard de MTU était de 23 octets et la charge utile réelle n'était que de 20 octets. Il s'est avéré que la cause ne semble pas être faite. Selon le système, il semble que la taille MTU de BLE puisse être augmentée pour communiquer avec une longueur dépassant 23 octets, mais même si j'ai essayé diverses choses avec RasPi, c'était complètement inutile. Nous n'avons pas beaucoup de temps pour la mise en ligne, nous allons donc renoncer à augmenter la taille de MTU et passer à quelque chose que nous pouvons faire avec 20 octets. Dans la plage de 20 octets, seuls 2 ensembles de coordonnées de destination peuvent être saisis. Heureusement, notifier les mouches lorsque le cube principal toio atteint les coordonnées cibles, et c'était une spécification que des coordonnées de destination supplémentaires peuvent être empilées même en se déplaçant.
Je l'ai implémenté de cette manière. Avec cela, nous avons pu réaliser le mouvement de couture de plusieurs coordonnées successives. Après cela, tout en plaçant le tableau de coordonnées collectées plus tôt et en déplaçant réellement le cube de base toio, ajustez les paramètres de la valeur de vitesse et du type de vitesse (comme l'augmentation progressive de la vitesse) afin qu'il se déplace comme ça.
Je tire sur le cube cible toio core, mais je pensais que les trois suivants pourraient être utilisés comme jugement de frappe.
En premier lieu, je n'ai pas décidé pourquoi tirer sur le cube core toio (la cible ci-dessus), mais en quelque sorte nerf, [Rubber gun](https: / /www.amazon.co.jp/gp/product/B07PJPBGDL/), Pistolet à air Je pensais vaguement Cependant, le dessin de l'espace d'exposition a été divulgué (2020/1/24), et quand je l'ai regardé, c'était une table d'une largeur de 180 cm et d'une profondeur de 45 cm. Il est très petit car d'autres personnes seront également exposées. Il s'avère qu'il n'y a presque aucune distance à tirer. Puisque vous tirerez de près, le nerf est trop puissant et si vous le touchez, la cible faite avec Lego sera disjointe, donc inutile. Le pistolet à air de type cylindre est plus difficile à viser que ce à quoi je m'attendais et il est très gênant car il s'agit d'un seul coup. En conséquence, j'ai décidé d'utiliser un pistolet en caoutchouc à anneau continu.
Lorsque j'ai essayé la détection de collision, la détection horizontale et la détection de posture du capteur de mouvement tout en tirant avec le pistolet en caoutchouc à anneau, le cube de noyau toio n'est pas tombé au point que le caoutchouc de l'anneau a frappé. Par conséquent, la détection de la posture n'est pas adoptée. Testez si la vibration autour de l'anneau en caoutchouc peut être discriminée par détection de collision et détection horizontale. Nous avons ajusté le seuil d'angle pour la détection horizontale et le seuil pour la détection de collision de diverses manières, et finalement nous avons décidé de n'utiliser que la détection de collision. Cependant, il a été constaté que cette valeur de seuil change en fonction du poids de ce qui est placé sur le cube core toio, il était donc nécessaire de définir une valeur correspondant à la cible. De plus, avec cette méthode, il y a un problème: même si les cubes de base toio entrent en collision les uns avec les autres, cela sera jugé comme un coup, mais il est difficile de contrôler la trajectoire pour qu'ils ne se heurtent pas, donc cette fois je vais fermer les yeux. Je l'ai fait.
J'avais l'intention de faire une cible avec LEGO, mais il est inutile de la rendre trop grande, donc à cause de mes pensées, LEGO Minecraft % B4-LEGO-30393-% E3% 83% 9E% E3% 82% A4% E3% 83% B3% E3% 82% AF% E3% 83% A9% E3% 83% 95% E3% 83% 88- % E3% 82% B9% E3% 83% 86% E3% 82% A3% E3% 83% BC% E3% 83% 96% E3% 81% A8% E3% 82% AF% E3% 83% AA% E3 % 83% 83% E3% 83% 91% E3% 83% BC / dp / B07NDXJNPH / ref = pd_aw_sbs_21_1 / 356-7905405-7675543? _Encoding = UTF8 & pd_rd_i = B07NDXJNPH & pd_rd2_r2-b07NDXJNPH & pd_rd2_r2-5c44-bb-44-bb-7 = bff3a3a6-0f6e-4187-bd60-25e75d4c1c8f & pf_rd_r = BSHJKFDE63WHGZ46HVZM & psc = 1 & refRID = BSHJKFDE63WHGZ46HVZM]) a été adopté. Vous pouvez ajouter une histoire pour vaincre les plantes grimpantes qui courent, et l'idée est qu'elle sera populaire auprès des élèves du primaire.
Puisque la cible a été décidée, ajustez le seuil de détection d'impact en fonction du poids et ajustez la vitesse pour qu'elle accélère ou décélère en se déplaçant le long de la trajectoire selon l'agencement des coordonnées. Si vous vous arrêtez ou changez de direction trop brusquement, cela sera traité comme un choc et ce sera un «coup», alors ajustez-le à une vitesse modérée. Aussi, quand il est "frappé", il exprime qu'il frappe en tournant pendant quelques secondes. Pendant ce temps, nous avons ajouté des mesures ad hoc telles que l'empêcher d'être traité comme un «coup» même s'il frappe à nouveau.
Je voulais créer un effet sonore en frappant, donc j'avais à portée de main [Speaker pHat] de Pimoroni (https://www.switch-science.com/catalog/3219/), donc je l'ai incorporé dans RasPi J'ai essayé de le faire sonner. Sélectionnez la source sonore sur le site de matériel gratuit "Sound effect lab" et sélectionnez le son sonore "Boyoyon". J'ai utilisé pygame pour la lecture sur python. ("Lire et lire du son avec Pygame")
Quand c'est devenu un "hit", je voulais ajouter la partition et afficher la partition quelque part, mais je pensais que ce serait ennuyeux de connecter un écran HDMI normalement, alors je l'ai eu à Tokyo Maker Faire PIXOO J'ai essayé de l'afficher, mais j'ai abandonné car je ne pouvais pas accéder au contrôle de RasPi avec Bluetooth. Il m'est arrivé d'avoir un module LCD d'affichage de caractères avec des spécifications LCD2USB, donc je l'ai changé pour l'afficher à la place. Eh bien, en production, le joueur n'a pas du tout vu le score, mais c'était pratique pour moi de commencer / terminer le script et de voir le statut.
USB port 1602 LCD Module for Pi (LCD2USB) Bibliothèque Python pour LCD2USB https://pypi.org/project/lcd2usb/
Bien qu'il soit proche de viser la cible pour se déplacer, j'ai pensé que ce serait difficile pour les jeunes enfants, j'ai donc décidé de créer un mode simple. La cible doit être stationnaire, et quand elle frappe, elle exprime "frappé" puis se déplace rapidement vers un autre endroit et s'arrête.
[](http://www.youtube.com/watch ? v = OX2hYu_99j0)
Il se termine lorsque vous le frappez plusieurs fois.
La cible se déplace dès que le jeu commence. Il suit une trajectoire fixe, mais à première vue, on a l'impression de s'enfuir au hasard. Des points seront ajoutés lorsque l'anneau en caoutchouc frappera, et cela se terminera lorsque tous les modèles de mouvement prédéterminés auront été exécutés.
[](http://www.youtube.com/watch?v=Su- xKABGDyg)
J'avais l'intention d'ajuster la position et la vitesse des orbites de chacun des deux cubes core toio afin qu'ils ne se heurtent pas, mais si l'un d'eux s'arrêtait en état de frappe, le timing de fonctionnement changerait et une collision se produirait quelque part. Il y a des moments, mais j'ai décidé de ne pas m'en soucier.
Chaque jeu relancera le script à chaque fois. Tout en regardant l'âge du client, choisissez s'il est facile ou un peu compliqué de commencer.
J'ai fait divers ajustements et j'ai réussi à le faire fonctionner le 2/14 la veille de la production.
Continuation vers Partie 2
Recommended Posts