commit 60fa09d29815d8eaff21e1c82322ba4838ee8e38 Author: Dmitry Isaenko Date: Sat Sep 11 18:58:49 2021 +0300 share this diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c1a46b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +util +OneWire.cpp +OneWire.h \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8b1a9d8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +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. diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..087eeff --- /dev/null +++ b/README.MD @@ -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. \ No newline at end of file diff --git a/arduino_rw1990.ino b/arduino_rw1990.ino new file mode 100644 index 0000000..3627867 --- /dev/null +++ b/arduino_rw1990.ino @@ -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); +} diff --git a/what_is_it_should_be_look_like.jpg b/what_is_it_should_be_look_like.jpg new file mode 100644 index 0000000..d860c5f Binary files /dev/null and b/what_is_it_should_be_look_like.jpg differ