#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;
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);
}
if (!ibutton.search (addr)) {
ibutton.reset_search();
delay(50);
return;
}
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;
}
#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;
}
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F };
byte ReadID[8] = { 0x01, 0x12, 0x34, 0x56, 0xAB, 0xCD, 0xEF, 0xAA };
прошиваем ключ и смотрим что там, а там видно что в поле CRC должно быть E0.byte ReadID[8] = { 0x01, 0x12, 0x34, 0x56, 0xAB, 0xCD, 0xEF, 0xAA };
byte ReadID[8] = { 0x01, 0x12, 0x34, 0x56, 0xAB, 0xCD, 0xEF, 0xE0 };
+17 |
3654
102
|
Домофон, предположительно Vizit, без опознавательных знаков, точнее они все затёрты.
Номер ключа считывается, но затем что-то идет не так — при кратковременном замыкании D6 и +5 красный светодиод загорается на 1 секунду, а не светится постоянно. Так и должно быть?
Второй iButton не работает. Мог я его испортить во время попыток записи? Возможно он пока в кармане валялся пришел в негодность
Болванка точно RW1990?
На фотографии плохо видно, но они подключены к линии 15 брэдборда. Я проверял. Там ноги резистора идут вверх и они слишком светлые на снимке.
К сожалению, я не знаю как определить тип болванки, но на днях мне принесут еще несколько — поэксперементирую с ними.
Из изменений в схеме:
1. Не поставил кнопку, а дотрагиваюсь джампером до контакта.
2. Поставил не 1K, а 2K резистор
3. Питание от USB только на miniUSB Arduino Nano
Использовал скетч второй редакции. Изменений не производил.
Заказывать другой Arduino Nano?
Это намёк на то, что полезность устройства весьма ммм… сомнительна чтоли… Впрочем, правильный кот вполне вполне оправдывает автора (про стремление к рукоблудию я уж не говорю — оно похвально по умолчанию! ))).
он есть практически на всех домофонах
.
и его дай гостят\родственикам
.
не кто не имеет права ограничивать вход в подъезд
.
если чтото не нравится пускай их человек сидит у двери 24\7 и открывает по первому требованию
не каждый пойдёт в суд из-за кода…
Они могут (общим решением) делать с ним всё, что хотят: снять, поставить, выключить, включить, сменить обслуживающую организацию, программировать самостоятельно, и т. д.
Подсказать, что нужно делать?
Кроме того, для добросовестного использования общего имущества не всегда требуется общее согласие.
Подскажите, как цивилизованно решить вопрос с кодом не прибегая к общему собранию.
Это может быть долгий путь.
Быстрый и неофициальный — наладить личные отношения с инженером, обслуживающим домофон.
Более неофициальный — прописать самому. Если подойдёт один из «стандартных» — даже вскрывать ничего не надо…
А вообще, я не адвокат. :) Я думаю, это не то место, где нужно это обсуждать.
С жалобами понятно, на жалобу будет дан официальный ответ, что работа кодов непредусмотрена (хоть мы и знаем, что это не так). Всё.
А дальше только в суд, а это минимум на пол года тягомотина.
P.S.
многие банально не знают про наличии Кодов доступа, по мимо ключей.
а эти «клоуны» намерено скрывают такую возможность работы системы
(всем хочется побольше поиметь с жильцов помимо абонентской платы, это просто бизнес нечего личного )
То есть когда народ тупо кирпичом дверь подпирает -это безопасно, а если я дал код знакомому -это ужас-ужас…
Только ключи (таблетки или карты), только по количеству официально проживающих.
да и вообще если надо звони в любую квартиру и говори почта… откроют в 9 из 10 квартир
.
обще-подъездный домофон по сути не более чем закрывалка двери от сквозняка и ВСЁ
.
хотя некоторые верят что домофон их спасёт от кражы или гопоты
P.S.
да и вообще если угодно можешь домофонщиков хоть каждую неделю заставить менять код…
они не плохие $$ за воздух получают (абонентской платой с дома)
хотя большинство таких нытиков боятся права качать, дальше чем в интернете
P.S.S.
я лично против когда кто-то там решил что он имеет права ограничить доступ. да ещё за это требует $, при этом не неся не какой ответственности материальной
Но с тезисом «домофонная компания гребёт бабло из воздуха» согласен, умножил сумму из квитанции на число квартир в подъезде, за год сумма превышает стоимость домофона.
А если соскочить с обслуживания — кто-то должен будет взвалить на себя работу по замене ключей, вызове ремонтников в случае поломки домофона и сбору денег на этот ремонт. И скандалам с теми кто деньги не сдаёт — им ведь вход в подъезд не запретишь, а переговорным устройством пользоваться им м.б. и не надо.
Если кому нужно пройти в подъезд тупо постоит полчаса возле подъезда.
войдет вслед за входящим или выходящим.
Да и жители бывают разные, некоторые таких «просачивающихся» принципиально не пускают, «открывай своим ключом или звони к кому пришёл». Особенно если это пьяный бомж или группа быдлодетей с «ягуаром» и семечками.
Для своего домофона я нашел алгоритм без мастер-ключей- требуется подтверждающее нажатие на кнопку из квартиры для смены.
п.с. ежемесячная плата раньше даже покрывала стоимость домофона (основного блока)
С тех пор ни разу ключи не меняли, хотя сам домофон был год назад заменён на новый.
И вроде бы ключи они бесплатно в офисе раздают, по предъявлению паспорта.
У меня компания обслуживающая домофон, новый (вместо утерянного) ключ вообще бесплатно выдала, единственное — пришлось ждать приезда специалиста пару дней, а когда я попросил несколько про запас, тогда пришлось заплатить, но символически, по 50р. за ключ…
А вот халявный курьер — это приятно.
arduino.ru
Давно хотел позаморачиваться с ардуиной :)
Однозначно плюс.
1. Собрать дубликатор.
2. Приложить исходный ключ к считывателю.
3. Нажать кнопку.
4. Приложить ключ который хотим перепрограммировать.
Всё.
Потом когда дойдет, сидит и плюется, да вот… оно все так просто :( :)
P.S. опередили выше:)
aliexpress.com/item/TM-probe-DS9092-Copper-probe-iButton-probe-reader-without-LED/32366773037.html
обычный
Наверное, повторюсь не в первый (и даже не в десятый) раз, но, вижу, некоторым это всё же не известно: «традиция» в том, чтобы фотографировать купленный товар на фоне домашних питомцев как доказательство факта его приобретения. А не просто «котофото» и прочая «милота». :) В Вашем случае вряд ли возникнут сомнения в том, что Вы товар действительно покупали, а не взяли фото в Сети. :)
Не могу припомнить случая, когда у автора требовали фотографий, подтверждающих факт покупки.
Фото из сети в 99% случаев легко вычисляются.
с перламутровыми пуговицамидля RFID токенов?Ведь контактной площадкой не обойдешься
Этот на 125 КГц.
Само собой разумеется!
Буду делать себе такой же.
ЗЫ плюсануть не могу, кармы не хватат, поэтому от меня +1 за кадром
Вот может кому будет интересно. Дубликатор на почти все случаи жизни. Правда не на ардуино (посложнее в исполнении), но тоже ничего страшного. Сам собирал (сначала на макетке, потом ЛУТом) всё с первого раза завелось.
А есть и на ардуино. Его я не пробовал, но люди пишут, что работает.
Чтобы размер был с обычный домофонный ключ. А то такую хреновину как то не очень в кармане носить.
А в этом можно до кучи собрать бутфорсер с экранчиком, пароли на цифровых замках перебирать, как в голливудсктх фильмах.
и при количестве битности 6 байт, вам прийдется ждать гораздо больше чем 10К вариантов у Эппла :)), годиков так на 1000+
P.S. С iButton работал еще в 90х :). Например с логгерами температуры (DS1921H) и управление ими с КПК Palm :). Собственный аппаратно-программные разработки.
если не трудно, проверьте еще вот этот ключ 00:36:5A:11:40:BE код семейства 01. crc какой должен быть?
Так что если вы хотите прошить этот ключ этим дубликатором, нужно байты записать в обратном порядке, начиная с 01:be:40:11:5a:36:00:e1.
Разные программаторы по разному выводят ключ, одни начиная с 01, другие с CRC. Интернеты вам в помощь.
Arduino: 1.6.10 (Windows 7), Плата:«Arduino Nano, ATmega328»
C:\Users\Андрей\Documents\Arduino\sketch_aug03a\sketch_aug03a.ino: In function 'void loop()':
sketch_aug03a:74: error: 'writeByte' was not declared in this scope
exit status 1
'writeByte' was not declared in this scope
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
Мне брак попался или я что-то сделал неправильно?
Нашел крайне костыльный способ решени проблемы. Для «лечения» подобного ключа необходимо закомментировать return в приведенном куске кода:
Запустить скетч(с заранее указанным «правильным» family code), прижать таблетку к контактам, отправляем в монитор порта «w».
И происходит маленькое чудо! Ключ успешно пишется. Можно убирать коммент, ключ снова определяется в штатном режиме.
dl.dropboxusercontent.com/u/40958483/key.ino
А болванки TM08v2 должны поддерживаться этим дубликатором?
Как приедет ардуино (пара недель, надеюсь), буду пробовать, начну тогда с RW1990, но постараюсь попробовать и ТМ08v2.
Т.к. цель, кроме познавательной, еще и показать место компании, которая обслуживает домофон, которая наотрез не говорит коды, заставляя всех делать ключи по 150р. Возможно так же придется попробовать болванки ТМ08Vi-2 (уверяют, что они не фильтруются новыми Vizit, а у меня, похоже, как раз такой).
Пользуясь случаем, хочу выразить большой респект за данный дубликатор :). И если всё получится, с меня отчет по совместимости с ТМ08v2 и ТМ08Vi-2.
ТМ08Vi-2 пока опробовать не получилось из-за их отсутствия.
Ключи данным скетчем успешно записались во все 3 типа меток! Т.е. опробованные ТМ совместимы по методу записи с RW1990 и никаких проблем не возникло. Аллилуйя, ура, занавес :).
Домофон все 3 ключа скушал, правда это еще не целевой домофон, более простой вариант. Испытания на совместимость с новым Визитом еще впереди.
up. Для отчетности. Резистор R2 использовал номиналом 2.7К.
а разница между vi и vi2 как пишут только «улучшенной стабильностью при считывания ключа панелью. „
Может быть так получится.
Записывать не пробовал, заготовки еще нет.
Вчера записал на две разные ключи, один подошел. сегодня хотел на другой тоже такой ключ записать а он не пишется(остается прежний).
сам пользуюсь другим, попроще
подключение
Для чтения ключа подключите как на картинке и смотрите монитор порта
Для прошивки кода ввести w в мониторе порта, подключить как на картинке
//0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01
//0x9B, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01
//0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
//0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4C, 0x01
//0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
//0x49, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01
//визит
//0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 //My OK
//0xE1, 0x00, 0x36, 0x5A, 0x11, 0x40, 0xBE, 0x01
//0x1D, 0x00, 0x00, 0x0A, 0x11, 0x40, 0xBE, 0x01
//0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F //My OK
У тя тут коды, которые не ок, записаны задом наперёд, поэтому и не ок
//метаком, цифрал
//0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F
//0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B
//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14
//0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4C, 0x71
//0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D
//0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x49
//визит
//0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 //My OK
//0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1
//0x01, 0xBE, 040, 0x11, 0x0A, 0x00, 0x00, 0x1D
//0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F //My OK
вот так над
а этот код скорей всего убьёт ключ (сам я не записывал его)
//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14
простите, а где указать какой код я хочу прошить?
Собрал все по схеме, только резисторов подходящих не было, поставил 1.6 кОм и вместо 10кОм поставил 2 по 5.1кОм. Код считывается, но не перезаписывает, болванки 1990А-F5, может изза этого?
И еще вопрос: что за сноска GND и +5v? случайно не нужно подавать еще питания?
Тыщу раз уже расписано выше: ключи DS1990A-F5, TM1990A-F5 — не перезаписываемые, то есть их один раз программируют на заводе и всё, код внутри ключа зашивается один раз и на всегда.
Проверенные на запись ключи: RW1990, TM08v2 и TM-08 VZT F.
Нет.
Очень пригодилось. Работа очень понравилась.
Andrey_n303 августа 2016, 10:53
0
Ребят подскажите, у меня скетч не компилируется.
Arduino: 1.6.10 (Windows 7), Плата:«Arduino Nano, ATmega328»
C:\Users\Андрей\Documents\Arduino\sketch_aug03a\sketch_aug03a.ino: In function 'void loop()':
sketch_aug03a:74: error: 'writeByte' was not declared in this scope
exit status 1
'writeByte' was not declared in this scope
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
ОтветитьСообщить
avatar
Andrey_n303 августа 2016, 11:20
0
Вопрос решен, установил иде 1.6.9 все скомпилировалось.
ОтветитьСообщить
avatar
kvolk13 сентября 2016, 11:20
0
Проблема в русских буквах в имени пользователя — может кому-нибудь пригодится.
Болванку еще не успел затестить.
Кто что может подсказать? У кого читает?
На днях думаю найду, тогда отпишусь.
А пока на счет ключа TM08v2…
Скетч на принудительное чтение показал ключ типа 00-00-00-00-00-00.
Это означает что ключ не считан? Или это ключ такой и есть?
При попытке их восстановить таким способом, нечего не происходит.
Программатор сообщает о том, что код успешно записан и сразу же выполняет его чтение на что в ответ и получает ( 0 0 0 0 0 0 0 0 )
После всех этих манипуляций он все еще успешно продолжает работать с домофоном.
img.mysku-st.ru/uploads/images/06/09/28/2017/01/07/a9ea3c.png
mySKU.me/blog/aliexpress/42027.html#comment1659981
Так вот, rw1990A без проблем читается и пишется, а вот с болванкой tm08v2 проблема остается, потому пока вообще ее отложил в сторону.
Сходил в сервис, там уже на более продвинутом дубликаторе с моего «домашнего» ключа tm08v2 считали дамп и залили на болванку rw1990a.
Этот дамп я уже смог прочитать схемой на arduino, только вот этот ключ дверь не открывает)
Ключ читается так 00:00:00:00:00:00
У кого tm01a оаботает с данной схемой?
Подскажите, можно ли прописать 2 кода в один ключ? Если не трудно, объясните как или дайте ссылку на скетч. Заранее спасибо.
2 кода в один ключ нельзя, 1код = 1 ключ.
Именно это они и сделали.
Пробуйте, может быть это отбраковка?
Болванка rw1990. Пытаюсь копировать ключ:
На али из обзора проверенные, можно брать?
Кстати, в сети попадалась информация, что существуют разные версии болванок rw1990 («Новый код для RW1990 записывается инверсно. Как обычно передача начинается с family code, младшим байтом вперед, но биты в каждом байте инвертированы. Больше отличий в протоколах нет»). Ещё где-то попадалось, что эти болванки при записи чувствительны к помехам. Может дело в этом, попробую укоротить провода.
С теми же самыми болванками попробовал еще поэкспериментировать. Более короткие провода сделал, потом начал экспериментировать с сопротивлением R2. В итоге с 500 Ом и какой-то магией получилось с n-ной попытки.
Похоже, действительно помехи. Либо ардуина…
byte newID[8] = {0x00, 0x00, 0x00, 0x00, 0x00 };
Возможно теперь как-либо восстановить ключ? Прикладывая его снова, он не читается, будто его нет!
Прошивал с помощью первого скетча.
Не получается у меня всё никак вывести на дисплей считываемую информацию. Скетч работает без дисплея, а как ввожу в скетч для вывода на дисплей, программа ругается на ошибку в скетче и так далее:
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(115200);
}
Помогите пожалуйста, уже запутался. Заранее благодарю.
Ключи rw1990 пишутся и читаются на ура.
Не получается прочитать код с ключей cyfral. В чем может быть дело?
Наконец дошли руки тоже сделать такой дубликатор.
С резистором 2,2 КОм ключ также не записывался как у Tosha.
Но поставил на 390 Ом — ключ записался, домофон открыл.
Болванки RW1990 с Алиэкспресс, система — Windows XP SP3, среда — Arduino IDE 1.0.6.
(Т.к. под ХР в более поздних версиях программы не компилируются скечи.
Возможно нужно доустанавливать какие-то файлы).
ЗЫ. Спасибо, добавлю в обзор.
На одном форуме писали, что записывали на резисторе 220 Ом.
Или 240 Ом.
Или, вот тоже, похоже, в каком-то серьезном исследовании используют резистор на 200 Ом.
"...RW1990.2 стабильно записывается при номинале подтягивающего резистора 200 Ом".
Правда там RW1990.2 и дубликаторы не на Ардуине (Microchip PIC16F88 и второй на ATMEGA16).
Всё собрал — работает!
Интересуюсь именно программой.
Для копирования ключа можно приложить исходный ключ, его номер считается в архив [addr], ключ убираю, кратковременно нажимаю кнопку, загорается светодиод и программа ждёт пока не будет приложена болванка. Как только болванка приложена — в неё записывается новый ID из исходного ключа.
Вопрос в следующем: почему останавливается loop() и на какой строке?
Вижу, что автор бывает тут и надеюсь на ответ, спасибо!
Пока не приложен ключ, условие «if (!ibutton.search (addr))» выполняется и код продолжается до строки «if (val <= 5) return», после чего происходит возврат к началу loop(). Т.о. кроме опроса состояния кнопки и нового поиска устройства на OneWire ничего не происходит.
Подскажите, пожалуйста, где можно прочитать про команды «ibutton.write(0xD1);» и «ibutton.write(0xD5);» — понятно, что это часть алгоритма записи на RW1990, но хотелось бы почитать подробнее. С ходу не нашел информации про эти коды. Везде только «0x33» и «0х0F».
Видел эту статью, но когда читал, ещё так глубоко не копал и пропустил информацию мимо.
Сегодня нашел анализ протокола записи RW-1990 неким студентом, прочитать можно тут.
А вот в скетче в этой статье после посылки команды 0xD1 все делается правильно, а в функции writeByte задержка 60us используется при посылке бита 1, а не 0.
Ошибка?
В RW1990.1 данные записываются инверсно!
Так что скетч рассчитан именно на них.
открылись как с родного. спасибо. удачи вам
Такую?
Есть 1 оригинальный ключ DS1990a
Есть болванки DS1993 +F5
Возможно ли сделать копию оригинального ключа?
Просто прямо сейчас имеются DS1993. Жалко что нельзя их использовать.
Суну и я свой пятак. Собрал макетку для Уны, добавил пищалку. Скетч доработал — использовал другие пинЫ, для компактности макетки. «Причесал» вывод на экран, чтобы строки не сползали.
Мой вариант скетча (не получается убрать в спойлер, извиняюсь)):
На Алишке закупился болванками по ~40 руб\шт. Прошил их «вездеходными» номерами (см. в начале скетча) и пошёл проверять в своём подъезде. Там стоит Визит. Подошли первые пять кодов. Скачал инструкцию от домофона и эти ключи стёр из него все по одному. Профит: вот уже 2 недели НИКАКОЙ рекламы в ящиках!!! А почту и квитанции приносят.
Спасибо ТС и всем участвовавшим!
А какой Дисплей? Вы о чём? Всё через терминал выводится.
Про «муть» читайте в начале коммента, а не только картинки смотрите.
Так что скорее всего мне китайцы Read Only прислали. Пытаюсь с ними поругаться, но скорее всего бесполезно — говорят, что устройство самодельное, оттого возможно и не работает. Попробуйте, говорят, на другом проверить. Кстати, судя по почте, на которую они просили видео работы прислать, это Banggood.
и каждый раз не перестаю убеждаться, насколько это нужная вещь.
Но нужно открыть один домофон, и ни один универсальный ключ не подходит.
Кодами с клавиатуры не открывается.
Коды для ключей, которые по поиску на первой странице яндекса не подходят.
(Это 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x56, 0x00, 0xBB и другие).
Возможно может кто-нибудь подскажет еще универсальные коды?
Или другие коды с клавиатуры?
Т.к. почтальоны заходят, и вряд ли они делали специальный ключ именно для этого домофона.
Домофон обычный визит типа такого.
⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Y⸮⸮⸮⸮⸮i⸮⸮Y⸮M⸮mzY⸮⸮y⸮Y⸮x⸮jY⸮y⸮x⸮⸮⸮⸮y⸮k⸮⸮⸮x⸮Y⸮x⸮⸮⸮⸮⸮mk⸮Y⸮zY⸮Y⸮k1⸮zY⸮Kqk⸮⸮⸮⸮M⸮⸮⸮k1⸮zy⸮⸮mK1⸮mY⸮K1zY⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Y⸮k⸮⸮mYQYQ⸮⸮K1⸮y⸮zY⸮⸮Mx⸮Kqy⸮⸮⸮k⸮x⸮K1KqY⸮MY⸮M⸮⸮⸮z⸮k⸮⸮y⸮⸮Mk⸮⸮⸮⸮⸮ɗM⸮Mk⸮⸮⸮⸮zy⸮⸮⸮⸮⸮m⸮MK1y⸮MOq⸮y⸮k⸮⸮⸮⸮⸮⸮⸮Y⸮k⸮y⸮YQk1⸮⸮MY⸮⸮q⸮⸮Y⸮⸮YٕMK1zY⸮x⸮Y⸮MK1Y⸮Y⸮Z⸮Y⸮x⸮⸮⸮⸮Z⸮⸮⸮⸮qzY⸮⸮MKqY⸮⸮mK1Oq⸮y⸮Y⸮x⸮⸮MY⸮⸮⸮zY⸮x⸮Y⸮k⸮Y⸮k⸮zY⸮KqzY⸮k⸮zY⸮K1x⸮zY⸮⸮Mk]⸮⸮y⸮k⸮OqK1x⸮Y⸮⸮y⸮Y⸮z
пробовал менять резисторы не помогает, что может быть не так?
В обзоре это написано:
В корпус стал как родной и пилить не чего не надо)))
я к тому что если делать в корпусе от Powerbank то это идеальное решение
Он собран на ATMEGA168P
Интересует вывод:
Serial.print(«CRC: „);
Serial.print(“ ID before write:»);
Serial.print(" Writing iButton ID:\n ");
вот ссылка на скетч cloud.mail.ru/public/3bb3/w6mTc6KNH
mySKU.me/blog/aliexpress/58428.html
Atmega 328 Mini USB память 32 Килобайт
У меня как раз Atmega 168
ну и библиотеки ессно подключите. например так
и ещё можно дублировать буфер и надписи на дисплее?
A5-SCL
Это и з за того что в буфер он постоянно отправляет данные
+ у вас ошибка
lcd.init(); // initialize the lcd
lcd.init();
надо изменить на
lcd.begin();
lcd.begin(); // инициализация LCD
а Serial.begin(9600); удалить. он тут не используется
подправил код
это при попытке зашить ключ
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
ID before write:
FF:FF:FF:2F:FF:FF:FF:FF:
Writing iButton ID:
F1:FF:FF:FF:FF:FF:2F:2F:F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
F1:FF:FF:FF:FF:FF:2F:2F: CRC:3C
плохо что здесь строки кода не пронумерованы. приходится весь скетч выкладывать.
ID before write:
1:4B:F2:7E:B:0:0:E9:
Writing iButton ID:
1:FF:FF:FF:FF:FF:FF:2F:
1:FF:FF:FF:FF:FF:FF:2F: CRC:2F
После считывания не пишется контрольная сума CRC:E9 и CRC:2F
А в мониторе порта все осталось как вы сделали
Я бы еще добавил в пост, что делать с «OneWire ». Лишь по коментариям понял что это «плагин» который надо добавить в N папку.
это для таких же «тугих» как я )) кто первый раз видит «ардуино».
Надеюсь теперь закрою проблему с ключами на работе.
использовал smd компоненты, 102 и 103 (выпаял с платы водонагревателя, больше негде взять)
и остался вопрос, а можно как-то самому прописывать ключи?
Спасибо.
Буду думать как это собрать в приятный корпус.
Кстати, среди ключей что валялись на работе, нашлась парочка перезаписываемых, на одном даже заводская надпись — христос воскрес.
Видимо кто-то заказывал «именные».
Подключение LCD дисплея
GND-GND
+5V-VCC
A4-SDA
A5-SCL
*/
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystalRus_I2C.h>
#define pin 11
OneWire ibutton (pin); // Пин D11 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f}; // «Универсальный» ключ. Прошивается последовательность 1:FF:FF:FF:FF:FF:FF:2F:CRC: 2F
const int buttonPin = 6; // Пин D6 Подключение кнопки
const int ledPin = 13; // Пин D13 Подключение плюса светодиода
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
LiquidCrystalRus_I2C lcd(0x27, 16, 2); // Адрес Lcd дисплея 16х2
void setup() {
lcd.init(); //Инициализация
lcd.begin(16,2);
lcd.backlight(); //Подсветка (с некоторыми экранами не обязательно)
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(9600); // Скорость монитора порта
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print(L" Программатор"); //выводим русский текст
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print(L" RW-1990 Ключей"); // Вторая строка при включении
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
readflag = 1;
writeflag = 1;
digitalWrite(ledPin, HIGH);
}
if (!ibutton.search (addr)) {
ibutton.reset_search();
delay(50);
return;
}
digitalWrite(ledPin, HIGH);
delay(50);
lcd.clear();
for (byte x = 0; x < 8; x++) {
Serial.print(addr[x], HEX);
lcd.print(addr[x], HEX);
if (readflag == 0) {
ReadID[x] = (addr[x]);
}
lcd.print(":");
Serial.print(":");
if (x==5) lcd.setCursor (0,1);
}
byte crc; // Проверка контрольной суммы
crc = ibutton.crc8(addr, 7);
lcd.setCursor(9, 1);
lcd.print(" CRC:");
lcd.print(crc, HEX);
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.println();
Serial.println(" ID ключа перед записью:");
lcd.clear();
lcd.print(" ID before write:");
for (byte x = 0; x < 8; x++) {
Serial.print(ibutton.read(), HEX);
// lcd.print(' ');
// lcd.print(ibutton.read(), HEX);
Serial.print(':');
}
Serial.print(" CRC:");
Serial.println(crc, 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.println();
Serial.println(" ID ключа после записи:");
lcd.print('\n');
lcd.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]);
lcd.print('*');
Serial.print(newID[x], HEX);
Serial.print(':');
}
Serial.print(" CRC:");
Serial.println(crc, HEX);
lcd.print('\n');
Serial.println();
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;
}
Ссылка на библиотеки
Распаковывать в: Папка с Arduino\libraries
Далее Файл=>Примеры=>OneWire=>RW1990_LCD_RUS
А зачем. Эти строки
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
Их можно и убрать.
чтобы было примерно написано
ID before write:
1FFFFFFFFFFFF2F
и ещё
Writing iButton:
1FFFFFFFFFFFF2F (где это новый ключ)
Подключение LCD дисплея
GND-GND
+5V-VCC
A4-SDA
A5-SCL
*/
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystalRus_I2C.h>
#define pin 11
OneWire ibutton (pin); // Пин D11 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f}; // «Универсальный» ключ. Прошивается последовательность 1:FF:FF:FF:FF:FF:FF:2F:CRC: 2F
const int buttonPin = 6; // Пин D6 Подключение кнопки
const int ledPin = 13; // Пин D13 Подключение плюса светодиода
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
LiquidCrystalRus_I2C lcd(0x27, 16, 2); // Адрес Lcd дисплея 16х2
void setup() {
lcd.init(); //Инициализация
lcd.begin(16,2);
lcd.backlight(); //Подсветка (с некоторыми экранами не обязательно)
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(9600); // Скорость монитора порта
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print(L" Программатор"); //выводим русский текст
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print(L" RW-1990 Ключей"); // Вторая строка при включении
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
readflag = 1;
writeflag = 1;
digitalWrite(ledPin, HIGH);
}
if (!ibutton.search (addr)) {
ibutton.reset_search();
delay(50);
return;
}
digitalWrite(ledPin, HIGH);
delay(50);
lcd.clear();
for (byte x = 0; x < 8; x++) {
Serial.print(addr[x], HEX);
lcd.print(addr[x], HEX);
if (readflag == 0) {
ReadID[x] = (addr[x]);
}
Serial.print(":");
if (x==7) lcd.setCursor (0,1);
}
byte crc; // Проверка контрольной суммы
crc = ibutton.crc8(addr, 7);
lcd.setCursor(5, 1);
lcd.print(«CRC:»);
lcd.print(crc, HEX);
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.println();
Serial.println(" ID ключа перед записью:");
lcd.clear();
//lcd.print(«ID before write:»);
for (byte x = 0; x < 8; x++) {
Serial.print(ibutton.read(), HEX);
// lcd.print(' ');
// lcd.print(ibutton.read(), HEX);
Serial.print(':');
}
Serial.print(" CRC:");
Serial.println(crc, 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.println();
Serial.println(" ID ключа после записи:");
//lcd.print('\n');
lcd.print(«Writing iButton:\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]);
//lcd.print('*');
Serial.print(newID[x], HEX);
Serial.print(':');
}
Serial.print(“ CRC:»);
Serial.println(crc, HEX);
lcd.print('\n');
Serial.println();
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;
}
Пока учусь на чужих примерах.
Спасибо.
Отличие от других версий она всего с 2 резисторами (но без монитора порта)
Инструкция находиться по пути: libraries\OneWire\examples\v3_RW1990_LCD_RUS\Dublicator_v3.pdf
Видел еще у китайцев считыватели MATRIX2 — они по выходу onewire. Можно еще и клонирование 13Мгц ключей добавить — места до черта остается…
На ардуине работает.
На STM не читает ключи. Кнопка и порт вывода работает.
Почему так?