Форум ModelldepO

Форум ModelldepO (http://forum.modelldepo.ru/index.php)
-   Arduino (http://forum.modelldepo.ru/forumdisplay.php?f=220)
-   -   DCC "по-воздуху" (http://forum.modelldepo.ru/showthread.php?t=19897)

laba 02.04.2019 21:13

DCC "по-воздуху"
 
Решил написать в отдельную тему, т.к. другие темы по радиоуправлению, вроде как не имеют отношения к DCC.
Я давал уже ссылку на этот проект, в теме со ссылками по проектам на базе Arduino.
Т.к. я планирую, также, как и Андрей, использовать на макете состав для чистки рельсов и чтобы не быть завязанным на плохой токосъём, в процессе чистки, мне было интересно попробовать, как это вообще работает и можно ли это использовать.
Собрал из подручных средств два устройства и попробовал по-управлять.
Для себя решил добавить, в схему передатчика, опторазвязку на базе 6N137, ну и питание сделал отдельное, а не от DCC.
Для управления, приёмник обрабатывает только команды, отправленные на конкретный, прописанный в скетче, локомотивный адрес. Изменить его можно, только перепрошив заново ардуино, прошивкой с новым значением адреса. Надо будет подумать, как это можно изменить.
В ходе тестирования, также обнаружился один неприятный момент. Приёмник никак не реагирует на выключение DCC или питания передатчика, либо потерю связи с ним. Это не очень приятный момент, т.к. при этом мы полностью теряем контроль над локомотивом.
Он в это время будет выполнять последнюю, полученную им команду и хорошо, если это будет команда остановки. А если нет?
Решил исправить ситуацию и немного подправить код.
Управление драйвером двигателя осуществляется цифровыми выходами D5 и D6, состояние которых изменяется прерыванием по таймеру2.
Немного почесав тыковку, пришёл к такому решению......
При отсутствии входящих сообщений по радиоканалу, необходимо запретить работу прерываний и установить на портах D5 и D6 низкий уровень, что приведёт к снятию питания на выходе драйвера.
При появлении сообщений, требуется всего лишь снова разрешить прерывания.
Для этого в скетче приёмника, в цикле loop, добавляем пару строчек(выделены слешами//):
Скрытый текст
Arduino код:

void loop(){
  
Serial.println("trying");
  
delay(100);   
   
  if ( 
radio.available() ) {
        
radio.read( &dataReceivedsizeof(dataReceived) );
        
newData true;
  
  
////////////////////////////////////////////////////////////////////////      
        
interrupts();//подключаем прерывания
  ////////////////////////////////////////////////////////////////////////  
    
    
}
    
  
//////////////////////////////////////////////////////////////////////////////////////////////////  
    
else{noInterrupts(); PORTD B00000000;}// иначе отключаем прерывания и устанавливаем на портах
    // управляющих драйвером низкий уровень, тем самым снимая питание на выходе драйвера.
  //////////////////////////////////////////////////////////////////////////////////////////////////
    
      
if (newData == true) {
        
//Serial.println(dataReceived);
        
inString String(dataReceived);
        
string();
        
newData false;
    } 


Теперь при нажатии кнопки Стоп на мультимаусе, отключении питания передатчика или потери сигнала, питание с декодера сразу снимается и лок останавливается, а после восстановления соединения продолжает выполнять поступающие команды.
Буду это воплощать в "железе", на нормальных платах, т.к. радиомодули очень чувствительны к потерям контакта и качеству питающего напряжения.

Qvan22 02.04.2019 21:36

Цитата:

Сообщение от laba (Сообщение 341256)
При отсутствии входящих сообщений по радиоканалу, необходимо запретить работу прерываний и установить на портах D5 и D6 низкий уровень, что приведёт к снятию питания на выходе драйвера.

Я немного запутался, а разве отключение прерываний не застопорит работу шины SPI, которая общается с nrf24? Может безопаснее останавливать сам таймер за номером 2?

laba 02.04.2019 22:04

Цитата:

Сообщение от Qvan22 (Сообщение 341258)
Я немного запутался, а разве отключение прерываний не застопорит работу шины SPI, которая общается с nrf24?

Я не силён в теории, на практике, пока проблем не заметил.
Цитата:

Сообщение от Qvan22 (Сообщение 341258)
Может безопаснее останавливать сам таймер за номером 2?

Если разъясните, как это грамотно сделать, все будут только благодарны. Это не мой конёк, я бы так сказал.

Qvan22 02.04.2019 23:15

Цитата:

Сообщение от laba (Сообщение 341260)
Если разъясните, как это грамотно сделать, все будут только благодарны. Это не мой конёк, я бы так сказал.

Я тоже любитель в данном вопросе, но предлагаю подойти следующим путем:

Скрытый текст
в основном примере по ссылке, автор скетча просто молодец и все подписал для нас,
в функции настройки таймера
Arduino код:

void SetupTimer2() {} 

есть строчка:
Arduino код:

 //Timer2 Overflow Interrupt Enable
TIMSK2 << TOIE2

она, по идее и разрешает наше прерывание по переполнению счетчика таймера2 которое в свою очередь и вызывает функцию:
Arduino код:

//Timer2 overflow interrupt vector handler
ISR(TIMER2_OVF_vect) {} 

в которой и генерируется сигнал для драйвера двигателя.


Попробуйте заменить в своем примере глобальные прерывания на упомянутую выше запись в регистр таймера:

Arduino код:

void loop(){ 
  
Serial.println("trying"); 
  
delay(100);    
    
  if ( 
radio.available() ) { 
        
radio.read( &dataReceivedsizeof(dataReceived) ); 
        
newData true
   
  
////////////////////////////////////////////////////////////////////////       
        
TIMSK2 << TOIE2;//подключаем прерывания 
  ////////////////////////////////////////////////////////////////////////   
     
    

     
  
//////////////////////////////////////////////////////////////////////////////////////////////////   
    
else{TIMSK2 << TOIE2PORTD B00000000;}// иначе отключаем прерывания и устанавливаем на портах 
    // управляющих драйвером низкий уровень, тем самым снимая питание на выходе драйвера. 
  ////////////////////////////////////////////////////////////////////////////////////////////////// 
     
      
if (newData == true) { 
        
//Serial.println(dataReceived); 
        
inString String(dataReceived); 
        
string(); 
        
newData false
    } 


laba 02.04.2019 23:42

Цитата:

Сообщение от Qvan22 (Сообщение 341267)
Попробуйте заменить в своем примере глобальные прерывания на упомянутую выше запись в регистр таймера:

Спасибо, попробую обязательно. По результатам отпишусь.

Harman 14.11.2019 11:50

Лучше использовать есп8266, там и контроль подключения можно настроить (именно потерю соединения покажет), да и модуль интереснее, компактнее. Короче масса плюсов.

pandrey 19.01.2024 07:36

Вложений: 2
Затеялся сделать апгрейд своему чистящему составу, соответственно данная тема очень понравилась.

Собрал. :)

Вложение 212520Вложение 212521

Реализация, мягко скажем грубоватая, но работает и лезет по габаритам. Пока скетчи использовал от автора. Добавления от Алексея и Владимира пока не пробовал.
Реализовал включение моторов пылесоса и шлифовалки от функциональных выходов декодера при помощи приблуд
Есть программный глюк. Функциональные выходы включаются, но не выключаются. :) Чтобы их выключить нужно вкл/выкл свет.

Попробую поразобраться в скетче, но если не получится, то и так сойдет! :)

Rebel 19.01.2024 11:41

надеюсь мы на пути к отрытой реализации HM7000

Saddam 19.01.2024 11:45

Цитата:

Сообщение от Rebel (Сообщение 413171)
надеюсь мы на пути к отрытой реализации HM7000

Нет, это совершено иное, грубо говоря "удлинитель" DCC.

Rebel 19.01.2024 11:57

Цитата:

Сообщение от Saddam (Сообщение 413172)
Нет, это совершено иное, грубо говоря "удлинитель" DCC.

а по мне так очень близко, тут и там заворачивают дцц в радио транспорт, только там BLE
тут, думаю, тоже на BLE можно сделать, останется только протокол совместимый с HM7000...
(в теории возможно что у HM7000 в блютусе вовсе не дцц завернут, но имхо странно и затратно с их стороны имея дцц декодер туда еще один протокол навешивать, хотя и такое возможно)

Alexmit 19.01.2024 12:51

Цитата:

Сообщение от Rebel (Сообщение 413173)
(в теории возможно что у HM7000 в блютусе вовсе не дцц завернут, но имхо странно и затратно с их стороны имея дцц декодер туда еще один протокол навешивать, хотя и такое возможно)

А тут вопрос в том, во что ДЦЦ в декодере преобразуется.

Если я правильно помню, то вроде у китайцев декодеры по сериал порту настраиваются.

pandrey 19.01.2024 20:41

Продолжение проекта

Garden Train - Arduino Wireless NMRA DCC


Текущее время: 15:06. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
Copyright © ModelldepO.ru 2006 -