Чтение и запись i-button ключей своими руками

Всем привет 🙂 !!!

Собственно рассказ простой. Мой брат связал свою жизнь с AliExpress, и в часности заказал там он себе Arduino UNO, решив собрать на досуге читалку ключей i-button. Ну и вот так выглядел первый вариант, собранный на коленке:

Потом он решил , что неплохо было бы ключи копировать, и я ему купил четыре болванки в магазине «Чип и Дип». В общем всё хорошо, а без кнопок, которыми можно управлять схемой, было очень плохо. И я получил задание — спаять аналоговую клавиатуру с 5-6 кнопками.

Дальше пошёл процесс с картинками:


Схема нашей клавиатуры.


Нарисовал печатную плату.


Нашёл односторонний текстолит.


Вырезал по размеру, пошкурил, очистил от жира.


Проверил печать лазерного принтера, на обычную бумагу. Потом такой же рисунок напечатал на глянцевом листе от какого то журнала.

Наложил рисунок на текстолит и утюгом через газетку на двоечке прогладил.


Отпечаток получился нормальный, только я забыл убрать при печати слой с контурами корпусов кнопок. Пришлось подчищать вручную, ножиком.


Травление в хлорном железе.


Так вот получилась печатная плата. Смыл тонер, просверлил отверстия, залудил проводники.

Ну и вот , что получилось в сборе:

Правда, оказалось, что разъём не нужен 🙁 , выпаял:

При тестировании клавиатуры, оказалось, что вход АЦП у Arduino по какой-то причине не работает, всё время показывает максимальное значение :scratch: . Там уже брат сам немножко переделал подключение клавиатуры к плате.

Запихал он всё это в корпус от D-Linka :yes: :

Вот скетч для Arduino:

#include <LiquidCrystal.h>

#include <OneWire.h&>

#define pin 10

OneWire ib (pin);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//------------------------------------------------------------// 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 Обычный
// 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00 Метаком (Metakom) открывает как старые так и новые модели 2010-2011 г (обходит все фильтры)
//0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0x00 домофоны Элтис (Eltis) - до 90%
//0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0x00 домофоны Визит (Vizit) - до 99%
// 0x01,0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00 домофоны Cyfral + фильтр и защита
// 0x01,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 домофоны Cyfral 70%
// 0x01,0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x00 cifra/met
// 0x01,0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x00 Univer 1F
//0x01,0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF, 0x00 Univer 2F
// 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 FF

byte COD[]= {
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00,
0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00,
0x01, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

String NAME[]= { "Obyknov.",
"Met10/11",
"Eltis90%",
"Visit99%",
"Cif/F+Z ",
"Cif 70% ",
"Cif/Met ",
"1F ",
"2F ",
"FF??? "
};
//------------------------------------------------------------

byte addr[8];
byte cod[8];
byte km;
int sch;
bool mas;
String uHex[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
bool vid=false;
//------------------------------------------------------------

char OK[8] = {
0b11111,
0b11111,
0b11011,
0b10011,
0b10001,
0b10011,
0b11011,
0b11111
};

char sb[8] = {
0b00100,
0b01100,
0b00100,
0b00100,
0b00000,
0b00000,
0b00000,
0b00000,
};

//--------------------------------------------------SETUP

void setup() {
Serial.begin(9600);

km=0;
mas=false;
lcd.begin(8, 2);

lcd.createChar(0, OK);
// lcd.createChar(1, sb);

lcd.setCursor(0,0);
lcd.print("Key");
lcd.setCursor(0,1);
lcd.print("Master");

delay(1000);
}

String hux(byte g) {
byte a;
byte b;
byte c;
byte i;
a=0;
b=0;

for (i=0;i<4;i++)
{
c=bitRead(g,i);
bitWrite(a,i,c);
}

for (i=4;i 1;
}
return 0;
}

int writeCod(byte Data[8])
{

// send reset
ib.skip();
ib.reset();
// send 0xD1
ib.write(0xD1);
// send logical 0
digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

ib.skip();
ib.reset();
ib.write(0xD5);
for (byte x = 0; x ");
}

ib.reset();
// send 0xD1
ib.write(0xD1);
//send logical 1
digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
}

//-----------------------------------------------------Выбор другого ключа

String KeyCode(byte u)
{
String a;

a=NAME[u];
u= u * 7;
for (byte x=0; x= 1010)
{
return 0;
}
delay(50);
a=analogRead(5);

if (a = 320)
{
if ( a<=370)
{
b= 2;
}
}

while (a 9){km=0;}
lcd.setCursor(0,1);
lcd.print(KeyCode(km));
sch=0;
vid=true;
}

sch++;
if (sch == 10000)
{
sch=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Key ");
lcd.setCursor(0,1);
lcd.print("Master ");
lcd.setCursor(7,0);
lcd.print(String(km));
vid=false;
}

if (vid==true)
{
if (crc==2)
{
x=0;
y=0;
for (crc=0;crc7){
x=0;
y++;
}
}
vid=false;
sch=0;
}
}

if (crc==2)
{
if (mas == false)
{
lcd.setCursor(6,0);
lcd.print("C");
mas=true;
KeyCode(km);
}
else
{
lcd.setCursor(6,0);
lcd.print(" ");
mas=false;
}
}

crc=ib.reset();
if (crc == 0)
{
return;
}

//-----------------------------------------------Запись ключа из памяти

if (mas == true)
{
lcd.setCursor(6,0);
lcd.print(" ");
mas=false;
sch=0;
lcd.setCursor(0,0);
lcd.print("Write ");
lcd.setCursor(0,1);
lcd.print(" ");
cod[7] = ib.crc8(cod, 7);
writeCod(cod);
delay(500);
lcd.setCursor(0,0);
lcd.print("OK ");
delay(500);
while (crc == 1)
{
crc=ib.reset();
delay(100);
}
lcd.setCursor(0,0);
lcd.print("Key ");
lcd.setCursor(0,1);
lcd.print("Master ");
return;
}

//-----------------------------------------------Копирование
lcd.clear();
lcd.setCursor(0,0);
lcd.print("LOAD ");
// ib.skip();
ib.reset();
ib.write(0x33);
// delay(50);
// ib.search (addr);
for ( x = 0; x < 8; x++)
{
addr[x]=ib.read();
Serial.print(addr[x],HEX);
}
Serial.print("\n");
delay(500);

lcd.setCursor(0,0);
lcd.print("OK");

x=2;
y=0;
for (crc=0;crc7){
x=0;
y++;
}
}

crc=ib.crc8(addr,7);
if (crc != addr[7])
{
lcd.setCursor(0,0);
lcd.print("Key ");
mas=false;
lcd.setCursor(0,1);
lcd.print("Faled! ");
while (ib.reset() == 1)
{
delay(100);
}
delay(1000);
sch=9999;
return;
}

while (ib.reset() == 1)
{
delay(100);
}

lcd.setCursor(0,0);
lcd.print("? ");

sch=500;
crc=0;
while (crc == 0)
{
delay(100);
crc=ib.reset();
sch--;
if (sch==0){crc=1;}
if (key()==1){crc=1;sch=0;}
}

if (sch != 0)
{
delay(1000);
lcd.setCursor(0,0);
lcd.print("Write ");
lcd.setCursor(0,1);
lcd.print(" ");
writeCod(addr);
delay(500);
lcd.setCursor(0,0);
lcd.print("OK ");
delay(500);
while (ib.reset() == 1)
{
delay(100);
}
}

//-------------------------------------------------------------------------
delay(500);
lcd.setCursor(0,0);
lcd.print("Key ");
lcd.setCursor(0,1);
lcd.print("Master ");
mas=false;
sch=0;
lcd.setCursor(7,0);
lcd.print(km);
}

 

Делалось всё это в первый раз, поэтому как и полагалось, не стремились к красоте, а гнались за функционалом , поэтому строгий суд тут не уместен :bye:

avatar

Денис ZX

г. Орехово-Зуево

Чтение и запись i-button ключей своими руками: 10 комментариев

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

  1. Что то ардуино не хочеть принимать такой скетч, во первых ошибки, а во вторых что за библиотека такая One.Wire.h& ,
    где такую взяли? OneWire.h может быть ?

Добавить комментарий