Прошиваем ключ от домофона с помощью ардуино

от
Железо    arduino

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

Схема нашего незатейливого устройства выглядит так:
y_jdVsTF1ps.jpg

То есть нам понадобится:
ардуина, резистор, макетка и сам ключ от домофона, типа i-Button:

DH32Imee1G0.jpg

Копируем код и компилируем. Библиотека есть в общем списке библиотек, необязательно ее искать и качать, просто установите и все.

  1. #include <OneWire.h>
  2. #define pin 10
  3.  
  4. OneWire ibutton (pin); // I button connected on PIN 10.
  5.  
  6. byte addr[8]; //array to store the Ibutton ID.
  7.  
  8. void setup(){
  9.  Serial.begin(115200);
  10. }
  11.  
  12. void loop(){
  13.   if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer
  14.     ibutton.reset_search();
  15.     delay(200);
  16.     return;
  17.  }
  18.  
  19.   Serial.print(millis()/1000);
  20.   Serial.print("> ");
  21.   for (byte x = 0; x<8; x++){  
  22.     Serial.print(addr[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--)
  23.      Serial.print(" ");
  24.   }
  25.  
  26.   //compute crc//
  27.   byte crc;
  28.   crc = ibutton.crc8(addr, 7);
  29.   Serial.print("CRC: ");
  30.   Serial.println(crc,HEX);
  31.   if ( Serial.read() == 'w' ){
  32.     ibutton.skip();ibutton.reset();ibutton.write(0x33);
  33.     Serial.print("  ID before write:");
  34.     for (byte x=0; x<8; x++){
  35.       Serial.print(' ');
  36.       Serial.print(ibutton.read(), HEX);
  37.     }
  38.     // send reset
  39.     ibutton.skip();
  40.     ibutton.reset();
  41.     // send 0xD1
  42.     ibutton.write(0xD1);
  43.     // send logical 0
  44.     digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60);
  45.     pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
  46.  
  47.     Serial.print('\n');
  48.     Serial.print("  Writing iButton ID:\n    ");
  49.     // Hardcode here your desired ID //
  50.     // 01 D5 9F DC 02 00 00 96
  51.     byte newID[8] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F};
  52.  
  53.     ibutton.skip();
  54.     ibutton.reset();
  55.     ibutton.write(0xD5);
  56.     for (byte x = 0; x<8; x++){
  57.       writeByte(newID[x]);
  58.       Serial.print('*');
  59.     }
  60.     Serial.print('\n');
  61.     ibutton.reset();
  62.     // send 0xD1
  63.     ibutton.write(0xD1);
  64.     //send logical 1
  65.     digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10);
  66.     pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
  67.  
  68.   }
  69. }
  70.  
  71. int writeByte(byte data){
  72.   int data_bit;
  73.   for(data_bit=0; data_bit<8; data_bit++){
  74.     if (data & 1){
  75.       digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
  76.       delayMicroseconds(60);
  77.       pinMode(pin, INPUT); digitalWrite(pin, HIGH);
  78.       delay(10);
  79.     } else {
  80.       digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
  81.       pinMode(pin, INPUT); digitalWrite(pin, HIGH);
  82.       delay(10);
  83.     }
  84.     data = data >> 1;
  85.   }
  86.   return 0;
  87. }

Открываем чтение порта. Плюс прикладываем к верху ключа, а минус соответственно держим сбоку. Если вы все правильно сделали, то в мониторе порта вы увидите данные, которые записаны на ваш ключ. Если вы хотите сделать дубликат, то смело их копируйте. Чтобы записать новые данные, нам необходимо будет отредактировать код. Находим:
  1. Serial.print('\n');
  2. Serial.print("  Writing iButton ID:\n    ");
  3. // Hardcode here your desired ID //
  4. // 01 D5 9F DC 02 00 00 96
  5. byte newID[8] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F};
Нам нужна строчка:
  1. byte newID[8] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F};
Редактируем ее, например у меня домофон открывается так:
  1. byte newID[8] = {0x00, 0x36, 0x5A, 0x11, 0x40, 0xBE, 0xE1, 0x05};
Компилируем и снова открываем монитор порта. Вводим "w", жмякаем энтер и после этого прикладываем провода к ключу. Происходит запись и все, готово. Вы молодец. Готовые коды вы можете найти в интернете. И еще, не все ключи прошиваются, обращайте на это внимание. Нужно использовать rw1990.