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

PuzzleBox

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

Arduino MKR IoT Bundle
× 1

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

Блинк

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

Примечание. Это руководство может быть устаревшим, перейдите здесь для более актуальной версии .

Убрать ценные вещи от посторонних глаз иногда бывает сложно, если только вы не положите их в большой сейф или что-то подобное ... но у кого для этого есть место?

Вместо этого создайте свой собственный пазл, используя компоненты из MKR IoT Bundle и немного картона! Мы не можем гарантировать сохранность ваших вещей, но, по крайней мере, это будет забавным сдерживающим фактором для потенциальных воров.

Конечно, мы советуем вам спрятать там конфеты ... не настоящие ценности.

В двух словах

Чтобы открыть коробку, которая удерживается закрытой с помощью серводвигателя, вам нужно будет повернуть потенциометры, пока не получите правильную комбинацию. Комбинацию можно задать через онлайн-приложение Blynk. Светодиод поможет вам угадать, давая цветовую обратную связь:чем ближе вы находитесь, тем теплее цвет.

Когда будет угадана правильная комбинация, зуммер начнет воспроизведение песни, а сервопривод откроет коробку.

Для создания нашего пазла нам понадобятся следующие компоненты:

  • Зуммер
  • Светодиод RGB
  • 3 потенциометра
  • ЖК-экран
  • Серводвигатель

Цели обучения

  • Представляем интернет-платформу Blynk
  • Подключение и использование ЖК-экрана.
  • Воспроизведение темы "Звездных войн" с помощью зуммера.

Хотите узнать больше?

Это руководство является частью серии экспериментов, знакомящих вас с MKR1000 и IoT. Все эксперименты могут быть построены с использованием компонентов, содержащихся в MKR IoT Bundle.

  • Подушка "Я тебя люблю"
  • Головоломка
  • Кот Павлова
  • Ботан
  • Заводской коммуникатор

Представляем Блинк

Blynk - популярное мобильное приложение для Интернета вещей, которое позволяет нам легко управлять подключенным к Интернету Arduino из любого места и в любое время.

Он был основан на Kickstarter и быстро стал одним из наиболее часто используемых приложений в этой области благодаря великолепной документации и простоте.

Начало работы с Blynk

Создать новый проект действительно просто, просто выполните следующие несколько простых шагов или взгляните на официальное начало работы от Blynk.

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

Чтобы подключить Arduino к приложению, нам потребуется установить библиотеку Blynk. Если вы используете веб-редактор Arduino, библиотека будет автоматически загружена, когда вы включите ее в эскиз, в противном случае вы можете загрузить ее из диспетчера библиотек.

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

  #include  #include  const char * ssid =SECRET_SSID; // SSID вашей сети (имя) const char * password =SECRET_PSWD; // ваш сетевой пароль char auth [] =SECRET_TOKEN; // ваш токен API Blynk // Переменные для хранения значения комбинации // Установите исходную комбинацию на (1 1 1) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Функции Blynk для получения значений BLYNK_WRITE (V1) {SliderValueOne =param.asInt (); // присвоение переменной входящего значения от вывода V1} BLYNK_WRITE (V2) {SliderValueTwo =param.asInt (); // присвоение переменной входящего значения от вывода V1} BLYNK_WRITE (V3) {SliderValueThree =param.asInt (); // присвоение переменной входящего значения от вывода V1} void setup () {Serial.begin (9600); Blynk.begin (авторизация, ssid, пароль); // запускаем функции Blynk и подключаемся к WiFi} void loop () {// Переменные для временного хранения комбинации int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run (); // опрашиваем новые значения комбинаций из онлайн-приложения // проверяем, изменились ли значения комбинации, и выводим их на консоль if (Temp_Slider_One_value! =SliderValueOne || Temp_Slider_Two_value! =SliderValueTwo || Temp_Slider_Three_value! =SliderValueThree) {Serial комбинация:"); Serial.print (SliderValueOne); Serial.print (""); Serial.print (SliderValueTwo); Serial.print (""); Serial.println (SliderValueThree); }}  

Использование ЖК-экрана

Пора подключить экран!

ЖК-экраном легко пользоваться, но для этого требуется много проводов, так что будьте готовы проявить терпение.

Обратите внимание, что мы используем источник питания 5 В и резистор 220 Ом.

Яркость можно регулировать, изменяя выходное значение аналогового вывода 3 от 0 до 255, где 0 является максимальным значением.

  analogWrite (A3, 0);  

Теперь мы можем загрузить пример скетча и посмотреть, все ли в порядке.

  // включаем код библиотеки:#include  // инициализируем библиотеку путем связывания любого необходимого вывода интерфейса LCD // с номером вывода Arduino, к которому он подключен const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; ЖК-дисплей LiquidCrystal (RS, EN, D4, D5, D6, D7); пустая настройка () {analogWrite (A3, 0); // Устанавливаем яркость на максимальное значение // устанавливаем количество столбцов и строк ЖК-дисплея:lcd.begin (16, 2); // Выводим сообщение на ЖК-дисплей. lcd.print («привет, мир!»); } void loop () {// установить курсор в столбец 0, строка 1 // (примечание:строка 1 - вторая строка, поскольку счет начинается с 0):lcd.setCursor (0, 1); // выводим количество секунд с момента сброса:lcd.print (millis () / 1000); }  

Добавить потенциометры

Для считывания значений потенциометров нам понадобится только analogRead () на правильный штифт. Мы подключаем их к аналоговым выводам 0, 1, 2.

Обратите внимание, что значение потенциометра находится в диапазоне от 0 до 1023, поэтому комбинацию невозможно угадать. Чтобы сопоставить эти значения от 0 до 9, мы будем использовать map () функция,

  int PotOne =map (analogRead (A0), 0, 1023, 0, 9);  

Вы можете использовать этот пример кода для печати на ЖК-экране значений потенциометров.

  #include  // Выводы ЖК-экрана const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; ЖК-дисплей LiquidCrystal (RS, EN, D4, D5, D6, D7); пустая настройка () {analogWrite (A3, 0); // устанавливаем яркость ЖК-экрана на максимальное значение Serial.begin (9600); lcd.begin (16, 2); // начать ЖК-экран с 16 столбцов и 2 строк} void loop () {int PotOne =map (analogRead (A0), 0, 1023, 0, 9); int PotTwo =карта (analogRead (A1), 0, 1023, 0, 9); int PotThree =map (analogRead (A2), 0, 1023, 0, 9); lcd.setCursor (0, 0); lcd.print (PotOne); lcd.setCursor (2, 0); lcd.print (PotTwo); lcd.setCursor (4, 0); lcd.print (PotThree); }  

Добавьте светодиод RGB

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

Вы можете использовать этот пример эскиза, чтобы увидеть RGB в действии!

  // выводы светодиода RGB int redPin =6; int greenPin =8; int bluePin =7; void setup () {pinMode (redPin, ВЫХОД); pinMode (greenPin, ВЫХОД); pinMode (bluePin, ВЫХОД); Serial.begin (9600); } недействительный цикл () {setColor (0, 0, 255); // синяя задержка (1000); setColor (0, 255, 255); // задержка аква (1000); setColor (255, 255, 0); // желтая задержка (1000); setColor (255, 0, 0); // Красная задержка (1000); } // Отправляем значения RGB на выводы светодиода void setColor (int red, int green, int blue) {analogWrite (redPin, red); analogWrite (greenPin, зеленый); analogWrite (bluePin, синий); }  

Подключите его к Blynk

Теперь мы готовы собрать все вместе:подключить плату к Blynk, потенциометр к ЖК-экрану и заставить светодиод мигать зеленым, когда комбинация правильная.

  • Обратите внимание, что мы будем использовать функцию giveColorFeedback () . для установки цвета светодиода, когда абсолютное значение каждого потенциометра ближе определенного порога к правильной комбинации.
  void giveColorFeedback (int PotOne, int PotTwo, int PotThree) {...}  
  • Мы также будем использовать эту переменную для хранения значений, отправленных из приложения, и, следовательно, их комбинации.
  int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1;  

Обратите внимание, что начальное значение установлено на 1, оно изменится, только если вы измените значения ползунков в приложении. Если вы сбросите настройки платы, комбинация вернется к значению по умолчанию.

  • Логическая переменная bool start =true; используется для определения того, когда комбинация уже угадана, чтобы избежать повторного открытия коробки в каждом цикле.

Загрузите этот пример эскиза, чтобы увидеть его в действии:

  #include  #include  #include  #include  // Выводы светодиодов RGB int redPin =6; int greenPin =8; int bluePin =7; const char * ssid =SECRET_SSID; // SSID вашей сети (имя) const char * password =SECRET_PSWD; // ваш сетевой пароль char auth [] =SECRET_TOKEN; // ваш токен API Blynk // контакты ЖК-экрана const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; bool start =true; // Переменные для хранения значения комбинации // Установите исходную комбинацию на (1 1 1) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Функции Blynk для получения значений BLYNK_WRITE (V1) {SliderValueOne =param.asInt (); // присвоение переменной входящего значения от вывода V1} BLYNK_WRITE (V2) {SliderValueTwo =param.asInt (); // присвоение переменной входящего значения от вывода V1} BLYNK_WRITE (V3) {SliderValueThree =param.asInt (); // присвоение переменной входящего значения от вывода V1} LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () {pinMode (redPin, ВЫХОД); pinMode (greenPin, ВЫХОД); pinMode (bluePin, ВЫХОД); analogWrite (A3, 0); // устанавливаем яркость ЖК-экрана на максимальное значение Serial.begin (9600); lcd.begin (16, 2); // начать ЖК-экран с 16 столбцов и 2 строк Blynk.begin (auth, ssid, password); // запускаем функции Blynk} void loop () {// Переменные для временного хранения комбинации int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run (); // опрашиваем новые значения комбинаций из онлайн-приложения // проверяем, изменились ли значения комбинации, и выводим их на консоль if (Temp_Slider_One_value! =SliderValueOne || Temp_Slider_Two_value! =SliderValueTwo || Temp_Slider_Three_value! =SliderValueThree) {Serial комбинация:"); Serial.print (SliderValueOne); Serial.print (""); Serial.print (SliderValueTwo); Serial.print (""); Serial.println (SliderValueThree); } int PotOne =map (analogRead (A0), 0, 1023, 0, 9); int PotTwo =карта (analogRead (A1), 0, 1023, 0, 9); int PotThree =map (analogRead (A2), 0, 1023, 0, 9); lcd.setCursor (0, 0); lcd.print (PotOne); lcd.setCursor (2, 0); lcd.print (PotTwo); lcd.setCursor (4, 0); lcd.print (PotThree); если (начало) {giveColorFeedback (PotOne, PotTwo, PotThree); если (PotOne ==SliderValueOne &&PotTwo ==SliderValueTwo &&PotThree ==SliderValueThree) {blinkGreenLed (); start =false; }} if (! start) {if (PotOne ==0 &&PotTwo ==0 &&PotThree ==0) {start =true; }}} // Даем обратную связь, основанную на том, насколько близко потенциометр к значению комбинации // Чем ближе он, тем теплее цвет светодиода void giveColorFeedback (int PotOne, int PotTwo, int PotThree) {if (abs (PotOne - SliderValueOne) <=1 &&abs (PotTwo - SliderValueTwo) <=1 &&abs (PotThree - SliderValueThree) <=1) {// Красный setColor (255, 0, 0); } else if (abs (PotOne - SliderValueOne) <=3 &&abs (PotTwo - SliderValueTwo) <=3 &&abs (PotThree - SliderValueThree) <=3) {// желтый setColor (255, 255, 0); } else if (abs (PotOne - SliderValueOne) <=4 &&abs (PotTwo - SliderValueTwo) <=4 &&abs (PotThree - SliderValueThree) <=4) {// цвет морской волны setColor (0, 255, 255); } else {// синий setColor (0, 0, 255); }} void blinkGreenLed () {for (int a =0; a <2; a ++) {for (int b =0; b <=255; b + =5) {setColor (0, b, 0); задержка (5); } для (int b =255; b> =0; b - =5) {setColor (0, b, 0); задержка (5); }} для (int b =0; b <=255; b + =5) {setColor (0, b, 0); задержка (5); }} // Отправляем значения RGB на выводы светодиода void setColor (int red, int green, int blue) {analogWrite (redPin, red); analogWrite (greenPin, зеленый); analogWrite (bluePin, синий); }  

Добавить зуммер

Мы будем использовать зуммер, чтобы проиграть мелодию, когда коробка открыта. Точнее, мы сыграем тему Звездных войн!

Подключить зуммер просто:

Загрузите этот пример кода и слушайте:

  const int c =261; const int d =294; const int e =329; const int f =349; const int g =391; const int gS =415; const int a =440; const int aS =455; const int b =466; const int cH =523; const int cSH =554; const int dH =587; const int dSH =622; const int eH =659; const int fH =698; const int fSH =740; const int gH =784; const int gSH =830; const int aH =880; int counter =0; #define buzzerPin 1 void setup () {pinMode (buzzerPin, OUTPUT); Serial.begin (9600); } недействительный цикл () {play_jingle (); задержка (3000); } void play_jingle () {beep (а, 500); beep (a, 500); beep (a, 500); beep (f, 350); звуковой сигнал (cH, 150); beep (a, 500); beep (f, 350); звуковой сигнал (cH, 150); beep (a, 650); задержка (500); звуковой сигнал (eH, 500); звуковой сигнал (eH, 500); звуковой сигнал (eH, 500); звуковой сигнал (fH, 350); звуковой сигнал (cH, 150); звуковой сигнал (gS, 500); beep (f, 350); звуковой сигнал (cH, 150); beep (a, 650); задержка (500); } void beep (int note, int duration) {// Воспроизвести сигнал на buzzerPin tone (buzzerPin, note, duration); // Остановить сигнал при достижении buzzerPin noTone (buzzerPin); задержка (50); // Увеличение счетчика counter ++; }  

Добавьте серводвигатель

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

Для подключения сервопривода требуется всего три провода.

Чтобы повернуть его на 90 градусов, воспользуемся следующими функциями:

  #include  int pos =0; // переменная для хранения положения сервопривода Servo myservo; // создаем сервообъект для управления сервоприводом void setup () {myservo.attach (9); // подключает сервопривод на выводе 9 к сервообъекту myservo.write (pos); // устанавливаем сервопривод в положение 0} void loop () {open_the_box (); задержка (2000); close_the_box (); задержка (2000); } void open_the_box () {for (pos =0; pos <=90; pos + =1) {// изменяется от 0 градусов до 90 градусов myservo.write (pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos' delay (15); // ожидает 15 мс, пока сервопривод достигнет позиции}} void close_the_box () {for (pos =90; pos> =0; pos - =1) {// идет от 90 градусов до 0 градусов myservo.write (pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos' delay (15); // ожидает 15 мсек, пока сервопривод достигнет позиции}}  

Обратите внимание, что для того, чтобы повернуть сервопривод обратно и закрыть коробку, все, что вам нужно сделать, это повернуть все потенциометры на 0.

Создайте свой ящик-головоломку

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

Обратите внимание, что мы использовали картон толщиной 2 мм.

Код

Полный набросок

Изготовленные на заказ детали и корпуса

Картон 2 мм box_E5j7tnFdNC.dxf

Схема


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

  1. Компоненты схемы
  2. Интегральная схема
  3. SensorTag для Blynk с использованием Node-RED
  4. Цифровые игральные кости Arduino
  5. Многотемпературный датчик
  6. Игровой контроллер Arduino
  7. MOSMusic
  8. Что такое микроэлектроника?
  9. Компоненты сверлильного станка
  10. Компоненты двигателя внутреннего сгорания