Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Construire une poupée Squid Games avec Arduino UNO

Composants et fournitures

Cathode commune diffuse RVB
Yeux
× 2
Affichage série 7 segments SparkFun - Rouge
Minuteur
× 1
Texas Instruments Shift Register - Parallèle à Série
Affichage à 4 chiffres et 7 segments
× 1
LCD alphanumérique, 16 x 2
Affichage du menu
× 1
Récepteur IR (générique)
Pour la télécommande
× 1
Arduino UNO
Les cerveaux
× 1
Micro-servomoteur SG90
Tournez la tête
× 1
Capteur de mouvement PIR (générique)
Détection de mouvement
× 1
Capteur à ultrasons - HC-SR04 (Générique)
Détection de distance pour gagner ou perdre
× 1
DFRobot DFPlayer - Un mini lecteur MP3
Voix
× 1
Bouton-poussoir, momentané
les boutons de menu et le bouton de démarrage
× 1

Outils et machines nécessaires

Imprimante 3D (générique)

Applications et services en ligne

Arduino IDE

À propos de ce projet

Construit une poupée de jeux de calmar entièrement fonctionnelle. Elle joue avec vous au jeu rouge-feu-vert. Complet avec tête rotative, yeux colorés, et elle parle ! Elle utilise des ultrasons et une détection de mouvement pour déterminer si vous gagnez ou perdez. Mais ne vous inquiétez pas, si vous perdez, elle vous demande simplement si vous voulez rejouer.

Regardez la vidéo et dites-moi ce que vous en pensez.

J'ai utilisé toutes les broches de l'Arduino UNO ! Ce que je n'avais jamais fait auparavant, c'était donc un exploit pour moi-même. Ce projet m'a pris 3 semaines à construire dont 1 semaine entièrement dédiée à l'impression ! Il m'a fallu 6 jours pour imprimer cette poupée. 1 semaine pour la construction et une autre semaine pour éditer la vidéo.

ELEGOO m'a envoyé un kit UNO gratuit si je leur fais une vidéo c'est pourquoi j'ai construit la poupée. C'était soit ça, soit construire une salle d'évasion. Je suis content qu'ils aient choisi ce projet. J'espère que les gens l'apprécieront parce que c'était une construction amusante qui est vraiment belle et qui fait peur à un tas de gens. Mais surtout, ça marche.

Voici toutes les pièces que je vais utiliser pour cette construction.

1. Lancer l'impression

L'impression va prendre beaucoup de temps. Il m'a fallu 6 jours pour imprimer la poupée entière. J'ai également utilisé des filaments de différentes couleurs afin de réduire la quantité de peinture.

J'ai remixé un modèle que j'ai trouvé sur thingverse.com, creusé le centre et ajouté des trous d'accès pour l'électronique. J'ai également modifié la plaque thoracique pour que le Servo et l'Ultra Sonic soient montés.

2. Personne n'aime la peinture

Il est temps de peindre. J'ai utilisé de la peinture en aérosol générique pour cela. J'ai peint l'intérieur de la tête de la poupée (masqué les yeux) afin que les LED pour les yeux ne fassent pas briller tout le visage. Bien que cela puisse être l'effet que vous recherchez. Je voulais juste que les yeux brillent.

3. Les aimants attirent mais la colle colle

Une façon d'attacher tous les membres de la poupée est de faire fondre des aimants dans le plastique. C'est si vous voulez pouvoir la démonter. Si je devais refaire ce projet, je collerais probablement tous les membres sur elle. Comme je le vois maintenant, il y a peu d'avantages à utiliser des aimants à part qu'elle peut tenir dans une boîte plus petite pour le stockage si vous le souhaitez. La seule chose que vous ne devez pas attacher est la tête à ce stade.

4. Douceur pour les yeux

Commencez par l'étape la plus simple, les yeux. J'ai utilisé des LED tricolores pour les yeux. Comme vous le savez, vous pouvez mélanger et assortir les couleurs RVB pour obtenir la couleur de base que vous souhaitez. Je suis resté avec des couleurs primaires et secondaires pour ne pas avoir à PWM les signaux. Mais vous pouvez si vous cherchez cela.

La broche la plus longue est le sol, ce sera la broche 2.

Connectez la LED comme illustré en utilisant des résistances de 220 ohms pour chaque fil en dehors de la terre.

Pour le montage, j'ai simplement collé à chaud les LED aussi près que possible du centre des yeux, mais à l'envers. Assurez-vous d'avoir un fil suffisamment long pour passer le long du cou et dans la partie inférieure de son corps.

5. Menu LCD

Le prochain composant le plus simple est l'écran LCD 16x2. Vous devez utiliser l'écran LCD avec un adaptateur I2C. Cela vous facilitera grandement la vie et réduira le nombre d'E/S de 6 à 2. Une fois connecté, l'écran LCD devrait démarrer avec "Welcome to the squid games!" à l'écran.

Pour le montage, j'ai imprimé un cercle de 1mm d'épaisseur. Je le rend fin pour pouvoir le mouler sur le dos des poupées avec un pistolet thermique. C'est beaucoup plus facile que de déterminer les contours de son dos (du moins pour moi). J'ai installé des inserts filetés pour l'écran avec des écrous au verso pour fixer l'écran et le support d'écran au corps.

6. Seules les têtes de chouette pivotent à 180 degrés

Le servo était difficile pour une raison principale, je n'utilise pas la bibliothèque de servos. Je sais que cela semble bizarre, mais j'ai dû utiliser le timer1 pour la mise à jour de l'affichage à 4 chiffres et la bibliothèque d'asservissement l'utilise également. Heureusement, le servo est soit à 0 degré, soit à 180 degrés et il n'y a pas d'intervalle pour rendre cela beaucoup plus facile.

Timer1 est configuré pour des intervalles de 5 ms, 2000 Hz. La période d'asservissement est de 20 ms. À 0 degré, la broche n'a besoin d'être élevée que pour 2 comptes et basse le reste de la période. Pour 180 degrés, la broche doit être haute pendant 4 temps et basse le reste du temps.

Il y a un joli support sur la plaque de poitrine pour le servo. Vous pouvez le visser ou le coller en place. J'ai utilisé de l'époxy pour fixer le servo à la plaque thoracique, car cela renforcera également la plaque thoracique et, espérons-le, l'empêchera de l'endommager.

7. On dirait une chauve-souris

Ensuite, nous allons installer le module de distance à ultrasons. J'ai cette mise à jour toutes les 250ms. Il a également un bel emplacement de montage sur la plaque thoracique. Il n'y a que 2 fils pour ce module.

J'ai utilisé de l'époxy pour monter l'ultrason sur la plaque thoracique.

8. Aucune condition

Le capteur infrarouge de la télécommande n'est nécessaire que si vous souhaitez contrôler le jeu. Je pensais que ce serait amusant, mais n'utilisez pas vraiment ce mode, le jeu automatique est assez amusant.

J'ai choisi de monter le capteur IR à l'intérieur d'un clip sur les cheveux de la poupée. Vous pouvez évidemment choisir de le placer ailleurs. J'essayais de le cacher mais peut-être qu'il y a un meilleur endroit parce que l'IR ne voit pas toujours la télécommande quand elle tourne la tête et que le capteur est de l'autre côté.

9. De temps en temps

Ensuite, nous allons configurer l'affichage de la minuterie. C'est beaucoup de travail pour un affichage à 4 chiffres. Je vais inclure le schéma de connexion d'ELEGOO. Le jeu ne dure que 5 minutes, j'ai donc également supprimé l'utilisation du chiffre le plus significatif. Mais vous décidez de le garder si vous avez la broche IO disponible. Pour mettre à jour l'affichage, vous devez faire défiler la LED très rapidement car vous ne pouvez avoir qu'un seul chiffre actif à la fois. C'est pourquoi ils semblent scintiller lorsqu'ils sont regardés à travers une caméra. J'ai utilisé un taux de rafraîchissement de 2 ms qui est suffisamment rapide pour que vous ne puissiez pas voir le scintillement. À 5 ms, je peux commencer à le voir scintiller en regardant l'affichage dans votre vision périphérique. De plus, vous aurez besoin du registre à décalage 74HC595.

Le montage de l'écran ce qui n'est pas amusant. J'ai décidé qu'il était préférable d'intégrer l'écran dans sa ceinture. La poupée originale de Squid Games n'a bien sûr pas de ceinture, mais des sacrifices ont dû être faits pour obtenir cet affichage sur elle. Si vous choisissez également cette voie, masquez un carré de la même taille que l'écran puis découpez avec un Dremel. J'ai ensuite utilisé du mastic époxy pour ajouter une transition progressive à l'affichage. Mais ce n'était pas nécessaire, je pensais juste que ça avait l'air mieux de cette façon.

J'ai monté le 74HC595 sur le prototype de blindage, sinon vous aurez des fils partout. Une solution alternative consiste à utiliser un affichage de minuterie différent qui a une communication plus pratique avec moins de broches.

10. Je t'ai vu bouger

Le détecteur de mouvement est un petit gars bizarre. Cette chose utilise l'infrarouge pour détecter le mouvement. Une chose que j'ai apprise est que ce capteur a besoin de temps pour se réchauffer. Au démarrage, il faut 1 minute pour se réchauffer. C'est pourquoi il y a un temps de démarrage de 1 minute pour la poupée. Un autre inconvénient avec ce module est que la mise à jour la plus rapide d'une détection de mouvement est d'environ 5 secondes. Le dernier inconvénient est la sensibilité de ce capteur. Même avec la sensibilité au minimum, il peut toujours voir le plus petit des mouvements et parfois des mouvements dont je ne sais même pas de quoi il parle. Pour aider à prévenir ces "faux positifs", j'ai monté le capteur à l'intérieur d'une boîte à oeillères pour chevaux. La boîte a un petit trou (7 mm) pour que le détecteur de mouvement puisse regarder. En bonus, cela vous évite d'avoir à monter ce capteur géant à l'extérieur de la poupée. Le capteur de mouvement n'a qu'un seul fil binaire pour le retour, mouvement ou non.

Pour monter le capteur, j'ai imprimé le blinder du cheval et je l'ai collé à l'intérieur de la poupée. J'ai ensuite percé un trou dans le corps. J'ai utilisé un insert fileté sur la boîte de blinder pour sécuriser le capteur de mouvement.

11. N'appuie pas sur mes boutons

Enfin, nous sommes aux boutons. Si vous disposez de broches d'E/S supplémentaires, il est plus facile de connecter chacune d'entre elles à une entrée numérique. Mais je n'avais pas ce luxe pour l'ONU. Au lieu de cela, j'ai dû utiliser une entrée analogique pour lire les valeurs de résistance afin de déterminer quel bouton était enfoncé. Les valeurs que j'ai utilisées étaient 1K, 2K et 5K. Ensuite, j'ai eu une résistance de 220 Ohm pour tirer l'entrée analogique vers le bas. Sinon, il flottera et obtiendra des pressions aléatoires sur les boutons.

J'ai monté les boutons sur la même plaque de montage que l'écran LCD. Ce n'était pas facile mais je n'avais pas de meilleur moyen. Souder les fils sur ces boutons puis les faire passer à travers de petits trous percés dans le plastique testera vos patients.

12. Pouvez-vous m'entendre maintenant ?

La dernière étape et probablement la plus importante est le module de sons. Cela utilisera le port série de l'UNO, vous devez donc ajouter des résistances de 1K Ohm aux broches Tx et Rx, sinon vous ne pourrez plus programmer l'UNO une fois cette connexion établie. De plus, vous devrez utiliser la broche "occupé" pour que l'UNO sache qu'un son est déjà en cours de lecture. Ceci est très important si vous avez des MP3 lus dos à dos.

J'ai monté le module lecteur MP3 sur le prototype de shield. Ce blindage rend le montage de composants comme celui-ci très pratique car il se branche ensuite simplement sur l'UNO. Ce module aura besoin d'un haut-parleur de 8 ohms et a une sortie de 3W. Le haut-parleur était juste collé à la base de la poupée. J'ai percé des petits trous sous le haut-parleur pour que le son sorte mieux.

13. Montez l'UNO

Installez l'UNO sur la plate-forme et branchez le prototype de bouclier sur l'UNO. Assurez-vous d'avoir étiqueté tous les fils, sinon vous ne savez probablement pas où ils vont maintenant. Avec un peu de négociation, vous pouvez obtenir l'UNO monté à l'intérieur de la poupée avec tous les fils connectés.

J'ai utilisé des inserts filetés pour monter la plate-forme au bas de la poupée.

14. Test de correction de test

C'est à ce moment-là que vous mettez votre chapeau de débogage. Je peux vous dire que le logiciel fonctionne sur GitHub, donc au moins c'est une chose de moins à déboguer. Mais allez-y quand même si vous avez des doutes et envoyez-moi toutes les mises à jour que vous trouvez.

15. Jouons

Il est temps de la tester et de jouer à un jeu. Voici comment le jeu est programmé.

Au démarrage, elle tourne la tête en avant.

Le détecteur de mouvement met une minute entière à démarrer. Il y a donc une minuterie quand il démarre. A mi-chemin, elle rit et tourne la tête. Puis annonce quand elle est prête.

Selon que le jeu est réglé sur télécommande, elle dit des choses différentes. En mode Auto, elle vous demande d'appuyer sur le bouton de lecture. Dans mon cas, c'est le bouton le plus à droite. En mode télécommande, elle vous demandera d'appuyer sur le bouton d'alimentation lorsque vous serez prêt. Appuyez ensuite sur le bouton de lecture pour basculer entre la lumière rouge ou la lumière verte.

Alors, lorsque vous êtes prêt, appuyez sur le bouton Go et elle vous donnera 10 secondes pour se mettre en place. Habituellement, quelqu'un d'autre à proximité appuiera sur ce bouton.

Puis le jeu commence. Elle commencera par le feu vert. Pour le feu vert, vous devez vous approcher à moins de 50 cm pour déclencher une victoire. Si vous êtes à moins de 100 cm, elle dira que vous vous rapprochez. Le voyant vert n'utilise que le sonar.

Pour la lumière rouge, le capteur de mouvement et le capteur de distance sont utilisés. Si vous bougez suffisamment pour que le détecteur de mouvement se déclenche ou si vous avancez de plus de 10 cm, vous perdrez la partie. Vous perdrez également le jeu si le temps s'écoule. Elle vous rappellera que le temps est presque écoulé à 5 secondes restantes.

La dernière fonctionnalité intéressante est qu'elle parlera également de la voix coréenne pour le feu rouge. Il s'agit d'une fonction de menu. Appuyez sur le bouton le plus à gauche pour basculer l'élément de menu et le bouton central pour basculer les options de l'élément.

16. Regarder la vidéo

Cette vidéo m'a pris beaucoup de temps à monter. J'ai probablement 30 heures juste pour le montage. Mais c'était amusant de le faire. Je pense que c'est bien sorti et c'est drôle, mais je veux que vous voyiez par vous-même. N'hésitez pas à me dire ce que vous en pensez et si vous avez des questions.

https://youtu.be/jd_4a4x3uCw

Merci !

Code

  • Croquis de poupée de jeu de calmar
Squid Game Doll SketchC/C++
Cela contrôlera tout le capteur et la logique du jeu.
/// CodeMakesItGo Dec 2021#include #include #include #include # include #include #include /*-----( Analog Pins )-----*/#define BUTTONS_IN A0#define SONAR_TRIG_PIN A1#define SONAR_ECHO_PIN A2 #define MOTION_IN A3/*-----( Digital Pins )-----*/#define LED_BLUE 13#define LED_GREEN 12#define LED_RED 11#define SEGMENT_DATA 10 // DS#define SEGMENT_CLOCK 9 // SHCP#define SEGMENT_LATCH 8 // STCP#define SEGMENT_1_OUT 7#define SEGMENT_2_OUT 6#define SEGMENT_3_OUT 5#define IR_DIGITAL_IN 4 // Télécommande IR#define SERVO_OUT 3#define DFPLAYER_BUSY_IN 2/*-----( Configuration )------ #define TIMER_FREQUENCY 2000#define TIMER_MATCH (int)(((16E+6) / (TIMER_FREQUENCY * 64.0)) - 1)#define TIMER_2MS ((TIMER_FREQUENCY / 1000) * 2)#define VOLUME 30 // 0-30#define BETTER_HURRY_S 5 // lecture du clip à 5 secondes restantes#define WIN_PROXIMITY_CM 50 // cm de distance pour w inner#define CLOSE_PROXIMITY_CM 100 // distance en cm pour près de gagner#define GREEN_LIGHT_MS 3000 // 3 secondes allumées pour la lumière verte#define RED_LIGHT_MS 5000 // 5 secondes allumées pour la lumière verte#define WAIT_FOR_STOP_MOTION_MS 5000 // 5 secondes pour attendre la détection de mouvement pour arrêter/*-----( Variables globales)-----*/static unsigned int timer_1000ms =0;static unsigned int timer_2ms =0;static unsigned char digit =0; // chiffre pour l'affichage statique à 4 segments int countDown =60; // Démarrer le compte à rebours de 1 minute au démarragestatic const int sonarVariance =10; // détecter le mouvement s'il est supérieur à thisstatic bool gameInPlay =false;static bool faceTree =false;static bool remotePlay =false;// 0 , 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B , C, D, E, F, NULLconst nombres de caractères non signés[] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x7900, 0x71, };const char *MenuItems[] ={"Language", "Play Time", "Play Type"};typedef enum{ LANGUAGE, PLAYTIME, PLAYTYPE, MENUITEM_COUNT} MenuItemTypes;const char *Languages[] ={"English", "Korean"};typedef enum{ ENGLISH, KOREAN, LANUAGE_COUNT} LanguageTypes;static int language =0;const char *PlayTime[] ={"300", "240", "180", "120", "60", "30", "15"};typedef enum{ PT300, PT240, PT180, PT120, PT60, PT30, PT15, PLAYTIME_COUNT} PlayTimeTypes;const int playTimes[] ={300, 240, 180, 120, 60, 30, 15 };static int playTime =0;const char *PlayType[] ={"Auto", "Remote"};typedef enum{ AUTO, REMOTE, PLAYTYPE_COUNT} PlayTypeTypes;static int playType =0;typedef enum{ NOIR, ROUGE, VERT , BLEU, BLANC, JAUNE, VIOLET} EyeColors;EyeColors eyeColor =BLACK;typedef enum{ WARMUP, WAIT, READY, GREENLIGHT, REDLIGHT, WIN, LOSE} GameStates;static GameStates gameState =WARMUP;/*-----( Class Objects )- ----*/FireTimer task_50ms;FireTimer task_250ms;DFPlayerMini_Fast dfPlayer;SR04 sonar =SR04(SONAR_ECHO_PIN, SONAR_TRIG_PIN);IRrecv irRecv(IR_DIGITAL_IN);decode_results irResults, 16Results; // Écran LCD 16x2/*-----( Functions )-----*/void translateIR() // prend des mesures en fonction du code IR reçu{ switch (irResults.value) { case 0xFFA25D:Serial.println( "PUISSANCE"); if (gameState ==WAIT) { gameInPlay =true; } Pause; case 0xFFE21D :Serial.println("FUNC/STOP"); Pause; case 0xFF629D :Serial.println("VOL+"); Pause; case 0xFF22DD :Serial.println("RETOUR RAPIDE"); Pause; case 0xFF02FD :Serial.println("PAUSE"); remotePlay =!remotePlay; Pause; case 0xFFC23D :Serial.println("FAST FORWARD"); Pause; case 0xFFE01F :Serial.println("DOWN"); Pause; case 0xFFA857 :Serial.println("VOL-"); Pause; case 0xFF906F :Serial.println("UP"); Pause; case 0xFF9867 :Serial.println("EQ"); Pause; case 0xFFB04F :Serial.println("ST/REPT"); Pause; case 0xFF6897 :Serial.println("0"); Pause; case 0xFF30CF :Serial.println("1"); Pause; case 0xFF18E7 :Serial.println("2"); Pause; case 0xFF7A85 :Serial.println("3"); Pause; case 0xFF10EF :Serial.println("4"); Pause; case 0xFF38C7 :Serial.println("5"); Pause; case 0xFF5AA5 :Serial.println("6"); Pause; case 0xFF42BD :Serial.println("7"); Pause; case 0xFF4AB5 :Serial.println("8"); Pause; case 0xFF52AD :Serial.println("9"); Pause; case 0xFFFFFFFF:Serial.println(" REPEAT"); Pause; par défaut :Serial.println(" autre bouton "); }}bool isPlayingSound(){ return (digitalRead(DFPLAYER_BUSY_IN) ==LOW);}void updateTimeDisplay(chiffre de caractère non signé, num de caractère non signé){ digitalWrite(SEGMENT_LATCH, LOW); shiftOut(SEGMENT_DATA, SEGMENT_CLOCK, MSBFIRST, nombres[num]); // Active LOW digitalWrite(SEGMENT_1_OUT, digit ==1 ? LOW :HIGH); digitalWrite(SEGMENT_2_OUT, digit ==2 ? LOW :HIGH); digitalWrite(SEGMENT_3_OUT, digit ==3 ? LOW :HIGH); digitalWrite(SEGMENT_LATCH, HIGH);}void updateServoPosition(){ static int servoPulseCount =0; static bool lastPosition =false; // N'obtient la nouvelle valeur qu'au début de la période if (servoPulseCount ==0) lastPosition =faceTree; if (!lastPosition) // 180 degrés { digitalWrite(SERVO_OUT, servoPulseCount <5 ? HIGH :LOW); } else // 0 degrés { digitalWrite(SERVO_OUT, servoPulseCount <1 ? HIGH :LOW); } servoPulseCount =(servoPulseCount + 1) % 40 ; // Période de 20 ms} void updateMenuDisplay(const int button){ static int menuItem =0; static int menuOption =0; switch (bouton) { cas 1 :menuItem =(menuItem + 1) % MENUITEM_COUNT; if (menuItem ==LANGUAGE) { menuOption =language; } else if (menuItem ==PLAYTIME) { menuOption =playTime; } else if (menuItem ==PLAYTYPE) { menuOption =playType; } else { optionmenu =0; } Pause; cas 2 :if (menuItem ==LANGUAGE) { menuOption =(menuOption + 1) % LANUAGE_COUNT; langue =optionmenu; } else if (menuItem ==PLAYTIME) { menuOption =(menuOption + 1) % PLAYTIME_COUNT; playTime =menuOption; } else if (menuItem ==PLAYTYPE) { menuOption =(menuOption + 1) % PLAYTYPE_COUNT; playType =menuOption; } else { optionmenu =0; } Pause; cas 3 :if (gameState ==WAIT) { gameInPlay =true; } if (gameState ==GREENLIGHT || gameState ==REDLIGHT) { gameInPlay =false; } par défaut :pause ; } if (menuOption !=-1) { lcdDisplay.clear(); lcdDisplay.setCursor(0, 0); lcdDisplay.print(MenuItems[menuItem]); lcdDisplay.setCursor(0, 1); if (menuItem ==LANGUAGE) { lcdDisplay.print(Languages[menuOption]); } else if (menuItem ==PLAYTIME) { lcdDisplay.print(PlayTime[menuOption]); } else if (menuItem ==PLAYTYPE) { lcdDisplay.print(PlayType[menuOption]); } else { lcdDisplay.print("unknown option"); } } else { menuItem =0; menuOption =0; }}void handleButtons(){ static int buttonPressed =0; int value =analogRead(BUTTONS_IN); if (value <600) // buttons released { if (buttonPressed !=0) updateMenuDisplay(buttonPressed); buttonPressed =0; return; } else if (value <700) { Serial.println("button 1"); buttonPressed =1; } else if (value <900) { Serial.println("button 2"); buttonPressed =2; } else if (value <1000) { Serial.println("button 3"); buttonPressed =3; } else { Serial.println(value); buttonPressed =0; }}static int lastSonarValue =0;void handleSonar(){ int value =sonar.Distance(); if (value> lastSonarValue + sonarVariance || value  30000 || sequence ==0) { internalTimer =millis(); if(playType ==AUTO) { // press the go button when you are ready Serial.println("Press the go button when you are ready"); dfPlayer.playFolder(1, 5); } else { Serial.println("Press the power button on the remote when you are ready"); dfPlayer.playFolder(1, 6); } // eyes are blue eyeColor =BLUE; // facing players faceTree =false; gameInPlay =false; sequence++; } } else if (gameState ==READY) { currentTimer =millis(); if (sequence ==0) { // get in position, game will start in 10 seconds Serial.println("Get in position."); dfPlayer.playFolder(1, 7); countDown =10; // eyes are green eyeColor =WHITE; // facing players faceTree =false; sequence++; internalTimer =millis(); } else if (sequence ==1) { if (playType ==REMOTE) { if (remotePlay) sequence++; } else sequence++; } else if (sequence ==2) { // at 0 seconds, here we go! if (countDown ==0) { countDown =playTimes[playTime]; Serial.print("play time set to "); Serial.println(countDown); Serial.println("Here we go!"); dfPlayer.playFolder(1, 8); gameState =GREENLIGHT; sequence =0; } } } else if (gameState ==GREENLIGHT) { currentTimer =millis(); if (sequence ==0) { // eyes are green eyeColor =GREEN; // play green light Serial.println("Green Light!"); dfPlayer.playFolder(1, 9); sequence++; } else if(sequence ==1) { // play motor sound dfPlayer.playFolder(1, 19); // facing tree faceTree =true; sequence++; internalTimer =millis(); } else if (sequence ==2) { // wait 3 seconds or until remote // switch to red light if (playType ==AUTO &¤tTimer - internalTimer> GREEN_LIGHT_MS) { sequence =0; gameState =REDLIGHT; } else if (playType ==REMOTE &&remotePlay ==false) { sequence =0; gameState =REDLIGHT; } else { // look for winner button or distance if (gameInPlay ==false || lastSonarValue  WAIT_FOR_STOP_MOTION_MS) { internalTimer =millis(); sequence++; Serial.println("Done settling"); } Serial.println("Waiting to settle"); } else if (sequence ==3) { // back to green after 5 seconds if (playType ==AUTO &¤tTimer - internalTimer> RED_LIGHT_MS) { sequence =0; gameState =GREENLIGHT; } else if (playType ==REMOTE &&remotePlay ==true) { sequence =0; gameState =GREENLIGHT; } else { // can't push the button while red light // detect movement // detect distance change if (gameInPlay ==false || lastMotion ==1 || lastSonarValue  
Project files
All of the files for this buildhttps://github.com/CodeMakesItGo/SquidGamesDoll

Schémas

This is how I connected all of the components to the UNO.
The project repo
All of the files for this build are stored here. https://github.com/CodeMakesItGo/SquidGamesDoll

Processus de fabrication

  1. Créer un moniteur Ambilight à l'aide d'Arduino
  2. Jeu Arduino Pong - Écran OLED
  3. Système robotique de détection humaine utilisant Arduino Uno
  4. Voltmètre DIY utilisant Arduino et Smartphone
  5. Moniteur de fréquence cardiaque utilisant l'IoT
  6. WebServerBlink avec Arduino Uno WiFi
  7. Calculatrice UNO simple
  8. Sonar utilisant arduino et affichage lors du traitement de l'IDE
  9. Persistance de la vision