Библиотека OneWireSlave позволяет использовать ардуину на линии 1-Wire в качестве ведомого устройства. Подробнее о OneWire можно прочитать здесь. Теоретически на линии может быть до 2^48 или 281 триллионов ведомых устройств.
С помощью этой библиотеки на одну линию совместно с датчиками температуры и прочими устройствами, использующими протокол 1-Wire, можно подключить несколько ардуин.
OneWireSlave(uint8_t pin);
— конструктор, параметром указывается пин ардуины для OneWire линии.
void setRom(char rom[8]);
— устанавливает тип и адрес устройства. Если библиотека скомпилирована с поддержкой расчета контрольной суммы crc8, то она подсчитывается и заносится в последний байт rom.
bool waitForRequest(bool ignore_errors);
— функция блокирует выполнение программы и ожидает обращения к текущему устройству. Функция возвращает управление программе, если ведущее устройство отправило команду MATCH ROM с адресом текущего устройства или команду SKIP ROM. Во время ожидания функция принимает участие в поисковых запросах ведущего устройства и отвечает на команду READ ROM. Таким образом обеспечивается поддержка базового протокола. Если параметр ignore_errors установлен, то функция будет игнорировать ошибки чтения/записи, иначе вернет FALSE.
bool waitReset(uint16_t timeout_ms);
— функция ждет RESET импульса на линии, после чего возвращает управление программе. Параметр timeout_ms устанавливает время в миллисекундах, по истечение которого функция принудительно вернет управление программе. Если timeout_ms равен 0, то программа будет вечно ожидать RESET импульс, пока не дождется. Стандартное значение timeout_ms — 1000. Возвращает TRUE, если принят сигнал RESET, в случае слишком короткого или слишком длинного сигнала или по истечение времени ожидания вернет FALSE.
bool presence(uint8_t delta);
— функция посылает сигнал PRESENCE согласно протоколу. Если в конце передачи сигнала на линии по какой-либо причине будет низкий уровень сигнала, функция вернет FALSE.
bool search();
— функция участвует в процедуре поиска устройств, описанной в документации протокола OneWire. Возвращает TRUE, если при поиске было найдено текущее устройство, иначе FALSE.
uint8_t sendData(char buf[], uint8_t len);
— отсылает на линию указанный объем данных. Возвращает количество отосланных байт данных.
uint8_t recvData(char buf[], uint8_t len);
— считывает с линии указанный объем данных и заносит их в указанный буфер. Возвращает количество успешно считанных байт данных.
void send(uint8_t v);
— отсылает на линию один байт данных.
uint8_t recv(void);
— считывает с линии один байт данных.
void sendBit(uint8_t v);
— отсылает на линию один бит данных.
uint8_t recvBit(void);
— считывает с линии один бит данных.
static uint8_t crc8(char addr[], uint8_t len);
— функция подсчитывает контрольную сумму по алгоритму crc8 указанного объема данных.
uint8_t errno;
Если выполнение функции закончилось неудачей, то она занесет номер ошибки в эту переменную.
Ошибки:
ONEWIRE_NO_ERROR при выполнении функции не возникло никаких исключений.
ONEWIRE_READ_TIMESLOT_TIMEOUT истекло время ожидания таймслота от ведомого устройства при чтении с линии. Устанавливается функциями recv*.
ONEWIRE_WRITE_TIMESLOT_TIMEOUT истекло время ожидания таймслота от ведомого устройства при записи на линию. Устанавливается функциями send*.
ONEWIRE_WAIT_RESET_TIMEOUT истекло время ожидания импульса RESET на линии. Устанавливается функцией waitReset.
ONEWIRE_VERY_LONG_RESET импульс RESET принят, но оказался слишком длинным (возможно это не RESET, а что-то другое). Устанавливается функцией waitReset.
ONEWIRE_VERY_SHORT_RESET импульс RESET оказался слишком коротким. Такая ошибка может появиться, если при ожидании RESET сигнала другое устройство начало передачу данных.
ONEWIRE_PRESENCE_LOW_ON_LINE по окончании передачи PRESENCE сигнала на линии оказывается низкий уровень сигнала. Согласно протоколу все устройства в момент считывания сигнала с линии должны были прекратить передачу импульса PRESENCE.
Пример скетча, эмулирующего работу ключа ibutton с микросхемой DS1990A
#include "WProgram.h" #include "OneWireSlave.h" char rom[8] = {0x01, 0xAD, 0xDA, 0xCE, 0x0F, 0x00, 0x00, 0x00}; OneWireSlave ds(8); void setup() { ds.setRom(rom); } void loop() { ds.waitForRequest(false); }
В данном случае функция waitForRequest вернет FLASE с ошибкой ONEWIRE_READ_TIMESLOT_TIMEOUT, т.к. домофон (или его эмулятор) не выбирает устройство, а только считывает его адрес.
В случае обрыва линии, на выводе может возникнуть неопределенное состояние, поэтому рекомендуется вывод ардуины подключить к земле через резистор 220к.
Заметка: с реальным домофоном без дополнительной обвязки ардуина работать не будет, т.к. в современные домофоны устанавливаются защиты от копированных ключей. Защита срабатывает на основе некоторых электрических и возможно временных параметров.
Скачать библиотеку: OneWireSlave.zip
OneWireSlave2.zip (с доработкой от Алексея Мочалова(lex512))
Автор статьи: Александр Гордеев — победитель конкурса «Напиши эмулятор iButton-а для Arduino и получи ProtoShield в подарок!»
По теме
Протокол 1-Wire
Практическое программирование Arduino/CraftDuino — протокол 1-Wire и iButton
Arduino/CraftDuino и эмулятор iButton
13 комментариев на «“Arduino и 1-Wire — эмуляция ведомого устройства с помощью библиотеки OneWireSlave”»
Не совсем понял практический смысл как использовать ардуину на линии 1-Wire в качестве ведомого устройства, но чувствуется работа проделана большая. Great work!
Вернее не так. «Для каких целей спользовать ардуину на линии 1-Wire в качестве ведомого устройства» 🙂
А для каких целей используют микроконтроллер?
Вот для этих целей и Ардуино, 1-Wire это просто один из вариантов доступа в дополнение к UART или Ethernet(нужен доп шилд)
Кстати вдогонку, есть интересная реализация взаимодействий 2х и более Ардуино по I2C, один из которых Мастер.
а где ссылка??
proteus на линуксе?
здоровым.
Я не работаю… Я должен Arduino IButton как сканеры, но когда я подключить эмулятор для читателя, я через последовательный монитор Arduino пишет неполную ID — 1 8B C8 FF FF FF FF. и так домофона на эмуляторе не работает.
Я с Ардуинкой новичок, но назрел вопрос. Где взять библиотеку «WProgram.h»?
этот заголовочный файл использовался в старых версиях IDE.Как адаптировать библиотеки для Arduino 1.0
см.
Светлых мыслей.
Благодарность авторам и выложившим сюда описание людям.
А можно написать минимальные требование для библиотеки?
В attiny13 влезет?
Хорошо бы порт нв stm8s003f3p6 по 17р. за проц 🙂
Если залить это на Arduino то можно открыть этим домофон?
Не могу понять что это за ошибка?
CC:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino:4:62: warning: narrowing conversion of ‘173’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
char rom[8] = {0x01, 0xAD, 0xDA, 0xCE, 0x0F, 0x00, 0x00, 0x00};
^
C:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino:4:62: warning: narrowing conversion of ‘218’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
C:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino:4:62: warning: narrowing conversion of ‘206’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
C:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino: In function ‘void setup()’:
C:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino:8:18: warning: invalid conversion from ‘char*’ to ‘unsigned char*’ [-fpermissive]
ds.setRom(rom);
^
In file included from C:\Users\MLG\Documents\Arduino\sketch_jan13b\sketch_jan13b.ino:2:0:
C:\Users\MLG\Documents\Arduino\libraries\OneWireSlave/OneWireSlave.h:44:10: note: initializing argument 1 of ‘void OneWireSlave::setRom(unsigned char*)’
void setRom(unsigned char rom[8]);
^
Подскажите как реализовать такое на ESP?
народ кто может помочь добавить данную функцию в этот скетч.
действия:
1) если приложен ключ 1 {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C}, выполняется первая команда записанная в скетче.
2) если приложен ключ 2 {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB}, начинается инициализация передачи кода {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB} на пин 6