Поговорим о ключах-таблетках для домофонов. Они бывают разных видов, но мы сегодня будем говорить о самом распространенном - работающим на 1 wire протоколе - DS-1990 (Dallas Touch Memory DS-90). Это ключи семейства iButton. Они очень просты по устройству, не имеют встроенной памяти, содержат только 64-битный id устройства.

Простота устройства, дешевизна изготовления, надежность (нечему ломаться) привело к тому, что данные ключи стали использоваться повсеместно. Начиная от домофонов и заканчивая автомобильными сигнализациями.
Многие производители считывающих устройств поддерживают так называемые "мастер ключи" - т.е. универсальные коды ключей. Такие обычно выдают обслуживающим организациям для доступа в подъезд. Вот некоторые из них, что можно найти в открытом доступе:
01:BE:40:11:5A:36:00:E1
FF:FF:FF:FF:FF:FF
00:36:5A:11:40:BE
00:00:00:FE:D4:53
00:00:00:00:00:00
00:00:00:01:FF:FF
00:00:09:3С:E4:A9
00:00:FF:FF:FF:FF
00:00:AA:11:BE:00
00:00:0F:2E:B8:76
FF:FF:FF:FF:FF
36:5A:11:40:BE
01:FF:FF:FF:FF
36:5A:39:81:49
00:00:00:00:00
01:FF:FF:FF:FF
56:5A:11:40:BE
36:5A:39:81:49
00:00:00:00:00
0B:57:81:46:01
C9:8E
Соберем программатор для записи ключей. Нам потребуются болванки. В продаже часто встречаются DS1990 и TM2004. TM2004 - можно перезописывать, если не произведена финализация (подача 9 вольт). После финализации ключ сохраняется на вечно.
Программировать будем через Arduino Uno. Подключается ключ на 16 ногу и подтягивается к плюсу. Второй конец ключа на землю.


Скетч программы для Arduino записывает каждый бит отдельно:
include <OneWire.h> #define pin 10 byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 }; OneWire ds(pin); // pin 10 is 1-Wire interface pin now void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte data[8]; delay(1000); // 1 sec ds.reset(); delay(50); ds.write(0x33); // "READ" command ds.read_bytes(data, 8); Serial.print("KEY "); for( i = 0; i < 8; i++) { Serial.print(data[i], HEX); if (i != 7) Serial.print(":"); } // Check if FF:FF:FF:FF:FF:FF:FF:FF // If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF) { Serial.println("...nothing found!"); return; } return; // remove when ready to programm // Check if read key is equal to the one to be programmed for (i = 0; i < 8; i++) if (data[i] != key_to_write[i]) break; else if (i == 7) { Serial.println("...already programmed!"); return; } Serial.println(); Serial.print("Programming new key..."); for (uint8_t i = 0; i < 8; i++) { ds.reset(); data[0] = 0x3C; // "WRITE" command data[1] = i; // programming i-th byte data[2] = 0; data[3] = key_to_write[i]; ds.write_bytes(data, 4); Serial.print("."); uint8_t crc = ds.read(); if (OneWire::crc8(data, 4) != crc) { Serial.print("error!\r\n"); return; } else Serial.print("."); send_programming_impulse(); } Serial.println("done!"); } void send_programming_impulse() { pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); delay(60); digitalWrite(pin, LOW); delay(5); digitalWrite(pin, HIGH); delay(50); }
Если вы хотите просто считать код ключа, а не программировать его, то закомментируйте строку "remove when ready to programm". При подключении ключа в консоль вывалится считанный код.
Таким образом, можно создать дубликат любого ключа или сделать свой мастер-ключ, если вам известен его код.
