ЗАМОК С “СЕКРЕТНЫМ СТУКОМ” НА ARDUINO

Замок с сервоприводом и датчиком звука/вибрации/касания, которые позволяют задавать и распознавать секретный стук, то есть последовательность ударов. Сервопривод открывает и закрывает крышку, питается система от пальчиковых батареек/аккумуляторов. Что умеет:

  • “Запоминает” секретный стук, а именно – время между “ударами”
  • Умеет распознавать слишком быстрое нажатие, слишком медленное, ну и само собой “правильное” нажатие
  • Работает от аппаратного прерывания, что даёт очень стабильную и чёткую отработку “стуков”
  • Использована библиотека сна, потребление в режиме ожидания около 0.1 мА

ПОДРОБНОЕ ВИДЕО ПО ПРОЕКТУ

  • В данном видео показан полный и максимально подробный процесс разработки и изготовления устройства, а также обзор его возможностей и функций, всё это с приятным монтажиком, музычкой и комментариями. В общем, приятного просмотра!
поддержать автора
канал на youtube
страничка на github
группа вконтакте

ИНСТРУКЦИИ ПО ЭКСПЛУАТАЦИИ

Логика работы построена следующим образом: при подключении питания запускается функция записи секретной комбинации нажатий или стуков. Все стуки и нажатия обрабатываются как прерывания, поэтому точность записи и распознавания очень высокая. Сначала система ждёт первого нажатия. Если есть сигнал, то начинает измерять время между всеми последующими стуками и записывать их в память. Далее если в течение 3 секунд сигналы не приходят, комбинация считается завершённой, далее записанная комбинация проигрывается, … крышка закрывается и система засыпает чтобы не тратить энергию. Так как я использую прерывания, то от любого срабатывания с датчика система просыпается и начинает распознавать секретный стук, сравнивая время между ударами или нажатиями. И тут возможны вариатны, слишком быстро или слишком медленно, в любом случае попытка проваливается. Чтобы открыть замок, нужно чтобы полностью совпала вся комбинация. Ну и чтобы закрыть замок нужно просто коснуться датчика или нажать кнопку закрытия, которую я убрал в своём варианте шкатулки. Ну и собсна всё.

СХЕМЫ, ПЕЧАТНЫЕ ПЛАТЫ

Схема

МАТЕРИАЛЫ И КОМПОНЕНТЫ

Ссылки на магазины, с которых я закупаюсь уже не один год

Вам скорее всего пригодится:

РАССЫПУХА

  • МОСФЕТ
    • IRF3704ZPBF
    • IRLB8743PBF
    • IRL2203NPBF
    • IRLB8748PBF
    • IRL8113PBF
    • IRL3803PBF
    • IRLB3813PBF
    • IRL3502PBF
    • IRL2505PBF
    • IRF3711PBF
    • IRL3713PBF
    • IRF3709ZPBF
    • AUIRL3705N
    • IRLB3034PBF
    • IRF3711ZPBF
  • Резистор 100 Ом
  • Резистор 10 кОм
  • Пищалка из компьютера
всё для пайки
аккумуляторы и модули
все arduino модули
мультиметры
инструменты
бп и преобразователи

ПРОШИВКА И НАСТРОЙКА

Содержимое папок в архиве

  • Low-Power – библиотека сна C:\Program Files (x86)\Arduino\libraries\ (Windows x64)
    C:\Program Files\Arduino\libraries\ (Windows x86)
  • knock_lock – прошивка для Arduino, файлы в папках открыть в Arduino IDE (читай FAQ)
скачать архив
страница на github

Как прошить?

  • ЕСЛИ ЭТО ПЕРВЫЙ ОПЫТ РАБОТЫ С 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();
  }

2018-02-21T00:39:32+00:00