Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Сборка Squid Games Doll с использованием Arduino UNO

Компоненты и расходные материалы

Общий катод, рассеянный RGB
Глаза
× 2
7-сегментный последовательный дисплей SparkFun - красный
Таймер
× 1
Регистр сдвига Texas Instruments - параллельно последовательному
4-значный 7-сегментный дисплей
× 1
Буквенно-цифровой ЖК-дисплей, 16 x 2
Отображение меню
× 1
ИК-приемник (общий)
Для удаленного управления
× 1
Arduino UNO
Мозги
× 1
Микро-серводвигатель SG90
Поверните голову
× 1
Датчик движения PIR (общий)
Обнаружение движения
× 1
Ультразвуковой датчик - HC-SR04 (общий)
Определение расстояния для выигрыша или проигрыша
× 1
DFRobot DFPlayer - мини-MP3-плеер
Голос
× 1
Кнопочный переключатель, мгновенный
кнопки меню и кнопка запуска
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Создал полностью функциональную куклу для игр с кальмарами. Она играет с вами в игру "красный-зеленый-свет". В комплекте с вращающейся головой, цветными глазами, и она говорит! Она использует ультразвуковое обнаружение и обнаружение движения, чтобы определить, выиграете вы или проиграете. Но не волнуйтесь, если вы проиграете, она просто спросит, не хотите ли вы сыграть снова.

Посмотрите видео и поделитесь своим мнением.

Я использовал все булавки на Arduino UNO! Чего я никогда раньше не делал, так что это было достижением для меня. На создание этого проекта у меня ушло 3 недели, из них 1 неделя была полностью посвящена печати! На печать этой куклы у меня ушло 6 дней. 1 неделя на сборку и еще неделя на монтаж видео.

ELEGOO прислал мне бесплатный комплект UNO, если я сделаю для них видео, поэтому я построил куклу. Либо это, либо построить квест. Я счастлив, что они выбрали этот проект. Я надеюсь, что людям это понравится, потому что это была забавная сборка, которая выглядела очень красиво и привлекала внимание многих людей. Но что более важно, это работает.

Вот все детали, которые я буду использовать для этой сборки.

1. Начните печать

Печать займет много времени. На распечатку всей куклы у меня ушло 6 дней. Я также использовал нить накаливания разного цвета, чтобы уменьшить объем рисования.

Я переделал модель, которую нашел на сайте thingiverse.com, выдолбил центр и добавил отверстия для доступа к электронике. Я также модифицировал нагрудную пластину для установки Servo и Ultra Sonic.

2. Никто не любит рисовать

Время рисовать. Я использовал для этого обычную аэрозольную краску. Я закрасила голову куклы изнутри (замаскировала глаза), чтобы светодиоды для глаз не заставляли светиться все лицо. Хотя, возможно, это именно тот эффект, который вы ищете. Я хотел, чтобы светились только глаза.

3. Магниты притягиваются, но клеят стержни

Один из способов прикрепить все конечности куклы - это расплавить магниты в пластике. Это если вы хотите разобрать ее. Если бы я снова занялся этим проектом, я бы, вероятно, просто приклеил бы к ней все конечности. Насколько я понимаю сейчас, использование магнитов не имеет большого преимущества, кроме того, что она может поместиться в меньшую коробку для хранения, если вы хотите. Единственное, чего вы не должны прикреплять, так это голову на этом этапе.

4. Не раздражает глаза

Начните с самого простого шага - с глаз. Для глаз я использовал трехцветные светодиоды. Как вы знаете, вы можете смешивать и сочетать цвета RGB, чтобы получить любой базовый цвет, который вам нужен. Я придерживался основных и дополнительных цветов, поэтому мне не пришлось использовать ШИМ-сигналы. Но вы можете, если вы этого ищете.

Самый длинный вывод - это земля, это будет вывод 2.

Подключите светодиод, как показано на рисунке, используя резисторы 220 Ом для каждого вывода в стороне от земли.

Для монтажа я просто приклеил светодиоды как можно ближе к центру глаз, но с обратной стороны. Убедитесь, что проволока достаточно длинна, чтобы пройти вниз по шее в нижнюю часть ее тела.

5. ЖК-меню

Следующим по простоте компонентом является ЖК-экран 16x2. Вы должны использовать ЖК-экран с адаптером I2C. Это значительно упростит вашу жизнь и сократит количество операций ввода-вывода с 6 до 2. После подключения на ЖК-дисплее должно появиться сообщение «Добро пожаловать в игры Squid!» на дисплее.

Для монтажа распечатал круг толщиной 1мм. Я делаю его тонким, чтобы можно было прилепить его к спине куклы с помощью теплового пистолета. Это намного проще, чем разобраться с контурами ее спины (по крайней мере, для меня). Я установил резьбовые вставки для дисплея с гайками на обратной стороне, чтобы закрепить дисплей и крепление дисплея к корпусу.

6. На 180 градусов вращаются только головы совы

Сервопривод был трудным по одной основной причине:я не использую библиотеку сервоприводов. Я знаю, что это звучит странно, но мне пришлось использовать timer1 для обновления 4-значного дисплея, и библиотека сервопривода также использует это. К счастью, сервопривод имеет угол 0 или 180 градусов, и между ними нет ничего проще.

Timer1 настроен на интервалы 5 мс, 2000 Гц. Период сервопривода составляет 20 мс. При 0 градусах штифт должен быть в высоком положении только на 2 отсчета и в низком положении в остальное время. Для 180 градусов штифт должен быть высоким на 4 счета и низким все остальное время.

На нагрудной пластине есть красивое крепление для сервопривода. Вы можете прикрутить его на место или приклеить. Я использовал эпоксидную смолу, чтобы прикрепить сервопривод к нагрудной пластине, потому что она также добавит прочности нагрудной пластине и, надеюсь, предотвратит ее повреждение.

7. Похоже на летучую мышь

Далее мы установим модуль ультразвуковой дальности. У меня это обновление каждые 250 мс. Он также имеет удобное место для крепления на нагрудной пластине. У этого модуля всего 2 провода.

Я использовал эпоксидную смолу, чтобы прикрепить УЗИ к пластине грудной клетки.

8. Никаких условий

ИК-датчик для пульта дистанционного управления нужен только в том случае, если вы хотите управлять игрой. Я подумал, что это будет весело, но на самом деле не использую этот режим, автоматическая игра достаточно забавна.

Я решил закрепить ИК-датчик внутри зажима на волосах куклы. Очевидно, вы можете разместить его где-нибудь еще. Я пытался спрятать это, но, может быть, есть место получше, потому что ИК не всегда видит пульт, когда она поворачивает голову, а датчик находится на другой стороне.

9. Время от времени

Далее мы настроим отображение таймера. Для 4-значного дисплея это большая работа. Я приложу схему подключения от ELEGOO. Игра длится всего 5 минут, поэтому я также убрал использование старшей цифры. Но вы решите оставить его, если у вас есть доступный вывод ввода-вывода. Чтобы обновить дисплей, вам нужно очень быстро переключать светодиод, потому что вы можете активировать только одну цифру за раз. Вот почему кажется, что они мерцают при просмотре через камеру. Я использовал частоту обновления 2 мс, которая достаточно высока, чтобы не было видно мерцания. Через 5 мс я могу начать мерцать, когда смотрю на дисплей периферийным зрением. Кроме того, вам понадобится сдвиговый регистр 74HC595.

Монтаж дисплея ни чего не интересного. Я решил, что лучше всего встроить дисплей в ее пояс. У оригинальной куклы в Squid Games, конечно же, нет ремня, но пришлось пойти на жертвы, чтобы получить этот дисплей на ней. Если вы тоже выберете этот путь, замаскируйте квадрат того же размера, что и дисплей, а затем вырежьте его с помощью Dremel. Затем я использовал эпоксидную замазку, чтобы добавить плавный переход к изображению. Но в этом не было необходимости, я просто подумал, что так будет лучше.

Я установил 74HC595 на экран прототипа, иначе у вас повсюду будут проходить провода. Альтернативным решением является использование другого дисплея таймера, который имеет более удобную связь с меньшим количеством контактов.

10. Я видел, как вы двигались

Детектор движения - странный маленький парень. Эта штука использует инфракрасный порт для обнаружения движения. Я понял, что этому датчику нужно время, чтобы нагреться. При запуске ему требуется 1 минута для разогрева. Поэтому время запуска куклы составляет 1 минуту. Еще одна неприятность этого модуля заключается в том, что самое быстрое обновление данных об обнаружении движения составляет около 5 секунд. Последнее раздражает, насколько чувствителен этот датчик. Даже с полностью пониженной чувствительностью он все еще может видеть мельчайшие движения, а иногда и движение, о котором я даже не знаю, о чем он говорит. Чтобы предотвратить эти «ложные срабатывания», я установил датчик внутри шоры для лошадей. В коробке есть небольшое отверстие (7 мм), чтобы детектор движения выглядывал наружу. В качестве бонуса это избавляет вас от необходимости устанавливать этот гигантский датчик снаружи куклы. Датчик движения имеет только один двоичный провод для обратной связи, движения или нет.

Чтобы установить датчик, я распечатал козырек лошади и приклеил его к внутренней части куклы. Затем я просверлил отверстие в теле. Я использовал резьбовую вставку на слепой коробке, чтобы закрепить датчик движения.

11. Не нажимайте мои кнопки

Наконец, мы подошли к кнопкам. Если у вас есть дополнительные контакты ввода / вывода, их легче подключить к цифровому входу. Но у меня не было этой роскоши для ООН. Вместо этого мне пришлось использовать аналоговый вход для чтения значений резистора, чтобы определить, какая кнопка была нажата. Я использовал следующие значения:1K, 2K и 5K. Затем у меня был резистор 220 Ом, чтобы понижать уровень аналогового входа. В противном случае он будет плавать и получать случайные нажатия кнопок.

Я установил кнопки на той же монтажной пластине, что и ЖК-дисплей. Это было нелегко, но лучшего пути у меня не было. Припаяйте провода к этим кнопкам и проведите их через маленькие отверстия в пластике, чтобы испытать ваших пациентов.

12. Теперь вы меня слышите?

Последний шаг и, наверное, самый важный - это звуковой модуль. Это будет использовать последовательный порт на UNO, поэтому вы должны добавить резисторы 1 кОм к контактам Tx и Rx, иначе вы заблокируете программирование UNO после того, как это соединение будет установлено. Кроме того, вам нужно будет использовать контакт «занято», чтобы UNO знала, что звук уже воспроизводится. Это очень важно при последовательном воспроизведении файлов MP3.

Я установил модуль MP3 плеера на щит прототипа. Этот экран делает монтаж подобных компонентов очень удобным, потому что он просто подключается к UNO. Для этого модуля потребуется динамик на 8 Ом и мощность 3 Вт. Динамик просто приклеили к основанию куклы. Я просверлил небольшие отверстия под динамик, чтобы звук лучше выходил.

13. Установите UNO

Установите UNO на платформу и подключите экран прототипа к UNO. Убедитесь, что вы пометили все провода, иначе вы, вероятно, не знаете, куда они уходят. После небольших переговоров вы можете установить UNO внутри куклы со всеми подключенными проводами.

Я использовал резьбовые вставки, чтобы прикрепить платформу к низу куклы.

14. Test Fix Test

Это когда вы можете надеть шляпу отладки. Я могу сказать вам, что программное обеспечение работает на GitHub, так что, по крайней мере, на одну вещь меньше для отладки. Но все равно продолжайте, если у вас есть сомнения, и присылайте мне любые обновления, которые найдете.

15. Поиграем

Пришло время проверить ее и поиграть в игру. Вот как запрограммирована игра.

При запуске она поворачивает голову вперед.

Датчику движения требуется целая минута для запуска. Так что есть таймер при запуске. На полпути она хихикает и поворачивает голову. Затем объявляет, когда она будет готова.

В зависимости от того, установлена ​​ли у вас удаленная игра, она говорит разные вещи. В автоматическом режиме она просит вас нажать кнопку воспроизведения. В моем случае это крайняя правая кнопка. В удаленном режиме она попросит вас нажать кнопку питания, когда вы будете готовы. Затем нажмите кнопку воспроизведения, чтобы переключиться на красный или зеленый свет.

Итак, когда вы будете готовы, нажмите кнопку «Пуск», и она даст вам 10 секунд, чтобы встать на место. Обычно эту кнопку нажимает кто-то поблизости.

Затем начинается игра. Она начнется с зеленого света. Чтобы получить зеленый свет, вы должны приблизиться на 50 см, чтобы получить выигрыш. Если вы находитесь в пределах 100 см, она скажет, что вы приближаетесь. Зеленый свет горит только эхолотом.

Для красного света используется датчик движения и датчик расстояния. Если вы переместитесь достаточно, чтобы датчик движения сработал, или если вы переместитесь вперед более чем на 10 см, вы проиграете игру. Вы также проиграете игру, если выйдет время. Она напомнит вам, что время почти истекло через 5 секунд до конца.

Последняя крутая особенность заключается в том, что она также будет говорить корейским голосом на красный свет. Это функция меню. Нажмите крайнюю левую кнопку, чтобы переключить элемент меню, и центральную кнопку, чтобы переключить параметры элемента.

16. Посмотреть видео

На редактирование этого видео у меня ушло много времени. У меня, наверное, 30 часов только на редактирование. Но делать это было весело. Я думаю, что получилось хорошо и забавно, но хочу, чтобы вы сами в этом убедились. Пожалуйста, дайте мне знать, что вы думаете, и если у вас есть вопросы.

https://youtu.be/jd_4a4x3uCw

Спасибо!

Код

  • Эскиз куклы для игры в кальмары
Эскиз куклы для игры в кальмар C / C ++
Это будет управлять всем датчиком и игровой логикой.
 /// CodeMakesItGo Dec 2021 # include  #include  #include  #include  # include  #include  #include  / * ----- (Аналоговые выводы) ----- * / # определить BUTTONS_IN A0 # определить SONAR_TRIG_PIN A1 # определить SONAR_ECHO_PIN A2 #define MOTION_IN A3 / * ----- (Цифровые выводы) ----- * / # 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 / * ----- (Конфигурация) ----- * / #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 // воспроизвести клип через 5 секунд до конца # определить WIN_PROXIMITY_CM 50 // см расстояние для w inner #define CLOSE_PROXIMITY_CM 100 // см расстояние для близкого к выигрышу #define GREEN_LIGHT_MS 3000 // 3 секунды для зеленого света # define RED_LIGHT_MS 5000 // 5 секунд для зеленого света # define WAIT_FOR_STOP_MOTION_MS 5000 // 5 секунд для ожидания обнаружения движения для остановки / * ----- (Глобальные переменные) ----- * / static unsigned int timer_1000ms =0; static unsigned int timer_2ms =0; static unsigned char digit =0; // цифра для 4-х сегментного дисплеяstatic int countDown =60; // Запуск 1-минутного обратного отсчета при запуске static const int sonarVariance =10; // обнаружение движения, если оно больше этого static 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 беззнаковые символьные числа [] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00 }; const char * MenuItems [] ={"Язык", "Время воспроизведения", "Тип воспроизведения"}; typedef enum {LANGUAGE, PLAYTIME, PLAYTYPE, MENUITEM_COUNT} MenuItemTypes; const char * Languages ​​[] ={"Английский", "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 , СИНИЙ, БЕЛЫЙ, ЖЕЛТЫЙ, ПУРПУРНЫЙ} EyeColors; EyeColors eyeColor =BLACK; typedef enum {WARMUP, WAIT, READY, GREENLIGHT, REDLIGHT, WIN, LOSE} GameStates; static GameStates gameState =WARMUP; / * ----- (Объекты класса) - ---- * / FireTimer task_50ms; FireTimer task_250ms; DFPlayerMini_Fast dfPlayer; SR04 сонар =SR04 (SONAR_ECHO_PIN, SONAR_TRIG_PIN); IRrecv irRecv (IR_DIGITAL_IN); decode_results irResults; // ЖК-дисплей 16x2 / * ----- (Функции) ----- * / void translateIR () // выполняет действие в зависимости от полученного ИК-кода {switch (irResults.value) {case 0xFFA25D:Serial.println ( "СИЛА"); если (gameState ==WAIT) {gameInPlay =true; } ломать; case 0xFFE21D:Serial.println ("FUNC / STOP"); ломать; case 0xFF629D:Serial.println ("VOL +"); ломать; case 0xFF22DD:Serial.println («БЫСТРО НАЗАД»); ломать; case 0xFF02FD:Serial.println («ПАУЗА»); remotePlay =! remotePlay; ломать; case 0xFFC23D:Serial.println («БЫСТРЫЙ ВПЕРЕД»); ломать; case 0xFFE01F:Serial.println («ВНИЗ»); ломать; case 0xFFA857:Serial.println ("VOL-"); ломать; case 0xFF906F:Serial.println («ВВЕРХ»); ломать; case 0xFF9867:Serial.println («EQ»); ломать; case 0xFFB04F:Serial.println ("ST / REPT"); ломать; case 0xFF6897:Serial.println («0»); ломать; case 0xFF30CF:Serial.println ("1"); ломать; case 0xFF18E7:Serial.println ("2"); ломать; case 0xFF7A85:Serial.println ("3"); ломать; case 0xFF10EF:Serial.println ("4"); ломать; case 0xFF38C7:Serial.println ("5"); ломать; case 0xFF5AA5:Serial.println («6»); ломать; case 0xFF42BD:Serial.println («7»); ломать; case 0xFF4AB5:Serial.println ("8"); ломать; case 0xFF52AD:Serial.println ("9"); ломать; case 0xFFFFFFFF:Serial.println («ПОВТОР»); ломать; по умолчанию:Serial.println («другая кнопка»); }} bool isPlayingSound () {return (digitalRead (DFPLAYER_BUSY_IN) ==LOW);} void updateTimeDisplay (цифра без знака, число без знака) {digitalWrite (SEGMENT_LATCH, LOW); shiftOut (SEGMENT_DATA, SEGMENT_CLOCK, MSBFIRST, числа [число]); // Активный LOW digitalWrite (SEGMENT_1_OUT, цифра ==1? LOW:HIGH); digitalWrite (SEGMENT_2_OUT, цифра ==2? LOW:HIGH); digitalWrite (SEGMENT_3_OUT, цифра ==3? LOW:HIGH); digitalWrite (SEGMENT_LATCH, HIGH);} void updateServoPosition () {static int servoPulseCount =0; static bool lastPosition =false; // Получить новое значение только в начале периода if (servoPulseCount ==0) lastPosition =faceTree; if (! lastPosition) // 180 градусов {digitalWrite (SERVO_OUT, servoPulseCount <5? HIGH:LOW); } else // 0 градусов {digitalWrite (SERVO_OUT, servoPulseCount <1? HIGH:LOW); } servoPulseCount =(servoPulseCount + 1)% 40; // период 20 мс} void updateMenuDisplay (const int button) {static int menuItem =0; статическое int menuOption =0; переключатель (кнопка) {case 1:menuItem =(menuItem + 1)% MENUITEM_COUNT; если (menuItem ==LANGUAGE) {menuOption =language; } иначе, если (menuItem ==PLAYTIME) {menuOption =playTime; } иначе, если (menuItem ==PLAYTYPE) {menuOption =playType; } еще {menuOption =0; } ломать; случай 2:если (menuItem ==LANGUAGE) {menuOption =(menuOption + 1)% LANUAGE_COUNT; language =menuOption; } иначе, если (menuItem ==PLAYTIME) {menuOption =(menuOption + 1)% PLAYTIME_COUNT; playTime =menuOption; } иначе, если (menuItem ==PLAYTYPE) {menuOption =(menuOption + 1)% PLAYTYPE_COUNT; playType =menuOption; } еще {menuOption =0; } ломать; случай 3:если (gameState ==WAIT) {gameInPlay =true; } если (gameState ==GREENLIGHT || gameState ==REDLIGHT) {gameInPlay =false; } по умолчанию:перерыв; } если (menuOption! =-1) {lcdDisplay.clear (); lcdDisplay.setCursor (0, 0); lcdDisplay.print (MenuItems [menuItem]); lcdDisplay.setCursor (0, 1); если (menuItem ==LANGUAGE) {lcdDisplay.print (Языки [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; возвращение; } 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

Схема

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

Производственный процесс

  1. Создание монитора Ambilight с помощью Arduino
  2. Игра Arduino Pong - OLED-дисплей
  3. Робототехническая система для обнаружения человека с использованием Arduino Uno
  4. Вольтметр своими руками с использованием Arduino и смартфона
  5. Монитор сердечного ритма с использованием Интернета вещей
  6. WebServerBlink с использованием Arduino Uno WiFi
  7. Простой калькулятор UNO
  8. Сонар с использованием Arduino и отображение при обработке IDE
  9. Постоянство видения
  10. Учебная платформа Arduino