ЗАМОК С “СЕКРЕТНЫМ СТУКОМ” НА ARDUINO
Замок с сервоприводом и датчиком звука/вибрации/касания, которые позволяют задавать и распознавать секретный стук, то есть последовательность ударов. Сервопривод открывает и закрывает крышку, питается система от пальчиковых батареек/аккумуляторов. Что умеет:
- “Запоминает” секретный стук, а именно – время между “ударами”
- Умеет распознавать слишком быстрое нажатие, слишком медленное, ну и само собой “правильное” нажатие
- Работает от аппаратного прерывания, что даёт очень стабильную и чёткую отработку “стуков”
- Использована библиотека сна, потребление в режиме ожидания около 0.1 мА
ПОДРОБНОЕ ВИДЕО ПО ПРОЕКТУ
- В данном видео показан полный и максимально подробный процесс разработки и изготовления устройства, а также обзор его возможностей и функций, всё это с приятным монтажиком, музычкой и комментариями. В общем, приятного просмотра!
ИНСТРУКЦИИ ПО ЭКСПЛУАТАЦИИ
Логика работы построена следующим образом: при подключении питания запускается функция записи секретной комбинации нажатий или стуков. Все стуки и нажатия обрабатываются как прерывания, поэтому точность записи и распознавания очень высокая. Сначала система ждёт первого нажатия. Если есть сигнал, то начинает измерять время между всеми последующими стуками и записывать их в память. Далее если в течение 3 секунд сигналы не приходят, комбинация считается завершённой, далее записанная комбинация проигрывается, … крышка закрывается и система засыпает чтобы не тратить энергию. Так как я использую прерывания, то от любого срабатывания с датчика система просыпается и начинает распознавать секретный стук, сравнивая время между ударами или нажатиями. И тут возможны вариатны, слишком быстро или слишком медленно, в любом случае попытка проваливается. Чтобы открыть замок, нужно чтобы полностью совпала вся комбинация. Ну и чтобы закрыть замок нужно просто коснуться датчика или нажать кнопку закрытия, которую я убрал в своём варианте шкатулки. Ну и собсна всё.
МАТЕРИАЛЫ И КОМПОНЕНТЫ
Ссылки на магазины, с которых я закупаюсь уже не один год
Вам скорее всего пригодится:
- Arduino NANO 328p – искать
- Серво искать
- Держатель для 3хАА https://ali.ski/y2iH10
- Сенсорная кнопка https://ali.ski/SnI3x
- Датчик звука https://ali.ski/RwAnUw
- Датчик удара https://ali.ski/vRhYv
РАССЫПУХА
- МОСФЕТ
- IRF3704ZPBF
- IRLB8743PBF
- IRL2203NPBF
- IRLB8748PBF
- IRL8113PBF
- IRL3803PBF
- IRLB3813PBF
- IRL3502PBF
- IRL2505PBF
- IRF3711PBF
- IRL3713PBF
- IRF3709ZPBF
- AUIRL3705N
- IRLB3034PBF
- IRF3711ZPBF
- Резистор 100 Ом
- Резистор 10 кОм
- Пищалка из компьютера
ПРОШИВКА И НАСТРОЙКА
Содержимое папок в архиве
- Low-Power – библиотека сна
C:\Program Files (x86)\Arduino\libraries\
(Windows x64)
C:\Program Files\Arduino\libraries\
(Windows x86) - knock_lock – прошивка для Arduino, файлы в папках открыть в Arduino IDE (читай FAQ)
Как прошить?
- ЕСЛИ ЭТО ПЕРВЫЙ ОПЫТ РАБОТЫ С ARDUINO – посмотреть ВИДЕО о платформе с целью ознакомления, далее скачать, установить и настроить необходимые для работы программы согласно СУПЕР ПОДРОБНОЙ ИНСТРУКЦИИ (там даже видео версия есть!).
- Скачать архив с проектом напрямую, или с GitHub (кнопки чуть выше)
Установить библиотеки (папка Libraries) в
C:\Program Files (x86)\Arduino\libraries\ (Windows x64)
C:\Program Files\Arduino\libraries\ (Windows x86)- Подключить Ардуино к компьютеру при помощи Data-кабеля
- Открыть файл прошивки желаемой версии (файлы прошивок .ino лежат в одноимённых папках)
- Настроить Arduino IDE (COM порт, куда подключена плата; подключенная модель Arduino, как в статье из первого пункта)
- Настроить что нужно в прошивке, нажать загрузить
- Если происходит ошибка компиляции или ошибка загрузки, читать 5-ый пункт в ЭТОЙ СТАТЬЕ
Настройки в прошивке
difficulty 100 // миллисекунд на реакцию (плюс минус) max_knock 30 // число запоминаемых "стуков" close_angle 85 // угол закрытия open_angle 180 // угол открытия debug 1 // режим отладки - вывод в порт информации о процессе игры
Дополнительно
- Если не работает, и явно не хватает напряжения на сервоприводе – грешите на китайский мосфет!
АЛГОРИТМ РАБОТЫ
if (threshold_flag && mode == 0) { threshold_flag = 0; if (knock == 0) { mode = 3; goto openCap; } debounce_time = millis(); last_try = millis(); // обнулить таймер tone(buzzPin, 400, 50); try_count = 0; threshold_flag = 0; while (1) { // если не нажал в установленное время (проигрыш) if (millis() - last_try > max_wait[try_count]) { // мигнуть красным два раза tone(buzzPin, 400, 50); delay(1000); mode = 0; // перейти в начало! Это начало нового раунда if (debug) Serial.println("too slow"); threshold_flag = 0; break; } if (threshold_flag) { // если нажатие попало во временной диапазон (правильное нажатие) if (millis() - last_try > min_wait[try_count] && millis() - last_try < max_wait[try_count]) { tone(buzzPin, 400, 50); // мигнуть try_count++; // увеличить счётчик правильных нажатий last_try = millis(); // ВОТ ТУТ СЧЁТЧИК СБРАСЫВАЕТСЯ, ЧТОБЫ УБРАТЬ ВЛИЯНИЕ ЗАДЕРЖЕК! threshold_flag = 0; // сбросить флаг if (debug) Serial.println("good"); // если нажал слишком рано (проигрыш) } else if (millis() - last_try < min_wait[try_count] && threshold_flag) { tone(buzzPin, 400, 50); delay(100); tone(buzzPin, 400, 50); // мигнуть красным дважды delay(1000); mode = 0; // перейти в начало! Это начало нового раунда if (debug) Serial.println("too fast"); threshold_flag = 0; break; } // если число правильных нажатий совпало с нужным для раунда (выигрыш) if (try_count == knock) { // мигнуть 3 раза delay(200); tone(buzzPin, 400, 50); delay(200); tone(buzzPin, 400, 50); delay(200); tone(buzzPin, 400, 50); delay(200); mode = 3; // перейти к действию при выигрыше if (debug) Serial.println("victory"); break; } } } } if (mode == 3) { openCap: mode = 4; delay(500); open_cap(); good_night(); } if ((threshold_flag && mode == 4) || mode == 5) { mode = 0; delay(500); close_cap(); good_night(); } if (millis() - debounce_time > 10000 || mode == 4) { good_night(); }