Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Squid Games Doll gebouwd met Arduino UNO

Componenten en benodigdheden

RGB diffuse gemeenschappelijke kathode
Ogen
× 2
SparkFun 7-segments serieel display - rood
Timer
× 1
Texas Instruments Shift Register- Parallel to Serial
4-cijferig 7-segments display
× 1
Alfanumeriek LCD-scherm, 16 x 2
Menuweergave
× 1
IR-ontvanger (algemeen)
Voor afstandsbediening
× 1
Arduino UNO
Het brein
× 1
SG90 Micro-servomotor
Draai de kop
× 1
PIR-bewegingssensor (algemeen)
Bewegingsdetectie
× 1
Ultrasone sensor - HC-SR04 (algemeen)
Afstandsdetectie voor winnen of verliezen
× 1
DFRobot DFPlayer - een mini-mp3-speler
Stem
× 1
Drukknop, tijdelijk
menuknoppen en de startknop
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Apps en online services

Arduino IDE

Over dit project

Bouwde een volledig functionele pop met inktvisspellen. Ze speelt het rood-licht-groen-licht-spel met jou. Compleet met draaiend hoofd, gekleurde ogen, en ze praat! Ze gebruikt ultrasone en bewegingsdetectie om te bepalen of je wint of verliest. Maar maak je geen zorgen, als je verliest, vraagt ​​ze gewoon of je nog een keer wilt spelen.

Bekijk de video en laat me weten wat je ervan vindt.

Ik gebruikte elke pin op de Arduino UNO! Wat ik nog nooit eerder heb gedaan, dus dit was een prestatie voor mezelf. Dit project kostte me 3 weken om te bouwen met 1 week volledig gewijd aan afdrukken! Het kostte me 6 dagen om deze pop af te drukken. 1 week voor de opbouw en nog een week om de video te monteren.

ELEGOO stuurde me een gratis UNO-kit als ik er een video van maak, daarom heb ik de pop gebouwd. Het was dit of een escape room bouwen. Ik ben blij dat ze voor dit project hebben gekozen. Ik hoop dat mensen ervan genieten, want het was een leuke build die er heel mooi uitzag en een heleboel mensen de stuipen op het lijf jaagde. Maar belangrijker nog, het werkt.

Hier zijn alle onderdelen die ik voor deze build zal gebruiken.

1. Begin met afdrukken

Het printen gaat lang duren. Het kostte me 6 dagen om de hele pop af te drukken. Ik heb ook filament in verschillende kleuren gebruikt, zodat ik de hoeveelheid verf kan verminderen.

Ik heb een model dat ik op thingiverse.com vond opnieuw gemixt, het midden uitgehold en toegangsgaten voor de elektronica toegevoegd. Ik heb ook de borstplaat aangepast om de Servo en Ultra Sonic te monteren.

2. Niemand houdt van schilderen

Tijd om te schilderen. Ik heb hiervoor generieke spuitverf gebruikt. Ik heb de binnenkant van het poppenhoofd geverfd (gemaskeerd voor de ogen) zodat de LED's voor de ogen niet het hele gezicht laten gloeien. Hoewel dit misschien het effect is waarnaar u op zoek bent. Ik wilde dat alleen de ogen zouden gloeien.

3. Magneten trekken aan, maar lijmen stokken

Een manier om alle ledematen van de pop te bevestigen, is door magneten in het plastic te smelten. Dit is als je haar uit elkaar wilt halen. Als ik dit project opnieuw zou doen, zou ik waarschijnlijk gewoon alle ledematen op haar lijmen. Zoals ik het nu zie, heeft het weinig voordeel om magneten te gebruiken, behalve dat ze in een kleinere doos passen als je dat wilt. Het enige dat u op dit punt niet moet bevestigen, is het hoofd.

4. Makkelijk voor de ogen

Begin met de gemakkelijkste stap, de ogen. Ik gebruikte driekleurige LED's voor de ogen. Zoals je weet, kun je RGB-kleuren mixen en matchen om elke gewenste basiskleur te krijgen. Ik bleef bij primaire en secundaire kleuren, zodat ik de signalen niet hoefde te PWMen. Maar dat kan als je daar naar op zoek bent.

De langste pin is de grond, dat wordt pin 2.

Sluit de LED aan zoals afgebeeld met 220ohm-weerstanden voor elke draad, behalve de aarde.

Voor montage heb ik de LED's eenvoudig zo dicht mogelijk bij het midden van de ogen gelijmd, maar aan de achterkant. Zorg ervoor dat de draad lang genoeg is om door de nek en in het onderste deel van haar lichaam te gaan.

5. LCD-menu

Het volgende gemakkelijkste onderdeel is het 16x2 LCD-scherm. U moet het LCD-scherm gebruiken met een I2C-adapter. Het zal je leven veel gemakkelijker maken en het aantal IO's verminderen van 6 naar 2. Zodra dit is aangesloten, zou het LCD-scherm moeten opstarten met "Welkom bij de inktvisspellen!" op het scherm.

Voor montage heb ik een cirkel van 1 mm dik uitgeprint. Ik maak dit dun zodat ik het met een warmtepistool naar de poppen kan vormen. Dit is veel gemakkelijker dan het uitzoeken van de contouren van haar rug (althans voor mij). Ik heb inzetstukken met schroefdraad voor het display geïnstalleerd met moeren aan de achterkant om het display en de displaymontage aan de behuizing te bevestigen.

6. Alleen uilenkoppen draaien 180 graden

De servo was om één belangrijke reden moeilijk, ik gebruik de servobibliotheek niet. Ik weet dat dat raar klinkt, maar ik moest de timer1 gebruiken voor de 4-cijferige display-update en de servobibliotheek gebruikt dit ook. Gelukkig is de servo 0 graden of 180 graden en er is geen tussenweg waardoor dit een stuk eenvoudiger wordt.

Timer1 is ingesteld voor intervallen van 5 ms, 2000 hz. De servoperiode is 20 ms. Bij 0 graden hoeft de pin maar 2 tellen hoog te zijn en de rest van de periode laag. Voor 180 graden moet de pin 4 tellen hoog zijn en de rest van de tijd laag.

Op de borstplaat zit een mooie bevestiging voor de servo. Je kunt het op zijn plaats schroeven of op zijn plaats lijmen. Ik heb epoxy gebruikt om de servo aan de borstplaat te bevestigen, omdat het ook kracht aan de borstplaat zal toevoegen en hopelijk schade zal voorkomen.

7. Klinkt als een vleermuis

Vervolgens zullen we de ultrasone afstandsmodule installeren. Ik heb deze update elke 250ms. Het heeft ook een mooie montageplaats op de borstplaat. Er zijn slechts 2 draden voor deze module.

Ik heb epoxy gebruikt om de ultrasone op de borstplaat te monteren.

8. Geen verplichtingen

De IR-sensor voor de afstandsbediening is alleen nodig als je het spel wilt besturen. Ik dacht dat dit leuk zou zijn, maar gebruik deze modus niet echt, automatisch spelen is leuk genoeg.

Ik koos ervoor om de IR-sensor in een clip op het haar van de pop te monteren. Je kunt er natuurlijk voor kiezen om hem ergens anders te plaatsen. Ik probeerde het te verbergen, maar misschien is er een betere plek omdat de IR de afstandsbediening niet altijd ziet als ze haar hoofd draait en de sensor aan de andere kant zit.

9. Tijd tot tijd

Vervolgens zullen we de timerweergave instellen. Dit is veel werk voor een 4-cijferig display. Ik zal het aansluitschema van ELEGOO toevoegen. Het spel duurt maar maximaal 5 minuten, dus ik heb ook het gebruik van het meest significante cijfer verwijderd. Maar je besluit om het te houden als je de IO-pin beschikbaar hebt. Om het display bij te werken, moet u de LED heel snel laten draaien, omdat u slechts één cijfer tegelijk actief kunt hebben. Dit is de reden waarom ze lijken te flikkeren wanneer ze door een camera worden bekeken. Ik gebruikte een verversingssnelheid van 2 ms die snel genoeg is dat je de flikkering niet kunt zien. Bij 5 ms kan ik het zien flikkeren als ik naar het scherm kijk in je perifere zicht. Daarnaast heeft u het schuifregister 74HC595 nodig.

Het monteren van het display wat niet leuk. Ik besloot dat het het beste was om het display in haar riem te integreren. De originele pop in Squid Games heeft natuurlijk geen riem, maar er moesten offers worden gebracht om deze weergave op haar te krijgen. Als u ook voor deze route kiest, maskeer dan een vierkant van dezelfde grootte als het scherm en knip het uit met een Dremel. Vervolgens heb ik epoxyplamuur gebruikt om een ​​geleidelijke overgang naar het scherm toe te voegen. Maar dit was niet nodig, ik vond het er gewoon beter uitzien op deze manier.

Ik heb de 74HC595 op het prototype schild gemonteerd, anders heb je overal draden. Een alternatieve oplossing is om een ​​ander timerdisplay te gebruiken dat gemakkelijker kan communiceren met minder pinnen.

10. Ik zag je bewegen

De bewegingsdetector is een raar mannetje. Dit ding gebruikt infrarood om beweging te detecteren. Een ding dat ik heb geleerd, is dat deze sensor tijd nodig heeft om op te warmen. Bij het opstarten heeft het 1 minuut nodig om op te warmen. Daarom is er een opstarttijd van 1 minuut voor de pop. Een andere ergernis met deze module is dat de snelste die een bewegingsdetectie kan updaten ongeveer 5 seconden is. De laatste ergernis is hoe gevoelig deze sensor is. Zelfs met de gevoeligheid helemaal naar beneden, kan hij nog steeds de kleinste bewegingen zien en soms bewegingen waarvan ik niet eens weet waar hij het over heeft. Om deze "false positives" te helpen voorkomen, heb ik de sensor in een paardenblinderkast gemonteerd. De doos heeft een klein gaatje (7 mm) waar de bewegingsmelder naar buiten kan kijken. Als bonus voorkom je hiermee dat je deze gigantische sensor aan de buitenkant van de pop moet monteren. De bewegingssensor heeft maar één binaire draad voor feedback, beweging of niet.

Om de sensor te monteren, heb ik de paardenblinder uitgeprint en aan de binnenkant van de pop geplakt. Ik heb toen een gat door het lichaam geboord. Ik heb een inzetstuk met schroefdraad op de blinderbox gebruikt om de bewegingssensor vast te zetten.

11. Druk niet op mijn knoppen

Eindelijk zijn we bij de knoppen. Als je de extra I/O-pinnen hebt, is het gemakkelijker om deze allemaal op een digitale ingang aan te sluiten. Maar die luxe had ik niet voor de UNO. In plaats daarvan moest ik een analoge ingang gebruiken om de weerstandswaarden te lezen om te bepalen op welke knop werd gedrukt. De waarden die ik gebruikte waren 1K, 2K en 5K. Toen had ik een weerstand van 220 Ohm om de analoge ingang laag te krijgen. Anders zal het zweven en willekeurig op de knop worden gedrukt.

Ik heb de knoppen op dezelfde montageplaat gemonteerd als het LCD-scherm. Dit was niet gemakkelijk, maar ik had geen betere manier. Door de draden op deze knoppen te solderen en ze vervolgens door kleine gaatjes te laten gaan die in het plastic zijn geboord, zullen uw patiënten worden getest.

12. Kun je me nu horen?

De laatste stap en waarschijnlijk de belangrijkste is de geluidsmodule. Dit gebruikt de seriële poort op de UNO, dus u moet weerstanden van 1K Ohm toevoegen aan de Tx- en Rx-pinnen, anders wordt u geblokkeerd voor het programmeren van de UNO nadat deze verbinding is gemaakt. Bovendien moet u de "busy"-pin gebruiken, zodat de UNO weet dat er al een geluid wordt afgespeeld. Dit is erg belangrijk als u mp3's achter elkaar afspeelt.

Ik heb de MP3-spelermodule op het prototype-schild gemonteerd. Dit schild maakt het monteren van dergelijke componenten erg handig omdat het dan gewoon in de UNO wordt gestoken. Deze module heeft een 8ohm speaker nodig en heeft een output van 3W. De luidspreker was gewoon vastgelijmd aan de basis van de pop. Ik heb kleine gaatjes onder de luidspreker geboord om het geluid beter tot zijn recht te laten komen.

13. Monteer de UNO

Installeer de UNO op het platform en steek het prototype schild op de UNO. Zorg ervoor dat je alle draden hebt gelabeld, anders weet je waarschijnlijk niet waar ze heen gaan. Met een beetje onderhandelen kun je de gemonteerde UNO in de pop krijgen met alle draden aangesloten.

Ik heb inzetstukken met schroefdraad gebruikt om het platform aan de onderkant van de pop te monteren.

14. Test fix-test

Dit is het moment waarop je je debug-hoed op mag zetten. Ik kan je vertellen dat de software op GitHub werkt, dus dat is in ieder geval een ding minder om te debuggen. Maar ga je gang als je twijfelt en stuur me alle updates die je vindt.

15. Laten we spelen

Tijd om haar uit te testen en een spelletje te spelen. Hier is hoe het spel is geprogrammeerd.

Bij het opstarten draait ze haar hoofd naar voren.

De bewegingssensor heeft een volle minuut nodig om op te starten. Er is dus een timer wanneer het begint. Halverwege giechelt ze en draait haar hoofd om. Dan kondigt ze aan wanneer ze klaar is.

Afhankelijk van of je het spel op afstandsbediening hebt ingesteld, zegt ze verschillende dingen. In de Auto-modus vraagt ​​ze je om op de afspeelknop te drukken. In mijn geval is dit de uiterst rechtse knop. In de modus op afstand zal ze je vragen om op de aan/uit-knop te drukken als je klaar bent. Druk vervolgens op de afspeelknop om naar rood licht of groen licht te schakelen.

Dus als je klaar bent, druk je op de go-knop en ze geeft je 10 seconden om op zijn plaats te komen. Gewoonlijk zal iemand anders in de buurt op deze knop drukken.

Dan begint het spel. Ze zal beginnen met Groen licht. Voor groen licht moet je binnen 50 cm komen om een ​​overwinning te activeren. Als je binnen 100 cm bent, zal ze zeggen dat je dichterbij komt. Groen licht gebruikt alleen de sonar.

Voor rood licht wordt de bewegingssensor en de afstandssensor gebruikt. Als je genoeg beweegt om de bewegingssensor te laten struikelen of als je meer dan 10 cm naar voren beweegt, verlies je het spel. Je verliest het spel ook als de tijd om is. Ze zal je eraan herinneren dat de tijd bijna om is met nog 5 seconden te gaan.

De laatste coole feature is dat ze ook in de Koreaanse stem zal spreken voor het rode licht. Dit is een menufunctie. Druk op de uiterst linkse knop om tussen het menu-item te schakelen en op de middelste knop om tussen de itemopties te schakelen.

16. Bekijk video

Deze video kostte me veel tijd om te bewerken. Ik heb waarschijnlijk 30 uur in het bewerken. Maar het was leuk om het te maken. Ik denk dat het goed uitkwam en grappig is, maar ik wil dat je het zelf ziet. Laat me weten wat je ervan vindt en als je vragen hebt.

https://youtu.be/jd_4a4x3uCw

Bedankt!

Code

  • Squid Game Doll Sketch
Squid Game Doll SketchC/C++
Dit regelt alle sensor- en spellogica.
/// CodeMakesItGo Dec 2021#include #include #include #include # include #include #include /*-----( Analoge pinnen)-----*/#define BUTTONS_IN A0#define SONAR_TRIG_PIN A1#define SONAR_ECHO_PIN A2 #define MOTION_IN A3/*-----( Digitale pinnen)-----*/#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 // IR Remote#define SERVO_OUT 3#define DFPLAYER_BUSY_IN 2/*------ Configuratie-*/- #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 // speel clip af met nog 5 seconden #define WIN_PROXIMITY_CM 50 // cm afstand voor w inner#define CLOSE_PROXIMITY_CM 100 // cm afstand voor bijna winnen#define GREEN_LIGHT_MS 3000 // 3 seconden aan voor groen licht#define RED_LIGHT_MS 5000 // 5 seconden aan voor groen licht#define WAIT_FOR_STOP_MOTION_MS 5000 // 5 seconden wachten op bewegingsdetectie om te stoppen/*-----( Globale variabelen)-----*/static unsigned int timer_1000ms =0;static unsigned int timer_2ms =0;static unsigned char digit =0; // cijfer voor 4 segment displaystatic int countDown =60; // Start 1 minuut aftellen bij opstartenstatic const int sonarVariance =10; // beweging detecteren indien groter dan dezestatic 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 niet-ondertekende tekens [] ={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 *Talen[] ={"English", "Koreaans"};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{ ZWART, ROOD, GROEN , BLAUW, WIT, GEEL, PAARS} EyeColors;EyeColors eyeColor =ZWART;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_,2quidCrysults; lcd // 16x2 LCD-scherm/*-----( Functies)-----*/void translateIR() // onderneemt actie op basis van ontvangen IR-code{ switch (irResults.value) { case 0xFFA25D:Serial.println( "STROOM"); if (gameState ==WACHT) { gameInPlay =true; } pauze; geval 0xFFE21D:Serial.println ("FUNC/STOP"); pauze; geval 0xFF629D:Serial.println ("VOL+"); pauze; case 0xFF22DD:Serial.println ("FAST BACK"); pauze; geval 0xFF02FD:Serial.println ("PAUZE"); remotePlay =!remotePlay; pauze; geval 0xFFC23D:Serial.println ("FAST FORWARD"); pauze; geval 0xFFE01F:Serial.println ("DOWN"); pauze; geval 0xFFA857:Serial.println ("VOL-"); pauze; geval 0xFF906F:Serial.println ("UP"); pauze; geval 0xFF9867:Serial.println ("EQ"); pauze; geval 0xFFB04F:Serial.println ("ST/REPT"); pauze; geval 0xFF6897:Serial.println ("0"); pauze; geval 0xFF30CF:Serial.println ("1"); pauze; geval 0xFF18E7:Serial.println ("2"); pauze; geval 0xFF7A85:Serial.println ("3"); pauze; geval 0xFF10EF:Serial.println ("4"); pauze; geval 0xFF38C7:Serial.println ("5"); pauze; geval 0xFF5AA5:Serial.println ("6"); pauze; geval 0xFF42BD:Serial.println ("7"); pauze; geval 0xFF4AB5:Serial.println ("8"); pauze; geval 0xFF52AD:Serial.println ("9"); pauze; geval 0xFFFFFFFF:Serial.println ("HERHALEN"); pauze; standaard:Serial.println ("andere knop "); }}bool isPlayingSound(){ return (digitalRead(DFPLAYER_BUSY_IN) ==LOW);}void updateTimeDisplay(unsigned char digit, unsigned char num){ digitalWrite(SEGMENT_LATCH, LOW); shiftOut (SEGMENT_DATA, SEGMENT_CLOCK, MSBFIRST, getallen [num]); // Actief LAAG digitalWrite (SEGMENT_1_OUT, cijfer ==1 ? LAAG:HOOG); digitalWrite (SEGMENT_2_OUT, cijfer ==2 ? LAAG:HOOG); digitalWrite (SEGMENT_3_OUT, cijfer ==3 ? LAAG:HOOG); digitalWrite(SEGMENT_LATCH, HIGH);}void updateServoPosition(){ static int servoPulseCount =0; statische bool lastPosition =false; // Krijg alleen een nieuwe waarde aan het begin van de periode als (servoPulseCount ==0) lastPosition =faceTree; if (!lastPosition) // 180 graden {digitalWrite(SERVO_OUT, servoPulseCount <5 ? HIGH:LOW); } else // 0 graden { digitalWrite (SERVO_OUT, servoPulseCount <1 ? HOOG:LAAG); } servoPulseCount =(servoPulseCount + 1) % 40; // Periode van 20 ms} ongeldige updateMenuDisplay (const int-knop) {static int menuItem =0; statisch int menuOption =0; schakelaar (knop) { geval 1:menuItem =(menuItem + 1) % MENUITEM_COUNT; if (menuItem ==TAAL) { menuOption =taal; } else if (menuItem ==SPEELTIJD) { menuOption =speeltijd; } else if (menuItem ==PLAYTYPE) { menuOption =playType; } else { menuOption =0; } pauze; geval 2:if (menuItem ==TAAL) { menuOption =(menuOption + 1) % LANUAGE_COUNT; taal =menuoptie; } else if (menuItem ==SPEELTIJD) { menuOption =(menuOption + 1) % PLAYTIME_COUNT; speeltijd =menuoptie; } else if (menuItem ==PLAYTYPE) { menuOption =(menuOption + 1) % PLAYTYPE_COUNT; playType =menuOption; } else { menuOption =0; } pauze; geval 3:if (gameState ==WACHT) { gameInPlay =true; } if (gameState ==GROENLICHT || gameState ==ROODLICHT) { gameInPlay =false; } standaard:breken; } 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; opbrengst; } 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

Schema's

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

Productieproces

  1. Maak Monitor Ambilight met Arduino
  2. Arduino Pong Game - OLED-scherm
  3. Human Detection Robotics System met Arduino Uno
  4. DIY voltmeter met Arduino en smartphone
  5. Hartslagmeter met IoT
  6. WebServerBlink met Arduino Uno WiFi
  7. Eenvoudige UNO-rekenmachine
  8. Sonar met arduino en weergave op verwerkings-IDE
  9. Persistentie van visie
  10. Arduino-trainingsplatform
  11. Bouw de Fridgeye-app met een Nextion-display