Решил написать в отдельную тему, т.к. другие темы по радиоуправлению, вроде как не имеют отношения к DCC.
Я давал уже ссылку на
этот проект, в
теме со ссылками по проектам на базе Arduino.
Т.к. я планирую, также, как и Андрей, использовать на макете состав для чистки рельсов и чтобы не быть завязанным на плохой токосъём, в процессе чистки, мне было интересно попробовать, как это вообще работает и можно ли это использовать.
Собрал из подручных средств два устройства и попробовал по-управлять.
Для себя решил добавить, в схему передатчика, опторазвязку на базе 6N137, ну и питание сделал отдельное, а не от DCC.
Для управления, приёмник обрабатывает только команды, отправленные на конкретный, прописанный в скетче, локомотивный адрес. Изменить его можно, только перепрошив заново ардуино, прошивкой с новым значением адреса. Надо будет подумать, как это можно изменить.
В ходе тестирования, также обнаружился один неприятный момент. Приёмник никак не реагирует на выключение DCC или питания передатчика, либо потерю связи с ним. Это не очень приятный момент, т.к. при этом мы полностью теряем контроль над локомотивом.
Он в это время будет выполнять последнюю, полученную им команду и хорошо, если это будет команда остановки. А если нет?
Решил исправить ситуацию и немного подправить код.
Управление драйвером двигателя осуществляется цифровыми выходами D5 и D6, состояние которых изменяется прерыванием по таймеру2.
Немного почесав тыковку, пришёл к такому решению......
При отсутствии входящих сообщений по радиоканалу, необходимо запретить работу прерываний и установить на портах D5 и D6 низкий уровень, что приведёт к снятию питания на выходе драйвера.
При появлении сообщений, требуется всего лишь снова разрешить прерывания.
Для этого в скетче приёмника, в цикле loop, добавляем пару строчек(выделены слешами//):
Скрытый текст
Arduino код:
void loop(){
Serial.println("trying");
delay(100);
if ( radio.available() ) {
radio.read( &dataReceived, sizeof(dataReceived) );
newData = true;
////////////////////////////////////////////////////////////////////////
interrupts();//подключаем прерывания
////////////////////////////////////////////////////////////////////////
}
//////////////////////////////////////////////////////////////////////////////////////////////////
else{noInterrupts(); PORTD = B00000000;}// иначе отключаем прерывания и устанавливаем на портах
// управляющих драйвером низкий уровень, тем самым снимая питание на выходе драйвера.
//////////////////////////////////////////////////////////////////////////////////////////////////
if (newData == true) {
//Serial.println(dataReceived);
inString = String(dataReceived);
string();
newData = false;
}
Теперь при нажатии кнопки Стоп на мультимаусе, отключении питания передатчика или потери сигнала, питание с декодера сразу снимается и лок останавливается, а после восстановления соединения продолжает выполнять поступающие команды.
Буду это воплощать в "железе", на нормальных платах, т.к. радиомодули очень чувствительны к потерям контакта и качеству питающего напряжения.