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


Шаг 1: Нужные материалы







Шаг 2: Проверяем клавиатуру


На картинке изображена электронная схема подключения, но я бы советовал проверить клавиатуру просто мультиметром.

Шаг 3: Код

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

Прежде чем вы скопируете код, подключите готовую библиотеку, которая находится в папке библиотек. Находится она по следующему пути: Windows C: —> program files (x86) —> Arduino.

Скопируйте код (но лучше загрузить файл):

#include 
#include 
#include 
#include 

Servo myservo;

//constants for LEDs
int greenLED = 22;
int redLED = 23;

LiquidCrystal lcd(13, 12, 11, 10, 9, 8, 7);
Password password = Password( "4155" );
int currentPosition = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {
    '1','2','3','A',  }
  ,
  {
    '4','5','6','B',  }
  ,
  {
    '7','8','9','C',  }
  ,
  {
    '*','0','#','D',  }
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {
  47, 46, 45, 44}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
  51, 50, 49, 48}; //connect to the column pinouts of the keypad

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  lcd.begin(16, 2);
  Serial.begin(9600);
  keypad.setDebounceTime(50);
  displayCodeEntryScreen();
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  myservo.attach(2);
  myservo.write(180);
  //setup and turn off both LEDs
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  digitalWrite(redLED, LOW);
  digitalWrite(greenLED, LOW);
}

void displayCodeEntryScreen()
{
  password.reset();
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("Enter Code:");
  lcd.setCursor(0,1);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  //setup and turn off both LEDs
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  digitalWrite(redLED, LOW);
  digitalWrite(greenLED, LOW);
}

void loop(){
  keypad.getKey();
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:
    lcd.print(eKey);
    switch (eKey){
    case '#': 
      checkPassword();
      break;
    case '*': 
         displayCodeEntryScreen(); break;
    default:
      password.append(eKey);
    }
 switch (keypad.getState()){
   case PRESSED:
   switch (eKey){
   case 'D': myservo.write(180); displayCodeEntryScreen();
    }
  }
  }
}

void checkPassword(){
  if (password.evaluate()){
    digitalWrite(greenLED, HIGH);
    lcd.clear();
    delay(30);
    lcd.setCursor(1, 0);
    lcd.print("Acces Granted");
    lcd.setCursor(4, 1);
    lcd.print("Welcome");
    unlockdoor();
    delay(2500);
    displayCodeEntryScreen();
  }
  else{
    loop(); {
      redlight();
    }
    lcd.clear();
    delay(10);
    lcd.setCursor(2, 0);
    lcd.print("Acces Denied");
    delay(2500);
    lcd.clear();
    displayCodeEntryScreen();
  }
}

void unlockdoor(){ //controls servo that locks the door
  myservo.write(90);
  digitalWrite(greenLED, HIGH);
  delay(5000);
}

void redlight(){
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
digitalWrite(redLED, HIGH);
delay(100);
}

Файлы

Шаг 4: Подключаем компоненты и помещаем в корпус


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

Если вы хотите вывести клавиатуру, диоды и дисплей на столешницу или дверцу шкафа, вам останется только поместить контроллер и плату в коробку.

Файлы

Шаг 5: Устанавливаем на место





  1. Нарисуйте, как примерно вы представляете себе результат
  2. Выберите место на столешнице, где вы будете устанавливать прибор (я советую установить прибор в верхний ящик стола и вывести периферию на поверхность столешницы)
  3. Наметьте на столе линии, по которым будете вырезать
  4. В углах контура просверлите отверстия (края отверстий не должны выходить за пределы контура)
  5. Вставьте полотно электролобзика в одно из отверстий и выпиливайте отверстие по контуру, посверленные отверстия облегчат вам процесс выпиливания углов
  6. Выпилите из листа ДСП (не толще 2,5 мм) кусок такого же размера, как и отверстие в столешнице
  7. На этом куске наметьте отверстия под клавиатуру, диоды и дисплей
  8. Просверлите отверстие для лобзика и выпилите намеченные фигуры
  9. Припаяйте провода-перемычки к контактам дисплея, клавиатуры и диодов
  10. Вставьте дисплей, клавиатуру и диоды в соответствующие отверстия в ДСП
  11. Кусок ДСП поместите в отверстие в столешнице
  12. Закрепить кусок ДСП можно маленькими уголками или клеем, я рекомендую первый вариант

По желанию:
Если закрепили поверхность кодового замка была утоплена в столешницу, можно добавить сверху еще один кусок ДСП, закрывающий электрокомпоненты. Этот кусок должен быть чуть больше, чем вырез в столешнице, и с маленькой петлей.

Шаг 6: Устанавливаем запирающий механизм




Эта часть достаточно сложная, поэтому заранее извиняюсь, если что-то написал непонятно.
Найдите где-нибудь металлическую пластину и согните ее буквой П. «Ноги» буквы сделайте по 3 см, а перекладину — 2 см.

В одной из «ног» просверлите 2 отверстия.
В дверце ящика просверлите 2 отверстия на таком же расстоянии друг от друга, как и отверстия на металлической детали.

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

При установке сервопривода ориентируйтесь на фото. Установите привод в 2 см (или в 1см, это зависит от того, какую перекладину вы сделали П-образному крепежу) от дверцы.
Я приклеил сервопривод на суперклей, но вам я советую так не делать.

Шаг 7: Ставим выключатель на питание


Пару месяцев назад я поменял 12В адаптер от ноутбука на блок питания от старого компьютера.
Я соединил световой выключатель с проводом блока питания и с 12В выходом контроллера. Теперь я выключателем могу включать-выключать питание и кодовый замок. Блок питания подает ток на 2 диодных полосы, диоды замка и сам замок.

Провода блока питания, подключенные к выключателю – зеленый и черный. Если соединить эти два провода, а блок питания в это время будет включен в сеть, он заработает.

Шаг 8: Заключение

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

Квадрат в столешнице нужно было вырезать аккуратнее.

Я хотел бы внести следующие изменения:

  • заменить Arduino Mega 2560 на Arduino Uno и подключить клавиатуру к аналоговому входу (используя пороговый сигнал)
  • поместить замок в корпус
  • напечатать на 3Д-принтере нормальную панель, которая бы закрыла неаккуратный вырез в столешнице. Я напечатаю панель, как только заработает нормально мой самодельный 3Д-принтер (пока что сопло постоянно забивается, а филамент скручивается)
  • заменить сервопривод на соленоид

Шаг 9: Видео