Помогите подружить iButton и Arduino.

alexig
Offline
Зарегистрирован: 13.04.2015

Всем привет. Помогите новичку. Хочу сделать дубликат соего ключа iButton. Купил Arduino и несколько заготовок, пробовал как тут:

https://www.youtube.com/watch?v=r5tBm_yZgiE

Считал я ключ нормально, а при попытке записать ничего не происходит. Резисторы менял разные. Вот скетч:

#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); 

}

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013
cc_coba
Offline
Зарегистрирован: 06.03.2014

а что за ключ для записи ты использовал?

alexig
Offline
Зарегистрирован: 13.04.2015

cc_coba пишет:

а что за ключ для записи ты использовал?

rw1990

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
RuslanX
RuslanX аватар
Offline
Зарегистрирован: 20.05.2017

Уважаемые формучане. Нужна помощь.  Исполнительных устройств по реализации с iButton много. Но я не нашел как реализовать чтения электронного ключа сразу двумя ардуинами. Мне нужно чтобы приложив ibutton сработали сразу две андруино. так как они расположенны в разных местах и далеки друг от друга, то самое лучшее решение для меня это параллельное чтитывание. 

Пример: Приложив ключ одно ардуино включает электроэнергию в одном месте, другой ардуино в другом.

Не могу понять как реализовать синхронизацию всего этого.

Заранее плагодарю за помощь. 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

В протоколе 1-Wire последовательная передача осуществляется в полудуплексном режиме (т. е. либо прием, либо передача), внутри дискретно определенных временных интервалов, называемых тайм-слотами.

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

Вижу 2 выхода:

а) использовать три Arduino, одна считывает iButton, и передает ID (либо хранит в себе разешенные ключи и сразу выдает "разрешено"/"запрещено) остальным. Связь по RS-485 (помехоустойчивость) или напрямую RX-TX (если не далее 3 м). Полноценную Arduino можно не брать, достаточно крошки Digispark (размеры 22x20 мм) или ProMini.

б) использовать только две существующие Arduino, при этом одна из них возьмет на себя функции общения с iButton и передачи ID в другую Arduino. По линии связи аналогично п. а)

RuslanX
RuslanX аватар
Offline
Зарегистрирован: 20.05.2017

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

А как вам такая идея. Предположим я расположу например ардуино мастер на расстоянии 10 метров от таблетки. А так сказать пвссивный ардуино (считыватель ключа) непосрественной близости от колодки Ibutton и при записи кода ключа она передаст его (или команду на включение утройствами) по эфиру на частоте 315 мгЦ на третью исполняющую ардуино? Как бы с помехами с вами согласен. Но мне не понятен вопрос синхронизации. Вот например. Обычный домофон понятно как работает и алгоритм считывания кода с таблетки и этих программ много в инете. Но второй ардуино имеет свою тактовую внутреннюю частоту и уж она точно не совпадает с домофоном. Так какая есть возможность синхронизации? По RX-TX все понятно. Но в жизни может возникнуть такая ситуация и в других решениях когда один ардуино выступает в роли ведушего, а второй в роли ведомой флешки. Так каким способом они за синхронизируются? Я полагаю (а вы поправьте если не прав) что ардуино-2 можно запрограмировать в роли таблетки, только с одним условием после сброса и команды на чтение она переходит в режим чтения и параллельно записывает код. Может какое быть? Я слаб в програмировании и контроллерах, у меня область по электроники другая. Я занимаюсь технологиями Тесла, а там контроллеры не выживают.  Спасибо вам что уделяете мне внимание.   

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Что-то вы излишне усложняете. Не нужна тут синхронизация.
К iButton сколько проводов проложено, 2 или 3?
Если 3, то вообще все шоколадно.
Если 2, то возле iButton разместить мастер, по этим проводам дать питание 5 В, а линию RX-TX прокинуть по радиоканалу (передатчик на мастер, а приемников можно сколько угодно), модуль на 433 МГц стоит 200 р. HC-12 подороже, но там зато аппаратное решение коллизий и помех (но приемник вроде только один).