Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membuat Boneka Permainan Squid menggunakan Arduino UNO

Komponen dan persediaan

Katoda Umum Difusi RGB
Mata
× 2
Tampilan Serial 7-Segmen SparkFun - Merah
Pengatur waktu
× 1
Texas Instruments Shift Register- Parallel to Serial
4 digit tampilan 7 segmen
× 1
LCD alfanumerik, 16 x 2
Tampilan menu
× 1
Penerima IR (generik)
Untuk kendali jarak jauh
× 1
Arduino UNO
Otak
× 1
Motor servo mikro SG90
Memutar kepala
× 1
Sensor Gerak PIR (generik)
Deteksi gerakan
× 1
Sensor Ultrasonik - HC-SR04 (Generik)
Deteksi jarak untuk menang atau kalah
× 1
DFRobot DFPlayer - Pemutar MP3 Mini
Suara
× 1
Sakelar Tombol Tekan, Sesaat
tombol menu dan tombol mulai
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Membangun boneka permainan cumi-cumi yang berfungsi penuh. Dia memainkan permainan lampu merah-lampu-hijau-dengan Anda. Lengkap dengan kepala berputar, mata berwarna, dan dia berbicara! Dia menggunakan ultra-sonik dan deteksi gerakan untuk menentukan apakah Anda menang atau kalah. Tapi jangan khawatir, jika Anda kalah, dia hanya bertanya apakah Anda ingin bermain lagi.

Tonton videonya dan beri tahu saya pendapat Anda.

Saya menggunakan setiap pin di Arduino UNO! Yang belum pernah saya lakukan sebelumnya jadi ini adalah pencapaian untuk diri saya sendiri. Proyek ini membutuhkan waktu 3 minggu untuk saya buat dengan 1 minggu didedikasikan sepenuhnya untuk pencetakan! Butuh waktu 6 hari untuk mencetak boneka ini. 1 minggu untuk pembuatan dan seminggu lagi untuk mengedit video.

ELEGOO mengirimi saya kit UNO gratis jika saya membuatnya menjadi video, jadi inilah alasan saya membuat boneka itu. Entah ini atau membangun ruang pelarian. Saya senang mereka memilih proyek ini. Saya harap orang-orang menyukainya karena itu adalah build yang menyenangkan yang terlihat sangat bagus dan membuat banyak orang merinding. Tetapi yang lebih penting, itu berhasil.

Berikut adalah semua bagian yang akan saya gunakan untuk build ini.

1. Mulai Mencetak

Pencetakan akan memakan waktu lama. Butuh waktu 6 hari untuk mencetak seluruh boneka. Saya juga menggunakan filamen warna yang berbeda sehingga saya dapat mengurangi jumlah lukisan.

Saya me-remix model yang saya temukan di thingiverse.com, melubangi bagian tengahnya, dan menambahkan lubang akses untuk elektronik. Saya juga memodifikasi pelat dada untuk Servo dan Ultra Sonic yang akan dipasang.

2. Tidak ada yang suka melukis

Waktu untuk melukis. Saya menggunakan cat semprot generik untuk ini. Saya mengecat bagian dalam kepala boneka (menutupi mata) sehingga LED untuk mata tidak membuat seluruh wajah bersinar. Meskipun ini mungkin efek yang Anda cari. Saya hanya ingin matanya bersinar.

3. Magnet tarik menarik tapi lem menempel

Salah satu cara untuk menempelkan semua anggota badan boneka adalah dengan melelehkan magnet ke dalam plastik. Ini jika Anda ingin dapat memisahkannya. Jika saya melakukan proyek ini lagi, saya mungkin hanya akan menempelkan semua anggota badan padanya. Seperti yang saya lihat sekarang, ada sedikit keuntungan menggunakan magnet selain dia bisa masuk ke dalam kotak yang lebih kecil untuk penyimpanan jika Anda mau. Satu-satunya hal yang tidak boleh Anda pasang adalah kepala pada saat ini.

4. Nyaman di mata

Mulailah dengan langkah termudah, mata. Saya menggunakan LED tiga warna untuk mata. Seperti yang Anda ketahui, Anda dapat mencampur dan mencocokkan warna RGB untuk mendapatkan warna dasar apa pun yang Anda inginkan. Saya terjebak dengan warna primer dan sekunder sehingga saya tidak perlu PWM sinyal. Tapi Anda bisa jika Anda mencarinya.

Pin terpanjang adalah ground, yang akan menjadi pin 2.

Hubungkan LED seperti yang digambarkan dengan menggunakan resistor 220ohm untuk setiap kabel selain dari ground.

Untuk pemasangan, saya cukup menempelkan LED sedekat mungkin dengan pusat mata tetapi di sisi sebaliknya. Pastikan kabel yang cukup panjang untuk melewati leher dan ke bagian bawah tubuhnya.

5. Menu LCD

Komponen termudah berikutnya adalah layar LCD 16x2. Anda harus menggunakan layar LCD dengan adaptor I2C. Ini akan membuat hidup Anda lebih mudah dan mengurangi jumlah IO dari 6 menjadi 2. Setelah ini terhubung, LCD akan memulai dengan "Selamat datang di game cumi-cumi!" di layar.

Untuk pemasangan, saya mencetak lingkaran setebal 1mm. Saya membuat ini tipis sehingga saya bisa membentuknya kembali ke boneka dengan senapan panas. Ini jauh lebih mudah daripada mencari tahu kontur punggungnya (setidaknya untuk saya). Saya memasang sisipan berulir untuk layar dengan mur di sisi belakang untuk mengamankan layar dan dudukan layar ke bodi.

6. Hanya kepala burung hantu yang berputar 180 derajat

Servo sulit karena satu alasan utama, saya tidak menggunakan perpustakaan servo. Saya tahu kedengarannya aneh tetapi saya harus menggunakan timer1 untuk pembaruan tampilan 4 digit dan perpustakaan servo juga menggunakan ini. Untungnya, servo adalah 0 derajat atau 180 derajat dan tidak ada di antara yang membuat ini jauh lebih mudah.

Timer1 diatur untuk interval .5ms, 2000hz. Periode servo adalah 20 ms. Pada 0 derajat pin hanya perlu tinggi untuk 2 hitungan dan rendah selama sisa periode. Untuk 180 derajat pin harus tinggi untuk 4 hitungan dan rendah di sisa waktu.

Ada dudukan yang bagus di pelat dada untuk servo. Anda dapat memasangnya pada tempatnya atau merekatkannya pada tempatnya. Saya menggunakan epoksi untuk mengamankan servo ke pelat dada karena itu juga akan menambah kekuatan pada pelat dada dan mudah-mudahan mencegahnya dari kerusakan.

7. Kedengarannya seperti kelelawar

Selanjutnya kita akan memasang modul ultra sonic distance. Saya memiliki pembaruan ini setiap 250ms. Ini juga memiliki lokasi pemasangan yang bagus di pelat dada. Hanya ada 2 kabel untuk modul ini.

Saya menggunakan epoksi untuk memasang ultra sonic ke pelat dada.

8. Tanpa pamrih

Sensor IR untuk remote hanya diperlukan jika Anda ingin mengontrol permainan. Saya pikir ini akan menyenangkan tetapi tidak benar-benar menggunakan mode ini, bermain game otomatis cukup menyenangkan.

Saya memilih untuk memasang sensor IR di dalam klip di rambut boneka itu. Anda jelas dapat memilih untuk menempatkannya di tempat lain. Saya mencoba untuk menyembunyikannya tetapi mungkin ada tempat yang lebih baik karena IR tidak selalu melihat remote ketika dia memutar kepalanya dan sensor berada di sisi lain.

9. Dari Waktu ke Waktu

Selanjutnya kita akan mengatur tampilan timer. Ini banyak pekerjaan untuk tampilan 4 digit. Saya akan menyertakan diagram koneksi dari ELEGOO. Main gamenya hanya sampai 5 menit jadi saya juga menghilangkan penggunaan angka yang paling signifikan. Tetapi Anda memutuskan untuk menyimpannya jika Anda memiliki pin IO yang tersedia. Untuk memperbarui tampilan, Anda harus memutar LED dengan sangat cepat karena Anda hanya dapat mengaktifkan satu digit pada satu waktu. Inilah sebabnya mengapa mereka tampak berkedip ketika dilihat melalui kamera. Saya menggunakan kecepatan refresh 2ms yang cukup cepat sehingga Anda tidak dapat melihat kedipan. Pada 5ms saya bisa mulai melihatnya berkedip ketika melihat tampilan di penglihatan tepi Anda. Selain itu, Anda akan memerlukan register geser 74HC595.

Memasang tampilan apa yang tidak menyenangkan. Saya memutuskan yang terbaik adalah mengintegrasikan tampilan ke ikat pinggangnya. Boneka asli di Squid Games tentu saja tidak memiliki sabuk, tetapi pengorbanan harus dilakukan untuk mendapatkan tampilan ini pada dirinya. Jika Anda memilih rute ini juga, tutupi kotak dengan ukuran tampilan yang sama lalu potong dengan Dremel. Saya kemudian menggunakan dempul epoksi untuk menambahkan transisi bertahap ke tampilan. Tapi ini tidak diperlukan, saya hanya berpikir itu terlihat lebih baik dengan cara ini.

Saya memasang 74HC595 ke pelindung prototipe, jika tidak, Anda akan memiliki kabel di semua tempat. Solusi alternatif adalah dengan menggunakan tampilan pengatur waktu yang berbeda yang memiliki komunikasi yang lebih nyaman dengan pin yang lebih sedikit.

10. Aku melihatmu bergerak

Detektor gerakan adalah pria kecil yang aneh. Benda ini menggunakan infra merah untuk mendeteksi gerakan. Satu hal yang saya pelajari adalah bahwa sensor ini membutuhkan waktu untuk pemanasan. Saat startup perlu 1 menit untuk pemanasan. Itulah mengapa ada waktu startup 1 menit untuk boneka itu. Gangguan lain dengan modul ini adalah bahwa yang tercepat dapat memperbarui deteksi gerakan adalah sekitar 5 detik. Gangguan terakhir adalah seberapa sensitif sensor ini. Bahkan dengan sensitivitas yang diturunkan sepenuhnya, ia masih dapat melihat gerakan terkecil dan terkadang gerakan yang bahkan saya tidak tahu apa yang dibicarakannya. Untuk membantu mencegah "positif palsu" ini, saya memasang sensor di dalam kotak penutup mata kuda. Kotak itu memiliki lubang kecil (7mm) agar detektor gerakan dapat melihat keluar. Sebagai bonus, ini mencegah Anda dari keharusan memasang sensor raksasa ini di bagian luar boneka. Sensor gerak hanya memiliki satu kawat biner untuk umpan balik, gerak atau tidak.

Untuk memasang sensor, saya mencetak penutup mata kuda dan menempelkannya ke bagian dalam boneka. Saya kemudian mengebor lubang melalui tubuh. Saya menggunakan sisipan berulir pada kotak penutup mata untuk mengamankan sensor gerak.

11. Jangan tekan tombol saya

Akhirnya, kita berada di tombol. Jika Anda memiliki pin I/O tambahan, akan lebih mudah untuk menghubungkan masing-masing pin tersebut ke input digital. Tapi saya tidak memiliki kemewahan ini untuk UNO. Sebaliknya saya harus menggunakan input analog untuk membaca nilai resistor untuk menentukan tombol mana yang sedang ditekan. Nilai yang saya gunakan adalah, 1K, 2K, dan 5K. Kemudian saya memiliki resistor 220 Ohm untuk menarik input analog rendah. Kalau tidak, itu akan mengapung dan mendapatkan penekanan tombol acak.

Saya memasang tombol pada pelat pemasangan yang sama dengan LCD. Ini tidak mudah tetapi saya tidak memiliki cara yang lebih baik. Menyolder kabel ke tombol-tombol ini kemudian membuatnya melewati lubang kecil yang dibor di plastik akan menguji pasien Anda.

12. Bisakah Anda mendengar saya sekarang?

Langkah terakhir dan mungkin yang paling penting adalah modul suara. Ini akan menggunakan port serial pada UNO sehingga Anda harus menambahkan resistor 1K Ohm ke pin Tx dan Rx jika tidak, Anda akan diblokir dari pemrograman UNO setelah koneksi ini dibuat. Selain itu, Anda perlu menggunakan pin "sibuk" agar UNO mengetahui bahwa sebuah suara sedang diputar. Ini sangat penting jika Anda memutar MP3 secara berurutan.

Saya memasang modul pemutar MP3 pada pelindung prototipe. Perisai ini membuat pemasangan komponen seperti ini sangat nyaman karena tinggal dicolokkan ke UNO. Modul ini akan membutuhkan speaker 8ohm dan memiliki output 3W. Speaker hanya direkatkan ke dasar boneka. Saya mengebor lubang kecil di bawah speaker agar suaranya keluar lebih baik.

13. Pasang UNO

Pasang UNO ke platform dan pasang pelindung prototipe ke UNO. Pastikan Anda telah memberi label pada semua kabel, jika tidak, Anda mungkin tidak tahu ke mana perginya sekarang. Dengan sedikit negosiasi, Anda bisa mendapatkan UNO yang terpasang di dalam boneka dengan semua kabel terhubung.

Saya menggunakan sisipan berulir untuk memasang platform ke bagian bawah boneka.

14. Uji Perbaiki Uji

Ini adalah saat Anda harus mengenakan topi debug Anda. Saya dapat memberi tahu Anda bahwa perangkat lunak ini berfungsi di GitHub jadi setidaknya itu adalah satu hal yang kurang untuk di-debug. Tapi tetap lanjutkan jika Anda ragu dan kirimi saya pembaruan yang Anda temukan.

15. Ayo bermain

Saatnya untuk mengujinya dan bermain game. Inilah cara permainan diprogram.

Saat startup, dia menoleh ke depan.

Sensor gerak membutuhkan satu menit penuh untuk memulai. Jadi ada timer ketika dimulai. Setengah jalan dia terkikik dan memutar kepalanya. Kemudian mengumumkan ketika dia siap.

Bergantung pada apakah Anda mengatur permainan ke jarak jauh, dia mengatakan hal yang berbeda. Dalam mode Otomatis dia meminta Anda untuk menekan tombol putar. Dalam kasus saya, ini adalah tombol paling kanan. In remote mode she will ask you to press the power button when you are ready. Then press the play button to toggle to red light or green light.

So when you are ready, press the go button and she will give you 10 seconds to get in place. Usually someone else nearby will press this button.

Then the game begins. She will start with Green light. For green light you have to get within 50cm to trigger a win. If you are within 100cm she will say indicate that you are getting closer. Green light is only using the sonar.

For red light the motion sensor and the distance sensor is being used. If you move enough for the motion sensor to trip or if you move more than 10cm forward, you will loose the game. You will also loose the game if time runs out. She will remind you that time is almost out at 5 seconds left.

The last cool feature is that she will also speak in the Korean voice for the red light. This is a menu feature. Press the far left button to toggle the menu item, and the center button to toggle the item options.

16. Watch Video

This video took me a long time to edit. I have probably 30 hours in just editing. But it was fun making it. I think it came out good and is funny but want you to see for yourself. Please let me know what you think and if you have any questions.

https://youtu.be/jd_4a4x3uCw

Thank You!

Code

  • Squid Game Doll Sketch
Squid Game Doll SketchC/C++
This will control all of the sensor and the game logic.
/// 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 // IR Remote#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 // play clip at 5 seconds left#define WIN_PROXIMITY_CM 50 // cm distance for winner#define CLOSE_PROXIMITY_CM 100 // cm distance for close to winning#define GREEN_LIGHT_MS 3000 // 3 seconds on for green light#define RED_LIGHT_MS 5000 // 5 seconds on for green light#define WAIT_FOR_STOP_MOTION_MS 5000 // 5 seconds to wait for motion detection to stop/*-----( Global Variables )-----*/static unsigned int timer_1000ms =0;static unsigned int timer_2ms =0;static unsigned char digit =0; // digit for 4 segment displaystatic int countDown =60; // Start 1 minute countdown on startupstatic const int sonarVariance =10; // detect movement if greater than 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 unsigned char numbers[] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};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{ BLACK, RED, GREEN, BLUE, WHITE, YELLOW, PURPLE} 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;LiquidCrystal_I2C lcdDisplay(0x27, 16, 2); // 16x2 LCD display/*-----( Functions )-----*/void translateIR() // takes action based on IR code received{ switch (irResults.value) { case 0xFFA25D:Serial.println("POWER"); if (gameState ==WAIT) { gameInPlay =true; } break; case 0xFFE21D:Serial.println("FUNC/STOP"); break; case 0xFF629D:Serial.println("VOL+"); break; case 0xFF22DD:Serial.println("FAST BACK"); break; case 0xFF02FD:Serial.println("PAUSE"); remotePlay =!remotePlay; break; case 0xFFC23D:Serial.println("FAST FORWARD"); break; case 0xFFE01F:Serial.println("DOWN"); break; case 0xFFA857:Serial.println("VOL-"); break; case 0xFF906F:Serial.println("UP"); break; case 0xFF9867:Serial.println("EQ"); break; case 0xFFB04F:Serial.println("ST/REPT"); break; case 0xFF6897:Serial.println("0"); break; case 0xFF30CF:Serial.println("1"); break; case 0xFF18E7:Serial.println("2"); break; case 0xFF7A85:Serial.println("3"); break; case 0xFF10EF:Serial.println("4"); break; case 0xFF38C7:Serial.println("5"); break; case 0xFF5AA5:Serial.println("6"); break; case 0xFF42BD:Serial.println("7"); break; case 0xFF4AB5:Serial.println("8"); break; case 0xFF52AD:Serial.println("9"); break; case 0xFFFFFFFF:Serial.println(" REPEAT"); break; default:Serial.println(" other button "); }}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, numbers[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; // Only get new value at start of period if (servoPulseCount ==0) lastPosition =faceTree; if (!lastPosition) // 180 degrees { digitalWrite(SERVO_OUT, servoPulseCount <5 ? HIGH :LOW); } else // 0 degrees { digitalWrite(SERVO_OUT, servoPulseCount <1 ? HIGH :LOW); } servoPulseCount =(servoPulseCount + 1) % 40; // 20ms period}void updateMenuDisplay(const int button){ static int menuItem =0; static int menuOption =0; switch (button) { case 1:menuItem =(menuItem + 1) % MENUITEM_COUNT; if (menuItem ==LANGUAGE) { menuOption =language; } else if (menuItem ==PLAYTIME) { menuOption =playTime; } else if (menuItem ==PLAYTYPE) { menuOption =playType; } else { menuOption =0; } break; case 2:if (menuItem ==LANGUAGE) { menuOption =(menuOption + 1) % LANUAGE_COUNT; language =menuOption; } else if (menuItem ==PLAYTIME) { menuOption =(menuOption + 1) % PLAYTIME_COUNT; playTime =menuOption; } else if (menuItem ==PLAYTYPE) { menuOption =(menuOption + 1) % PLAYTYPE_COUNT; playType =menuOption; } else { menuOption =0; } break; case 3:if (gameState ==WAIT) { gameInPlay =true; } if (gameState ==GREENLIGHT || gameState ==REDLIGHT) { gameInPlay =false; } default:break; } 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

Schematics

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

Proses manufaktur

  1. Membuat Monitor Ambilight Menggunakan Arduino
  2. Game Arduino Pong - Tampilan OLED
  3. Sistem Robotika Deteksi Manusia Menggunakan Arduino Uno
  4. Voltmeter DIY Menggunakan Arduino dan Smartphone
  5. Pemantau Detak Jantung Menggunakan IoT
  6. WebServerBlink Menggunakan Arduino Uno WiFi
  7. Kalkulator UNO sederhana
  8. Sonar menggunakan arduino dan ditampilkan pada pemrosesan IDE
  9. Kegigihan Visi
  10. Platform Pelatihan Arduino