OneWire запись на болванку RW1990

Ramzes
Offline
Зарегистрирован: 25.09.2013

Есть код, позволяющий прошиватьключи DS. Из всех имеющихся ключей, смог найти только RW 1990 (Такие болванки продаются у мастеров по изготовлению ключей. Переделать код под запись на RW  1990 не получается, хотя описание протокола есть.  

Стандартный код для DS:

#include <OneWire.h>

#define pin 10

byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };

OneWire  ds(pin);  // pin 10 is 1-Wire interface pin now

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte data[8];

  delay(1000); // 1 sec
  
  ds.reset();
  delay(50);
  ds.write(0x33); // "READ" command
  
  ds.read_bytes(data, 8);

  Serial.print("KEY ");
  for( i = 0; i < 8; i++) {
    Serial.print(data[i], HEX);
    if (i != 7) Serial.print(":");
  }

  // Check if FF:FF:FF:FF:FF:FF:FF:FF
  // If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
  if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
  {
    Serial.println("...nothing found!"); 
    return;
  }

// return; // remove when ready to programm

  // Check if read key is equal to the one to be programmed
  for (i = 0; i < 8; i++)
    if (data[i] != key_to_write[i])
      break;
    else
      if (i == 7)
      {
        Serial.println("...already programmed!");
        return;
      }

  Serial.println();
  Serial.print("Programming new key...");
  
  for (uint8_t i = 0; i < 8; i++)
  {
    ds.reset();
    data[0] = 0x3C; // "WRITE" command
    data[1] = i; // programming i-th byte
    data[2] = 0;
    data[3] = key_to_write[i];
    ds.write_bytes(data, 4);
    Serial.print(".");
  
    uint8_t crc = ds.read();
    
    if (OneWire::crc8(data, 4) != crc) {
        Serial.print("error!\r\n");
        return;
    }
    else
      Serial.print(".");
    
    send_programming_impulse();
  }
  
  Serial.println("done!");
}

void send_programming_impulse()
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH); 
  delay(60);
  digitalWrite(pin, LOW); 
  delay(5);
  digitalWrite(pin, HIGH); 
  delay(50); 
}

Вот описание протокола: 

http://sun-student.ru/hard/rw1990/finale.html

http://electromost.com/news/protokol_dlja_ehlektronnykh_kljuchej_rw1990/...

Помогите пожалйуста с переработкой кода.

 

Ramzes
Offline
Зарегистрирован: 25.09.2013

Никто не поможет чтоли?

Vладимир
Offline
Зарегистрирован: 27.01.2015

Чем уникальнее ваше железо тем сложнее найти помощьника ,

веть помогающий должен на чом то проверить свои мысли

Sovun
Offline
Зарегистрирован: 04.06.2015

Буду также весьма благодарен, если кто-то поделится скетчем, работающим с RW1990

fleshkovich
Offline
Зарегистрирован: 15.07.2015

попытки реализовать описанный алгоритм (который относится к болванкам 1990.1,1990.2, даботает ли на 1990.0 - вопрос) приводят к тому, что на ключ пишется код, состоящий из 0,1,3,80,FF. из за скудных знаний, попытки анализа проблемы не приводят ни к чему. как я понимаю, если рабочий скетч и есть, никто им не заделится, однако если у кого есть документация на RW1990 - киньте, буду благодарен

big_alex
Offline
Зарегистрирован: 31.10.2015

Здесь нашел скетч, Новое значение записывается в переменную newID. Скорость обмена выставляем в 115200. Для записи ключа отправляем w в порт. Проверил на ESP8266 и RW1990 (подключил через 2кОм к 5В) - работает.

 // Based on https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/
// and: http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton...
// By Swift Geek 28-08-2015
// TODO: danger to atmega328! Use OpenCollector logic!
// Used 4.8kΩ Pull-up and 3.1 Vcc for arduino/pull-up

#include <OneWire.h>
#define pin 5

OneWire ibutton (pin); // I button connected on PIN 2.

byte addr[8]; //array to store the Ibutton ID.

void setup(){
 Serial.begin(115200); 
}

void loop(){
  if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
 
  Serial.print(millis()/1000);
  Serial.print("> ");
  for (byte x = 0; x<8; x++){  
    Serial.print(addr[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(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc,HEX);
  if ( Serial.read() == 'w' ){
    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);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    
    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    // Hardcode here your desired ID //
    // 01 D5 9F DC 02 00 00 96
    byte newID[8] = { 0x01, 0xCA, 0x4E, 0xA5, 0x00, 0x00, 0x00, 0x0E };
                     
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x<8; x++){
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

  }
} 

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

 

MacSim
Offline
Зарегистрирован: 28.11.2012

удалил. вопрос решен.

MacSim
Offline
Зарегистрирован: 28.11.2012
int writeByte(byte data){
78
	  int data_bit;
79
	  for(data_bit=0; data_bit<8; data_bit++){
80
	    if (data & 1){
81
	      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
82
	      delayMicroseconds(60);
83
	      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
84
	      delay(10);
85
	    } else {
86
	      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
87
	      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
88
	      delay(10);
89
	    }
90
	    data = data >> 1;
91
	  }
92
	  return 0;
93
	}

 

тут запись вообще не работает, как будто специально все через Ж, чтоб ламеры не лезли, но суть правильная, остальное додумываем. переписал ВСЮ функцию записи.

помогла статейка

http://electromost.com/news/protokol_dlja_ehlektronnykh_kljuchej_rw1990/2011-04-24-35

смотрим диаграмы, делаем выводы. да поможет вам шаманский бубен программиста. админ

все работает :-)

зы: в процесее пострадал один ключик. пал, как первопроходец смертью храбрых... но о нем помнят остальные

ссылку исправил

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Мак, фиксаните ссылку) она у вас на локальный документ)

MaximZ
Offline
Зарегистрирован: 24.03.2015

Поделись уж, не томи, весь вечер убил, не пишется и всё, пробовал и с 4.8 кОм и с 2.2

DJ_Wever
DJ_Wever аватар
Offline
Зарегистрирован: 09.08.2014

MaximZ пишет:

Поделись уж, не томи, весь вечер убил, не пишется и всё, пробовал и с 4.8 кОм и с 2.2

MacSim себе цену набивает.

Вместо помощи, он считает -

MacSim пишет:

...чтоб ламеры не лезли...

и наломали себе копьев или что-бы не только у него - 

MacSim пишет:

...в процесее пострадал один ключик. пал, как первопроходец смертью храбрых...

 

PS. На 5 вольтовой ардуинке, подтяжка 2.2 кОм . Она не причем, проблема в скетче. Уже убил 4 шт RW1990.

MacSim
Offline
Зарегистрирован: 28.11.2012

так я об этом и писал. читайте протокол записи на эту болванку. правьте функцию записи. а чтоб все писали не хочу. удочку дал ловить не буду.

не я писал приведенный скетч. уже и носом ткнул где не правильно написано. "для ламеров" из контекста зачем вырвали? Вы я посмотрю прирожденный журналист: понавырывали слов-цитат и расставили в нужном вам порядке, только вот весь смысл мною сказанного исказили.

не получается? повторяю: найдите в нете протокол записи именно на ЭТУ болванку. посмотрите осцилограмму записи снятую с оригинальных программаторов. это поможет.

правте функцию записи. дебаты разводить не в моем стиле.

ПС: спасибо что хоть вы меня хвалите. я решил вопрос с одним убитым за 20-30 минут. форумчанам прошью ключи, приходите. Ну и чтоб не обижался : сейчас ковыряю rw2007. Проблемы те же что и у Вас. Пока не выходит. Думаю попробывать ТМ-01 использовать.

satelit
Offline
Зарегистрирован: 12.12.2015

что то с записью у всех проблемы, я сколько пробовал не получилось

 

satelit
Offline
Зарегистрирован: 12.12.2015

и почему на аттини есть копировальщики, а на ардуино сначала считывают, меняют код, потом записывают

MacSim
Offline
Зарегистрирован: 28.11.2012

satelit пишет:

и почему на аттини есть копировальщики, а на ардуино сначала считывают, меняют код, потом записывают

а потому, что ардуина не програмируется. ардуина это ATmega с обвязкой. програмировать надо МК.

если уж нашли готовый на тини, проблем перебросить на ATmega быть не должно.

считывают,меняют,записывают... как программу написали так и работает.

MaximZ
Offline
Зарегистрирован: 24.03.2015

DJ_Wever пишет:

PS. На 5 вольтовой ардуинке, подтяжка 2.2 кОм . Она не причем, проблема в скетче. Уже убил 4 шт RW1990.

Привет, посмотри мой коммент, у меня всё получилось с резистором 220 Ом, скетч не правил. Если что, спрашивай.
http://arduino.ru/forum/programmirovanie/onewire-zapis-v-ibutton#comment...

sir90
Offline
Зарегистрирован: 02.01.2016

народ а как организовать что то вроде 

http://electromost.com/index/dublikator_ehlektronnykh_kljuchej_ds1990a/0-67

только с использовонием среды ардуино

железо:

Arduino

дисплей 1602 подключенный по i2c

2 светодиодов

2 кнопки 

 

пс нужен сам скетч

auditordik
auditordik аватар
Offline
Зарегистрирован: 19.11.2016

Если кому интересен реальный проект копирования , программирования  ключиков Touch Memory , могу поделиться в личку программой , и подробным описанием , как собрать . Собрал за пол дня с перекурами . Но ждал с китая шелушки по месяцу . Результат положительный . Программатор самопальный , обошёлся в 300 рублей , а не в 4700 , который может оказаться не рабочим ) 

 Пишите , спрашивайте ! 

  auditordik@mail.ru

ds1990
Offline
Зарегистрирован: 15.01.2017

auditordik, а что ж в личку? Почему бы не выложить здесь? 

Вот форум на Казусе, где действительно можно найти проект без всяких "личек"

http://kazus.ru/forums/showthread.php?t=67407 

satelit 2
Offline
Зарегистрирован: 04.12.2016

нашел рабочий скетч, коды переписывать не надо и комп после прошивки тоже не нужен. приложили ключ- ардуино считата, нажали кнопку-ардуино переходит в режим записи, приложили болванку- ардуино начинает записывать. почему-то болванки у меня не записались, а бу ключи клонировались

#include <OneWire.h>

#define pin 11
OneWire ibutton (pin); // Пин D11 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; // "Универсальный" ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F

const int buttonPin = 6;
const int ledPin = 13;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    readflag = 1;
    writeflag = 1;
    digitalWrite(ledPin, HIGH);
    val++;
    if (val > 6) val = 6;
    Serial.print(val);
    delay(500);
  }
  else {
    val = 0;
  }


  if (!ibutton.search (addr)) {
    ibutton.reset_search();
    delay(50);
    if (val <= 5) return;
    val = 0;
  }

  digitalWrite(ledPin, HIGH);
  delay(50);

  for (byte x = 0; x < 8; x++) {
    Serial.print(addr[x], HEX);
    if (readflag == 0) {
      ReadID[x] = (addr[x]);
    }
    Serial.print(":");
  }

  byte crc; // Проверка контрольной суммы
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
  digitalWrite(ledPin, LOW);

  if ((writeflag == 1) or (Serial.read() == 'w')) {
    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);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    writeflag = 0;
    readflag = 0;
    digitalWrite(ledPin, LOW);
  }
}

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

 

кажется пора спать, код взят с первого поста. сори

MacSim
Offline
Зарегистрирован: 28.11.2012

satelit 2 пишет:

нашел рабочий скетч

вы его тестировали? с какими заготовками?

satelit 2
Offline
Зарегистрирован: 04.12.2016

да работает. болванки купленные у нас в городе(может не китайские) не копируются, а остальные(которые мною найдены) все до одного прошились

satelit 2
Offline
Зарегистрирован: 04.12.2016

скетч рабочий 100%. IDE 1.0.5

библиотека дмитрия осипова

ASK-list
Offline
Зарегистрирован: 17.01.2017

Купил перезаписываемый ключ RW 1990 здесь (Красноярск), никаких надписей на нём нет вообще.

Удалось этот ключ записать через UNO R3 только с подтягивающим резистором на 220 Ом, а с резисторами на 1 и 2 кОм не получалось.

Скетч взял отсюда (этот скетч недавно здесь упоминали), но переделал его немного, чтобы можно было не только кнопкой на шестом пине копировать ключи, но и отправляя в порт символ "w".

//   http://mysku.ru/blog/aliexpress/42027.html
//   с предлагаемым подтягивающим резистором не работает, с резистором 220 Ом работает
//   код изменён для того, чтобы запись также происходила через отправку в порт символа "w"


#include <OneWire.h>

#define pin 11
OneWire ibutton (pin); // Пин для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; // "Универсальный" ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F

const int buttonPin = 6;
const int ledPin = 13;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);     
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);     // лучше закомментировать эту строку, если нет кнопки на шестом пине
  if ((buttonState == HIGH) or (Serial.read() == 'w')) {
    readflag = 1;
    writeflag = 1;
    digitalWrite(ledPin, HIGH);
    val++;
    if (val > 6) val = 6;
    Serial.print(val);
    delay(500);
  }
  else {
    val = 0;
  }


  if (!ibutton.search (addr)) { //read attached ibutton and assign value to buffer
    ibutton.reset_search();
    delay(50);
    if (val <= 5) return;
    val = 0;
  }

  digitalWrite(ledPin, HIGH);
  delay(50);

  for (byte x = 0; x < 8; x++) {
    Serial.print(addr[x], HEX); //print the buffer content
    if (readflag == 0) {
      ReadID[x] = (addr[x]);
    }
    Serial.print(":");
  }

  byte crc; // расчёт контрольной суммы
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
  digitalWrite(ledPin, LOW);

  if (writeflag == 1) {
    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);
    }
    Serial.print('\n');
    Serial.print("  ID to write:    ");
    for (byte x = 0; x < 8; x++) {
      Serial.print(' ');
      Serial.print(ReadID[x], HEX);
    }

    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    writeflag = 0;
    readflag = 0;
    digitalWrite(ledPin, LOW);
  }
}

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

Использование: подключаем оригинал - он читается и отображается в Мониторе порта; даём команду на запись (отправляем в порт символ "w" или жмём кнопку, подключенную к шестому пину, как описано в упомянутом источнике) - на Ардуино загорается светодиод; подключаем болванку - она записывается и информация отображается в Мониторе порта.

Для записи "универсального ключа" (см. тот же источник) перезагружаем Ардуино, даём команду на запись и подключаем болванку.

Кстати, если не будете использовать кнопку на шестом пине, для стабильности работы устройства лучше строку

  buttonState = digitalRead(buttonPin);

закомментировать, иначе иногда мешает шум на ней.

satelit 2
Offline
Зарегистрирован: 04.12.2016

какой командой можно узнать считался ли ключ, хочу светодиод опставить еще один для автономной работы

Timon351
Offline
Зарегистрирован: 19.01.2017

Вопрос. Можно ли на одну болванку записать 4-5 ключей и как это будет выглядеть?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

На стандартную - нельзя, можно свой эмулятор ключа сделать с селектором, а туда уж пиши - не хочу.

Timon351
Offline
Зарегистрирован: 19.01.2017

Yarik.Yar пишет:
На стандартную - нельзя, можно свой эмулятор ключа сделать с селектором, а туда уж пиши - не хочу.
 

а как почтальоны ходят? 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Timon351 пишет:

Yarik.Yar пишет:
На стандартную - нельзя, можно свой эмулятор ключа сделать с селектором, а туда уж пиши - не хочу.
 

а как почтальоны ходят? 

по цифровому коду открывают

arDubino
Offline
Зарегистрирован: 12.01.2017

Timon351 пишет:

Yarik.Yar пишет:
На стандартную - нельзя, можно свой эмулятор ключа сделать с селектором, а туда уж пиши - не хочу.
 

а как почтальоны ходят? 

почтальоны ходят по общему ключу. так что все эти домофоны на самом деле лажа. никакой защиты посути то нет. иногда даже и ваш ключ может кудато подойти

satelit 2
Offline
Зарегистрирован: 04.12.2016

я работаю домофонщиком, почтальоны покупают ключи на каждый подъ

езд, коды про которые вы говорите, мы выключаем при установке

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Хех...у меня в 2012 году меняли домофон, поставили временный код для тех, кто еще не успел поменять ключи. До начала 2016 этот код, 2012, так и открывал дверь...)

satelit 2
Offline
Зарегистрирован: 04.12.2016

эта функция копирует все входящие ключи и открывает дверь

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

satelit 2 пишет:

я работаю домофонщиком, почтальоны покупают ключи на каждый подъ

езд, коды про которые вы говорите, мы выключаем при установке

А МЧС, а МВД и... тоже покупают?

satelit 2
Offline
Зарегистрирован: 04.12.2016

мчс, мвд, скорая также не имеют доступ в подьезд

ключи покупают только почта

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Подскажите-заказал с Али болванки перезаписываемые.Залил скетч на прошивку в ардуино,но болванка не шьется.Скетч 

#include <OneWire.h>

#define pin 10

byte key_to_write[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

OneWire  ds(pin);  // pin 10 is 1-Wire interface pin now

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte data[8];

  delay(1000); // 1 sec
  
  ds.reset();
  delay(50);
  ds.write(0x33); // "READ" command
  
  ds.read_bytes(data, 8);

  Serial.print("KEY ");
  for( i = 0; i < 8; i++) {
    Serial.print(data[i], HEX);
    if (i != 7) Serial.print(":");
  }

  // Check if FF:FF:FF:FF:FF:FF:FF:FF
  // If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
  if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
  {
    Serial.println("...nothing found!"); 
    return;
  }

 

  // Check if read key is equal to the one to be programmed
  for (i = 0; i < 8; i++)
    if (data[i] != key_to_write[i])
      break;
    else
      if (i == 7)
      {
        Serial.println("...already programmed!");
        return;
      }

  Serial.println();
  Serial.print("Programming new key...");
  
  for (uint8_t i = 0; i < 8; i++)
  {
    ds.reset();
    data[0] = 0x3C; // "WRITE" command
    data[1] = i; // programming i-th byte
    data[2] = 0;
    data[3] = key_to_write[i];
    ds.write_bytes(data, 4);
    Serial.print(".");
  
    uint8_t crc = ds.read();
    
    if (OneWire::crc8(data, 4) != crc) {
        Serial.print("error!\r\n");
        return;
    }
    else
      Serial.print(".");
    
    send_programming_impulse();
  }
  
  Serial.println("done!");
}

void send_programming_impulse()
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH); 
  delay(60);
  digitalWrite(pin, LOW); 
  delay(5);
  digitalWrite(pin, HIGH); 
  delay(50); 
}

Выдает ошибку 

b707
Offline
Зарегистрирован: 26.05.2017

fly245 пишет:

Подскажите-заказал с Али болванки перезаписываемые.Залил скетч на прошивку в ардуино,но болванка не шьется.

Это скетч для записи болванок формата TM2004, а не RW1990

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Решил проблему вот этим скетчем взятым с просторов ютюба

 // Based on https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/
// and: http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton...
// By Swift Geek 28-08-2015
// TODO: danger to atmega328! Use OpenCollector logic!
// Used 4.8kΩ Pull-up and 3.1 Vcc for arduino/pull-up

#include <OneWire.h>
#define pin 10

OneWire ibutton (pin); // I button connected on PIN 2.

byte addr[8]; //array to store the Ibutton ID.

void setup(){
 Serial.begin(115200); 
}

void loop(){
  if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
 
  Serial.print(millis()/1000);
  Serial.print("> ");
  for (byte x = 0; x<8; x++){  
    Serial.print(addr[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(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc,HEX);
  if ( Serial.read() == 'w' ){
    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);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
    
    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    // Hardcode here your desired ID //
    // 01 D5 9F DC 02 00 00 96
    byte newID[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
                     
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x<8; x++){
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);

  }
} 

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

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

 

rw1990.ru
Offline
Зарегистрирован: 14.09.2017

Здравствуйте, уважаемые форумчане.
Мы занимаемся производством RW1990, RW1990-2 и RW2004i, RW2004(3) с 2009 года.
Вижу, тут многие мучаются с заготовками, купленными на Алиэкспресс - не всегда работают...
Заявляю Вам со всей ответственностью, что китайцы уже пару лет делают свой аналог RW1990 который стоит дешевле, но имеет другие параметры и  очень нестабильно записывается. Даже серийные дубликаторы не всегда с первого раза записывают эти заготовки. Внешне вы их никак не отличите... гравировка может быть любой или отсутствовать вообще. Только грамотный продавец может Вам ответить на вопрос, какой чип в той или и ной заготовке...

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

а на аттини 85 можно залить

satelit 2
Offline
Зарегистрирован: 04.12.2016

скетч сократил, просто проблема в том,что я хочу запитатьего от 3 вольтовой таблетки. 

b707
Offline
Зарегистрирован: 26.05.2017

satelit 2 пишет:

а на аттини 85 можно залить

можно, только смысл?

satelit 2 пишет:
скетч сократил,

опять же - непонятно зачем. Там кода-то всего ничего, таких скетчей в тиньку 85 три штуки войдет :)

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

хочу собрать на аттини 85 с смд корпусе навесным монтажем максимально маленький копировальщик. просто для прикола поиграться. первый проект был сделан в корпусе зажигалки, на аттини 2313 и хекс файл был взят и интернета. так и не заработало. сейчас собираю в крышке от полторушки)))))))

скетч я не сокращал, а просто убрал сериал, компилятор ругается на него

b707
Offline
Зарегистрирован: 26.05.2017

satelit 2 пишет:

хочу собрать на аттини 85 с смд корпусе навесным монтажем максимально маленький копировальщик. просто для прикола поиграться. первый проект был сделан в корпусе зажигалки, на аттини 2313 и хекс файл был взят и интернета. так и не заработало. сейчас собираю в крышке от полторушки)))))))

скетч я не сокращал, а просто убрал сериал, компилятор ругается на него

если вы и в этот раз будете подбирать код из инета - вряд ли что получится. Во всех примерах, что видел - намеренно вставлены ошибки.

Пишите код сами - или хотя бы разбирайтесь в чужом так, чтоб "закладки" найти.

Дубликатор RW1990 - очень простой код. Это был мой самый первый проект на ардуино :), я тогда провным счетом ничего не знал - собрал за пару недель, работает второй год.

satelit 2
Offline
Зарегистрирован: 04.12.2016

как так может быть. заливаю тиньку через usbasp . для достоверности проверил все пины атиньки через блинк со встроенным генератором на 1 мгц. все хорошо. а как заливаю копировальщик, пишет-пожалуйста, проверьте обновление usbasp

b707
Offline
Зарегистрирован: 26.05.2017

satelit 2 пишет:

как так может быть. заливаю тиньку через usbasp

не знаю, я usbasp -ом не пользуюсь, тиньки прошиваю через Ардуино-как-ISP

Про usbasp в последний год читал дикое кол-во негатива - очень у многих он не работает. видимо в прошивке что-то "подкрутили"

satelit 2
Offline
Зарегистрирован: 04.12.2016

интересно получается, я специально заказал его для аттинек

satelit 2
Offline
Зарегистрирован: 04.12.2016

все!!! я сдаюсь)))) 

b707
Offline
Зарегистрирован: 26.05.2017

satelit 2 пишет:

все!!! я сдаюсь)))) 

выкиньте usbasp, возьмите ардуину - все прошьется.

satelit 2
Offline
Зарегистрирован: 04.12.2016

да там что то не понятное. блинк заливаетсяна ура и через usbasp и через ардуино. а как заливаю копир,то тинька зависает,даже на кнопку не реагирует. залил этот же скетч на ардуино, все работает, все копирует. кстати на ардуино про мини тоже не заливается. добился при заливке аттини не одной ошибки компиляции, а при заливки мини, ошибка что то там про sck