Форум ModelldepO  

Вернуться   Форум ModelldepO > Моделизм > Электрика и DCC > Arduino
Ответ
 
Опции темы Опции просмотра
Старый 02.04.2019, 21:13   #1
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,591
Сказал(а) 'не согласен(а)'!: 9
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,677
Поблагодарили 4,666 раз(а) в 1,769 сообщениях
Репутация: репутация неоспорима (4950)
По умолчанию DCC "по-воздуху"

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

Теперь при нажатии кнопки Стоп на мультимаусе, отключении питания передатчика или потери сигнала, питание с декодера сразу снимается и лок останавливается, а после восстановления соединения продолжает выполнять поступающие команды.
Буду это воплощать в "железе", на нормальных платах, т.к. радиомодули очень чувствительны к потерям контакта и качеству питающего напряжения.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!
laba вне форума   Вверх
5 пользователя(ей) сказали cпасибо:
Старый 02.04.2019, 21:36   #2
Qvan22
Заглянувший
 
Регистрация: 26.01.2013
Адрес: Минск
Сообщений: 99
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 239
Поблагодарили 155 раз(а) в 63 сообщениях
Репутация: - весьма и весьма положительная личность (155)
По умолчанию

Цитата:
Сообщение от laba Посмотреть сообщение
При отсутствии входящих сообщений по радиоканалу, необходимо запретить работу прерываний и установить на портах D5 и D6 низкий уровень, что приведёт к снятию питания на выходе драйвера.
Я немного запутался, а разве отключение прерываний не застопорит работу шины SPI, которая общается с nrf24? Может безопаснее останавливать сам таймер за номером 2?
Qvan22 вне форума   Вверх
Старый 02.04.2019, 22:04   #3
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,591
Сказал(а) 'не согласен(а)'!: 9
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,677
Поблагодарили 4,666 раз(а) в 1,769 сообщениях
Репутация: репутация неоспорима (4950)
По умолчанию

Цитата:
Сообщение от Qvan22 Посмотреть сообщение
Я немного запутался, а разве отключение прерываний не застопорит работу шины SPI, которая общается с nrf24?
Я не силён в теории, на практике, пока проблем не заметил.
Цитата:
Сообщение от Qvan22 Посмотреть сообщение
Может безопаснее останавливать сам таймер за номером 2?
Если разъясните, как это грамотно сделать, все будут только благодарны. Это не мой конёк, я бы так сказал.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!
laba вне форума   Вверх
Старый 02.04.2019, 23:15   #4
Qvan22
Заглянувший
 
Регистрация: 26.01.2013
Адрес: Минск
Сообщений: 99
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 239
Поблагодарили 155 раз(а) в 63 сообщениях
Репутация: - весьма и весьма положительная личность (155)
По умолчанию

Цитата:
Сообщение от laba Посмотреть сообщение
Если разъясните, как это грамотно сделать, все будут только благодарны. Это не мой конёк, я бы так сказал.
Я тоже любитель в данном вопросе, но предлагаю подойти следующим путем:

Скрытый текст
в основном примере по ссылке, автор скетча просто молодец и все подписал для нас,
в функции настройки таймера
PHP код:
void SetupTimer2() {} 
есть строчка:
PHP код:
 //Timer2 Overflow Interrupt Enable
TIMSK2 << TOIE2
она, по идее и разрешает наше прерывание по переполнению счетчика таймера2 которое в свою очередь и вызывает функцию:
PHP код:
//Timer2 overflow interrupt vector handler
ISR(TIMER2_OVF_vect) {} 
в которой и генерируется сигнал для драйвера двигателя.


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

PHP код:
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
    } 
Qvan22 вне форума   Вверх
Пользователь сказал cпасибо:
Старый 02.04.2019, 23:42   #5
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,591
Сказал(а) 'не согласен(а)'!: 9
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,677
Поблагодарили 4,666 раз(а) в 1,769 сообщениях
Репутация: репутация неоспорима (4950)
По умолчанию

Цитата:
Сообщение от Qvan22 Посмотреть сообщение
Попробуйте заменить в своем примере глобальные прерывания на упомянутую выше запись в регистр таймера:
Спасибо, попробую обязательно. По результатам отпишусь.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!
laba вне форума   Вверх
Старый 14.11.2019, 11:50   #6
Harman
Заглянувший
 
Аватар для Harman
 
Регистрация: 09.08.2009
Адрес: Донецк
Сообщений: 59
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 5
Поблагодарили 71 раз(а) в 16 сообщениях
Репутация: скоро придёт к известности (71)
По умолчанию

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Rocrail+OpenCar System=RailCom "по-воздуху" laba Rocrail 5 13.09.2017 19:56
"Пять копеек" старого "ворчуна" по теме "электроника" старлей Флейм 17 13.01.2014 14:31


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


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