Форум 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=17468)

BR95009 14.10.2015 22:12

Декодер DCC на ардуино для немецкого выходного сигнала
 
Вложений: 1
По просьбе Геннадича выкладываю проект прототипа декодера с применением Ардуино для вот такой хрени:
http://www.viessmann-modell.com/shop...mages/4013.jpg


Макетка:
Вложение 117022

BR95009 14.10.2015 22:22

Схема аналогична той, что приводится тут, но для вывода используются пины: D4, D5, D6, D7, D8. Они переводятся в состояния LOW, если нужно зажечь LED, и в HIGH, если нужно его погасить.

pandrey 14.10.2015 22:36

Цитата:

Сообщение от BR95009 (Сообщение 260422)
Скетч будет позже.

А плавное, как на взрослых светофорах, вкл/выкл будет? ;-)

genadich 14.10.2015 22:56

Я был бы счастлив если бы оно просто работало. Честно говоря,плавность мне не очень интересна...

BR95009 14.10.2015 23:07

А там еще и плавность должна быть?

---------- Сообщение добавлено в 01:07 ---------- Предыдущие сообщение было в 01:05 ----------

Цитата:

Сообщение от genadich (Сообщение 260327)
Используются вот какие комбинации:
1.два красных
2.один красный и белые
3.один зеленый
4.зеленый и желтый


А какие 0 и 1 стрелок отвечают за каждую комбинацию?

genadich 14.10.2015 23:28

Адреса стрелок было бы здорово программировать каким-либо образом.
Для каждого адреса есть 2 положения: "прямо" и "криво".
Т.е. 4 варианта задаются 2 адресам стрелок.

BR95009 14.10.2015 23:59

Геннадич, я не о том.

Какая комбинация переключенныхс стрелок = какой световой схеме?

Например:
1.два красных == 0-0
2.один красный и белые == 0-1
3.один зеленый == 1-0
4.зеленый и желтый ==1-1

Цитата:

Сообщение от genadich (Сообщение 260433)
Для каждого адреса есть 2 положения: "прямо" и "криво".

Там тупо 0 и 1. Прямо и криво - это уже от контроллера щависит и от подключеняи стрелки.

---------- Сообщение добавлено в 01:59 ---------- Предыдущие сообщение было в 01:52 ----------

Лови скетч, Геннадич.

Должно работать. Нету светофора, что бы проверить.

Arduino код:

// DCC декодер для немецкого выходного сигнала Viessmann H0 Licht-Ausfahrsignal Art.Nr  4013:
// by BR95009. V01
// Лицензия GPL. Бесплатно для не коммерческого использования. Ссылка на автора обязательна.
// DCC reading PIN = 2 (from opto coupler)

// Подключаем библиотеку DCC Decoder
#include <DCC_Decoder.h>

// Параметры декодера для настройки:
#define DECODER_ADDRESS_1  1     // Адрес декодера для первой стрелки
#define DECODER_ADDRESS_2  2     // Адрес декодера для второй стрелки

// Управляющие пины, где wire номер = номеру провода на схеме светофора Viessmann H0 Licht-Ausfahrsignal Art.Nr  4013:
#define WIRE1_PIN  8
#define WIRE2_PIN  7
#define WIRE3_PIN  6
#define WIRE4_PIN  5
#define WIRE5_PIN  4

//Прерывание для DCC библиотеки
#define kDCC_INTERRUPT   0

bool on_already1 false// флаг, что бы отсечь остальные аналогичные пакеты для первой стрелки
bool on_already2 false// флаг, что бы отсечь остальные аналогичные пакеты для второй стрелки

// Флаги  состояний декодера:
bool flag1 false// флаг комманды первой стрелки (ВКЛ/ВЫКЛ)
bool flag2 false// флаг комманды второй стрелки (ВКЛ/ВЫКЛ)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()//обязательная функция для любого сетча: настраивает программу, запускается 1 раз при старте.
//Выставляем управляющие пины на вывод:
  
pinMode(WIRE1_PINOUTPUT); pinMode(WIRE2_PINOUTPUT); pinMode(WIRE3_PINOUTPUT); pinMode(WIRE4_PINOUTPUT); pinMode(WIRE5_PINOUTPUT);

  
//Выставляем их в "НIGН", что бы при запуске светофор не горел. Так как они подключены к общему плюсу и минусом к выводам, то управляющая логика будет обратной:
  // HIGH = OFF, LOW = ON:
  
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);

  
// Инициализируем декодер:
  
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handlertrue);
  
DCC.SetupDecoder0x000x00kDCC_INTERRUPT );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() // Оновная функция, повторяющаяся бесконечно.
{
  
DCC.loop(); // постонно крутим DCC библиотеку, что бы не пропускать пакеты.
}// end of loop   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Обработчик стрелочных пакетов. Эта функция запускается, когда библиотека ловит пакет:
void BasicAccDecoderPacket_Handler(int addressboolean activatebyte data)
{
  
// Конвертируем адрес стрелки в формат Мультимауса и Рокрейла:
  
address -= 1address *= 4address += 1address += (data 0x06) >> 1address += 4;

  
boolean enable = (data 0x01) ? 0//получаем команду декодеру

  
if ( address == DECODER_ADDRESS_1) {// Если адрес в пакете == адресу декодера #1, то обрабатываем флаг1
    
if ( enable && !on_already1) { // Флаг1 в 1
      
flag1 true;
      
on_already1 true//больше не ловим остальные 5 пакетов ВКЛ
      
set_lights(); // меняем схему при переключении
    
}
    if ( !
enable && on_already1) { // Флаг1 в 0
      
flag1 false;
      
on_already1 false//больше не ловим остальные 5 пакетов ВЫКЛ
      
set_lights(); // меняем схему при переключении
    
}
  }
  if ( 
address == DECODER_ADDRESS_2) { // Если адрес в пакете == адресу декодера #2, то обрабатываем флаг2
    
if ( enable && !on_already2) { // Флаг2 в 1
      
flag2 true;
      
on_already2 true//больше не ловим остальные 5 пакетов ВКЛ
      
set_lights(); // меняем схему при переключении
    
}
    if ( !
enable && on_already2) { // Флаг2 в 0
      
flag2 false;
      
on_already2 false//больше не ловим остальные 5 пакетов ВЫКЛ
      
set_lights(); // меняем схему диодов при переключении
    
}
  }
}
// end of handler

// Функция установки диодов во ВКЛ/ВЫКЛ
void set_lights() {
  
// Логика кобработки флагов:
  
if ((flag1 == false) && (flag2 == false)) { //Логика состояния 0&0
    // Меняем HIGH на LOW по вкусу! HIGH = диод не горит, LOW = диод горит
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == false) && (flag2 == true)) { //Логика состояния 0&1
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == true) && (flag2 == false)) { //Логика состояния 1&0
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == true) && (flag2 == true)) { //Логика состояния 1&1
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }

}
//End of sketch 


Alexmit 15.10.2015 00:00

genadich, в TC есть какой-нибудь лог типа такого?

23:55:15 output 10 2 1 on
23:55:15 output 10 1 0 on

23:55:10 output 10 2 0 on
23:55:10 output 10 1 1 on

23:55:04 output 10 2 0 on
23:55:04 output 10 1 0 on

23:55:00 output 10 2 1 on
23:55:00 output 10 1 1 on

BR95009 15.10.2015 00:09

Цитата:

Сообщение от pandrey (Сообщение 260423)
как на взрослых светофорах, вкл/выкл будет?

Да, вот такой:
оффтопик

---------- Сообщение добавлено в 02:09 ---------- Предыдущие сообщение было в 02:04 ----------

Цитата:

Сообщение от BR95009 (Сообщение 260435)
Меняем*HIGH*на*LOW*по*вкусу!

Короче, можно настроить самому, какие огоньки загорятся при каком состоянии.

Garri 15.10.2015 04:21

Вложений: 1
BR95009, здесь сигналы немецких светофоров DB. Отклонение по стрелки или прямо, это отдельная секция и на данном светофоре её нет. См вложения.
С уважением!
Garri

genadich 15.10.2015 06:39

BR95009
Спасибо !
Соответствие комбинации стрелок и сигналов не важна: настраивается в программе.
Интересно, а сколькими сигналами может управлять один контроллер?
Я тоже не могу пока проверить: нет контроллера;D вот только на следующей неделе попробую заказать:)

Alexmit
пока по логам в ТС ничего не смотрел: я пока больше 2 локов не гонял. И так все видно.

pandrey 15.10.2015 08:06

Цитата:

Сообщение от BR95009 (Сообщение 260438)
Да, вот такой:

:) Я имел ввиду плавность включения и выключения. В принципе, это не так сложно сделать самому, в примерах ардуины вроде есть вариант с плавным включением светодиода...

BR95009 15.10.2015 10:41

Цитата:

Сообщение от genadich (Сообщение 260444)
Интересно, а сколькими сигналами может управлять один контроллер?

У Ардуино Про Мини и у UNO 14 цифровых пинов, т.е. 14 светодиодов. Вот и считай. Это если без доп. навески.

У Ардуино MEGA - 54 выхода. :)

А если с доп навеской, то:
Цитата:

Сообщение от Петин В. А. - "Проекты с использованием контроллера Arduino.", стр. 215
16.3. SPI-расширитель выходов 74HC595
Чтобы управлять большим количеством пинов светодиодной матрицы, не обязательно использовать большое количество выходов Arduino. Можно обойтись всего тремя. Применим для этого сдвиговый регистр. Рассмотрим микросхему 74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последователь- ным или параллельным выводом информации, с триггером-защелкой и тремя со- стояниями на выходе (рис. 16.3).

Т.е. 3 пина на 8 светодиодов. :)

---------- Сообщение добавлено в 12:41 ---------- Предыдущие сообщение было в 11:44 ----------

Цитата:

Сообщение от Garri (Сообщение 260443)
BR95009, здесь сигналы немецких светофоров DB

Спасибо, конечно. Но я пока в тему светофоров не залезал. LED - он и в африке LED.

Alexmit 15.10.2015 10:56

Цитата:

Сообщение от Garri (Сообщение 260443)
Отклонение по стрелки или прямо, это отдельная секция и на данном светофоре её нет.

Отклонение по стрелке - это Hp2.

Цитата:

Сообщение от BR95009 (Сообщение 260447)
Т.е. 3 пина на 8 светодиодов.

74HC595 можно поставить 2 последовательно. Соответственно 3 пина на 16 светодиодов.
Если взять 8 штук mcp23017, то на 2 пина 128 светодиодов.
А ещё есть PCA9685, тоже можно подключить 8 штук, соответственно 128 светодиодов с ШИМом. (но она дороже)

Цитата:

Сообщение от pandrey (Сообщение 260445)
В принципе, это не так сложно сделать самому, в примерах ардуины вроде есть вариант с плавным включением светодиода...

Берём контакты 3, 5, 6, 9, 10 и 11 на которых есть ШИМ, в скетч добавляем циклы, вот и плавное включение.

Garri 15.10.2015 12:09

Цитата:

Сообщение от Alexmit (Сообщение 260449)
Отклонение по стрелке - это Hp2.


Это ограничение скорости до 40 км/ч.
Wn1-Wn6 сигналы стрелочных отклонений.

bluxer 15.10.2015 12:42

Цитата:

Сообщение от Garri (Сообщение 260453)
Это ограничение скорости до 40 км/ч.
Wn1-Wn6 сигналы стрелочных отклонений.

Абсолютно неправильно. Стрелочные указатели указывают положение стрелки. Отклонение по съезду указывает именно Hp2. Кроме стрелочных, есть ещё маршрутные указатели, которые информируют машиниста о маршруте приема или отправления поезда. А вот сигнал ограничения скорости (постоянный или для временного ограничения) - это Lf. Основные сигналы для 4-ой эпохи (к слову, приведенный Вами файл описывает 3-4 эпохи) - это Hp. И соответственно, если поезд идет с отклонением, то горит ЖЗ. Такие же сигналы применялись на ж.д. СССР до третей эпохи (имеется ввиду, комбинация основных сигналов). А вот светофор топикстартера- это уже конец 4-ой - 5-я эпохи.

Alexmit 15.10.2015 14:21

Цитата:

Сообщение от BR95009 (Сообщение 260435)
Должно работать.

Почти, команды принимаются.
Но в - void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
явно есть ошибка.

А после того как я добавил
Serial.print("Z , ");
Serial.print(address);
Serial.print(", ");
Serial.print(data);
Serial.print(", ");
Serial.println(activate);
появилось желание переписать её целиком.

---------- Сообщение добавлено в 14:21 ---------- Предыдущие сообщение было в 14:13 ----------

Цитата:

Сообщение от Alexmit (Сообщение 260449)
74HC595 можно поставить 2 последовательно. Соответственно 3 пина на 16 светодиодов.

Чего-то тупанул. Если по максимуму, то получается на UNO можно поставить 30 микросхем, а это 240 светодиодов.

Alex_S 15.10.2015 14:30

Цитата:

Сообщение от BR95009 (Сообщение 260435)
Какая комбинация переключенныхс стрелок = какой световой схеме?

Например:
1.два красных == 0-0
2.один красный и белые == 0-1
3.один зеленый == 1-0
4.зеленый и желтый ==1-1

ИМХО состояние светофора, управляемого стрелочными командами, определяется не комбинацией, а конкретной командой. Одной.

Т.е. например:
1.два красных == стрелка 1 = 0
2.один красный и белые == стрелка 1 = 1
3.один зеленый == стрелка 2 = 1
4.зеленый и желтый == стрелка 2 = 0

(под "стрелкой" имеется ввиду DCC-"аксессуар" с двумя положениями, диапазон адресов 1 - 2048)

Такое управление - одной аксессуарной командой на каждый "аспект" многолампового светофора - встречалось как в программах (JMRI), так и в цифровых "железках" (ESU ECOS). При этом получается, что аспект не зависит от комбинации. Т.е. например если нужен зеленый+желтый (Hp2), нужно послать только одну команду стрелка 2 = 0; как при этом переключена стрелка 1, не имеет значения.

В программах (JMRI) соответствие аспектов и аксессуарных команд выбирается произвольно, а например в Экосе "железно" заложено, как в моем примере выше, и причем адреса обеих стрелок должны быть рядом (1-2, 3-4 и т.д.).

Alexmit 15.10.2015 14:44

Цитата:

Сообщение от Alex_S (Сообщение 260461)
ИМХО состояние светофора, управляемого стрелочными командами, определяется не комбинацией, а конкретной командой. Одной.

Ага, щаз. Я 8 сообщение просто так что-ли писал.
Зависит от конкретной системы.
А Rocrail и вот такие пачечки посылать умеет.
14:36:46 output 10 2 0 on
14:36:46 output 10 4 0 off
14:36:46 output 10 3 0 off
14:36:46 output 10 2 0 off
14:36:46 output 10 1 0 off

Цитата:

Сообщение от Alex_S (Сообщение 260461)
а например в Экосе "железно" заложено, как в моем примере выше, и причем адреса обеих стрелок должны быть рядом (1-2, 3-4 и т.д.).

Если у вас после декодера стоит viessmann 5223 или что-то подобное, то да, работать будет.

Alex_S 15.10.2015 15:37

Цитата:

Сообщение от Alexmit (Сообщение 260463)
Если у вас после декодера стоит viessmann 5223 или что-то подобное, то да, работать будет.

У меня TrafficLight местного производства. На любой аспект - в т.ч. многозначный (например желтый+желтый мигающий) - нужна только одна аксессуарная команда, а не комбинация.
Светофорный декодер LDT так же работает.

А какие светофорные декодеры работают на основе комбинаций?

BR95009 15.10.2015 16:01

Цитата:

Сообщение от Alexmit (Сообщение 260459)
Почти, команды принимаются.
Но в - void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
явно есть ошибка.

В чем это заключаетсяся? В чем ошибка?

---------- Сообщение добавлено в 18:01 ---------- Предыдущие сообщение было в 17:58 ----------

Цитата:

Сообщение от Alex_S (Сообщение 260468)
У меня TrafficLight местного производства. На любой аспект - в т.ч. многозначный (например желтый+желтый мигающий) - нужна только одна аксессуарная команда, а не комбинация.
Светофорный декодер LDT так же работает.
А какие светофорные декодеры работают на основе комбинаций?

Это не важно. Можно сделать на основе комбинаций состояний двух стрелок (как сейчас реализовано), а можно завести на один акксесуарный адрес деокодер и переключать комбинации кнопками F1- F28.

Alex_S 15.10.2015 16:14

Цитата:

Сообщение от BR95009 (Сообщение 260469)
а можно завести на один акксесуарный адрес деокодер и переключать комбинации кнопками F1- F28.

у аксессуаров нет F1-F28, только прямо/криво. Fxx есть у локомотивного адреса. Это разные адресные "пространства".

Цитата:

Сообщение от BR95009 (Сообщение 260469)
Это не важно.

Может и не важно, но уже есть некие сложившиеся традиции, которым уже много лет.
Так можно дойти до управления светофором с помощью скорости :)
А как только захотите управлять макетом другой программой - да та же JMRI к примеру - то упретесь в ограничения.

BR95009 15.10.2015 17:06

Цитата:

Сообщение от Alex_S (Сообщение 260471)
у аксессуаров нет F1-F28, только прямо/криво.

Изучайте: http://www.nmra.org/sites/default/fi....1_2012_07.pdf

"Extended Accessory Decoder Control Packet Format"



Цитата:

Сообщение от Alex_S (Сообщение 260471)
Это разные адресные "пространства".

И что?

Цитата:

Сообщение от Alex_S (Сообщение 260471)
А как только захотите управлять макетом другой программой - да та же JMRI к примеру - то упретесь в ограничения.

Я никуда не упрусь. Я перепишу скетч под под декодирование пакетов из этой программы. И все. У меня нет задачи сделать универсальный деркодер. Можно каждый скетч переписать под конкретные пререквизиты.

Alexmit 15.10.2015 18:31

Цитата:

Сообщение от BR95009 (Сообщение 260469)
В чем это заключаетсяся? В чем ошибка?

Не отрабатывается точно - //Логика состояния 0&0.

---------- Сообщение добавлено в 18:22 ---------- Предыдущие сообщение было в 18:17 ----------

Цитата:

Сообщение от шмырштю (Сообщение 260465)
а третьих больше 8 штук последовательно китайские копии 595 не держат - дают глюки, на больших частотах.

Не я считал по две микросхемы последовательно, а выводы строба (12 нога) на разные выходы Arduino.

---------- Сообщение добавлено в 18:31 ---------- Предыдущие сообщение было в 18:22 ----------

Цитата:

Сообщение от Alex_S (Сообщение 260468)
У меня TrafficLight местного производства. На любой аспект - в т.ч. многозначный (например желтый+желтый мигающий) - нужна только одна аксессуарная команда, а не комбинация.

Вопрос не в том как сделан какой либо декодер.
Вопрос - что выдаёт управляющая программа.
Может кто-нибудь уже посмотрит, что выдаёт Train controller.

Alex_S 15.10.2015 18:58

Цитата:

Сообщение от BR95009 (Сообщение 260475)
Изучайте: http://www.nmra.org/sites/default/fi....1_2012_07.pdf

"Extended Accessory Decoder Control Packet Format"

Вы путаете с понятием "aspect". Про F1-28 в этом разделе (Accessory Decoder) нет ни одного упоминания.

Цитата:

Сообщение от BR95009 (Сообщение 260475)
У меня нет задачи сделать универсальный деркодер. Можно каждый скетч переписать

Тогда не обращайте внимания :)
Я лишь пытался донести, как (строго ИМХО) делают разные фирмы-производители. Это не догма, можно делать по-своему.
Выше вроде как обсуждали обычные стрелочные команды, а не расширенные с аспектами.


Цитата:

Сообщение от Alexmit (Сообщение 260481)
Вопрос не в том как сделан какой либо декодер.
Вопрос - что выдаёт управляющая программа.
Может кто-нибудь уже посмотрит, что выдаёт Train controller.

Команды DCC вообще-то выдает командная станция. Компьютер шлет команды в соответствии с протоколом связи с КС, а та их преобразует в DCC-пакеты.

Про Экос я уже выше написал: если завести в нем выходной светофор DB, то на каждый требуемый аспект (Hp00, Hp0+Sh1, Hp1, Hp2) Экос пошлет одну простую (не extended) акессуарную команду по одному из двух смежных "стрелочных" адресов.

JMRI работает так же, если светофор заведен как "Turnout Controlled Mast".

Про TrainController увы не могу подсказать. И даже мануал по TC8 не помог. Про настройку светофоров там почти ничего нет, надо ковырять реальную прогу.


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

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