share this
This commit is contained in:
commit
60fa09d298
5 changed files with 185 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
util
|
||||
OneWire.cpp
|
||||
OneWire.h
|
13
LICENSE
Normal file
13
LICENSE
Normal file
|
@ -0,0 +1,13 @@
|
|||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
42
README.MD
Normal file
42
README.MD
Normal file
|
@ -0,0 +1,42 @@
|
|||
# arduino_rw1990
|
||||
|
||||
Read and flash RW1990 keys using arduino.
|
||||
|
||||
RW1990 aka RW-1990. Most likely RW-1990.1, ТМ-08, ТМ-08v2 will be working.
|
||||
|
||||
### It should be something about 'PCB'
|
||||
|
||||
You will need:
|
||||
* Resistor 2.2k
|
||||
* Arduino Nano. Or not Nano, Uno is also good. Or you can pick some Arduino-compatible board.
|
||||
* Wires x3
|
||||
|
||||
Long story short: pull PIN 10 over capacitor to VCC. Plug this pin to the center of the iButton key. Key 'borders' should be connected to the ground.
|
||||
|
||||
Just take a look on [what_is_it_should_be_look_like.jpg](what_is_it_should_be_look_like.jpg)
|
||||
|
||||
### HOWTO
|
||||
|
||||
To ***read key*** just flash snipped as is.
|
||||
|
||||
To ***write key*** you need do next steps:
|
||||
|
||||
1. Set `key_to_write` to key you want to write.
|
||||
2. Find in code '// UNCOMMENT THIS SECTION FOR FLASHING KEY' section and uncomment this section.
|
||||
3. Flash. Check. Get satisfied.
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
### References:
|
||||
|
||||
Uses some code, ideas, information, inspiration taken from:
|
||||
* https://github.com/AlexMalov/EasyKeyDublicator/
|
||||
* https://habr.com/ru/post/237487/
|
||||
|
||||
### License
|
||||
|
||||
Since I didn't find any license info in projects used please consider this as WTFPL app.
|
127
arduino_rw1990.ino
Normal file
127
arduino_rw1990.ino
Normal file
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* NOTE: Button center is positive wire. Borders eq. ground
|
||||
*/
|
||||
|
||||
#include "OneWire.h"
|
||||
|
||||
#define used_pin 10
|
||||
#define _DEBUG
|
||||
|
||||
// KEY_TO_WRITE. SET KEY YOU WANNA WRITE RIGHT HERE
|
||||
byte key_to_write[] = { 0x01, 0x5F, 0x69, 0xB, 0x1, 0x0, 0x0, 0xEA };
|
||||
|
||||
OneWire ds(used_pin); // pin 10 is 1-Wire interface pin now
|
||||
|
||||
void setup(void) {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
byte i;
|
||||
byte read_data[8];
|
||||
|
||||
delay(1000); // 1 sec
|
||||
|
||||
read_key(read_data);
|
||||
|
||||
if (print_key_connected_status(read_data))
|
||||
return;
|
||||
|
||||
print_key(read_data, 8);
|
||||
|
||||
if (validate_key(read_data))
|
||||
return;
|
||||
|
||||
if (!checkTypeRW1990()){
|
||||
Serial.println("Not RW1990. Not supported.");
|
||||
return;
|
||||
}
|
||||
// UNCOMMENT THIS SECTION FOR FLASHING KEY
|
||||
/*
|
||||
flash();
|
||||
read_key(read_data);
|
||||
print_key(read_data, 8);
|
||||
*/
|
||||
}
|
||||
|
||||
void read_key(byte* read_data){
|
||||
ds.reset();
|
||||
ds.write(0x33); // "READ" command
|
||||
ds.read_bytes(read_data, 8);
|
||||
}
|
||||
boolean print_key_connected_status(byte read_data[]){
|
||||
// Check if FF:FF:FF:FF:FF:FF:FF:FF . MOST LIKELY (but not always) NOTHING IS PLUGGED IN
|
||||
if (read_data[0] & read_data[1] & read_data[2] & read_data[3] & read_data[4] & read_data[5] & read_data[6] & read_data[7] == 0xFF){
|
||||
Serial.print(".");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void print_key(byte *key_array, int size){
|
||||
Serial.println();
|
||||
Serial.print("[");
|
||||
for(int i = 0; i < size; i++) {
|
||||
Serial.print(key_array[i], HEX);
|
||||
if (i != 7)
|
||||
Serial.print(":");
|
||||
}
|
||||
Serial.println("]");
|
||||
}
|
||||
|
||||
boolean validate_key(byte read_data[]){
|
||||
// Check if read key is equal to one that has to be programmed
|
||||
for (int i = 0; i < 8; i++){
|
||||
if (read_data[i] != key_to_write[i])
|
||||
return false;
|
||||
}
|
||||
Serial.print(" programmed to KEY requested");
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean checkTypeRW1990(){
|
||||
ds.reset();
|
||||
ds.write(0xD1); // attend to remove write flag
|
||||
ds.write_bit(1);
|
||||
delay(10);
|
||||
pinMode(used_pin, INPUT);
|
||||
|
||||
ds.reset();
|
||||
ds.write(0xB5); // Request write flag stat
|
||||
byte reply = ds.read();
|
||||
#ifdef DEBUG
|
||||
Serial.print("Reply RW-1990.1: ");
|
||||
Serial.println(reply, HEX);
|
||||
#endif
|
||||
if (reply == 0xFE) // 0xFE eq. RW-1990, RW-1990.1, ТМ-08, ТМ-08v2
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void flash(){
|
||||
ds.reset();
|
||||
ds.write(0xD1); // write command
|
||||
ds.write_bit(0);
|
||||
delay(10);
|
||||
pinMode(used_pin, INPUT);
|
||||
ds.reset();
|
||||
ds.write(0xD5);
|
||||
for (byte i = 0; i < 8; i++){
|
||||
BurnByte(~key_to_write[i]); // invert 4 RW1990.1
|
||||
Serial.print('+');
|
||||
}
|
||||
|
||||
ds.write(0xD1); // write flag
|
||||
ds.write_bit(1); // stop
|
||||
pinMode(used_pin, INPUT);
|
||||
delay(10);
|
||||
}
|
||||
|
||||
void BurnByte(byte data){
|
||||
for(byte n_bit = 0; n_bit < 8; n_bit++){
|
||||
ds.write_bit(data & 1);
|
||||
delay(5); // даем время на прошивку каждого бита до 10 мс
|
||||
data = data >> 1; // переходим к следующему bit
|
||||
}
|
||||
pinMode(used_pin, INPUT);
|
||||
}
|
BIN
what_is_it_should_be_look_like.jpg
Normal file
BIN
what_is_it_should_be_look_like.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.1 MiB |
Loading…
Reference in a new issue