Сделал замочек на ардуино. Устройство состоит преимущественно из готовых компонентов. Ниже приводится описание моей конструкции (железо, код) и некоторые мысли по теме.
Видео демонстрация работы устройства
Замочек у меня управляется с пульта. У такого решения есть плюсы и минусы. Основной минус заключается в необходимости иметь при себе пульт. К плюсам можно отнести неочевидность наличия такого замка. Также заслуживает положительной оценки отсутствие свободного доступа к элементам замка.
Начну описание конструкции с пульта. На данный момент используется ИК связь. Это недорогое и простое решение. Существенным недостатком ИК связи является необходимость обеспечения видимости приемником передатчика. Иначе говоря, между приемником и передатчиком не должно быть абсолютно непроницаемых для инфракрасного света преград. Впрочем, с ролью проводника ИК излучения прекрасно справляется дверной глазок, замочная скважина, вентиляционное отверстие.
Основой пульта является Arduino Pro Mini
Эта платка имеет небольшие размеры и небольшую цену.
Кнопочка
Модуль ИК передатчика
Схема ИК передатчика
Подключение выполняется согласно изложенным ниже инструкциям.
Arduino --- IR Transmitter
GND --- GND
VCC --- VCC
TX --- DAT
Arduino --- Батарея
VCC --- +
Arduino --- Кнопка
GND --- GND
Кнопка --- Батарея
OUT --- -
В данном случае кнопочка управляет питанием ардуино. Пока кнопка не нажата, ардуино обесточена. Расход энергии минимален :)
Программный код
Как превратить этот код в прошивку я уже писал здесь Загрузить прошивку в ардуино можно руководствуясь моими рекомендациями изложенными здесь
Скажу пару слов о работе программы. При подаче питания на ардуино, программа дрыгает ножкой PD1. К этой ножке подключен ИК светодиод. Таким образом пульт передает некий код. В приведенной программе код состоит из четырех байт. Это 0b10101010 10101010 10101010 10101010 Используемый протокол сильно напоминает описанный мною ранее
Пульт собранный из модулей ардуино прекрасно подходит для разработки и тестирования устройства. Однако, пользоваться им постоянно нелегко. Поэтому был сделан более компактный и мобильный вариант.
Корпусом послужила пластиковая коробочка от tic tac. Когда у меня появится 3D принтер, станет лучше. А пока :)
Схема
В этом устройстве используется трехмиллиметровый инфракрасный светодиод L-34F3C. Резистор на 200 Ом и 0.25 Вт. Кнопочка. Самая маленькая с нормально разомкнутыми контактами. Питают пульт три последовательно соединенные батарейки 357A в 1.5 вольта.
Теперь расскажу об устройстве самого замка. Мозгом конструкции служит Arduino Nano
Эта платка не сильно дороже Arduino Pro Mini, но у неё есть USB-UART переходник и USB разъем.
Для приема сигналов пульта используется модуль ардуино IR Receiver
Схема ИК приемника
Управление защелкой осуществляется через модуль реле
Сами защелки бывают разные
Отличаются не только конструкцией, но и рабочим напряжением и током. Я использовал защелку на 12 вольт и 0.6 ампера.
Сразу скажу, защелки эти от честных людей. В буржуйских фильмах часто открывают двери банковской картой. Я подозреваю, что на тех дверях стоят именно такие защелки :)
Для подключения к 12 вольтовому блоку питания удобно использовать 5.5x2.1mm DC Female Plug Jack Power Supply Adapter Connector
Подключается все согласно приведенным ниже инструкциям.
Arduino Nano --- IR Receiver
GND --- GND
VCC --- VCC
D2 --- OUT
Arduino Nano --- Relay Module
GND --- GND
VCC --- VCC
D8 --- IN
Solenoid Lock --- Relay Module
синий провод --- NO (нормально разомкнут)
Solenoid Lock --- 12 V блок питания
красный провод --- +
12 V блок питания --- Relay Module
- --- COM (общий контакт)
Arduino Nano питается от 5 вольтового блока питания через USB разъем. Но можно питать ардуино и от 12 вольтового блока питания через встроенный линейный стабилизатор.
Программа. Это модифицированный скетч из ранее опубликованной статьи
В заключении скажу несколько слов о планируемых улучшениях конструкции. Во-первых, задвижку неплохо бы заменить на нечто более надежное. Во-вторых, для повышения защищенности устройства необходимо внести существенные изменения в алгоритм обмена данными между пультом и замком. В-третьих, не лишним будет перейти на радиоволны.
Видео демонстрация работы устройства
Замочек у меня управляется с пульта. У такого решения есть плюсы и минусы. Основной минус заключается в необходимости иметь при себе пульт. К плюсам можно отнести неочевидность наличия такого замка. Также заслуживает положительной оценки отсутствие свободного доступа к элементам замка.
Начну описание конструкции с пульта. На данный момент используется ИК связь. Это недорогое и простое решение. Существенным недостатком ИК связи является необходимость обеспечения видимости приемником передатчика. Иначе говоря, между приемником и передатчиком не должно быть абсолютно непроницаемых для инфракрасного света преград. Впрочем, с ролью проводника ИК излучения прекрасно справляется дверной глазок, замочная скважина, вентиляционное отверстие.
Основой пульта является Arduino Pro Mini
Эта платка имеет небольшие размеры и небольшую цену.
Кнопочка
Схема ИК передатчика
Подключение выполняется согласно изложенным ниже инструкциям.
Arduino --- IR Transmitter
GND --- GND
VCC --- VCC
TX --- DAT
Arduino --- Батарея
VCC --- +
Arduino --- Кнопка
GND --- GND
Кнопка --- Батарея
OUT --- -
В данном случае кнопочка управляет питанием ардуино. Пока кнопка не нажата, ардуино обесточена. Расход энергии минимален :)
Программный код
;--------------------------------------------- ; Program : IR transmitter ; Compiler : Atmel Studio ; Chip type : ATmega328P ; System Clock : 16 MHz ; Date : ;--------------------------------------------- .include "m328Pdef.inc" ;--------------------------------------------- ; Interrupt vectors .cseg .org 0x0000 ; Reset jmp RESET .org 0x0002 ; External Interrupt Request 0 reti .org 0x0004 ; External Interrupt Request 1 reti .org 0x0006 ; Pin Change Interrupt Request 0 reti .org 0x0008 ; Pin Change Interrupt Request 1 reti .org 0x000A ; Pin Change Interrupt Request 2 reti .org 0x000C ; Watchdog Time-out Interrupt reti .org 0x000E ; Timer/Counter 2 Compare Match A reti .org 0x0010 ; Timer/Counter 2 Compare Match B reti .org 0x0012 ; Timer/Counter 2 Overflow reti .org 0x0014 ; Timer/Counter 1 Capture Event reti .org 0x0016 ; Timer/Counter 1 Compare Match A reti .org 0x0018 ; Timer/Counter 1 Compare Match B reti .org 0x001A ; Timer/Counter 1 Overflow reti .org 0x001C ; Timer/Counter 0 Compare Match A reti .org 0x001E ; Timer/Counter 0 Compare Match B reti .org 0x0020 ; Timer/Counter 0 Overflow reti .org 0x0022 ; SPI Serial Transfer Complete reti .org 0x0024 ; USART, Rx Complete reti .org 0x0026 ; USART, UDR Empty reti .org 0x0028 ; USART, Tx Complete reti .org 0x002A ; ADC Conversion Complete reti .org 0x002C ; EEPROM Ready reti .org 0x002E ; Analog Comparator reti .org 0x0030 ; Two-wire Serial Interface reti .org 0x0032 ; Store Program Memory Read reti .org INT_VECTORS_SIZE ;--------------------------------------------- RESET: ;--------------------------------------------- ; Steck initialization ldi R16, Low(RAMEND) out SPL, R16 ldi R16, High(RAMEND) out SPH, R16 ;--------------------------------------------- ; USART ldi R16, 0 sts UBRR0H, R16 sts UBRR0L, R16 sts UCSR0A, R16 sts UCSR0B, R16 sts UCSR0C, R16 ;--------------------------------------------- ; Input/Output ports ldi R16, 0b00000000 out PORTB, R16 ldi R16, 0b00000000 out DDRB, R16 ldi R16, 0b00000000 out PORTC, R16 ldi R16, 0b00000000 out DDRC, R16 ldi R16, 0b00000000 out PORTD, R16 ldi R16, 0b00000010 out DDRD, R16 ;--------------------------------------------- ; Global interrupt disable cli ;--------------------------------------------- ; main main: rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_1800_us ; 1 rcall blink rcall delay_800_us ; 0 rcall blink rcall delay_50_ms rjmp main ;--------------------------------------------- ; blink blink: ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000010 out PORTD, R16 rcall delay_13_us ldi R16, 0b00000000 out PORTD, R16 rcall delay_13_us ret ;--------------------------------------------- ; wait 13 us delay_13_us: ldi R16, 0x43 l_10: subi R16, 1 brcc l_10 ret ;--------------------------------------------- ; wait 800 us delay_800_us: ldi R16, 0x80 ; Low byte ldi R17, 0x0C ; High byte l_20: subi R16, 1 sbci R17, 0 brcc l_20 ret ;--------------------------------------------- ; wait 1800 us delay_1800_us: ldi R16, 0x20 ; Low byte ldi R17, 0x1C ; High byte l_30: subi R16, 1 sbci R17, 0 brcc l_30 ret ;--------------------------------------------- ; wait 50 ms delay_50_ms: ldi R16, 0x00 ; Low byte ldi R17, 0x71 ; Middle byte ldi R18, 0x02 ; High byte l_40: subi R16, 1 sbci R17, 0 sbci R18, 0 brcc l_40 ret ;---------------------------------------------
Как превратить этот код в прошивку я уже писал здесь Загрузить прошивку в ардуино можно руководствуясь моими рекомендациями изложенными здесь
Скажу пару слов о работе программы. При подаче питания на ардуино, программа дрыгает ножкой PD1. К этой ножке подключен ИК светодиод. Таким образом пульт передает некий код. В приведенной программе код состоит из четырех байт. Это 0b10101010 10101010 10101010 10101010 Используемый протокол сильно напоминает описанный мною ранее
Пульт собранный из модулей ардуино прекрасно подходит для разработки и тестирования устройства. Однако, пользоваться им постоянно нелегко. Поэтому был сделан более компактный и мобильный вариант.
Корпусом послужила пластиковая коробочка от tic tac. Когда у меня появится 3D принтер, станет лучше. А пока :)
Схема
В этом устройстве используется трехмиллиметровый инфракрасный светодиод L-34F3C. Резистор на 200 Ом и 0.25 Вт. Кнопочка. Самая маленькая с нормально разомкнутыми контактами. Питают пульт три последовательно соединенные батарейки 357A в 1.5 вольта.
Теперь расскажу об устройстве самого замка. Мозгом конструкции служит Arduino Nano
Эта платка не сильно дороже Arduino Pro Mini, но у неё есть USB-UART переходник и USB разъем.
Для приема сигналов пульта используется модуль ардуино IR Receiver
Схема ИК приемника
Управление защелкой осуществляется через модуль реле
Сами защелки бывают разные
Отличаются не только конструкцией, но и рабочим напряжением и током. Я использовал защелку на 12 вольт и 0.6 ампера.
Сразу скажу, защелки эти от честных людей. В буржуйских фильмах часто открывают двери банковской картой. Я подозреваю, что на тех дверях стоят именно такие защелки :)
Для подключения к 12 вольтовому блоку питания удобно использовать 5.5x2.1mm DC Female Plug Jack Power Supply Adapter Connector
Подключается все согласно приведенным ниже инструкциям.
Arduino Nano --- IR Receiver
GND --- GND
VCC --- VCC
D2 --- OUT
Arduino Nano --- Relay Module
GND --- GND
VCC --- VCC
D8 --- IN
Solenoid Lock --- Relay Module
синий провод --- NO (нормально разомкнут)
Solenoid Lock --- 12 V блок питания
красный провод --- +
12 V блок питания --- Relay Module
- --- COM (общий контакт)
Arduino Nano питается от 5 вольтового блока питания через USB разъем. Но можно питать ардуино и от 12 вольтового блока питания через встроенный линейный стабилизатор.
Программа. Это модифицированный скетч из ранее опубликованной статьи
//////////////////////// // // Arduino Nano // //////////////////////// // // Sketch: IR receiver // const unsigned char RELAY = 8; const unsigned long int KEY_CODE = 0xAAAAAAAAL; volatile unsigned char count = 0; volatile unsigned long int temp = 0; volatile unsigned long int data = 0; volatile unsigned long int time1 = 0; volatile unsigned long int time2 = 0; volatile unsigned long int period = 0; void setup() { pinMode(RELAY, OUTPUT); digitalWrite(RELAY, HIGH); attachInterrupt(0, tsop, FALLING); } void loop() { if ( data == KEY_CODE ) digitalWrite(RELAY, LOW); else digitalWrite(RELAY, HIGH); data = 0; delay(1000); } void tsop() { time1 = micros(); period = time1 - time2; time2 = time1; temp <<= 1; count += 1; if ( period > 1500 ) temp |= 1; if ( period > 15000 ) count = 0; if ( count == 32 ) data = temp; } // // End // ////////////////////////
В заключении скажу несколько слов о планируемых улучшениях конструкции. Во-первых, задвижку неплохо бы заменить на нечто более надежное. Во-вторых, для повышения защищенности устройства необходимо внести существенные изменения в алгоритм обмена данными между пультом и замком. В-третьих, не лишним будет перейти на радиоволны.
Неужели задумка умерла? Если в качестве ключа использовать телефон? По-разному. NFC, синезуб и прочее?
ОтветитьУдалитьНа блог времени нет.
Удалить