Понадобилось мне как-то скопировать домофонный ключ RW1990, не долго думая достал свою ардуинку и основываясь на распространённых в сети примерах, быстренько набросал скетч.
Ключ подключается к Arduino pro micro или UNO(на других не проверял) по такой схеме:
Управление программатором можно осуществлять как через 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: