Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
Компоненты и материалы
- SparkFun APDS-9960 (сенсор жестов/проксималити/RGB) — 1 шт.
- Arduino UNO — 1 шт. (Важно: по тестам автора не работает на Nano и Mega 2560)
- RGB-светодиод (общий катод) — 1 шт.
- LCD 16x2 (Adafruit, белый на синем) — 1 шт.
- Резисторы 4.75 кОм — 2 шт. (подтяжка I2C SDA/SCL к 3.3V)
- Резистор 1 кОм — 1 шт.
- Перемычки — набор
- Сервопривод (любой) — 1 шт. (для механизма захлопывания)
Программное обеспечение
- Arduino IDE
- Библиотеки:
Wire.h,SparkFun_APDS9960.h,LiquidCrystal.h,Servo.h
О проекте
Простой в сборке жестовый замок на базе APDS-9960. Распознает 4 жеста: ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО. Пароль задается последовательностью жестов (до 6). При верном вводе сервопривод открывает замок на 16 секунд. Индикация на LCD и RGB-светодиоде (красный — ошибка, зеленый — верно). Питание от 9V батареи через DC-джек.
Сборка
- LCD: стандартная схема. Если нет 10к потенциометра — резистор 1к между VO и GND.
- APDS-9960: работает только от 3.3V! На UNO требуется сдвиг уровней: SDA/SCL (A4/A5) через резисторы 4.7к к 3.3V (см. схему). INT — на пин 2 (прерывание).
- RGB LED: R -> A1, G -> A2 (через резисторы), общий катод -> GND.
- Серво: сигнальный провод на пин 9.
- Корпус: картонная коробка с вырезами под компоненты. Можно собрать на макетке или спаять на перфоплате.
Алгоритм работы
- Режим ожидания (стр. 0): LCD «Locked — get 3 inches away». Мигает красным. При приближении (проксималити > 40) переход к вводу кода.
- Ввод кода (стр. 1): LCD «Enter code...». Ожидает жест через прерывание. Сравнивает с эталонным массивом
secret[].- Верно: «Next», зеленый, счетчик++.
- Неверно: «Wrong, return to main page», красный, сброс на стр. 0.
- Не распознано: «Not recognized: Try again», повтор попытки.
- Доступ разрешен (стр. 2): LCD «Enter now». Серво поворачивается на 90° (открывает), мигает зеленым 16 сек с обратным отсчетом, затем закрывается (0°), возврат на стр. 0.
Код (основные моменты)
// Пароль: 6 жестов (только UP, DOWN, LEFT, RIGHT)
#define PINSIZE 6
String secret[PINSIZE] = {"UP","DOWN","UP","UP","RIGHT","LEFT"};
// В loop() — конечный автомат pageNum (0,1,2)
// Прерывание от APDS-9960 (пин 2, FALLING) ставит флаг isr_flag
// handleGesture() читает жест: DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT, DIR_NEAR, DIR_FAR, NONE
// При полном совпадении (numRight == PINSIZE) -> pageNum = 2
Важные нюансы
- APDS-9960 только 3.3V! Не подключайте к 5V напрямую.
- На UNO обязательны резисторы 4.7к на SDA/SCL к 3.3V.
- Серво отключается (
servo.detach()) в закрытом состоянии для экономии тока. - Пароль хранится в коде — для реального использования вынесите в EEPROM с возможностью смены.
Схема
Полная схема подключения (PNG) в разделе Schematics оригинала.
Производственный процесс
- Эволюция и производство современных цилиндровых замков с пин-тумблерами
- Комбинированный замок: дизайн, производство и историческая эволюция
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Экономия пинов Arduino: подключение 4×3 клавиатуры по трём аналоговым входам
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO