Передать/принять двоичное значение с помощью Arduino

ii_alex
Offline
Зарегистрирован: 28.12.2015
Только начал осваивать Arduino очень много непонятно пытаюсь вникать. Огромное спасибо всем помогавшим участникам, а особенно dimax за помощь в освоении. 
 
Вот возникла задача, к которой совсем не знаю как подойти. Если не затруднит направьте на путь, как 
можно реализовать, если можно и не очень затруднит с примерами. Ну или просто идеи.
 
Существует 2  Arduino между ними нужно организовать связь в одну сторону. Arduino 1  при выполнении 
определенного условия должна передать по одному порту одно из 15 значений. На определенной частоте, например 53 гц.
 
Другая Arduino должна это все принять по одному порту и воспроизвести на своих 4 портах двоичное значение переданной переменной от Arduino 1. Подтверждения данной операции от Arduino 2 не требуется. Переменная, которую необходимо передавать имеет значения от 0 до 15.
 
Для второй Arduino задача в детекте частоты 53гц упрощается. Т.к есть маленький детектор частоты (устройство ) которое может игнорировать все, что приходит на него на частоте отличной от 53 гц. 
Т.е на входе второй Arduino детектор будет изменять значение порта с состояния high на Low (или наоборот), когда обнаружит что-то у себя на входе с частотой 53гц. 
 
Посоветуете алгоритм передачи значения переменной. 
khseal
Offline
Зарегистрирован: 15.01.2016

ii_alex пишет:

Для второй Arduino задача в детекте частоты 53гц упрощается. Т.к есть маленький детектор частоты (устройство ) которое может игнорировать все, что приходит на него на частоте отличной от 53 гц. 
Т.е на входе второй Arduino детектор будет изменять значение порта с состояния high на Low (или наоборот), когда обнаружит что-то у себя на входе с частотой 53гц. 
 
Посоветуете алгоритм передачи значения переменной. 

Так алгоритм напрямую зависит от значений количества импульсов на детекторе. Считаете импульсы и присваиваете переменные или у вас прямая завимисмость импульсов от переменных?

ii_alex
Offline
Зарегистрирован: 28.12.2015

khseal пишет:

Так алгоритм напрямую зависит от значений количества импульсов на детекторе. Считаете импульсы и присваиваете переменные или у вас прямая завимисмость импульсов от переменных?

В таком варианте если например значение переменной 5, с Arduino 1 мы отсылаем 5 импульсов длительностью 200мс (детектору для точной сработки нужен импульс длительностью не менее 180мс) каждый. На приемной стороне просто считаем эти импульсы и присваиваем переменной значение. Затем в соответствии с полученным значением выставляем порты Arduino 2 в соответствии с bin значением переменной. 

Все вроде хорошо, но будет очень много ложных срабатываний, в канале передачи импульсов образуются наводки от досаточно мощъного оборудования, единичный импульс длительностью 200 мс в таких условиях очень частое явление, а иногда и 2 импульса подряд прилетают, смещение частоты не помогает тем более, что она ограничена детектором до 100 гц . Ошибочные импульсы будут посчитаны. Мы пытались реализовать такой алгоритм на счетчике и дискретных элементах, без использования arduino, все передавалось и работало отлично, но справится с ложными срабатываниями так и не смогли. 

Нужно что-то более защищенное. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ii_alex, я для тиньки делал нечто похожее, не подойдёт?

ESV
Offline
Зарегистрирован: 16.12.2015

1 Почему именно  частота а не напряжение 0-15 или ток?

2 Как часто переменная меняется?

3 наскольно изменение переменной критично по времени?

ii_alex
Offline
Зарегистрирован: 28.12.2015

dimax да да вот примерно, что-то подобное и хочется пока начинаю осваивать, немного сложно для понимаия и код для тиньки, попытаюсь разобраться. Еще бы как-то, при условии генерить импульсы с определенной длительностью и на частоте 53 гц научится. А потом уже и похожий алгоритм передачи использовать можно. Пытаюсь разобраться. 

ESV    Потому-что планируется собрать схему управления устройством, которое находится очень далеко. Обычных каналов связи с этим устройством нет. Есть только канал радиосвязи на определенной частоте. Так  же есть канал  CTCSS который реализован, но не задействован в оборудовании (можно задействовать для определенных нужд ).  Сигналы CTCSS подмешиваются в канал радиосвязи по мере необходимости. Полоса CTCSS которую я могу использовать от 53 до 100 гц можно выбрать любую частоту из этого из диапазона. Так же имеется детектор сигналов CTCSS который умеет принимать и детектировать синалы на определенной, заданной частоте, например 53 Гц, а все остальные частоты отсекает. Т.е если на вход детектора подавать используя канал радиосвязи сигналы 53 гц (опустим каналы обработки и т.д) то на выходе детектора получим изменение уровня. Например на выходе детектора LOW на вход детектора прилетел сигнал на частоте 53 ГЦ длительностью 180 мс, детектор его принял и на 180 мс дал на выходе HIGH. Правда сигналы CTCSS подразумевают использование синусоиды. Но проверив на прямоугольных импульсах, собрав генератор который сделал dimax и выставив частоту 53 гц я получил отличную сработку детектора. Значит писать часть преобразования и делать цап для преобразования из прямоугольника в синус ненужно (от очень упрощает задачу).

Переменная будет менятся, ну наверное раз в неделю или месяц. 

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

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

 

  

ESV
Offline
Зарегистрирован: 16.12.2015

Если Изменение переменной по времени сильно не критично но хотелось бы уложится в диапазон от 1 до 5 секунд , то можно промодулировать несущую частоту сигналом UART на скорости допустим 5.6 бод (10 периодов на бит) или ниже, желательно(но не обязательно) кратно частоте несущей. Детектировать значение бита програмно по мажоритарному принципу.  Скопировать младшую тетраду передаваемого байта  в старшую (можно с инверсией)  с последующим програмным сравнением на приёмной стороне, наложить контроль чётности младшей тетрады и тд. Это если хочется сложно.

А по проще - разделить каждый 5 секундный интервал на 16+2 ровных частей и включать несущую n+1 интервалов 5с/18,   где n= переменная. полное отсутствие несущей и непрерывая несущая= false.