» » » Программатор ключей Ibutton RW1990 на arduino

Программатор ключей Ibutton RW1990 на arduino

Автор: Tonich от 5-05-2016, 15:39

Понадобилось мне как-то скопировать домофонный ключ RW1990, не долго думая достал свою ардуинку и основываясь на распространённых в сети примерах, быстренько набросал скетч.

Ключ подключается к Arduino pro micro или UNO(на других не проверял) по такой схеме:

Программатор ключей Ibutton RW1990 на arduino


Управление программатором можно осуществлять как через UART, так и при помощи кнопок S1-S5.

Команды отправляемые в программатор через монитор порта:
h - help (справка)
r - reading ID of IButton (чтение ID ключа в буфер)
w - writing ID to IButton (программирование ключа)
s - save reading ID to EEPROM (сохранение считанного ID в энергонезависимую память)
l - loading ID from EEPROM (загрузка сохранённого ID в буфер)
e - erasing EEPROM (очистка энергонезависимой памяти)
c - load constant ID to bufer (загрузка константы в буфер(константа указывается вначале скетча))
p - print variables (вывод текущих значений переменных)

Кнопки:
S1 - чтение ID ключа в буфер
S2 - программирование ключа
S3 - сохранение считанного ID в энергонезависимую память
S4 - загрузка сохранённого ID в буфер
S5 - загрузка константы в буфер(константа указывается вначале скетча)

Работа с ключом основывается на библиотеке OneWire.h, её необходимо распаковать в C:\Program Files\Arduino\libraries

Собственно сам скетч:
#include <OneWire.h>
#include <EEPROM.h>
#define pin 10 // I button connected on PIN 10.

OneWire ibutton (pin); 

byte IDconst[8]= {0x01, 0x24, 0x2A, 0xAB, 0x00, 0x00, 0x00, 0x2F};
byte arr[8];
byte ID[8];
char com = 0;
int sw1=0;
int sw2=0;
int sw3=0;
int sw4=0;
int sw5=0;


void setup(){
 Serial.begin(9600); 
 
 pinMode(2, INPUT);           // назначить выводу порт ввода
 digitalWrite(2, HIGH); 
 
 pinMode(3, INPUT);           // назначить выводу порт ввода
 digitalWrite(3, HIGH); 
 
 pinMode(4, INPUT);           // назначить выводу порт ввода
 digitalWrite(4, HIGH); 
 
 pinMode(5, INPUT);           // назначить выводу порт ввода
 digitalWrite(5, HIGH); 
 
 pinMode(6, INPUT);           // назначить выводу порт ввода
 digitalWrite(6, HIGH); 
}

void loop(){
  

 
 if (!ibutton.search (arr)){//read attached ibutton and asign value to buffer

  ibutton.reset_search();
  delay(200);
  //com=0;
  //Serial.print(" ..");
  return;
 
}


  
com = Serial.read(); 

  if ( com == 'h' ){
    delay (200);
    Serial.print("Help \n");
    Serial.print("r - reading ID of IButton \n");
    Serial.print("w - writing ID to IButton \n");
    Serial.print("s - save reading ID to EEPROM \n");
    Serial.print("l - loading ID from EEPROM \n");
    Serial.print("e - erasing EEPROM \n");
    Serial.print("c - load constant ID to bufer \n");
    Serial.print("p - print  variables\n");
    com=0;
    
  }
 


if ( com == 'c' || digitalRead(6) == LOW && sw5==0){
  delay (200);
  
  /*ibutton.search (arr);//read attached ibutton and asign value to buffer
  ibutton.reset_search();*/
  for (byte x = 0; x<8; x++){
  ID[x] = IDconst[x];}
  Serial.print("Constant ID: ");
  
    for (byte x = 0; x<8; x++){  
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
    Serial.print(" ");
  }
  Serial.print("\n");
  com = 0;
  sw5 = 1;
}
 if (digitalRead(6) == HIGH && sw5==1) {
   delay (200);
   sw5=0;  
  }

if ( com == 'r' || digitalRead(2) == LOW && sw1==0 ){
  delay (200);
  
  /*ibutton.search (arr);//read attached ibutton and asign value to buffer
  ibutton.reset_search();*/
  for (byte x = 0; x<8; x++){
  ID[x] = arr[x];}
  
  Serial.print("ID: ");
  
  //Serial.print(millis()/1000);
  //Serial.print("Read ID ");
 
  for (byte x = 0; x<8; x++){  
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
  //compute crc//
  byte crc;
  crc = ibutton.crc8(ID, 7);
  Serial.print("CRC: ");
  Serial.println(crc,HEX);
  //newID[8] = ID[8];
  com=0;
  sw1=1;
}
  if (digitalRead(2) == HIGH && sw1==1) {
   delay (200); 
   sw1=0;  
  }
  
  if ( com == 's'|| digitalRead(4) == LOW && sw3==0){  
    
   delay (200); 
  Serial.print("Saved ID: ");  
    for (byte x = 0; x<8; x++){  
    EEPROM.write(x, ID[x]);
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
    Serial.print(" ");
  }
  com=0;
  sw3=1;
  Serial.print("\n");
  }
  if (digitalRead(4) == HIGH && sw3==1) {
   delay (200); 
   sw3=0;  
  }
  
   if ( com == 'p'){
    Serial.print("Print ID: ");
    for (byte x = 0; x<8; x++){ 
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
  Serial.print("\n");
  
      Serial.print("Print ARR: ");
    for (byte x = 0; x<8; x++){ 
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
  Serial.print("\n");
  
      Serial.print("Print IDconst: ");
    for (byte x = 0; x<8; x++){ 
    Serial.print(IDconst[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
  Serial.print("\n");
  
  
  com=0;
  }
  
  
   if ( com == 'l'|| digitalRead(5) == LOW && sw4==0){
     delay (200);
    Serial.print("Loaded ID: ");
    for (byte x = 0; x<8; x++){  
    ID[x] = EEPROM.read(x);
    Serial.print(ID[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
  Serial.print("\n");
  com=0;
  sw4=1;
  }
    if (digitalRead(5) == HIGH && sw4==1) {
   delay (200); 
   sw4=0;  
  }
     if ( com == 'e'){
     Serial.print("Erase saved ID");
     for (byte x = 0; x<8; x++){  
     EEPROM.write(x, 0xFF);
     }
     Serial.print("\n");
     com=0;
     }
  
  
  
  
  if ( com == 'w' || digitalRead(3) == LOW && sw2==0){
    delay (200);
    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);
    }
    
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD1);
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
    
    Serial.print('\n');
    Serial.print("Writing iButton ID: ");
    for (byte x=0; x<8; x++){
      Serial.print(ID[x],HEX);
      Serial.print(' ');
    }
    Serial.print('\n');
    // Hardcode here your desired ID //
    // 01 D5 9F DC 02 00 00 96
                     
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x<8; x++){
      writeByte(ID[x]);
      Serial.print("**");
    }
    Serial.print('\n');
    ibutton.reset();
    ibutton.write(0xD1);
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
    com=0;
    sw2=1;
  }
    if (digitalRead(3) == HIGH && sw2==1) {
   delay (200); 
   sw2=0;  
  }
} 

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;
  
}


Скетч и библиотека OneWire.h: RW1990PROG.zip [23,23 Kb] (cкачиваний: 1464)
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
  • Ronny

  • 3 апреля 2017 15:38
  • Группа: Посетители
  • ICQ:
  • Регистрация: 3.04.2017
  • Статус: Пользователь offline
  • Комментариев: 1
  • Публикаций: 0
^
Здравствуйте!
Посоветуйте, пожалуйста, хочу клонировать себе ключ от лифта. На ключе нет никаких обозначений, но на пластиковой подложке есть надпись "Метаком". Срабатывает только если вплотную поднести к гнезду считывателя. В сети прочитал, что только этим "Метаком" отличается от "Даллас". "Даллас" срабатывает до 2-х метров. Собираюсь купить для клонирования вот такую Arduino и такие ключи на АлиЭксперессе. Вопроc собственно в том, правильно ли я выбрал ключи? Подойдут ли они программирования на этой Arduino?
  • Группа: Посетители
  • ICQ:
  • Регистрация: 3.04.2017
  • Статус: Пользователь offline
  • Комментариев: 1
  • Публикаций: 0
^
Чтение и последующая запись работает (копирование), загрузка константы в буфер и последующая запись убивает ключ , угробил 2 ключа , че за хня?
  • Tonich

  • 4 апреля 2017 11:05
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 18.10.2012
  • Статус: Пользователь offline
  • Комментариев: 158
  • Публикаций: 315
^
Цитата: Ronny
Здравствуйте!
Посоветуйте, пожалуйста, хочу клонировать себе ключ от лифта. На ключе нет никаких обозначений, но на пластиковой подложке есть надпись "Метаком". Срабатывает только если вплотную поднести к гнезду считывателя. В сети прочитал, что только этим "Метаком" отличается от "Даллас". "Даллас" срабатывает до 2-х метров. Собираюсь купить для клонирования вот такую Arduino и такие ключи на АлиЭксперессе. Вопроc собственно в том, правильно ли я выбрал ключи? Подойдут ли они программирования на этой Arduino?
Ключи подойдут, но не факт, что ваша метакомовская таблетка стандарта RW1990, надо пробовать...

Цитата: alekszaytsev
Чтение и последующая запись работает (копирование), загрузка константы в буфер и последующая запись убивает ключ , угробил 2 ключа , че за хня?

Какую константу загружаете?
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Суббота
15-12-2018
14:21
Поиск по сайту

Профиль
Здравствуйте Гость


Логин:
Пароль:
Поиск документации
Новое на форуме
проектирование схем электрич [Поиск схем] Ответов 0, последний: 8-10-2018, 18:38 от Openair
как впихнуть модели? [OrCAD] Ответов 0, последний: 11-09-2018, 16:35 от BIOS
светодиодная индикация на буфере с открытым коллектором [Поиск схем] Ответов 0, последний: 26-05-2018, 14:40 от maxim-us
Унч на полевых транзисторах [Усилители] Ответов 31, последний: 12-01-2018, 16:34 от GTS
Регулятор к швейной машинке [Поиск схем] Ответов 33, последний: 28-05-2017, 22:12 от GeoS
Новое в блогах
Световой будильник (рассвет) 11.12.2018 - Световой будильник (рассвет) (0)
Если arduino не переходит в режим DFU 16.04.2017 - Если arduino не переходит в режим DFU (0)
Программатор ключей Ibutton RW1990 на arduino 05.05.2016 - Программатор ключей Ibutton RW1990 на … (3)
Регулятор громкости на Arduino и энкодере 31.03.2016 - Регулятор громкости на Arduino и энкод… (2)
Двухканальный ШИМ регулятор мощности на AtTiny 13 27.03.2016 - Двухканальный ШИМ регулятор мощности н… (2)
Статистика
Пользователей онлайн: 6
Гостей: 6
Реклама
Социальные сети
Теги
10 полосный анализатор спектра, 5.1 регулятор, ARM, atmega, atmega8, AVR, codevision, Eagle3D, mega8, NEC, twi, USB, Wi-Fi, анализатор, антенна, высокое напряжение, ЖК, звуковая карта, зу, индикатор, ключ, Конкурс 2013, микроконтроллер, микроконтроллеры, ПДУ, первый, программа, программирования, проект, прошивка, радиолоцман, распиновка, симулируем, температура, трансформатор, усилитель, халява, ЦАП, часы, электрик

Показать все теги