Проект 004 - Дубликатор Домофонных Ключей Стационарный

Список разделов Электроника Arduino

Сообщение #1 [Stealth] » 12.04.2017, 19:35

Жду корпус, или макетку, т.к. всё готово для сборки. Корпус планирую от PowerBank на 1 элемент 18650, т.к. начинка минимальна...

Что должен делать - иметь малый корпус, питание от USB, уметь делать дубликаты ключей, уметь записывать универсальный/произвольный ключ (меняется в скетче), уметь считывать ключ (вывод в терминал).

Из чего должен состоять - корпус от PowerBank на 1 элемент 18650, ардуино Pro Mini, контакты для iButton, кнопка. Светодиод будет использоваться встроенный, для экономии места.

Позже повешу фотки в процессе и скетч.
Изображение
Изображение
[Stealth] M
Администратор
Администратор
Аватара
Репутация: 103
Сообщения: 2684
С нами: 12 лет 6 месяцев

Сообщение #2 [Stealth] » 17.05.2017, 16:44

И так, руки дошли доделать проект, и малость отфоткать...

В процессе монтажа и пайки:

IMAG3829.jpg
IMAG3830.jpg


К ногам подпаивался, остальные срезал. По сути, можно было вообще пины не ставить, или поставить только в нужных местах. Всё, что могло коротнуть - замазано термоклеем, двухсторонним скотчем и ПВХ. Усадку решил не пользовать, размеры мелкие, монтаж плотный. Корпус дорабатывался дремелью, что бы всё влезло. Свёрла, ступенчатые свёрла и насадки для дремели - для отверстий.

Где можно накосячить:
1. Перепутать GND и DATA контактной площадки iButton. Вот подсказка:

docibuttonreview1.gif
docibuttonreview1.gif (4.63 КБ) Просмотров: 3468


Готовый девайс:

IMAG3835.jpg


Окно просверлено и допилено фрезой и надфилем, затем залито термоклеем на металлическом блине. Ещё одно не используемое отверстие - тоже. Окошко получилось универсальное, через него видно два светодиода.

Дальше пойдут скетчи и ключи...
Изображение
Изображение
[Stealth] M
Администратор
Администратор
Аватара
Репутация: 103
Сообщения: 2684
С нами: 12 лет 6 месяцев

Сообщение #3 [Stealth] » 17.05.2017, 16:59

Привожу схемку автора:

b879e9.png


Пины не менял, всё устраивает. Наличие окошка не требует светиков с резюками для индикации режимов работы.

У автора (kvolk) есть два варианта скетча. Второй умеет корректировать неверный family code.

Сперва заберём и установим библиотеку OneWire.

Скетч v1.0
Код: Выделить всё
#include <OneWire.h>

#define pin 11
OneWire ibutton (pin); // Пин D11 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; // "Универсальный" ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F

const int buttonPin = 6;
const int ledPin = 13;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    readflag = 1;
    writeflag = 1;
    digitalWrite(ledPin, HIGH);
  }
  if (!ibutton.search (addr)) {
    ibutton.reset_search();
    delay(50);
    return;
  }

  digitalWrite(ledPin, HIGH);
  delay(50);

  for (byte x = 0; x < 8; x++) {
    Serial.print(addr[x], HEX);
    if (readflag == 0) {
      ReadID[x] = (addr[x]);
    }
    Serial.print(":");
  }

  byte crc; // Проверка контрольной суммы
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
  digitalWrite(ledPin, LOW);

  if ((writeflag == 1) or (Serial.read() == 'w')) {
    ibutton.skip(); ibutton.reset(); ibutton.write(0x33);
    Serial.print("  ID before write:");
    for (byte x = 0; x < 8; x++) {
      Serial.print(' ');
      Serial.print(ibutton.read(), HEX);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    writeflag = 0;
    readflag = 0;
    digitalWrite(ledPin, LOW);
  }
}

int writeByte(byte data) {
  int data_bit;
  for (data_bit = 0; data_bit < 8; data_bit++) {
    if (data & 1) {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      delayMicroseconds(60);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    } else {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    }
    data = data >> 1;
  }
  return 0;
}
Скетч v2.0
Код: Выделить всё
#include <OneWire.h>

#define pin 11
OneWire ibutton (pin); // Пин D11 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; // "Универсальный" ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F

const int buttonPin = 6;
const int ledPin = 13;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    readflag = 1;
    writeflag = 1;
    digitalWrite(ledPin, HIGH);
    val++;
    if (val > 6) val = 6;
    Serial.print(val);
    delay(500);
  }
  else {
    val = 0;
  }


  if (!ibutton.search (addr)) {
    ibutton.reset_search();
    delay(50);
    if (val <= 5) return;
    val = 0;
  }

  digitalWrite(ledPin, HIGH);
  delay(50);

  for (byte x = 0; x < 8; x++) {
    Serial.print(addr[x], HEX);
    if (readflag == 0) {
      ReadID[x] = (addr[x]);
    }
    Serial.print(":");
  }

  byte crc; // Проверка контрольной суммы
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
  digitalWrite(ledPin, LOW);

  if ((writeflag == 1) or (Serial.read() == 'w')) {
    ibutton.skip(); ibutton.reset(); ibutton.write(0x33);
    Serial.print("  ID before write:");
    for (byte x = 0; x < 8; x++) {
      Serial.print(' ');
      Serial.print(ibutton.read(), HEX);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    writeflag = 0;
    readflag = 0;
    digitalWrite(ledPin, LOW);
  }
}

int writeByte(byte data) {
  int data_bit;
  for (data_bit = 0; data_bit < 8; data_bit++) {
    if (data & 1) {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      delayMicroseconds(60);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    } else {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    }
    data = data >> 1;
  }
  return 0;
}

Ну, вот и всё. Дальше пробежимся по режимам работы и ключикам "вездеходам"...
Изображение
Изображение
[Stealth] M
Администратор
Администратор
Аватара
Репутация: 103
Сообщения: 2684
С нами: 12 лет 6 месяцев

Сообщение #4 [Stealth] » 17.05.2017, 17:49

Переходим к режимам работы...

1. Дублирование ключей.

Включаем, подносим ключ, С КОТОРОГО копируем код, светодиод начинает мигать (pin13). Нажимаем кнопку, светодиод горит постоянно. Подносим БОЛВАНКУ, через секунду светодиод начинает мигать - ключ скопирован.

2. Запись произвольного ключа (указывается в скетче).

Включаем, нажимаем кнопку, светодиод горит постоянно. Подносим БОЛВАНКУ, через секунду светодиод мигает - ключ записан.

3. Чтение кода ключа.

Подключаем девайс к компу, устанавливаем дрова, если требуется. Отгадываем, какой порт COM эмулируется (например, в диспетчере устройств). Скачиваем и запускаем PUTTY, тип соединения - SERIAL, выбираем нужный COM, скорость 11520, жмакаем OPEN и прикладываем ключ. Выводится прошитый в ключ код, и подсчитанный CRC (об этом позже).

4. Исправление Family Code.

Включаем, прикладываем ИСПРАВЛЯЕМЫЙ ключ, и, не убирая его, зажимаем кнопку на 6 секунд. Запишется "универсальный" ключ из скетча.

Так, что осталось пройти по этой теме? Вроде только расчёт CRC и коды ключей...
Изображение
Изображение
[Stealth] M
Администратор
Администратор
Аватара
Репутация: 103
Сообщения: 2684
С нами: 12 лет 6 месяцев

Сообщение #5 [Stealth] » 17.05.2017, 18:05

Коды ключей. Из чего состоят.

И так, допустим, у нас есть ключ 01:00:36:5A:11:40:BE:B1. Разберём его.

01 - код типа устройства, всегда 01 (Family Code).
00 36 5A 11 40 BE - уникальный код. Именно он и указывается в большинстве источников в сети.
B1 - контрольная сумма CRC, а точнее, CRC-8/MAXIM.

Можете поебсти себе мозг, но куда проще его посчитать онлайн.

Так что при желании записать, например, 00:00:0F:2E:B8:76, нам нужно будет записать 01:00:00:0F:2E:B8:76:96, желательно ещё проверить в PUTTY. В скетч код полетит в таком виде:

Код: Выделить всё
byte ReadID[8] = { 0x01, 0x00, 0x00, 0x0F, 0x2E, 0xB8, 0x76, 0x96 };
Изображение
Изображение
[Stealth] M
Администратор
Администратор
Аватара
Репутация: 103
Сообщения: 2684
С нами: 12 лет 6 месяцев


Вернуться в Arduino

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость

cron