RailwayPassion.com - Форум за железопътен моделизъм

Електроника и Електротехника | Electronics and Electrical Engineering => Цифрово / дигитално управление | Digital Command Control => Темата е започната от: IvanC в 31 Януари 2022, 04:17:08

Титла: Осветление на вагони
Публикувано от: IvanC в 31 Януари 2022, 04:17:08
С добавяне на вътрешно осветление на вагони се занимавам отдавна. От няколко години правя осветление със светодиоди и стабилизирано захранване на 3,3 волта и в повечето случаи с един или два "златни" кондензатора, които да премахнат досадното премигване на осветлението.

Схемата е тази:

(https://www.bulgaria21.net/cankov/modelrailroad/piko4apass/300p023.jpg)

но с малка промяна - понеже в момента използвам светодиоди с голяма яркост при 5 mA номинален ток, баластните съпротивления, които използвам са 1 килоом, като понякога го променям в зависимост от цвета на интериора - при светъл интериор използвам баластни съпротивления с по-голямо съпротивление (до 2 килоома), а при тъмен интериор по-малки стойности (750 - 820 ома).

Монтирал съм и декодери на няколко вагона - мотрисни и такива с командна кабина. В тези случаи използвам "заводски" декодер, който да управлява челните светлини и осветлението на салона. Тук няма нищо особено, свързването е на същия принцип както при монтиране на декодер на локомотив с единствената разлика, че няма мотор за опроводяване.

Последното осветление, което направих е на багажен вагон на Брава. Тук има малко предистория. Имам събрана композиция на Рейнголд (II-ра епоха) от стари вагони на Лилипут. Вагоните преработих, като добавих токоснемане на талигите, направих кулисни механизми с NEM глави за тегличите и осветление на салона по "класическата" ми схема, показана горе. В композицията имам и багажен вагон - пак на Лилипут, който от завода вече си имаше кулиса за тегличите с NEM глава. Направих му токоснемане и осветление по горната схема. Та преди месец-два видях, че Липето са пуснали допълнителен багажен вагон за Рейнголда. Преди да го поръчам се разтърсих из нета за повече информация за "цифровата" версия 45415:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415001.jpg)

Не успях да намеря информация, освен още снимки и това, което Липето показват на техния сайт. Дори и на сайта на Брава не дават този вагон - просто липсва там. Мислейки си, че щом е "цифров с вътрешно осветление", поне ще има токоснемане и платка със светодиоди, като в най-лошия случай ще трябва да монтирам друг декодер.

Поръчах вагона и той пристигна в тенекиената кутия:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415002.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415003.jpg)

Оказа се, че токоснемане от колелата няма! От единия край има теглич с 6-изводен конектор, на платката няма токоизправител, "декодерът" не е декодер а "приемник" (emphanger) на D&H, който получава захранване и цифров сигнал през конектора на теглича, явно пригоден да работи с декодер в един от другите вагони от композицията на Брава. Ако по време на проучването, което се опитах да направя преди поръчката бях намерил тази информация, щях да поръчам 45413, който е без осветление и цифровите изгъзици на Брава/D&H.

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415004.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415005.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415006.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415007.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415008.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415009.jpg)

Съответно платката и тегличът бяха свалени и се захванах с направата на токоснемане и ново осветление.


Токоснемане - пластини и опроводяване:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415010.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415011.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415012.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415013.jpg)


Проводниците от талигите прекарах между пода и рамата и през тоалетната:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415014.jpg)

Оригиналните колооси бяха с две изолирани колела от осите и ги смених с такива, с едно изолирано колело, за да може токоснемането да работи.


Платка за осветлението и декодер
На този вагон реших да сложа декодер по моя идея - "декодерът" е на базата на ATmega328P, като използвах Ардуино Про-мини на 3,3 волта и 8 MHz. Захранването е идентично с това на "аналоговото" осветление със стабилизатор на 3,3 волта и "златен" кондензатор. Програмата в про-минито е моя разработка, като съм изпозлвал готова библиотека за DCC. Има маскимално до 12 изхода с възможност за много ефекти на светлините - мигане по различни начини, плавно палене и гасене на светлините, ефект на палене на луминисцентно осветление, задаване на ШИМ на всеки един изход, задаване на активното ниво (0 или 1), възможност за запазване на последното състояние в EPROM-а поотделно за всяка функция. Всичко това се избира със CV-та, така че е напълно програмируемо от DCC станция.

Осветлението е разделено на 3 кръга, така, както беше на оригиналната платка на вагона:
1. Багажни отделения
2. Купе на началник влака, тоалетна и амвон
3. Преддверията на вратите в двата края на вагона.

Ефекти не съм използвал. Настроих CV-тата така, че F1 да управлява осветлението на багажните отделения, F3 на купето, амвона и тоалетната, F5 преддверията и F0 да пали всички светлини.

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415015.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415016.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415017.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415018.jpg)

И едно клипче - https://youtu.be/ypFDbH0G-8g

Иван
Титла: Re: Осветление на вагони
Публикувано от: ivo в 31 Януари 2022, 14:54:54
Здравей  :)

едно питане относно: "Оригиналните колооси бяха с две изолирани колела от осите и ги смених с такива, с едно изолирано колело, за да може токоснемането да работи."

колелата които си сложил с ос 24мм. и диаметър 11мм. са ???

имам същия вагон и не мога да намеря такива колела ...
Титла: .
Публикувано от: IvanC в 31 Януари 2022, 17:46:20
Иво,

Колоосите са InterMountain 40049 (12 бр. в комплект), които са с малка ширина на бандажа и нисък реборд (RP-25). Стават и 40048, които са с широки бандажи и нисък реборд. Диаметърът на колелата е идентичен с оригиналните на вагона - 11 мм.

И на двата вида осите са много дълги (25,8 мм) и ги скъсих до (по памет) 23,8 мм като на оригиналните.

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/imr40049.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/imr40048.jpg)

За съжаление от около година вече не мога да ги намеря. Последно купих от тях през 2020 година и имам малък запас, който започна да се изчерпва и периодично ги търся, но без успех.

Пробвах 40198 на Roco, от които имам и ги има налични в Липето (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Roco%2D40198/gb/modell_22584.html), но не стават - диаметърът на ребордите на колелата е много голям и не се събират в талигите. Осите им също са по-дълги от необходимото, но това е малкият проблем - 40182 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Roco%2D40182/gb/modell_22571.html) са с необходимата дължина. Големият диаметър на ребордите не позволява да се използват тези колооси. Може би 40264 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Roco%2D40264/gb/modell_22588.html), които са с RP-25 профил ще станат след скъсяване на осите с 0,9 - 1,0 мм.

Иван
Титла: Re: Осветление на вагони
Публикувано от: Krasi Tankista в 31 Януари 2022, 19:33:12
Цитат на: ivo link=topic=5553.msg123110#msg123110 date=1643633694
Здравей  :)

едно питане относно: "Оригиналните колооси бяха с две изолирани колела от осите и ги смених с такива, с едно изолирано колело, за да може токоснемането да работи."

колелата които си сложил с ос 24мм. и диаметър 11мм. са ???

имам същия вагон и не мога да намеря такива колела ...

А тук търсил ли си?
http://blaetterkatalog.weinert-modellbau.de/#page_66
Титла: .
Публикувано от: IvanC в 31 Януари 2022, 20:07:39
Цитат на: Krasi Tankista link=topic=5553.msg123113#msg123113 date=1643650392
А тук търсил ли си?
http://blaetterkatalog.weinert-modellbau.de/#page_66

Краси, супер си!

Според каталога 11 мм диаметър за Брава (23 мм ос) са 9746 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D9746/gb/modell_70357.html) с RP-25 профил и ги има налични на Липето. А Fine-25 еквивалента за Брава са 97460 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D97460/gb/modell_70358.html) но са с резервация.

Иван
Титла: Re: Осветление на вагони
Публикувано от: ivo в 01 Февруари 2022, 17:04:01
Благодаря :)

Накрая намерих в Ebay  :)  https://www.ebay.de/itm/194615066415?hash=item2d4ff63f2f:g:7IgAAOSwwTlUn~wp от Benno002-22
(https://i.ebayimg.com/images/g/7IgAAOSwwTlUn~wp/s-l1600.jpg)
Титла: Схема на печатната платка
Публикувано от: IvanC в 03 Февруари 2022, 22:07:20
Схемата на печатната платка:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415icsch.png)

Вместо диода за разряд на "златния" кондензатор C5 използвах съпротивление 0 ома, т.е. мост. Този стабилизатор на напрежение се справя много добре със зарядния ток на коднензаторите.

Иван
Титла: Програмата на функционалния декодер - част 1
Публикувано от: IvanC в 05 Февруари 2022, 22:14:16
Това е програмата на функционалния декодер:


#include <NmraDcc.h>                              // Библиотека за DCC декодер - необходима за правилната работа на програмата

//#define debug_cvchange                            // Генерира код за дебъгване ако се махнат двете наклонени черти в началото на реда;
//#define debug_ack                                 //   нужно е само на автора на програмата
//#define debug_speed
//#define debug_functions
//#define debug_mapping
//#define debug_effects
#define debug_defaults
#define dump_CVs_enabled                          // uncomment to enable CV change readback and CV dump to serial

#if defined(debug_cvchange) or defined(debug_ack) or defined(debug_speed) or defined(debug_functions) or defined(debug_mapping) or defined(debug_effects) or defined(debug_defaults) or defined(dump_CVs_enabled)
  #define debug_main
#endif

// ---------------- Константи за нормалната работа на програмата - да не се променят!!! ----------------
#define mfrID                   13
#define mfrVer                  11
#define mfrSubver                1

#define defaultAddress           3                // default decoder address
#define defaultLongAddress     128                // default long address

// ---------------------------------- Задаване функциите на изводите: ----------------------------------
#define dccPin                   2                // Вход за DCC сигнала; стойност 2 или 3;
                                                  //   да не се използват други стойности!!!
#define motorPwm                14                // Изход за ШИМ на мотора
#define motorDir                13                // Изход за посока на мотора

//                    FA0f FA0r FA1  FA2  FA3  FA4  FA5  FA6  FA7  FA8
const byte foPin[] = {  3,   5,   6,   9,  10,  11,  12,   8,   7,   4};  // Изводи за управление на функциите.
                                                                          //   Първите 6 извода да не се променят
                                                                          //   и да няма дублиране с dccPin!!!

const int  outs    = sizeof(foPin) / sizeof(foPin[0]);
byte       foPol[outs];                           // "Поляритет" на изводите - виж cvFAPolLo и cvFAPolHi:
                                                  //   0 - активно ниско ниво
                                                  //   1 - активно високо ниво

// -------------- Още константи за нормалната работа на програмата - да не се променят!!! --------------
#define maxFuncs                13
#define pwmTime                 20                // time in µs for PWM counter increment
#define pwmStep                  8                // PWM counter increment step

#define stopped              false
#define moving                true
#define reverse                  0
#define forward                  2
#define off                      0
#define on                     255
#define momentumConst       900000UL

// ------------------------------------- Променливи на програмата: -------------------------------------
struct throttleStruct {byte Value; byte Dir;};

throttleStruct throttle      = {0, forward};
throttleStruct intThrottle   = {0, forward};
byte locoDirFwd              = DCC_DIR_FWD;
byte vMin                    = 1;
byte vMid                    = 85;
byte vMax                    = 255;
byte doMotorFlag             = false;
unsigned long accelCount     = momentumConst;
unsigned long decelCount     = momentumConst;
unsigned long accelCounter   = 0;
unsigned long decelCounter   = 0;
unsigned long truePwmTime    = pwmTime;
int  deltaThrottle           = 0;

byte stateF[maxFuncs];
byte stateFA[outs];
byte oldStateFA[outs];
byte pwmFA[outs];
byte effectFA[outs];
byte outPwm[outs];
unsigned long effectMillis[outs];
int  cEff[outs];
byte doFunctions             = true;
byte throttleReq             = false;
byte cvChanged               = false;

                                                  //                                                CCCC     VV     VV
                                                  //                                              CC    CC    VV    VV    SSS
                                                  //                                             CC           VV   VV    SS
                                                  //                                             CC            VV VV      SSS
                                                  //                                              CC    CC      VVV         SS
                                                  //                                                CCCC         V        SSS

                                                  // -------------------------------------------- ID and reset to defaults CVs -------------------------------------------
#define cvMfr                    8                // manufacturer ID
#define cvVer                    7                // decoder type and code
#define cvSub                   65                // decoder software version
#define cvDef                   11                // reset to defaults: write 11 to reset all CVs to defaults

                                                  // --------------------------------------- address and decoder configuration CVs ---------------------------------------
#define cvShortAddress           1                // decoder short address
#define cvLongAddressHi         17                // decoder long address high byte
#define cvLongAddressLo         18                // decoder long address low byte
#define cvConfig1               29                // decoder configuration I bits

                                                  // ----------------------------------------------- speed and momentum CVs ----------------------------------------------
#define cvStartV                 2                // minimum motor PWM
#define cvMaxV                   5                // maximum motor PWM
#define cvMidV                   6                // motor PWM @63 throttle
#define cvAccel                  3                // acceleration time from min to max motor PWM in 0.9s
#define cvDecel                  4                // deceleration time from max to min motor PWM in 0.9s
#define cvMomReduction         124                // momentum reduction:
                                                  //            255 = no reduction
                                                  //            192 = reduced to 75%
                                                  //            128 = reduced to 50%
                                                  //             64 = reduced to 25%
                                                  //              0 = no momentum
#define cvHalfSpeedKey         155                // speed reduction key:
                                                  //              0 = no key assigned
                                                  //         1 - 28 = active when F1 - F28 (if supported) key on
                                                  //             29 = active when F0 key on
                                                  //      101 - 128 = active when F1 - F28 (if supported) key off
                                                  //            129 = active when F0 key off
#define cvMomentumKey          156                // momentum reduction key - same key assignment as cvHalfSpeedKey


                                                  // ------------------------------------------------- motor control CVs -------------------------------------------------
#define cvMotorFreq              9                // motor control frequency                                  FUTURE IMPLEMENTATION
#define cvMotorPI               56                // motor control P and I                                    FUTURE IMPLEMENTATION
#define cvMotorVref             57                // motor control reference voltage                          FUTURE IMPLEMENTATION
#define cvMotorBEMF             58                // motor control BEMF intensity                             FUTURE IMPLEMENTATION

                                                  // ------------------------------- "NMRA" (F0f-FA6) key-to-output mapping (no shift) CVs -------------------------------
#define cvF0f                   33                // F0f key
#define cvF0r                   34                // F0r key
#define cvF1                    35                // F1 key
#define cvF2                    36                // F2 key
#define cvF3                    37                // F3 key
#define cvF4                    38                // F4 key
#define cvF5                    39                // F5 key
#define cvF6                    40                // F6 key
#define cvF7                    41                // F7 key
#define cvF8                    42                // F8 key
#define cvF9                    43                // F9 key
#define cvF10                   44                // F10 key
#define cvF11                   45                // F11 key
#define cvF12                   46                // F12 key

                                                  // ----------------------------------- extended (FA7-FA14) key-to-output mapping CVs -----------------------------------
#define cvF0fe                 133                // F0f key
#define cvF0re                 134                // F0r key
#define cvF1e                  135                // F1 key
#define cvF2e                  136                // F2 key
#define cvF3e                  137                // F3 key
#define cvF4e                  138                // F4 key
#define cvF5e                  139                // F5 key
#define cvF6e                  140                // F6 key
#define cvF7e                  141                // F7 key
#define cvF8e                  142                // F8 key
#define cvF9e                  143                // F9 key
#define cvF10e                 144                // F10 key
#define cvF11e                 145                // F11 key
#define cvF12e                 146                // F12 key

                                                  // --------------------------------------------- function output effect CVs --------------------------------------------
#define cvF0fEffect            125                // F0f output effect
#define cvF0rEffect            126                // F0r output effect
#define cvFA1Effect            127                // FA1 output effect
#define cvFA2Effect            128                // FA2 output effect
#define cvFA3Effect            129                // FA3 output effect
#define cvFA4Effect            130                // FA4 output effect
#define cvFA5Effect            131                // FA5 output effect
#define cvFA6Effect            132                // FA6 output effect
#define cvFA7Effect            159                // FA7 output effect
#define cvFA8Effect            160                // FA8 output effect
#define cvFA9Effect            161                // FA9 output effect
#define cvFA10Effect           162                // FA10 output effect
#define cvFA11Effect           163                // FA11 output effect
#define cvFA12Effect           164                // FA12 output effect
#define cvFA13Effect           165                // FA13 output effect
#define cvFA14Effect           166                // FA14 output effect

                                                  // -------------------------------------------------- effect selectors -------------------------------------------------
#define outEffDir                3                // output direction mask
#define outEffBidir              0                // xxxxxx00 - active in both directions
#define outEffFwd                1                // xxxxxx01 - active only forward
#define outEffRev                2                // xxxxxx10 - active only in reverse
#define outEffMask             252                // output effect mask
#define outEffNone               0                // 000000xx - no effect (except direction)
#define outEffMars               4                // 000001xx - mars light
#define outEffRandom             8                // 000010xx - random flicker
#define outEffFlash             12                // 000011xx - flashing light
#define outEffStrobe1           16                // 000100xx - single pulse strobe
#define outEffStrobe2           20                // 000101xx - double pulse strobe
#define outEffBeacon            24                // 000110xx - rotary beacon
#define outEffGyra              28                // 000111xx - gyralite
#define outEffDitch1R           32                // 001000xx - ditch light 1, right
#define outEffDitch1L           36                // 001001xx - ditch light 1, left
#define outEffDitch2R           40                // 001010xx - ditch light 2, right
#define outEffDitch2L           44                // 001011xx - ditch light 2, left
#define outEffCoupler           48                // 001100xx - coupler per cv115
#define outEffSoft              52                // 001101xx - soft start per cv63
#define outEffBrake             56                // 001110xx - auto brake light                              FUTURE IMPLEMENTATION
#define outEffStand             60                // 001111xx - output active at standstill only
#define outEff5min              64                // 010000xx - output off after 5 minutes
#define outEff10min             68                // 010001xx - output off after 10 minutes
#define outEffSSmoke            72                // 010010xx - speed dependent steam smoke                   FUTURE IMPLEMENTATION
#define outEffLowVin            76                // 010011xx - relay protection for servos, off at low input voltage   FUTURE IMPLEMENTATION
#define outEffDSmoke            80                // 010100xx - driving dependent diesel smoke                FUTURE IMPLEMENTATION
#define outEffFade              88                // 010110xx - fade-in per cv190, fade-out per cv191
#define outEffFluo              92                // 010111xx - fluorescent lamp effect
#define outEffSparks            96                // 011000xx - sparks with heavy braking                     FUTURE IMPLEMENTATION

                                                  // --------------------------------------------------- available CVs ---------------------------------------------------
#define cv47Available           47                // available                                                FUTURE IMPLEMENTATION
                                                  //    to
#define cv53Available           53                // available                                                FUTURE IMPLEMENTATION


Продължението следва...

Иван
Титла: Програмата на функционалния декодер - част 2
Публикувано от: IvanC в 05 Февруари 2022, 22:20:39

                                                  // ------------------------------------------------- effect control CVs ------------------------------------------------
#define cvMarsMin               54                // mars and gyralite effect minimum PWM
#define cvRandMin               55                // random flicker effect minimum PWM
#define cvMars                  59                // mars and gyralite effect cycle time in 0.1s
#define cvFlash                 60                // flashing effect:
                                                  //   hundreds and tens - flasher cycle time in 0.2s
                                                  //              0x = 0.2s cycle (5 times per second)
                                                  //              1x = 0.4s cycle (2.5 times per second)
                                                  //              2x = 0.6s cycle (1.7 times per second)
                                                  //              . . . . . . . .
                                                  //             24x = 5.0s cycle
                                                  //   ones digit xx0 = 10% on time
                                                  //              xx1 = 20% on time
                                                  //              . . . . . . . .
                                                  //              xx9 = 100% on time
#define cvStrobe                61                // strobe effect:
                                                  //   hundreds digit - strobe flash duration in 0.035s
                                                  //              0xx = 0.035s
                                                  //              1xx = 0.070s
                                                  //              2xx = 0.105s
                                                  //   tens digit - strobe cycle time in 0.2s
                                                  //              x0x = 0.2s
                                                  //              x1x = 0.4s
                                                  //              . . . . . . . .
                                                  //              x9x = 2.0s
                                                  //   ones digit - pause between double strobes in 0.05s
                                                  //              xx0 = 0.05s
                                                  //              xx1 = 0.10s
                                                  //              . . . . . . . .
                                                  //              xx9 = 0.50s
#define cvBeacon                62                // rotary beacon cycle time in 0.1s
#define cvSoftSt                63                // soft start effect time in 0.1s
#define cvDitch                 64                // ditch lights:
                                                  //   hundreds digit - low PWM pause:
                                                  //              0xx = 10% of cycle time
                                                  //              1xx = 20% of cycle time
                                                  //   tens digit - minimum PWM:
                                                  //              x0x = 0% (completely off)
                                                  //              x1x = 5%
                                                  //              . . . . . . . .
                                                  //              x9x = 42%
                                                  //   ones digit - cycle time:
                                                  //              xx0 = 0.5s
                                                  //              xx1 = 0.6s
                                                  //              . . . . . . . .
                                                  //              xx9 = 1.4s
#define cvCoupler              115                // coupler settings:
                                                  //   hundreds and tens - max PWM time in 0.2s:
                                                  //               0x = 0.0s
                                                  //               1x = 0.2s
                                                  //               2x = 0.4s
                                                  //              . . . . . . . .
                                                  //              24x = 4.8s
                                                  //   ones digit - holding PWM:
                                                  //              xx0 =  0%
                                                  //              xx1 = 10%
                                                  //              . . . . . . . .
                                                  //              xx9 = 90%
#define cvFadeIn               190                // fade-in  effect time in 0.1s
#define cvFadeOut              191                // fade-out effect time in 0.1s

                                                  // --------------------------------------------------- available CVs ---------------------------------------------------
#define cv147Available         147                // available                                                FUTURE IMPLEMENTATION
                                                  //    to
#define cv154Available         154                // available                                                FUTURE IMPLEMENTATION

#define cv192Available         192                // available                                                FUTURE IMPLEMENTATION
                                                  //    to
#define cv199Available         199                // available                                                FUTURE IMPLEMENTATION

                                                  // ---------------------------------------------- function output PWM CVs ----------------------------------------------
#define cvF0fPwm               209                // F0f PWM
#define cvF0rPwm               210                // F0r PWM
#define cvFA1Pwm               211                // FA1 PWM
#define cvFA2Pwm               212                // FA2 PWM
#define cvFA3Pwm               213                // FA3 PWM
#define cvFA4Pwm               214                // FA4 PWM
#define cvFA5Pwm               215                // FA5 PWM
#define cvFA6Pwm               216                // FA6 PWM
#define cvFA7Pwm               217                // FA7 PWM
#define cvFA8Pwm               218                // FA8 PWM
#define cvFA9Pwm               219                // FA9 PWM
#define cvFA10Pwm              220                // FA10 PWM
#define cvFA11Pwm              221                // FA11 PWM
#define cvFA12Pwm              222                // FA12 PWM
#define cvFA13Pwm              223                // FA13 PWM
#define cvFA14Pwm              224                // FA14 PWM

                                                  // -------------------------------------- function output memory and polarity CVs --------------------------------------
#define cvMem                  200                // function state storage; uses 8 bytes for 29 inputs:
                                                  //   +0 to +3 contain function state masks set by user
                                                  //   +4 to +7 store function states saved by firmware on state change
#define cvFAPolLo              225                // F0f - FA6 output polarity: 0 - active low; 1 - active high
#define cvFAPolHi              226                // FA7 - FA14 output polarity as described above

                                                  // --------------------------------------------------- available CVs ---------------------------------------------------
#define cv227Available         227                // available                                                FUTURE IMPLEMENTATION
                                                  //    to
#define cv249Available         249                // available                                                FUTURE IMPLEMENTATION

                                                  // ----------------------------------------------------- other CVs -----------------------------------------------------
#define cvDump                 256                // write any non-zero value to this CV to dump CV values to serial

struct cvPair {int cv; byte value;};

byte          defsCVCnt      = 0;
int           setCVInd       = 0;
byte          setCVVal       = 0;
unsigned long cvChangeMillis = 0;
int           getCVInd       = 0;

int           marsStep       = 1;
unsigned long marsMillis     = 0;
byte          marsMin        = 32;
byte          randMin        = 32;
unsigned long flashOnMillis  = 0;
unsigned long flashOffMillis = 0;
unsigned long strobeOnMillis = 0;
unsigned long strobeOffMillis = 0;
unsigned long strobe2Millis  = 0;
int           beaconStep     = 1;
unsigned long beaconMillis   = 0;
int           ditchCounter   = 0;
int           ditchStep      = 1;
unsigned long ditchMillis    = 0;
unsigned long oldDitchMillis = 0;
byte          ditchMin       = 32;
byte          ditchPause     = 25;
byte          ditchFlag      = 0;
unsigned long couplerMillis  = 0;
word          couplerPwm     = 0;
int           softStStep     = 1;
unsigned long softStMillis   = 0;
int           fadeInStep     = 1;
int           fadeOutStep    = 1;
unsigned long fadeInMillis   = 0;
unsigned long fadeOutMillis  = 0;
unsigned long pwmMicros      = 0;                 // PWM µs storage
byte          pwmCounter     = 0;                 // PWM counter

cvPair factoryDefaults[] = {                      // default CV values table
  {cvShortAddress, defaultAddress},
  {cvLongAddressHi, CALC_MULTIFUNCTION_EXTENDED_ADDRESS_MSB(defaultLongAddress)},
  {cvLongAddressLo, CALC_MULTIFUNCTION_EXTENDED_ADDRESS_LSB(defaultLongAddress)},
  {cvConfig1, 6}, {cvSub, mfrSubver}, {cvDef, 0},
  {cvStartV, 1}, {cvMaxV, 1}, {cvMidV, 1}, {cvAccel, 5}, {cvDecel, 5},
  {cvMotorFreq, 95}, {cvMotorPI, 55}, {cvMotorVref, 0}, {cvMotorBEMF, 255},
  {cvMomReduction, 0}, {cvHalfSpeedKey, 0}, {cvMomentumKey, 0},
  {cvF0f,  1}, {cvF0r,  2}, {cvF1,   4}, {cvF2,   8},
  {cvF3,  16}, {cvF4,  32}, {cvF5,  64}, {cvF6, 128},
  {cvF7,   0}, {cvF8,   0}, {cvF9,   0}, {cvF10,  0},
  {cvF11,  0}, {cvF12,  0},
  {cvF0fe, 0}, {cvF0re, 0}, {cvF1e,  0}, {cvF2e,  0},
  {cvF3e,  0}, {cvF4e,  0}, {cvF5e,  0}, {cvF6e,  0},
  {cvF7e,  1}, {cvF8e,  2}, {cvF9e,  4}, {cvF10e, 8},
  {cvF11e, 0}, {cvF12e, 0},
  {cvF0fEffect,  0}, {cvF0rEffect,  0}, {cvFA1Effect,  0}, {cvFA2Effect,  0},
  {cvFA3Effect,  0}, {cvFA4Effect,  0}, {cvFA5Effect,  0}, {cvFA6Effect,  0},
  {cvFA7Effect,  0}, {cvFA8Effect,  0}, {cvFA9Effect,  0}, {cvFA10Effect, 0},
  {cvFA11Effect, 0}, {cvFA12Effect, 0}, {cvFA13Effect, 0}, {cvFA14Effect, 0},
  {cvMarsMin, 32}, {cvRandMin, 32}, {cvMars,   15}, {cvFlash, 53},
  {cvStrobe,  57}, {cvBeacon,  30}, {cvSoftSt, 15}, {cvDitch, 35},
  {cvCoupler,  0}, {cvFadeIn,   8}, {cvFadeOut, 8},
  {cvF0fPwm,  160}, {cvF0rPwm,  160}, {cvFA1Pwm,  160}, {cvFA2Pwm,  160},
  {cvFA3Pwm,  160}, {cvFA4Pwm,  160}, {cvFA5Pwm,  160}, {cvFA6Pwm,  160},
  {cvFA7Pwm,  160}, {cvFA8Pwm,  160}, {cvFA9Pwm,  160}, {cvFA10Pwm, 160},
  {cvFA11Pwm, 160}, {cvFA12Pwm, 160}, {cvFA13Pwm, 160}, {cvFA14Pwm, 160},
  {cvFAPolLo,   0}, {cvFAPolHi,   0},
  {cvMem + 0, 255}, {cvMem + 1, 255}, {cvMem + 2, 255}, {cvMem + 3, 255},
  {cvMem + 4,   0}, {cvMem + 5,   0}, {cvMem + 6,   0}, {cvMem + 7,   0},
  {cvDump, 0}
};

NmraDcc Dcc;

void setup() {                                    // program setup
  pinMode(motorPwm, OUTPUT);
  pinMode(motorDir, OUTPUT);
  for (int i = 0; i < outs; i++) {                  // initialize all function outputs
    stateFA[i] = 0;                                   // initialize output state
    oldStateFA[i] = 0;
    effectFA[i] = 0;                                  // and effects (no effects)
    effectMillis[i] = 0;
    cEff[i] = 0;
  } // for i
  for (int i = 1; i < maxFuncs; i++) stateF[i] = 0; // initialize all function input states
  stateF[0] = 1;
  #ifdef digitalPinToInterrupt
    Dcc.pin(dccPin, 1);
  #else
    Dcc.pin(0, dccPin, 1);
  #endif
  Dcc.init(mfrID, mfrVer, FLAGS_MY_ADDRESS_ONLY | FLAGS_AUTO_FACTORY_DEFAULT, 0); // initialize DCC library
  if (Dcc.getCV(cvSub)  != mfrSubver) Dcc.setCV(cvSub, mfrSubver); // set sub version CV value
  if (Dcc.getCV(cvDef)  != 0) Dcc.setCV(cvDef,  0); // reset factory defaults CV value
  if (Dcc.getCV(cvDump) != 0) Dcc.setCV(cvDump, 0); // reset dump CV value
  getVvalues();
  getMomentumValues();
  getCouplerValues();
  marsMin = Dcc.getCV(cvMarsMin);                   // load mars light minimum PWM
  randMin = Dcc.getCV(cvRandMin);                   // load random flicker minimum PWM
  getEffectMillis(cvMars,    43);
  getEffectMillis(cvFlash,   43);
  getEffectMillis(cvStrobe,  43);
  getEffectMillis(cvBeacon,  43);
  getEffectMillis(cvDitch,   43);
  getEffectMillis(cvSoftSt,  43);
  getEffectMillis(cvFadeIn, 128);
  getEffectMillis(cvFadeOut, 43);
  getLocoDir();
  #ifdef debug_main                                 // send decoder info if debug mode is enabled
    Serial.begin(115200);                             // set up UART; needed for dumpCVs
    Serial.println();
    Serial.println("--- Function DCC Decoder --- Ivan Cankov ---");
    Serial.print("Mfr ID: ");
    Serial.print(Dcc.getCV(cvMfr));
    Serial.print("; Version: ");
    Serial.print(Dcc.getCV(cvVer));
    Serial.print(".");
    Serial.print(Dcc.getCV(cvSub));
    Serial.print("; Address: ");
    Serial.print(Dcc.getAddr());
    Serial.print("; CV");
    Serial.print(cvConfig1);
    Serial.print(": ");
    Serial.println(Dcc.getCV(cvConfig1));
    Serial.println();
  #endif
  byte c = cvFAPolLo;
  byte p = 1;
  for (int i = 0; i < outs; i++) {
    pwmFA[i] = Dcc.getCV(cvF0fPwm + i);               // load output PWMs
    foPol[i] =  (Dcc.getCV(c) & p) ? 1 : 0;
    digitalWrite(foPin[i], !foPol[i]);                // deactivate function output
    pinMode(foPin[i], OUTPUT);                        // initialize function output
    if ((i & 7) == 7) {
      c++;
      p = 1;
    } else p *= 2;
  } // for i
  c = cvMem;
  p = 1;
  for (int i = 0; i < maxFuncs; i++) {              // read enabled function states from cvMem
    stateF[i] = (Dcc.getCV(c) & Dcc.getCV(c + 4) & p) ? 1 : 0;
    if ((i & 7) == 7) {
      c++;
      p = 1;
    } else p *= 2;
  } // for i
  randomSeed(analogRead(A7));
  if (Dcc.getAddr() > 9983) defsCVCnt = sizeof(factoryDefaults) / sizeof(cvPair); // make defsCVCnt non-zero and equal to number
    // of CVs to be reset to flag the loop()
    // function reset to factory defaults is needed
} // setup

void loop() {                                     // main cycle
  Dcc.process();
  if (doFunctions || throttleReq) {
    for (int i = 0; i < outs; i++) stateFA[i] = 0;    // reset all function output states
    for (int i = 0; i < maxFuncs; i++) doMapping(i);  // apply function mapping to output states
    doOutputs();                                      // check output states and apply effects as needed
    doFunctions = false;
    throttleReq = false;
  } // if doFunctions
  checkEffectInProgress();
  if (doMotorFlag) doMotor();
  if (defsCVCnt && Dcc.isSetCVReady()) {  // check if factory reset of CVs was requested
    defsCVCnt--;                          // decrement from initial size of array
    Dcc.setCV(factoryDefaults[defsCVCnt].cv, factoryDefaults[defsCVCnt].value);
    #ifdef debug_defaults
      Serial.print("Load Factory Defaults: CV");
      Serial.print(factoryDefaults[defsCVCnt].cv);
      Serial.print(": ");
      Serial.println(factoryDefaults[defsCVCnt].value);
    #endif
    if (!defsCVCnt) asm("jmp 0");         // done with factory defaults, restart program; comment if restart is not desired
//    if (!defsCVCnt) requestFunctionCheck(); // uncomment if restart is not desired
  } // if defsCVCnt
  if (setCVInd && Dcc.isSetCVReady() && (millis() - cvChangeMillis > 63)) { // CV needs to reset immediately
    Dcc.setCV(setCVInd, setCVVal);                        // after its value has been set
    if (setCVInd == cvDump) dumpCVs();                    // dump CVs if dump CV changed
    setCVInd = 0;                                         // clear request
  } // if setCVInd
  #ifdef dump_CVs_enabled
    if (getCVInd && !setCVInd) {                          // check for CV readback to serial request
      Serial.print("CV");                                   // CV readback to serial requested
      Serial.print(getCVInd);                               // send CV to serial
      Serial.print(",");
      Serial.println(Dcc.getCV(getCVInd));
      getCVInd = 0;                                         // clear request
    } // if getCVInd
  #endif
} // loop


Продължението следва...

Иван
Титла: Програмата на функционалния декодер - част 3
Публикувано от: IvanC в 05 Февруари 2022, 22:24:04

void notifyDccCVChange(unsigned int cv, byte value) {  // called when DCC packet changes CV value
  #ifdef debug_cvchange
    Serial.print("notifyDccCVChange: CV");
    Serial.print(cv);
    Serial.print(": ");
    Serial.println(value);
  #endif
  switch (cv) {
    case cvDef:                                       // factory defaults CV has changed
      if (value == cvDef)                               // change to reset to factory defaults
        defsCVCnt = sizeof(factoryDefaults) / sizeof(cvPair); // make defsCVCnt non-zero and equal to number
      // of CVs to be reset to flag the loop()
      // function reset to factory defaults is needed
      break;
    case cvSub:                                       // subversion has been changed
      setCVInd = cvSub;                                 // flag the loop() to restore it
      setCVVal = mfrSubver;
      break;
    case cvStartV:
    case cvMaxV:
    case cvMidV:
      getVvalues();
    case cvAccel:
    case cvDecel:
      getMomentumValues();
      break;
    case cvMarsMin:                                   // mars light minimum PWM value changed
      marsMin = Dcc.getCV(cv);                        // load mars light minimum PWM
      break;
    case cvRandMin:                                   // random flicker minimum PWM value changed
      randMin = Dcc.getCV(cv);                        // load random flicker minimum PWM
      break;
    case cvMars:                                      // mars light value changed
    case cvFlash:                                     // flash value changed
    case cvStrobe:                                    // strobe value changed
    case cvBeacon:                                    // rotary beacon value changed
    case cvDitch:                                     // ditch lights value changed
    case cvSoftSt:                                    // fade-in value changed
    case cvFadeOut:                                   // fade-out value changed
      getEffectMillis(cv, 43);
      break;
    case cvFadeIn:                                    // fade-in value changed
      getEffectMillis(cv, 128);
      break;
    case cvCoupler:
      getCouplerValues();
      break;
    #ifdef dump_CVs_enabled
      case cvDump:                                      // CV dump is requested
        setCVInd = cvDump;                                // flag the loop() to reset the value
        setCVVal = 0;                                     // and dump the CVs to serial
        break;
    #endif
    default:
      cvChanged = cv;
      requestFunctionCheck();
      break;
  } // switch cv
  if ((cv == cvFAPolLo) || (cv == cvFAPolHi)) {     // output polarity value changed
    byte c = cvFAPolLo;
    byte p = 1;
    for (int i = 0; i < outs; i++) {
      foPol[i] =  (Dcc.getCV(c) & p) ? 1 : 0;
      if ((i & 7) == 7) {
        c++;
        p = 1;
      } else p *= 2;
    } // for i
  } // if cv
  if ((cv >= cvF0fPwm) && (cv < cvF0fPwm + outs))
    for (int i = 0; i < outs; i++)
      pwmFA[i] = Dcc.getCV(cvF0fPwm + i);               // load output PWMs
  cvChangeMillis = millis();                        // get current millis for CV change blocking
  getCVInd = cv;                                    // flag the loop() to send a CV readback to serial
} // notifyDccCVChange

void notifyCVAck(void) {                          // called when ACK needs to be sent for a CV read
  #ifdef debug_ack
    Serial.println("notifyCVAck") ;
  #endif
  digitalWrite(motorPwm, on);
  delay(8);
  digitalWrite(motorPwm, off);
} // notifyCVAck

void notifyDccSpeed(unsigned int a, DCC_ADDR_TYPE at, byte s, DCC_DIRECTION d, DCC_SPEED_STEPS ss) {  // called when a DCC speed packet with decoder address is received
  byte ts = (s <= 1) ? stopped : moving;
  byte td = (d == locoDirFwd) ? forward : reverse;
  throttleReq = ((throttle.Dir + (throttle.Value > 0)) != (td + ts));
  doMotorFlag = ((throttle.Value != s) || (throttle.Dir != td));
  if (s) s--;
  else {
    digitalWrite(motorPwm, off);
    intThrottle.Value = s;
    intThrottle.Dir   = td;
    accelCounter = 0;
    decelCounter = 0;
  } // if s
  if (s) {
    byte hs = ss >> 1;
    if (s < hs) s = map(s,  1, hs, vMin, vMid);
    else        s = map(s, hs, ss, vMid, vMax);
  } // if s
  throttle.Value = s;
  throttle.Dir   = td;
  #ifdef debug_speed
    Serial.print("notifyDccSpeed: Address: ");
    Serial.print(a);
    Serial.print((at == DCC_ADDR_SHORT) ? "-S" : "-L");
    Serial.print("; Speed: ");
    Serial.print(s);
    Serial.print((d == DCC_DIR_FWD) ? "-F" : "-R" );
    Serial.print("; Steps: ");
    Serial.print(ss);
    Serial.print("; State: ");
    Serial.print((ts == moving) ? "Moving " : "Stopped ");
    Serial.print((throttle.Dir == forward) ? "forward" : "in reverse");
    Serial.println();
  #endif
} // notifyDccSpeed

void notifyDccFunc(unsigned int a, DCC_ADDR_TYPE aType, FN_GROUP fGroup, byte fState) {  // called when a DCC function packet with decoder address is received
  #ifdef debug_functions
    Serial.print("notifyDccFunc: Address: ");
    Serial.print(a);
    Serial.print((aType == DCC_ADDR_SHORT) ? "-S" : "-L");
    Serial.print("; Function Group: ");
    switch (fGroup) {
      case FN_0_4:   Serial.print(" F0-F4:   "); break;
      case FN_5_8:   Serial.print(" F5-F8:   "); break;
      case FN_9_12:  Serial.print(" F9-F12:  "); break;
      case FN_13_20: Serial.print("F13-F20:  "); break;
      case FN_21_28: Serial.print("F21-F28:  "); break;
    } // switch fGroup
  #endif
  switch (fGroup) {
    case FN_0_4:
      stateF[0] = (fState & FN_BIT_00) ? 1 : 0;
      #ifdef debug_functions
        Serial.print(stateF[0]);
      #endif
      setFuncState(FN_BIT_01, fState, 1, 4);   break;
    case FN_5_8:   setFuncState(FN_BIT_05, fState, 5, 8);   break;
    case FN_9_12:  setFuncState(FN_BIT_09, fState, 9, 12);  break;
    case FN_13_20: setFuncState(FN_BIT_13, fState, 13, 20); break;
    case FN_21_28: setFuncState(FN_BIT_21, fState, 21, 28); break;
  } // switch fGroup
  #ifdef debug_functions
    Serial.println();
  #endif
  doFunctions = 1;
  byte m = 0;
  byte p = 1;
  byte c = cvMem + 4;
  for (int i = 0; i < maxFuncs; i++) {              // store input states to cvMem
    m += (stateF[i]) ? p : 0;
    if ((i == 7) || (i == maxFuncs - 1)) {
      if (Dcc.getCV(c) != m) Dcc.setCV(c, m);
      m = 0;
      p = 1;
      c++;
    } else p *= 2;
  } // for i
} // notifyDccFunc

void getVvalues() {
  byte b = Dcc.getCV(cvStartV);
  vMin = (b < 2) ? 1 : ((b > 252) ? 252 : b);
  b = Dcc.getCV(cvMaxV);
  vMax = (b < 2) ? 255 : ((b < (vMin + 3)) ? (vMin + 3) : b);
  b = Dcc.getCV(cvMidV);
  vMid = (b < 2) ? ((vMax - vMin) / 3 + vMin) : ((b < (vMin + 1)) ? (vMin + 1): ((b > (vMax - 2)) ? (vMax - 2) : b));
  #ifdef debug_speed
    Serial.print(vMin);
    Serial.print(" - ");
    Serial.print(vMid);
    Serial.print(" - ");
    Serial.println(vMax);
  #endif
  doMotorFlag = true;
} // getVvalues

void getMomentumValues(){
  accelCount = momentumConst * Dcc.getCV(cvAccel) / (vMax - vMin);
  decelCount = momentumConst * Dcc.getCV(cvDecel) / (vMax - vMin);
} // getMomentumValues

// ---------------------------------------------------------------------------- doMotor ----------------------------------------------------------------------------

void doMotor() {
  if ((!accelCounter) || (!decelCounter)) {
    byte f = false;
    byte tv = throttle.Value;
    byte mr;
    byte hsk = Dcc.getCV(cvHalfSpeedKey);
    byte k = hsk % 100;
    if (k) {
      if (k == 29) k = 0;
      if (k < maxFuncs) {
        f = stateF[k];
        if (hsk / 100 == 1) f = !f;
        if (f) tv = tv >> 1;
      } // if hsk
    } // if hsk
    f = false;
    hsk = Dcc.getCV(cvMomentumKey);
    k = hsk % 100;
    if (k) {
      if (k == 29) k = 0;
      if (k < maxFuncs) {
        f = stateF[k];
        if (hsk / 100 == 1) f = !f;
        if (f) mr = Dcc.getCV(cvMomReduction);
      } // if hsk
    } // if hsk
    int accel = 0;                                              // constant speed
    if (!intThrottle.Value) {
      intThrottle.Dir = throttle.Dir;
      throttleReq = true;
    } // if !intThrottle.Value
    if (intThrottle.Dir == throttle.Dir) {
      if      (intThrottle.Value < tv) accel =  1;                // accelerating
      else if (intThrottle.Value > tv) accel = -1;                // decelerating
    } else accel = -1;                                            // decelerating
    if (((accel > 0) && (!accelCounter)) || ((accel < 0) && (!decelCounter))) {
      intThrottle.Value += accel;
      throttleReq = true;
      deltaThrottle = (intThrottle.Dir == throttle.Dir) ? tv : -tv;
      deltaThrottle -= intThrottle.Value;
      if (intThrottle.Value != tv) {
        if (accel > 0) {
          accelCounter = expo(accelCount, intThrottle.Value, true) / truePwmTime;
          if (f) accelCounter = (accelCounter * mr) >> 8;
        } // if accel > 0
        else if (accel < 0) {
          decelCounter = expo(decelCount, intThrottle.Value, true) / truePwmTime;
          if (f) decelCounter = (decelCounter * mr) >> 8;
        } // if accel < 0
      } else if (!intThrottle.Value) {
        intThrottle.Dir = throttle.Dir;
        throttleReq = true;
      } // if !intThrottle.Value
    } // if accel
  } // if intThrottle.Dir
  digitalWrite(motorDir, intThrottle.Dir);
  digitalWrite(motorPwm, intThrottle.Value > pwmCounter);
//  analogWrite(motorPwm, intThrottle.Value);
  doMotorFlag = false;
} // doMotor

void getEffectMillis(word cv, byte d) {
  int s;
  unsigned long m;
  byte b = Dcc.getCV(cv);
  switch (cv) {
    case cvFlash:
      m = b / 10 + 1;
      m *= 20;
      b %= 10;
      flashOnMillis  = m * (1 + b);
      flashOffMillis = m * (9 - b);
      return;
    case cvStrobe:
      m = b / 100;
      strobeOnMillis = 35 * (1 + m);
      m = (b / 10) % 10;
      strobeOffMillis = 200 * (1 + m) - strobeOnMillis;
      m = b % 10;
      strobe2Millis = 50 * (1 + m);
      return;
    case cvDitch:
      ditchPause = (b / 100 + 1) * 25;
      ditchMin = ((b / 10) % 10) * 12;
      b %= 10;
      b += 5;
    default:
      b = max(b, 1);
      s = int(d / b);
      s = max(s, 1);
      m = (unsigned long)(s * b / 2.56);
      break;
  } // switch cv
  switch (cv) {
    case cvMars:    marsStep    = s; marsMillis    = m; break;
    case cvBeacon:  beaconStep  = s; beaconMillis  = m; break;
    case cvDitch:   ditchStep   = s; ditchMillis   = m; break;
    case cvSoftSt:  softStStep  = s; softStMillis  = m; break;
    case cvFadeIn:  fadeInStep  = s; fadeInMillis  = m; break;
    case cvFadeOut: fadeOutStep = s; fadeOutMillis = m; break;
  } // switch cv
} // getEffectMillis

void getCouplerValues() {
  unsigned long l = Dcc.getCV(cvCoupler);
  couplerMillis = (l / 10) * 200;
  couplerPwm = (l % 10) * 25;
} // getCouplerValues

unsigned long expo(unsigned long m, byte c, byte t) {
  if (t) {
    if (c < 10)  return (m * 8);
    if (c < 25)  return (m * 4);
  } // if t
  if (c < 51)  return (m * 2);
  if (c < 102) return (m * 1.290);
  if (c < 153) return (m * 0.831);
  if (c < 240) return (m * 0.535);
  return (m * 0.345);
} // expo

void requestFunctionCheck() {
  doFunctions = true;
  throttleReq = true;
  getLocoDir();
} // requestFunctionCheck

byte getFAEffectIndex(byte cv) {                  // returns the function output index based on output effect CV
  for (int i = 0; i < outs; i++) {
    byte j = ((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i; // check all output effects
    if (cv == (((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i)) return (i);
  } // for i
  return (outs);
} // getFAEffectIndex

void dumpCVs() {                                  // dump all CVs to serial
  #ifdef dump_CVs_enabled
    Serial.println("--- CV Dump Start ---");
    Serial.println("CV,Value");
    for (int i = 1; i <= 256; i++) {                  // cycle thru all (256 supported) CVs
      int p = ((i == cvVer) || (i == cvMfr)) ? i : 0;   // CV7 and CV8 are not in defaults array
      if (!p)
        for (int c = 0; c < sizeof(factoryDefaults) / sizeof(cvPair); c++)
          if (i == factoryDefaults[c].cv) p = i;            // get index if CV in defaults array
      if (p) {                                          // check if CV found
        Serial.print("CV");                               // send CV to serial
        Serial.print(p);
        Serial.print(",");
        Serial.println(Dcc.getCV(p));
      } // if p
    } // for i
    Serial.println("---- CV Dump End ----");
  #endif
} // dumpCVs

void getLocoDir() {locoDirFwd = (Dcc.getCV(cvConfig1) & CV29_LOCO_DIR) ^ DCC_DIR_FWD;}  // get direction from CV29.0

void setFuncState (byte g, byte s, byte b, byte e) {
  byte m = g;
  for (int c = b; c <= min(e, maxFuncs - 1); c++) {
    stateF[c] = (s & m) ? 1 : 0;
    m *= 2;
    #ifdef debug_functions
      Serial.print(stateF[c]);
    #endif
  } // for c
} // setFuncState

// --------------------------------------------------------------------------- doMapping ---------------------------------------------------------------------------

void doMapping(int i) {
  byte m = Dcc.getCV((i) ? (cvF0r + i) : ((intThrottle.Dir == forward) ? cvF0f : cvF0r)); // get function mapping CV value
  for (int c = 0; c < outs; c++) {                  // check all mapping
    if ((c < outs) && (m & 1)) {
      if (stateF[i]) stateFA[c] = stateF[i];            // output is controlled by input - store "new" state
        #ifdef debug_mapping
          Serial.print("State of F");
          if (i) Serial.print(i); else Serial.print((intThrottle.Dir == forward) ? "0f" : "0r");
          Serial.print(": ");
          Serial.print(stateF[i]);
          Serial.print("; Mask: ");
          Serial.print(m);
          Serial.print("; State of FA");
          Serial.print(c);
          Serial.print(": ");
          Serial.println(stateFA[c]);
        #endif
    } // if c
    if ((c & 7) == 7) m = Dcc.getCV((i != 0) ? (cvF0re + i) : ((intThrottle.Dir == forward) ? cvF0fe : cvF0re)); else m /= 2;
  } // for c
} // doMapping


Продължението следва...

Иван
Титла: Програмата на функционалния декодер - част 4 (последна)
Публикувано от: IvanC в 05 Февруари 2022, 22:26:42

// --------------------------------------------------------------------------- doOutputs ---------------------------------------------------------------------------

void doOutputs() {                                // apply output effects if any
  unsigned long m;
  for (int i = 0; i < outs; i++) {                  // cycle through all function outputs
    if ((stateFA[i] != oldStateFA[i]) || throttleReq) { // check if output or throttle status has changed
      byte j = ((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i; // check all output effects
      byte d = Dcc.getCV(j);
      effectFA[i] = d & outEffMask;                     // get non-directional effect
      d &= outEffDir;                                   // get directional effect
      byte td = intThrottle.Dir;                        // get direction from throttle state
      if (((d == outEffFwd) && (td == reverse)) ||      // output on forward only, throttle is in reverse or
          ((d == outEffRev) && (td == forward)))        // output on in reverse only, throttle is forward:
        stateFA[i] = 0;                                   // turn off output state
      #ifdef debug_effects
        Serial.print("Output Effects: Index: ");
        Serial.print(i);
        Serial.print("; CV");
        Serial.print(j);
        Serial.print(": ");
        Serial.print(Dcc.getCV(j));
        Serial.print(" - ");
        switch (effectFA[i]) {
          case outEffNone:    Serial.println("None");             break;
          case outEffMars:    Serial.println("Mars");             break;
          case outEffRandom:  Serial.println("Flicker");          break;
          case outEffFlash:   Serial.println("Flasher");          break;
          case outEffStrobe1: Serial.println("Single Strobe");    break;
          case outEffStrobe2: Serial.println("Dual Strobe");      break;
          case outEffBeacon:  Serial.println("Beacon");           break;
          case outEffGyra:    Serial.println("Gyralite");         break;
          case outEffDitch1R: Serial.println("RH Ditch 1");       break;
          case outEffDitch1L: Serial.println("LH Ditch 1");       break;
          case outEffDitch2R: Serial.println("RH Ditch 2");       break;
          case outEffDitch2L: Serial.println("LH Ditch 2");       break;
          case outEffCoupler: Serial.println("Coupler");          break;
          case outEffSoft:    Serial.println("Soft Start");       break;
          case outEffBrake:   Serial.println("Brake Light");      break;
          case outEffStand:   Serial.println("Standing Only");    break;
          case outEff5min:    Serial.println("Off in 5 min");     break;
          case outEff10min:   Serial.println("Off in 10 min");    break;
          case outEffFade:    Serial.println("Fade-in/out");      break;
          case outEffFluo:    Serial.println("Fluorescent");      break;
          case outEffSparks:  Serial.println("Brake Sparks");     break;
          default:            Serial.println("Undefined (None)"); break;
        } // switch effectFA
      #endif
      if (cvChanged) {
        if (i == getFAEffectIndex(cvChanged)) {
          oldStateFA[i] = !stateFA[i];
          cvChanged = 0;
        } // if i
      } // if cvChanged
      switch (effectFA[i]) {
        case outEffFlash:                                 // flashing light effect
          if (stateFA[i] == oldStateFA[i]) break;           // do nothing if output state has not changed
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          if (!stateFA[i]) {                                // check if output state is off
            effectMillis[i] = 0;                              // no effect on turn off
            break;
          } // if !stateFA
          effectMillis[i] = millis() + flashOnMillis;       // get next time to check output effect
          cEff[i] = 0;                                      // clear output counter
          break;
        case outEffStrobe1:                               // single pulse strobe
        case outEffStrobe2:                               // double pulse strobe
          if (stateFA[i] == oldStateFA[i]) break;           // do nothing if output state has not changed
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          if (!stateFA[i]) {                                // check if output state is off
            effectMillis[i] = 0;                              // no effect on turn off
            break;
          } // if !stateFA
          effectMillis[i] = millis() + strobeOnMillis;      // get next time to check output effect
          cEff[i] = 0;                                      // clear output counter
          break;
        case outEffStand:                                 // output on standing, off moving
          if (intThrottle.Value) stateFA[i] = 0;            // turn off output state if moving
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          break;
        case outEff5min:                                  // turn off output after 5 minutes
        case outEff10min:                                 // turn off output after 10 minutes
          if (stateFA[i] == oldStateFA[i]) break;           // do nothing if output state has not changed
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          if (!stateFA[i]) {                                // check if output state is off
            effectMillis[i] = 0;                              // no effect on turn off
            break;
          } // if !stateFA
          effectMillis[i] = millis();                       // get current time
          effectMillis[i] += (effectFA[i] == outEff5min) ? 300000 : 600000; // add 5 or 10 minutes (300,000µs or 600,000µs)
          break;
        case outEffCoupler:                               // coupler control per cvCoupler
          if (intThrottle.Value) stateFA[i] = 0;            // turn off output state if moving
        case outEffDitch1R:                               // ditch light 1, right
        case outEffDitch1L:                               // ditch light 1, left
        case outEffDitch2R:                               // ditch light 2, right
        case outEffDitch2L:                               // ditch light 2, left
        case outEffMars:                                  // mars light effect
        case outEffRandom:                                // random flicker effect
        case outEffBeacon:                                // rotary beacon effect
        case outEffGyra:                                  // gyralite effect
        case outEffSoft:                                  // soft start per cvSoft [0.1s]
          if (!stateFA[i]) {                                // check if output state is off
            outPwm[i] = off;                                  // turn off output
            effectMillis[i] = 0;                              // no effect on turn off
            cEff[i] = 0;                                      // clear output counter
            break;
          } // if !stateFA
        case outEffFade:                                  // fade-in per cvFadeIn, fade-out per cvFadeOut [0.1s]
          if (stateFA[i] == oldStateFA[i]) break;           // do nothing if output state has not changed
          effectMillis[i] = millis();                       // get current time for input
          break;
        case outEffFluo:                                  // fluorescent light startup
          if (stateFA[i] == oldStateFA[i]) break;           // do nothing if output state has not changed
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          if (!stateFA[i]) {                                // check if output state is off
            effectMillis[i] = 0;                              // no effect on turn off
            break;
          } // if !stateFA
          effectMillis[i] = millis() + random(50, 300);     // get next time to check output effect
          cEff[i] = random(1, 4) << 1;                      // get random number of flickers
          break;
        default:                                          // no effect
          outPwm[i] = (stateFA[i]) ? on : off;              // apply state to output
          break;
      } // switch effectFA
      oldStateFA[i] = stateFA[i];                       // output status has changed, store status
    } // if stateFA
  } // for i
} // doOutputs

// --------------------------------------------------------------------- checkEffectInProgress ---------------------------------------------------------------------

void checkEffectInProgress() {
  byte f;
  unsigned long m = micros();
  truePwmTime = m - pwmMicros;
  if (truePwmTime > pwmTime) {
    pwmMicros = m;
    pwmCounter += pwmStep;
    doMotorFlag = true;
    if (accelCounter) accelCounter--;
    if (decelCounter) decelCounter--;
  } // if micros
  m = millis();
  ditchFlag = (m - oldDitchMillis > ditchMillis);
  if (ditchFlag) {
    oldDitchMillis = m;
    ditchCounter += ditchStep;
  } // if oldDitchMillis
  for (int i = 0; i < outs; i++) {
    if (effectMillis[i]) {
      byte eff = effectFA[i] & outEffMask;
      switch (eff) {
        case outEffMars:                                  // mars light effect
          f = cEff[i] << 2;
          if (cEff[i] & 64) f = ~f;
          if (millis() - effectMillis[i] < expo(marsMillis, f, false)) break;
          effectMillis[i] = millis();
          cEff[i] += marsStep;
          f = cEff[i] << 2;
          if (cEff[i] & 64) f = ~f;
          if (cEff[i] & 128) f = f / 3;
          outPwm[i] = max(f, marsMin);
          break;
        case outEffRandom:                                // random flicker effect
          if (millis() < effectMillis[i]) break;            // do nothing if time has not elapsed
          cEff[i]++;
          if (!cEff[i]) break;
          cEff[i] = random(randMin, on);
          f = random(0, 120);
          outPwm[i] = (f > 80) ? randMin : cEff[i];
          effectMillis[i] = millis() + f;
          break;
        case outEffFlash:                                 // flashing light effect
          if (millis() < effectMillis[i]) break;            // do nothing if time has not elapsed
          cEff[i]++;
          if (cEff[i] & 1) {
            outPwm[i] = off;
            effectMillis[i] = millis() + flashOffMillis;      // get next time to check output effect
            break;
          } // if cEff
          outPwm[i] = on;
          effectMillis[i] = millis() + flashOnMillis;       // get next time to check output effect
          break;
        case outEffStrobe1:                               // single pulse strobe effect
        case outEffStrobe2:                               // double pulse strobe effect
          if (millis() < effectMillis[i]) break;            // do nothing if time has not elapsed
          cEff[i]++;
          if (cEff[i] & 1) {
            outPwm[i] = off;
            m = (((cEff[i] & 2) == 0) && ((effectFA[i] & outEffMask) == outEffStrobe2)) ? strobe2Millis : strobeOffMillis;
            effectMillis[i] = millis() + m;                   // get next time to check output effect
            break;
          } // if cEff
          outPwm[i] = on;
          effectMillis[i] = millis() + strobeOnMillis;      // get next time to check output effect
          break;
        case outEffBeacon:                                // rotary beacon effect
          f = cEff[i] << 2;
          if (cEff[i] & 64) f = ~f;
          if (millis() - effectMillis[i] < expo(beaconMillis, f, false)) break;
          effectMillis[i] = millis();
          cEff[i] += beaconStep;
          if (cEff[i] & 128) {
            outPwm[i] = off;
            break;
          } // if cEff
          f = cEff[i] << 2;
          if (cEff[i] & 64) f = ~f;
          outPwm[i] = f;
          break;
        case outEffGyra:                                  // gyralite effect
          if (millis() - effectMillis[i] < marsMillis) break;
          effectMillis[i] = millis();
          cEff[i] += marsStep;
          if (cEff[i] & 128) {
            outPwm[i] = marsMin;
            break;
          } // if cEff
          f = cEff[i] << 2;
          if (cEff[i] & 64) f = ~f;
          outPwm[i] = max(f, marsMin);
          break;
        case outEffDitch1R:                               // ditch light 1, right
        case outEffDitch1L:                               // ditch light 1, left
        case outEffDitch2R:                               // ditch light 2, right
        case outEffDitch2L:                               // ditch light 2, left
          if (!ditchFlag) break;
          f = ditchCounter << 1;
          if (eff & 4) f = ~f;
          if (ditchCounter & 128) f = ~f;
          if (f < ditchMin + ditchPause) f = ditchMin;
          outPwm[i] = f;
          break;
        case outEff5min:                                  // turn off output after 5 minutes
        case outEff10min:                                 // turn off output after 10 minutes
          if (millis() < effectMillis[i]) break;            // do nothing if time has not elapsed
          outPwm[i] = off;                                  // time has elapsed, turn off output
          effectMillis[i] = 0;
          break;
        case outEffCoupler:                               // coupler control per cvCoupler
          outPwm[i] = (millis() - effectMillis[i] < couplerMillis) ? on : couplerPwm;
          break;
        case outEffSoft:                                  // soft start per cvSoft [0.1s]
          if (millis() - effectMillis[i] < expo(softStMillis, cEff[i], false)) break;
          effectMillis[i] = millis();
          cEff[i] += softStStep;
          if (cEff[i] > 255) {
            outPwm[i] = on;
            cEff[i] = 255;
            effectMillis[i] = 0;
            break;
          } // if cEff
          outPwm[i] = cEff[i];
          break;
        case outEffFade:                                  // fade-in per cvFadeIn [0.1s]
          f = stateFA[i];                                   // fade-out per cvFadeOut [0.1s]
          m = (f) ? fadeInMillis : expo(fadeOutMillis, cEff[i], false);
          if (millis() - effectMillis[i] < m) break;
          effectMillis[i] = millis();
          cEff[i] += (f) ? fadeInStep : -fadeOutStep;
          if ((cEff[i] < 0) || (cEff[i] > 255)) {
            outPwm[i] = (f) ? on : off;
            cEff[i] = (f) ? 255 : 0;
            effectMillis[i] = 0;
            break;
          } // if cEff
          outPwm[i] = cEff[i];
          break;
        case outEffFluo:                                  // fluorescent ligh start up effect
          m = millis();                                     // get current time
          if (m < effectMillis[i]) break;                   // do nothing if not time yet
          cEff[i]--;                                        // decrement effect counter
          outPwm[i] = (cEff[i] & 1) ? off : on;             // turn on/off output based on even/odd counter
          effectMillis[i] = (cEff[i]) ? (m + ((cEff[i] & 1) ? random(400, 1000) : random(50, 300))) : 0;  // get time for next event
          break;                                            //   or 0 if counter expired
        default:
          effectMillis[i] = 0;
          break;
      } // switch effectFA
    } // if effectMillis
    f = highByte((unsigned int)outPwm[i] * (unsigned int)pwmFA[i]);  // apply max PWM
    if (!foPol[i]) f = ~f;                            // invert output if set as inverted
    if (i <= 5)
      analogWrite(foPin[i], f); else                    // apply hardware PWM to outputs if supported
      digitalWrite(foPin[i], f > pwmCounter);           // apply software PWM to outputs with no hardware PWM
  } // for i
} // checkEffectInProgress


Използва се библиотеката NmraDcc, която е публикувана тук:

https://github.com/mrrwa/NmraDcc (https://github.com/mrrwa/NmraDcc)

Библиотеката може да се инсталира директно от Ардуино-IDE средата. Ако по някаква причина Ардуино средата не намери библиотеката, може да си свалите файловете от горната препратка. Трябват файловете NmraDcc.cpp и NmraDcc.h, като силно препоръчвам и keywords.txt, за да се маркират ключовите думи от библиотеката със съответните цветове.

Иван
Титла: Re: Осветление на вагони
Публикувано от: pach в 05 Февруари 2022, 22:50:51
Тази школа, няма как да се развие при младите хобисти!!!
Благодарско Иване  - за споделеното и то до край!!!
 :hi: :clapping: :hi: :clapping: :hi: :clapping: &bgflag
Титла: Изводи на Про-мини
Публикувано от: IvanC в 05 Февруари 2022, 22:54:04
Изводите на Про-минито са зададени в тези редове:



// ---------------------------------- Задаване функциите на изводите: ----------------------------------
#define dccPin                   2                // Вход за DCC сигнала; стойност 2 или 3;
                                                  //   да не се използват други стойности!!!
#define motorPwm                14                // Изход за ШИМ на мотора
#define motorDir                13                // Изход за посока на мотора

//                    FA0f FA0r FA1  FA2  FA3  FA4  FA5  FA6  FA7  FA8
const byte foPin[] = {  3,   5,   6,   9,  10,  11,  12,   8,   7,   4};  // Изводи за управление на функциите.
                                                                          //   Първите 6 извода да не се променят
                                                                          //   и да няма дублиране с dccPin!!!


Ако не сте много навътре в ATmega328, силно препоръчвам да не променяте така присвоените функции на изводите.

С други думи:

2 - вход за DCC сигнала

3 - изход F0f
5 - изход F0r
6 - изход FA1
9 - изход FA2
10 - изход FA3
11 - изход FA4
12 - изход FA5
8 - изход FA6
7 - изход FA7
4 - изход FA8

Както се вижда броят изходи са 10, а не 12, както бях писал в първото мнение. При силно желание, броят на изходите може да се увеличи на 12 и дори малко повече, но може да доведе до забавяне на работата на програмата с последващи нежелателни ефекти.

"Истинските" (хардуерните) ШИМ изходи са първите 6. Останалите 4 използват софтуерен ШИМ, поради което някои ефекти не работят много добре - получава се видима стъпкова промяна на яркостта на светене на лампата/светодиода, свързан към някой от тези изводи. Заради това, препоръчвам FA5 до FA8 да не използват ефекти с плавна промяна на яркостта.

Всеки изход може да бъде зададен с активно ниско или високо ниво. Това става с помощтта на CV-та, които ще опиша в следващо мнение. Един изход може без проблеми да комутира до 20 mA, но общата комутация за цялото про-мини (сумата от комутирания ток на всички изводи) не трябва да надхвърля 200 mA.

Ако изпозлвате стабилизатор на напрежението за 3.3 V, про-минито трябва да е с кварц за максимум 8 MHz. Ако стабилизаторът е за 5 V, квaрцът може да е за 16 MHz. И в двата случая трябва да изберете правилната честота на кварца от Ардуино средата при програмирането на про-минито. В противен случай времеконстантите няма да отговарят на зададеното, като може времетраенетата на нарастнат или намалят двойно.

Както се вижда по-горе има и изводи за управление на мотор, но тази функцията е много първобитна и съм я направил единствено за да мога да направя задаването на времето за ускорение и спиране, което оказва влияние на някои от ефектите. Електромоторът НЕ МОЖЕ да се свърже директно към изводите на про-минито, а трябват драйвери. Ако се опитате да свържете мотор, като минимум съответните изводи ще се повредят, а е възможно да се повреди и цялото про-мини.

Иван
Титла: .
Публикувано от: IvanC в 05 Февруари 2022, 23:00:03
Цитат на: pach link=topic=5553.msg123159#msg123159 date=1644094251
Тази школа, няма как да се развие при младите хобисти!!!
Благодарско Иване  - за споделеното и то до край!!!
 :hi: :clapping: :hi: :clapping: :hi: :clapping: &bgflag

Това хоби има много широка техническа и технологическа база. Много от дейностите са коренно различни една от друга. Затова и смятам, че трябва да си помагаме взаимно - всеки да помага в сферата, в която има добри способности. Това е причината да публикувам тази тема - с всичко, което съм направил от началото до края.

Иван
Титла: Описание на CV-тата на функционалния декодер - част 1
Публикувано от: IvanC в 06 Февруари 2022, 01:40:06
Пропуснах да обясня, че трябваше да разделя програмата на 4 части поради ограничението на форума за максимум 20000 символа в едно мнение. Поради същата причина ще разделя и описанието на CV-тата в няколко мнения.

Виждам, че съм пропуснал и да дам препратка към про-минито, която е:

https://docs.arduino.cc/retired/boards/arduino-pro-mini (https://docs.arduino.cc/retired/boards/arduino-pro-mini)

Описанието на CV-тата на български ще е на практика превод от английски, защото не съм напълно запознат с българската терминология. Когато започнах да се занимавам с DCC, декодерите, които започнах да използвам бяха с описание на английски и от там съм запознат с английската терминология. То май българска терминология за това няма, но може и да греша в това. Та затова предварително моля да бъда извинен за неточности в българската терминология. Приемам конструктивна критика и поправки в това отношение. И понеже използвам "CV" навсякъде, ще поясня какво означава и защо използвам именно това съкращение.

CV е съкратено от Configuration Variable или на български "конфигурационна променлива". "Конфигурационна", защото задава какво да прави декодера, т.е. определя как е конфигурирана определена част от декодера, а "променлива", защото стойността може да бъде променяна. Стойността може да се променя както от потребителя (нас), така и от програмата на декодера. Някои CV-та могат да се променят само от потребителя, други от потребителя и декодера, трети само от декодера, а някои са само за четене, т.е. те са програмирани от производителя на декодера и не могат да бъдат променяни, освен ако не се смени например програмата в декодера. Като цяло CV-тата казват на програмата на декодера какво точно да прави и как тоано да го прави. В моята програмка, например, CV-тата за ефектите указват кой точно ефект да се използва за всеки изход на декодера, а други CV-та указват параметрите на съответния ефект. Постарал съм се в програмата колкото се може повече от параметрите да се задават с CV-та за колкото се може по-голяма гъвкавост. Това до известна степен усложнява настройките на CV-тата, но няма как - колкото повече възможности, толкова повече се усложнява настройката. Но пък ако не използвате много или въобще ефекти, настройките са минимални. Ще дам и пример накрая с точните настройки, които съм направил за моя багажен вагон.

Написах, че някои от CV-тата са само за четене. И за да няма неяснотии, трябва да поясня, че при този функционален декодер реално четене през централата не може да стане - декодерът в този си вид (като хардуер) няма как да върне сигнал на станцията. Единствената възможност да се прочетат CV-тата е през серийния интерфейс на про-минито, който в програмата така, както съм я публикувал, е разрешен. Това става със запис в едно от CV-тата, което ще опиша по-долу.

Описанието на CV-тата е групирано в зависимост от функционалността им.

CV-та за идентифициране на декодера и зареждане на "заводските" стойности

CV
Заводска
стойност
   Описание
CV8
13
Идентификация на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене
CV7
11
Вид на декодера; твърдо зададен с константа в програмата на декодера, т.е. само за четене
CV65
1
Версия на програмата на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене
CV11
0
Зареждане на "заводските" стойности в CV-тата при запис на стойност 11 в CV11


CV-та за задаване на адреса и основната конфигурация на декодера

CV
Заводска
стойност
   Описание
CV1
3
Къс адрес на декодера; стойности от 1 до 127; активира се от CV29
CV17
192
Дълъг адрес на декодера, старша част, активира се от CV29
CV18
128
Дълъг адрес на декодера, младша част, активира се от CV29
Дългият адрес се формира по формулата (CV17 - 192) * 256 + CV18
Формулата за изчисляване на CV17 и CV18 при желан дълъг адрес е
CV17 = адрес / 256 + 192
CV18 = остатъкът от разделянето на адреса на 256 = адрес по модул 256 = адрес - 256 * цялата часта от(адрес / 256)
CV29
6
Основна конфигурация на декодера
бит 0 - тегло 1 - посока на движение - 0 = напред; 1 = назад
бит 1 - тегло 2 - брой стъпки на тротъла - 0 = 14 стъпки; 2 = 128 стъпки
бит 2 - тегло 4 - аналогов режим - 0 = аналоговият режим е забранен; 4 = аналоговият режим е разрешен
битове 3 и 4 - тегла 8 и 16 - не се използват
бит 5 - тегло 32 - вид адрес - 0 = къс адрес, зададен от CV1; 32 = дълъг адрес, зададен с (CV17 - 192) * 256 + CV18
битове 6 и 7 - тегла 64 и 128 - не се използват
Стойността на CV29 се образува, като се съберат стойностите на всички битове, например:
бит 0: посока на движение напред = 0
бит 1: 128 стъпки на тротъла = 2
бит 2: разрешен аналогов режим = 4
бит 5: къс адрес според CV1 = 0
-----------------------------------------------------------
0 + 2 + 4 + 0 = 6 - това записваме в CV29 (този пример е за заводската стойност на CV-то)
Ако искаме посока назад (1), 128 стъпки (2), забранен аналогов режим (0) и дълъг адрес (32), в CV29 трябва да запишем 1 + 2 + 0 + 32 = 35

Адресът на декодера е от 1 до 9983 включително. Ако се зададе адрес по-голям от 9983, програмата преценява, че данните в CV-тата са повредени и зарежда заводските стойности.


CV-та за управление на мотора
Както писах по-горе, функциите за управление на мотора са съвсем елементарни и няма хардуер за мотора, но стойностите на тези CV-та имат влияние върху някои от ефектите на изходите.

CV
Заводска
стойност
   Описание
CV2
1
Минимален ШИМ на мотора (при тротъл = 1); стойност от 1 до CV6 - 1
CV5
1
Максимален ШИМ на мотора (при тротъл = 100%); стойност от CV6 + 1 до 255; 1 = 255
CV6
1
ШИМ на мотора при тротъл = 50%; стойност от CV2 + 1 до CV5 - 1; 1 = 1/3 от обхвата, зададен от CV2 и CV5
CV3
5
Време за ускорение от покой до максимална скорост в 0,9 секунди; стойност от 0 до 255; 0 = 0 сек.; 255 = 230 сек.
CV4
5
Време за спиране от максимална скорост до покой в 0,9 секунди; стойност от 0 до 255; 0 = 0 сек.; 255 = 230 сек.
CV124
0
Намаляване на времената, зададени от CV3 и CV4 при активиране на бутона, зададен от CV156:
255
=няма промяна на времената, зададени от CV3 и CV4
192
=времената, зададени от CV3 и CV4 са намалени до 75%
128
=времената са намалени до 50%
64
=времената са намалени до 25%
0
=времената са = 0, т.е. няма плавно потегляне и спиране
Всички стойности от 0 до 255 са валидни
CV155
0
Бутон за активиране на намалена до 50% скорост на движение (маневрен режим или режим "Депо"):
0
=няма присвоен бутон, т.е. функцията не може да бъде активирана
1 - 28
=бутон F1 до F28 активира функцията, когато бутонът е задействан
29
=бутон F0 активира функцията, когато бутонът е задействан
101 - 128
=бутон F1 до F28 активира функцията, когато бутонът НЕ е задействан
129
=бутон F0 активира функцията, когато бутонът НЕ е задействан
Програмата на декодера поддържа бутони от F0 до F12 включително; командите от бутоните от F13 до F28 включително се пренебрегват
CV156
0
Бутон за активиране на намаляването на времената, зададени от CV3 и CV4;
Намаляването на времената е според CV124, описано по-горе;
Задаването на бутона е идентично с описаното за CV155 по-горе

Продължението следва...

Иван
Титла: Описание на CV-тата на функционалния декодер - част 2
Публикувано от: IvanC в 06 Февруари 2022, 05:02:26
CV-та за задаване на бутоните за управление на изходите

CV
Заводска
стойност
   Описание
CV33
1
Изходи, управлявани от бутона F0 в посока напред:
бит 0-тегло 1-0 = изход F0f не се управлява от бутона;1 = изход F0f се активира при включен бутон
бит 1-тегло 2-0 = изход F0r не се управлява от бутона;2 = изход F0r се активира при включен бутон
бит 2-тегло 4-0 = изход FA1 не се управлява от бутона;4 = изход FA1 се активира при включен бутон
бит 3-тегло 8-0 = изход FA2 не се управлява от бутона;8 = изход FA2 се активира при включен бутон
бит 4-тегло 16-0 = изход FA3 не се управлява от бутона;16 = изход FA3 се активира при включен бутон
бит 5-тегло 32-0 = изход FA4 не се управлява от бутона;32 = изход FA4 се активира при включен бутон
бит 6-тегло 64-0 = изход FA5 не се управлява от бутона;64 = изход FA5 се активира при включен бутон
бит 7-тегло 128-0 = изход FA6 не се управлява от бутона;128 = изход FA6 се активира при включен бутон

Стойността на CV33 се образува, като се съберат стойностите на всички битове, например:
Искаме бутон F0 в посока напред да управлява изходи F0f (= 1) и FA1 (= 4), 1 + 4 = 5, което записваме в CV33

Втори пример - бутонът управлява изходи FA1 (= 4), FA2 (= 8 ) и FA3 (= 16): в CV33 записваме 28 (4 + 8 + 16)

CV34
2
Изходи, управлявани от бутона F0 в посока назад; задаването на изходите е еднакво с това за CV33 по-горе
CV35
4
Изходи, управлявани от бутона F1; аналогично на CV33 и CV34, но за бутон F1
CV36
8
Изходи, управлявани от бутона F2; като CV33 - CV35, но за бутон F2
CV37
16
Изходи, управлявани от бутона F3; като CV33 - CV36, но за бутон F3
CV38
32
Изходи, управлявани от бутона F4; като CV33 - CV37, но за бутон F4
CV39
64
Изходи, управлявани от бутона F5; като CV33 - CV38, но за бутон F5
CV40
128
Изходи, управлявани от бутона F6; като CV33 - CV39, но за бутон F6
CV41
0
Изходи, управлявани от бутона F7; като CV33 - CV40, но за бутон F7
CV42
0
Изходи, управлявани от бутона F8; като CV33 - CV41, но за бутон F8
CV43
0
Изходи, управлявани от бутона F9; като CV33 - CV42, но за бутон F9
CV44
0
Изходи, управлявани от бутона F10; като CV33 - CV43, но за бутон F10
CV45
0
Изходи, управлявани от бутона F11; като CV33 - CV44, но за бутон F11
CV46
0
Изходи, управлявани от бутона F12; като CV33 - CV45, но за бутон F12
CV133
0
Втора група изходи, управлявани от бутона F0 в посока напред:
бит 0-тегло 1-0 = изход FA7 не се управлява от бутона;1 = изход FA7 се активира при включен бутон
бит 1-тегло 2-0 = изход FA8 не се управлява от бутона;2 = изход FA8 се активира при включен бутон
бит 2-тегло 4-0 = изход FA9 не се управлява от бутона;4 = изход FA9 се активира при включен бутон
бит 3-тегло 8-0 = изход FA10 не се управлява от бутона;8 = изход FA10 се активира при включен бутон
битове 4 до 7-тегла 16 до 128-не се използват

Стойността на CV133 се образува, като се съберат стойностите на всички битове, както това е описано за CV33

CV134
0
Втора група изходи, управлявани от бутона F0 в посока назад; задаването на изходите е еднакво с това за CV133 по-горе
CV135
0
Втора група изходи, управлявани от бутона F1; аналогично на CV133 и CV134, но за бутон F1
CV136
0
Втора група изходи, управлявани от бутона F2; като CV133 - CV135, но за бутон F2
CV137
0
Втора група изходи, управлявани от бутона F3; като CV133 - CV136, но за бутон F3
CV138
0
Втора група изходи, управлявани от бутона F4; като CV133 - CV137, но за бутон F4
CV139
0
Втора група изходи, управлявани от бутона F5; като CV133 - CV138, но за бутон F5
CV140
0
Втора група изходи, управлявани от бутона F6; като CV133 - CV139, но за бутон F6
CV141
1
Втора група изходи, управлявани от бутона F7; като CV133 - CV140, но за бутон F7
CV142
2
Втора група изходи, управлявани от бутона F8; като CV133 - CV141, но за бутон F8
CV143
4
Втора група изходи, управлявани от бутона F9; като CV133 - CV142, но за бутон F9
CV144
8
Втора група изходи, управлявани от бутона F10; като CV133 - CV143, но за бутон F10
CV145
0
Втора група изходи, управлявани от бутона F11; като CV133 - CV144, но за бутон F11
CV146
0
Втора група изходи, управлявани от бутона F12; като CV133 - CV145, но за бутон F12


CV-та за задаване на ефектите на изходите
Описанието на стойностите, които се записват в тези CV-та ще дам по-нататък.

CV
Заводска
стойност
   Описание
CV125
0
Ефект на изход F0f
CV126
0
Ефект на изход F0r
CV127
0
Ефект на изход FA1
CV128
0
Ефект на изход FA2
CV129
0
Ефект на изход FA3
CV130
0
Ефект на изход FA4
CV131
0
Ефект на изход FA5
CV132
0
Ефект на изход FA6
CV159
0
Ефект на изход FA7
CV160
0
Ефект на изход FA8

Стойности за избор на ефектите, които се записват в CV-тата на ефектите (CV125 до CV132, CV159 и CV160)
Стойностите са разделени на две групи. Първата група указва посоката, в която ефектът да е активен, а втората група указва кой точно ефект да бъде избран. Стойността, която се записва в съответното CV се образува, като стойностите от двете групи се сумират. Ще дам пример след като опиша стойностите за избор на ефектите.

Група 1 - посока на движение:
0 = ефектът, зададен от група 2 е активен и в двете посоки
1 = ефектът е активен само в избрана посока напред
2 = ефектът е активен само в избрана посока назад
3 = също като стойност 0, т.е. и в двете посоки

Група 2 - избор на ефект:
0 = няма ефект, освен активиране на изхода в определена посока, зададено от група 1
4 = Марс светлина; параметрите на ефекта се управляват от CV54 и CV59
8 = произволно мигаща светлина; параметри в CV55
12 = мигаща светлина; параметри в CV60
16 = единична стробоскопна светлина - еднократно кратко присветване, последвано от пауза; параметри в CV61
20 = двукратна стробоскопна светлина - две кратки присветвания, последвани от пауза; параметри в CV61
24 = ефект на въртящ се "буркан"; параметри в CV62
28 = Gyralite светлина; параметри в CV59
32 = мигаща светлина 1, дясна (ditch light); параметри в CV64
36 = мигаща светлина 1, лява (ditch light); параметри в CV64
40 = мигаща светлина 2, дясна (ditch light); параметри в CV64
44 = мигаща светлина 2, лява (ditch light); параметри в CV64
48 = управление на електрически теглич; параметри в CV115
52 = плавно светване; параметри в CV63
60 = изходът е активен само в покой, ако съответният бутон е включен; в движение изходът се изключва
64 = изключване на изхода (ако е бил включен) след 5 минути работа
68 = изключване на изхода (ако е бил включен) след 10 минути работа
88 = плавно включване и изключване на изхода; параметри в CV190 и CV191
92 = ефект на светване на луминисцентна лампа; параметрите са от генератор на произволни числа

Пример:
Изход FA3 управлява осветлението на кабина 1 (в посока напред), FA4 управлява осветлението на кабина 2 (в посока назад).
Искаме кабината да се управлява от бутон F3 и да свети само в покой.

1. От таблицата за бутон F3 (CV37) виждаме, че FA3 се управлява със стойност 16, а FA4 с 32, следователно в CV37 записваме 48 (16 + 32).
2. Понеже от заводската стойност на CV38 = 32 бутон F4 също управлява FA4, забраняваме това, като в CV38 записваме 0.
3. Ефектът на FA3 ще бъде активен само в посока напред = 1 и изключен в движение = 60, в CV129 записваме 61 (60 + 1)
4. Ефектът на FA4 ще бъде активен само в посока назад = 2 и изключен в движение = 60, в CV130 записваме 62 (60 + 2)


CV-та за управление на ефектите

CV
Заводска
стойност
   Описание
CV54
32
Минимален ШИМ на Марс и Gyralite светлините (ефекти 4 и 28)
CV55
32
Минимален ШИМ на произволно мигащата светлина (ефект 8 )
CV59
15
Период на Марс и Gyralite светлините (ефекти 4 и 28) в 0,1 секунди
CV60
53
Мигаща светлина (ефект 12):
Стотици и десетици - период на мигането в 0,2 секунди:
0
=0,2 секунди период на мигане
10
=0,4 секунди период на мигане
20
=0,6 секунди период на мигане
. .
.. . . . .
240
=5,0 секунди период на мигане
Единици - времетраене на светенето в проценти от продължителността на периода:
0
=10%
1
=20%
.
.. . . .
9
=100%, т.е. ще свети непрекъснато
CV61
57
Стробоскопичен ефект (ефекти 16 и 20):
Стотици - продължителност на светенето в 0,035 секунди:
0
=0,035 секунди
100
=0,075 секунди
200
=0,105 секунди
Десетици - период на ефекта в 0,2 секунди:
0
=0,2 секунди период
10
=0,4 секунди период
. .
.. . . . .
90
=2,0 секунди период
Единици - пауза между двете присветвания на двойния стробоскопен ефект в 0,05 секунди:
0
=0,05 секунди пауза
1
=0,10 секунди пауза
. .
.. . . . .
9
=0,50 секунди пауза
CV62
30
Период на "въртене на буркана" (ефект 24) в 0,1 секунди
CV63
15
Време за плавно светване (ефект 52) в 0,1 секунди
CV64
35
Мигащи светлини (ditch lights), ефекти 32, 36, 40 и 44; стойности от 0 до 199:
Стотици - пауза при минимален ШИМ в % от периода:
0
=10% от периода
100
=20% от периода
Десетици - минимален ШИМ:
0
=0% (напълно изгасена светлина)
10
=5%
. .
.. . . . .
90
=42%
Единици - период на ефекта:
0
=0,5 секунди
1
=0,6 секунди
. .
.. . . . .
9
=1,4 секунди
CV115
0
Управление на електрически теглич (ефект 48):
Стотици и десетици - времетраене на максималния ШИМ в 0,2 секунди:
0
=0,0 секунди
10
=0,2 секунди
20
=0,4 секунди
. .
.. . . . .
240
=4,8 секунди
Единици - ШИМ за продължително задържане:
0
=0% (изключен изход)
1
=10%
. .
.. . . . .
9
=90%
CV190
8
Време за плавното включване на изхода (ефект 88) в 0,1 секунди
CV191
8
Време за плавното изключване на изхода (ефект 88) в 0,1 секунди


Продължението следва...

Иван
Титла: Описание на CV-тата на функционалния декодер - част 3 (последна)
Публикувано от: IvanC в 06 Февруари 2022, 06:11:00
CV-та за задаване на ШИМ на изходите
Тези ШИМове са максималните за всеки един изход. Там, където параметрите на ефектите задават ШИМ е всъщност процент от максималния ШИМ, указан в долните CV-та. Например ако в едно от долните CV-та е зададена стойност 160 (това са заводските стойности на тези CV-та), това задава маскимален ШИМ от 62,5% (0,625). Ако пък даден ефект задава ШИМ (минимален или максимален) от например 40% (0,4), то резултантният ШИМ ще бъде произведението от двата или в конкретния пример 25% (0,625 * 0,4 = 0,25). Това го дадох само като пример за по-любознателните. Ние нямаме нужда да го смятаме. Веднъж като сме определили какъв искаме да бъде максималният ШИМ, от там нататък спираме да мислим за него и задаваме съответните параметри на ефектите, ако има такива. Удобството на задамане на максималния ШИМ е, че може да сложим по-малки баластни съпротивления на светодиодите или крушки за по-ниско максимално напрежение (тук трябва да се внимава обаче!) и с ШИМа за изхода да зададем желаната яркост на светене. С крушките с по-ниско напрежение трябва да се внимава - ШИМът трябва да бъде програмиран ПРЕДИ да се свържат крушките, за да не изгорят. Аз обаче съм предвидил това до известна степен с въвеждане на заводска стойност 160 (62,5%) в CV-тата на ШИМа.

Стойност 0 означава 0% ШИМ, т.е. изходът ще е постоянно изключен.
Стойност 64 = 25% ШИМ
Стойност 128 = 50% ШИМ
Стойност 160 (заводската) = 62,5% ШИМ
Стойност 192 = 75% ШИМ
Стойност 255 = 100% ШИМ или когато изходът е включен, ШИМ няма да има - ще свети постоянно, освен ако има ефект, който моментно да задава някаква друга стойност на ШИМ на изхода

CV
Заводска
стойност
   Описание
CV209
160
ШИМ на изход F0f
CV210
160
ШИМ на изход F0r
CV211
160
ШИМ на изход FA1
CV212
160
ШИМ на изход FA2
CV213
160
ШИМ на изход FA3
CV214
160
ШИМ на изход FA4
CV215
160
ШИМ на изход FA5
CV216
160
ШИМ на изход FA6
CV217
160
ШИМ на изход FA7
CV218
160
ШИМ на изход FA8


CV-та за указване кои функции, задавани от бутоните да се запазват при отпадане на захранването

CV
Заводска
стойност
   Описание
CV200
255
Запазване на състоянието на функциите, зададени от бутони F0 до F6
бит 0-тегло 1-0 = състоянието на F0f няма да бъде запазено;1 = състоянието на F0f ще бъде запазено
бит 1-тегло 2-0 = състоянието на F0r няма да бъде запазено;2 = състоянието на F0r ще бъде запазено
бит 2-тегло 4-0 = състоянието на FA1 няма да бъде запазено;4 = състоянието на FА1 ще бъде запазено
бит 3-тегло 8-0 = състоянието на FA2 няма да бъде запазено;8 = състоянието на FА2 ще бъде запазено
бит 4-тегло 16-0 = състоянието на FA3 няма да бъде запазено;16 = състоянието на FА3 ще бъде запазено
бит 5-тегло 32-0 = състоянието на FA4 няма да бъде запазено;32 = състоянието на FА4 ще бъде запазено
бит 6-тегло 64-0 = състоянието на FA5 няма да бъде запазено;64 = състоянието на FА5 ще бъде запазено
бит 7-тегло 128-0 = състоянието на FA6 няма да бъде запазено;128 = състоянието на FА6 ще бъде запазено

Стойността на CV200 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV33.

CV201
255
Запазване на състоянието на функциите, зададени от бутони F7 до F12
бит 0-тегло 1-0 = състоянието на FA7 няма да бъде запазено;1 = състоянието на FA7 ще бъде запазено
бит 1-тегло 2-0 = състоянието на FA8 няма да бъде запазено;2 = състоянието на FA8 ще бъде запазено
бит 2-тегло 4-0 = състоянието на FA9 няма да бъде запазено;4 = състоянието на FА9 ще бъде запазено
бит 3-тегло 8-0 = състоянието на FA10 няма да бъде запазено;8 = състоянието на FА10 ще бъде запазено
битове 4 до 7-тегла 16 до 128-не се използват

Стойността на CV201 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV133.

CV204
255
Памет на състоянието на F0 до F6; програмата сама пише в това CV
CV205
255
Памет на състоянието на F7 до F12; и тук програмата сама пише в това CV

Както се вижда от заводските стойности на CV-тата за запазване на състоянията на функциите, всички функции са включени и се запазват. По този начин всички изходи на декодера ще бъдат включени в аналогов режим, а и в DCC режим, когато централата не подава команди към адреса на декодера.

Заводските стойности на ефектите са 0, т.е. ефекти няма и изходите се активират и в двете посоки, т.е. отново се са постоянно активни в аналогов режим или в DCC без декодерът да е изрично адресиран. Това съм го направил умишлено, за да може вагоните, с осветление управлявано от декодер да светят постоянно в аналогов режим - както би било при напълно аналогово осветление.


CV-та за задаване на активното ниво на изходите

CV
Заводска
стойност
   Описание
CV225
255
Активно ниво на изходите F0f до FA6:
бит 0-тегло 1-активно ниво на изход F0f:0 = ниско;1 = високо
бит 1-тегло 2-активно ниво на изход F0r:0 = ниско;2 = високо
бит 2-тегло 4-активно ниво на изход FA1:0 = ниско;4 = високо
бит 3-тегло 8-активно ниво на изход FA2:0 = ниско;8 = високо
бит 4-тегло 16-активно ниво на изход FA3:0 = ниско;16 = високо
бит 5-тегло 32-активно ниво на изход FA4:0 = ниско;32 = високо
бит 6-тегло 64-активно ниво на изход FA5:0 = ниско;64 = високо
бит 7-тегло 128-активно ниво на изход FA6:0 = ниско;128 = високо

Стойността на CV225 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV33.

CV226
255
Активно ниво на изходите FA7 до FA10:
бит 0-тегло 1-активно ниво на изход FA7:0 = ниско;1 = високо
бит 1-тегло 2-активно ниво на изход FA8:0 = ниско;2 = високо
бит 2-тегло 4-активно ниво на изход FA9:0 = ниско;4 = високо
бит 3-тегло 8-активно ниво на изход FA10:0 = ниско;8 = високо
битове 4 до 7-тегла 16 до 128-не се използват

Стойността на CV226 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV133.



CV за прочитане на стойностите на CV-тата през серийния порт

CV
Заводска
стойност
   Описание
CV256
0
При запис в това CV на стойност различна от нула, стойностите на всички CV-та, дефинирани в програмата, се предават по серийния порт


Иван
Титла: Коментари по декодера
Публикувано от: IvanC в 06 Февруари 2022, 07:26:50
Няколко коментара по декодера.

Декодерът може да се настройва чрез запис в CV-тата както на работния участък (Programming on the Main или PoM), така и на програмния. Препоръчвам да се настройва на работния участък, защото става по-бързо. При запис в CV на програмния участък, станцията обикновено се опитва и да чете CV-то от декодера. Тъй като този декодер няма как да отговори на станцията, тя изчаква известно време докато и дойде тайм-аута и това води до съществено забавяне.

Описанието на CV-тата може да изглежда много сложно. Донякъде е така, но няма нужда човек да се плаши. Ако няма да използвате ефекти, настройките чрез CV-тата не са толкова много. Едно от нещата, които се възприемат малко трудно от незапознатите с двоичната система и организацията на битовете в байтове е това, което съм описал в някои CV-та като

бит 0 - тегло 1
бит 1 - тегло 2
бит 2 - тегло 4
бит 3 - тегло 8
бит 4 - тегло 16
и т.н.

Вместо тези "тегла" на битовете, гледайте на 8-те бита (от 0 до 7) като на 8 банкноти със стойности 1, 2, 4, 8, 16, 32, 64 и 128. Да вземем CV33 до CV40 - всеки изход е представен със съответната банкнота:

F0f струва 1 (лев, например)
F0r струва 2 (лева)
FA1 струва 4 (лева)
FA2 струва 8 (лева)
FA3 струва 16 (лева)
FA4 струва 32 (лева)
FA5 струва 64 (лева)
FA6 струва 128 (лева)

Защо точно тези стойности? Ами защото системата в компютрите (каквото е декодерът) е двоичната, демек "тука има, тука нема" и 1, 2, 4, 8, 16, 32, 64, и 128 са първите 8 степени на двойката. 8 байта - 8 степени на двойката, от нулевата (1) до седмата (128).

И ако аз примерно искам с бутона F1 да управлявам изходи F0r (който струва 2 лева), FA2 (струва 8 лева) и FA5 (струва 64 лева), ще трябва на съответното CV, което за бутона F1 e CV35, да дам 2 + 8 + 64 (лева) или общо 74 (лева), защото толкова общо струва управлението на тези три изхода с бутона F1. Или да се върнем на другата терминология, в CV35 ще трябва да запишем стойност 74 или за по-кратко го написвам:

CV35 = 74.

И понеже обещах за пример да дам настройките на CV-тата за багажния вагон, ето ги - CV-тата, които се променят са почернени:

От заводските настройки започвам с промяната на това кой бутон кой изход да управлява:

1. Изходи:
1.1. Към FA1 са свързани светлините на двете багажни отделения.
1.2. Към FA2 са свързани светлините в преддверията.
1.3. Към FA3 са свързани светлините в купето на началник-влака, амвона и тоалетната.

2. Бутони за управление:
2.1. Бутон F1 (CV35) управлява светлините на багажните отделения, т.е. FA1 (4):
Тук няма какво да се настройва, защото от заводската стойност на CV35 = 4 това вече е направено.

2.2 Бутон F3 (CV37) управлява светлините в купето, амвона и тоалетната, т.е. FA3 (16):
И тук няма какво да се настройва, защото от заводската стойност на CV37 = 16 това е направено вече.

2.3. Бутон F5 (CV39) управлява светлините в предверията, т.е. FA2 (8 ):
CV39 = 8
и понеже от заводските настройки бутон F2 (CV36) управлява FA2 (8 ), а не искам това:
CV36 = 0 (бутон F2 не управлява изходи)

Ако бях решил с бутон F2 да упрвалявам FA2, нямаше да има нужда от промени в CV-тата. Но главата ми е свикнала с бутона F2 да управлява свирката на локомотива, а и F2 на тротъла е настроен като моментен бутон и не искам да го променям, та реших с F5 да управлявам светлините в предверията.

2.4. И накрая бутон F0 управлява всички светлини независимо от посоката на движение:
CV33 = 28 (FA1 = 4 + FA2 = 8 + FA3 = 16) - бутон F0 в посока напред
и същото за
CV34 = 28 (FA1 = 4 + FA2 = 8 + FA3 = 16) - бутон F0 в посока назад

3. Ефекти не използвам, така че не пипам CV-тата за избор на ефекти, както и CV-тата за задаване на параметрите на ефектите.

4. Осветлението ми се видя слабичко и затова "пипнах" CV-тата на ШИМовете на FA1, FA2 и FA3 - на максимална яркост:
CV211 = 255
CV212 = 255
CV213 = 255

5. И последно смених адреса от заводския 3 на 7986 (последните 4 цифри от DRG-ейския номер на вагона 107 986):
7986 / 256 = 31,195 - вземам цялата част, т.е. 31; 31 + 192 = 223
CV17 = 223
7986 / 256 = 31.195 - пак вземам цялата част, т.е. 31; 7986 - 31 * 256 = 7986 - 7936 = 50
CV18 = 50
и активирам дългия адрес, като към заводската стойност на CV29 = 6 прибавя 32:
CV29 = 38

Това е всичко - промених 10 CV-та.

Ако бях решил да използвам бутона F2 за осветлението на предверията, бях сложил баластни съпротивления с по-малки стойности и използвал къс адрес, променените CV-та щяха да намалеят на само 3 - CV3 за късия адрес и CV33 и CV34 за бутона F0. По-елементарно от това просто няма.


Иван
Титла: Re: Осветление на вагони
Публикувано от: angel.s в 06 Февруари 2022, 13:25:48
Браво,но ми се струва сложно и май няма да се спрсвя.  :unsure:
Титла: Re: Осветление на вагони
Публикувано от: IvanC в 06 Февруари 2022, 19:31:05
Цитат на: angel.s link=topic=5553.msg123170#msg123170 date=1644146748
Браво,но ми се струва сложно и май няма да се спрсвя.  :unsure:

Кое ти се струва сложно? Когато на мен нещо ми изглежда сложно, разделям го на по-прости части. Изпълнявам всяка част и така изпълнявам цялата задача. Така направих и с написването на програмата. Първо с проби разбрах как се работи с DCC библиотеката, после започнах да чета командите от станцията, след това да обръщам командите в управление на изходи. Последва запомнянето на функциите в CV-та, добавяне на ефекти един по един. Стигнах до ефектите, които зависят от ускорението и спирането и направих елементарното управление на мотор. Накрая захърших ефектите, които зависят от ускорението и забавянето.

CV-тата създавах в процеса на писане на програмата. Когато ми трябваха параметри за дадена част от програмата, избирах в кое CV какви параметри и в какъв формат да запазвам.

Какво точно искаш да направиш? Ако знам това, ще мога да помогна с конкретни обяснения.

Иван
Титла: Re: Осветление на вагони
Публикувано от: pach в 06 Февруари 2022, 21:17:30
Цитат на: IvanC link=topic=5553.msg123172#msg123172 date=1644168665
Кое ти се струва сложно? Когато на мен нещо ми изглежда сложно, разделям го на по-прости части. Изпълнявам всяка част и така изпълнявам цялата задача. ...
Иван

Това си е класическият начин за справяне с уж, непреодолими задачи. Практикува се, както от топ менажерите, така
и от обикновенните хора, които търсят решаването на задачите. Не знам с какво друго се занимаваш, но наистина това си е начинът!!!
 :hi:
Титла: Колооси за BRAWA 45415
Публикувано от: IvanC в 19 Февруари 2022, 03:34:25
Цитат на: IvanC link=topic=5553.msg123114#msg123114 date=1643652459
. . .

Според каталога 11 мм диаметър за Брава (23 мм ос) са 9746 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D9746/gb/modell_70357.html) с RP-25 профил и ги има налични на Липето. А Fine-25 еквивалента за Брава са 97460 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D97460/gb/modell_70358.html) но са с резервация.

Иван

Бях поръчал колооси 9743 и 9746 на Weinert за багажния вагон 45415 на Брава, които пристигнаха днес. 9746 би трябвало да са за Брава вагони (с оси дълги 23 мм), но не стават на този вагон, защото осите им са прекалено къси. Да припомня, че оригиналните колооси са с дължина 23,8 мм. Колоосите 9746 не изпадат от буксите, но са с прекалено голям страничен луфт.

Колоосите 9743 са уж за Флайшман, с 24 мм-ови оси. Тези стават на багажния вагон - по всички размери отговарят на оригиналните колооси на вагона - диаметър и ширина на бандажите, височина на реборда и дължина на оста (ле-е-еко по-дълга с 0,2 мм).

Та ако имате багажния вагон 45415 на Брава, НЕ купувайте за него колооси 9746 на Weinert, a 9743.

Иван
Титла: Re: Осветление на вагони
Публикувано от: dred77 в 19 Февруари 2022, 08:51:23
 Привет!
Става много добре, само имам едно въпросче, свързано с колоосите.
Off-Topic:
Оригиналните колооси бяха с две изолирани колела от осите и ги смених с такива, с едно изолирано колело, за да може токоснемането да работи.
Off-Topic:
Та ако имате багажния вагон 45415 на Брава, НЕ купувайте за него колооси 9746 на Weinert, a 9743.
Пробвали ли сте с "Conductive Adhesive Glue Silver", примерно това:https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html (https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html), да намажете изолацията на едното колело?
 За направата на подобни, само че diy колела -"RESISTOR WHEELS":
https://www.roco.cc/en/product/22574-0-0-0-0-0-0-003006-0/products.html (https://www.roco.cc/en/product/22574-0-0-0-0-0-0-003006-0/products.html)
(https://www.modellbahnshop-lippe.com/article_data/images/1/22574_b.jpg)

, на товарни вагони, заради вида на модулите ми на заетост, по този метод:

(http://apnmrr.club/images/Misc/WheelsetResistor.jpg),

с това "сребърно лепило": https://www.aliexpress.com/item/1005001719088780.html?spm=a2g0o.9042311.0.0.27424c4d5qsvct (https://www.aliexpress.com/item/1005001719088780.html?spm=a2g0o.9042311.0.0.27424c4d5qsvct) дори, всичко е ок

(https://ae01.alicdn.com/kf/Udd1555da3292411d9c63a75dc71f1802W.jpg)

 Поздрави!



Титла: Re: Осветление на вагони
Публикувано от: pach в 19 Февруари 2022, 14:41:44
Цитат на: IvanC link=topic=5553.msg123280#msg123280 date=1645234465
Бях поръчал колооси 9743 и 9746 на Weinert за багажния вагон 45415 на Брава, които пристигнаха днес. 9746 би трябвало да са за Брава вагони (с оси дълги 23 мм), но не стават на този вагон, защото осите им са прекалено къси. Да припомня, че оригиналните колооси са с дължина 23,8 мм. Колоосите 9746 не изпадат от буксите, но са с прекалено голям страничен луфт.

Колоосите 9743 са уж за Флайшман, с 24 мм-ови оси. Тези стават на багажния вагон - по всички размери отговарят на оригиналните колооси на вагона - диаметър и ширина на бандажите, височина на реборда и дължина на оста (ле-е-еко по-дълга с 0,2 мм).

Та ако имате багажния вагон 45415 на Брава, НЕ купувайте за него колооси 9746 на Weinert, a 9743.

Иван

А тези от РОКО дали също не вършат работа:
(https://i.ebayimg.com/images/g/DE4AAOSw8Fxhs3~U/s-l1600.jpg)

И ги имат в този магазин/продавач от Фридрихщат - Германия:
Roco 40196 2x Wechselstromradsatz Radsatz in H0 Fabrikneu (https://www.ebay.com.au/itm/154742534533?hash=item24075fb185:g:DE4AAOSw8Fxhs3~U)
Титла: Re: Осветление на вагони
Публикувано от: IvanC в 19 Февруари 2022, 23:58:01
Цитат на: dred77 link=topic=5553.msg123281#msg123281 date=1645253483
. . .

 Пробвали ли сте с "Conductive Adhesive Glue Silver", примерно това:https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html (https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html), да намажете изолацията на едното колело?

. . .

Не съм пробвал, но със сигурност няма да стане на оригиналните колооси на багажния вагон, защото те са с пластмасови тръбички в средата, в които са набити къси оси на колелата.

С други думи, колоосите приличат на тези, към които си дал линка и картинката:

(https://www.modellbahnshop-lippe.com/article_data/images/1/22574_b.jpg)


Цитат на: pach link=topic=5553.msg123282#msg123282 date=1645274504
А тези от РОКО дали също не вършат работа:
(https://i.ebayimg.com/images/g/DE4AAOSw8Fxhs3~U/s-l1600.jpg)

. . .

Това са AC колооси, т.е. и двете колела не са изолирани от оста и ще ми дават станцията на късо. Стават за Тонката...  ;)


Иван
Титла: Re: Осветление на вагони
Публикувано от: dred77 в 20 Февруари 2022, 11:09:37
Цитат на: IvanC link=topic=5553.msg123287#msg123287 date=1645307881
Не съм пробвал, но със сигурност няма да стане на оригиналните колооси на багажния вагон, защото те са с пластмасови тръбички в средата, в които са набити къси оси на колелата.
С други думи, колоосите приличат на тези, към които си дал линка и картинката:

 Сега върнах часовника /темата/ назад, и видях снимките. Моя грешка. Не знам защо си мислех, че става дума за подобни колела:
(https://www.elriwa.de/media/image/85/d6/98/191073_100302-2-05.jpg)...
 
 Още веднъж извинявай, че поизцапах. :drinks:
Титла: Осветление на вагони от ROCO комплекта 74189
Публикувано от: IvanC в 07 Ноември 2022, 03:11:43
За вагоните на Roco от комплекта 74189 използвах "класическата" схема, която публикувах в първото мнение в темата. Разработих печатна платка, която да е "универсална" за вагоните от комплекта, както и за повечето (всички?) вагони на Roco, тип Halberstadt - 74800, 74802, 74803, 74804, 74805, 74806, 74815, 74816, 74817 и др. Не съм сигурен дали платката ще може да се използва във вагона 74801, който е комбиниран 1-ва - 2-ра класа, тъй като такъв вагон нямам и не мога да проверя, дали разположението на светодиодите ще отговаря на разположението на купетата в този вагон.

Това е пълната схема на платката:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189sch.png)

Светодиодите са означени с буквите "A", "B", "D" и "R", както и комбинации от тези букви след номера на светодиода, в зависимост от това в кой тип вагон се монтира платката - "A" за вагона 1-ва класа, "B" за вагона 2-ра класа, "D" за комбинирания вагон 2-ра класа с инвалидно и багажно отделения и "R" за вагон-ресторанта. Светодиодите без букви след номера на светодиода са общи и за 4-те вида вагони.

Платката е с възможност за монтаж на декодер. При монтиране на декодер, елементите по захранването не се монтират, а се запояват съпротивленията, означени с "D" след номера на съпротивлението. Когато няма декодер, се запояват съпротивленията без буквата "D" след номера.

Печатната платка от горната страна - с елементите по захранването и буферните съпротивления на светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189t.png)


и от долната страна - със светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189b.png)


Поръчах платките и докато чаках да ги направят, се заех с токоснемането на вагоните:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418901.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418902.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418903.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418904.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418905.jpg)


Платката с вече запоените елементи и монтирана в първокласния вагон:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418906.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418907.jpg)


Бях пропуснал да забележа, че покривите на вагоните имат зъбчета, които са по-тесни от платката, както я проектирах и които зъбчета слизат под нивото на платката. Поради това, покривът не можеше да се постави на мястото му с монтираната платка. Наложи се да клъцна тези зъбчета:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418908.jpg)

Отляво е оригиналният покрив, отдясно е с отрязаните зъбчета.


Завършеният вагон:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418909.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418910.jpg)


При останалите вагони от комплекта разлики няма.

Иван
Титла: Осветление на вагони от ROCO комплекта 74190
Публикувано от: IvanC в 09 Ноември 2022, 02:17:48
Вагоните на Roco от комплекта 74190 са тип Y (B по източноевропейската по него време номенклатура), 3 броя - два второкласни и един първокласен. И тук както при комплекта 74189, разработих и поръчах платка за осветлението, която да е универсална за двата вида вагони от комплекта - първокласния и второкласния. Имам още един Y-вагон на Roco - 74818, който е първокласен и с изключение на цвета и надписите, е идентичен с първокласния вагон от комплекта 74190, така че платката става и за него.

Схемата на осветлението е почти идентична с тази на осветлението за 74189:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190sch.png)

И тук светодиодите са означени с буквите "A" и "B" и комбинации от тези букви след номера на светодиода, в зависимост от това в кой тип вагон се монтира платката - "A" за вагона 1-ва класа и "B" за вагона 2-ра класа. Светодиодите без букви след номера на светодиода са общи за 2-та вида вагони.

И тук, както при комплекта 74189, платката е с възможност за монтаж на декодер и при монтиране на декодер, елементите по захранването не се монтират, а се запояват съпротивленията, означени с "D" след номера на съпротивлението. Когато няма декодер, се запояват съпротивленията без буквата "D" след номера.

Печатната платка от горната страна - с елементите по захранването и буферните съпротивления на светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190t.png)


и от долната страна - със светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190b.png)


При тези вагони прокарването на проводниците от токоснемащите пластини през рамата и обзавеждането на салона е по-различно и се наложи да пробивам допълнителни отвори в тоалетните. Това се дължи на разликата в изпълнението на кулисния механизъм спрямо Halberstadt вагоните на Roco.

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419001.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419002.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419003.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419004.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419005.jpg)


Вагон, подготвен за монтиране на платката с осветлението:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419006.jpg)

Виждат се отворите, които пробих в напречните разпорки на коша, за да мога по-лесно да осветя тоалетните.


Платката (все още "гола", без запоени елементи), монтирана за проба:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r7419007.jpg)


Не съм снимал прогреса след този момент, тъй като монтажът (запояването) на елементите по платката и монтажът на платката във вагона са идентични с тези на вагоните от комплекта 74189. Тук проблеми с покрива няма, тъй като няма такива зъбчета, както при Halberstadt вагоните.

Иван
Титла: Осветление на вагони - токоснемащи пластини
Публикувано от: IvanC в 18 Ноември 2022, 19:38:10
 &bgflag Токоснемащи пластини ала Владо Цанков:  &bgflag

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/vcaxc01.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/vcaxc02.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/vcaxc03.jpg)


Владо наряза пластините от 0,1 мм месингова ламарина на CNC фрезата:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/vcaxc04.jpg)


За уточнение - токоснемащите пластини, които съм показал в предните мнения са купешки от един германец (или австриец?), който ги продаваше на eBay и от които Владо успя да закупи достатъчно количество, включително и за мен, но свършиха. Владо реши да си направи сам пластините на фрезата или да го цитирам:

"Вчера и днес, обхванат от творчески мързел, сътворих това:"

и ми прати горните снимки. :yahoo:

Иван
Титла: Re: Осветление на вагони
Публикувано от: IvanC в 28 Ноември 2022, 23:05:54
Тази мисъл ме човъркаше:

Цитат на: IvanC link=topic=5553.msg123981#msg123981 date=1667783503
. . .

 Не съм сигурен дали платката ще може да се използва във вагона 74801, който е комбиниран 1-ва - 2-ра класа, тъй като такъв вагон нямам и не мога да проверя, дали разположението на светодиодите ще отговаря на разположението на купетата в този вагон.

. . .


и към последната поръчка от Липето го добавих.

Оказа се, че по брой и разпределение на купетата е идентичен на първокласния и набързо му наредих платката за осветлението така, както е на първокласния вагон в комплекта 74189:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7480101.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7480102.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7480103.jpg)

За Митко - на тези модели "закачалките" си висят така, защото имат голям вертикален луфт в NEM-шахтата. Като започнат да се закачат се изправят и няма проблеми.

На снимките покривът зее, защото не бях забелязал, че не е "щракнал" напълно в двата края. Чух, че щракна, но не го огледах внимателно по цялата дължина на покрива. Вече е оправено.  :drinks:

На моя вагон бяха объркали седалките - купетата, означени като първокласни бяха с второкласни седалки, а четирите крайни 2-класни купета бяха с първокласните седалки. Размених им местата и всичко е наред. Някое виетнамче не е внимавало достатъно в час!  :nono:

Иван
Титла: Осветление на вагони от ROCO комплекта 74188
Публикувано от: IvanC в 29 Януари 2023, 22:07:51
Вагоните на Roco от комплекта 74188 са тип Y/B на унгарските железници MÁV, 3 броя - един второкласен, един второкласен кушет и един спален. Второкласният и кушет-вагонът са идентични по брой и разположение на купетата с второкласните вагони от комплекта 74190 (виж мнението за осветлението на тези вагони по-горе), докато спалният вагон е с едно купе в повече и съответно купетата са по-тесни. Поради това, платката за осветление на комплекта 74190 не може да се използва за този вагон и промених платката, като добавих светодиоди там, където такива липсваха за купетата на спалния вагон.

Новата схемата на осветлението с добавените светодиоди и баластни съпротивления:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188sch.png)

Светодиодите отново са означени с буквите "A", "B" и "L" и комбинации от тези букви след номера на светодиода, в зависимост от това в кой тип вагон се монтира платката - "A" за вагона 1-ва класа, "B" за вагона 2-ра класа (включително кушет-вагона) и "L" за спалния вагон. Светодиодите без букви след номера на светодиода са общи за 3-те вида вагони.

Всичко друго е еднакво с платката за комплекта 74190. Новата платка може да се използва както за комплекта 74188, така и за 74190 и за всички първокласни, второкласни, кушет и спални вагони Y/B на Roco. Няма възможност да се използва за комбинираните вагони 1-ва/2-ра класа, 2-ра класа с багажно отделение, вагон ресторантите и багажните/фургон и пощенските вагони (ако има такива). Възможността я няма, защото нямам такива вагони, за да мога да направя платката още по-универсална и за тези вагони.

Печатната платка от горната страна - с елементите по захранването и буферните съпротивления на светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188t.png)


и от долната страна - със светодиодите:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188b.png)


Токоснемането от талигите и прокарването на проводниците от токоснемащите пластини през рамата и обзавеждането на салона е същото, както при комплекта 74190, което съм показал по-горе, а монтажът (запояването) на елементите по платката и монтажът на платката във вагона са същите като при вагоните от комплекта 74189, затова нови снимки не съм правил.

Иван
Титла: Re: Осветление на вагони
Публикувано от: IvanC в 01 Февруари 2023, 03:13:44
За желаещите да си поръчат платките, публикувани в тази тема от фирма, която прави голи платки:

Платка за фургона на Brawa 45415 (https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415ic.brd)

Платка за вагоните на Roco от комплектите 74188 и 74190 (и другите тип Y/B) (https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190.brd)

Платка за вагоните на Roco от комплекта 74189 (и другите тип Халбещат) (https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189.brd)

Повечето фирми за голи печатни платки работят с този формат. Така няма нужда да се правят Гербери, което отнема много време. Самият аз не се занимават с Гербери, фирмата. на която поръчвам голите платки, работи директно с този формат.

Понеже форматът е всъщност XML, твърдо вероятно е като цъкнете на препратката, файлът да се отвори в браузъра. За да го запазите на компютъра като файл, цъкате с десния бутон на мишката, и избирате "Save..... Аs..." или "Запази...... като...". Това може да изглежда различно в различните браузъри, така че трябва да се експериментира с различните форми за запазване, докато файлът се запази като .brd.

Иван
Титла: Re: Осветление на вагони
Публикувано от: pach в 01 Февруари 2023, 18:08:56
Иване, перфектен си! Благодаря за темите, които правиш в момента, тук!
Качи моля, все пак снимки от "Еagle v.9.6.2"на трите платки, за повече прегледност,
 - да знаят хората какво си поръчват, като изпратят файловете на фирма за РСВ!
Ако искаш и скрийншот ще свършат работа (с прозрачни слоеве)!
Благодаря за труда ти тук и с "ардуино"-то!
 :hi: :clapping: :hi:

ПП. Дори ако не те затруднява - качи снимки 1:1 на въпросните платки - някой може да иска да си ги
направи не във фирма, а на "ръка" с лазерен принтер и домашен ец. :drinks:
Титла: Re: Осветление на вагони
Публикувано от: IvanC в 01 Февруари 2023, 20:32:17
Пацо,

Вече съм пуснал скриншотове на платките за 74188/74190 и 74189 в съответните мнения. Това са точните изображения на платките от фирмата, където съм ги поръчал и се вижда разположението на елементите и опроводяването. След малко ще публикувам и размерите им.

Ще пусна и PDF-и на платките в 1:1, но най-вероятно няма да свършат работа. Има много преходни отвори, които са с много малък диаметър (0,5 мм) и правенето на платката на ръка и без метализация на отворите, най-вероятно ще стане "манджа с грозде". Площадките на преходните отвори са много малки и сигурно ще се отлепят от текстолита при запояване на проводник за свързване на площадките от двете страни на отвора. Не съм предвидил платките да се правят на ръка, затова и пистите и преходните отвори са "тънкаж". Когато проектирам платки за направа на ръка, правя пистите по-широки и площадките за преходни отвори по-големи или направо проектирам платката едностранна с прехвърлящи мостчета. От известно време спрях да проектирам платки за ръчна направа - "купешките" по мой дизайн са много по-красиви.  :yes:

Иван
Титла: Осветление на вагони - печатни платки
Публикувано от: IvanC в 01 Февруари 2023, 23:07:04
Много от инфото по-долу вече съм го пуснал в предните мнения, но го повтарям за по-голяма прегледност, т.е. събрано на едно място.

Платката за ROCO 74188/74190 е с размери 265 x 23 мм:

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188t.png)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188b.png)

XML (eagle) за 74188/74190 (https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190.brd)

PDF за 74188/74190 (https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74190.pdf)

(https://www.bulgaria21.net/cankov/modelrailroad/r74190/r74188sch.png)


Платката за ROCO 74189 е с размери 292 x 22 мм:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189t.png)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189b.png)

XML (eagle) за 74189 (https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189.brd)

PDF за 74189 (https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189.pdf)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r74189sch.png)


Платката за BRAWA 45415 е с габаритни размери 190 x 22,6 мм:

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415t.png)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415b.png)

XML (eagle) за 45415 (https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415ic.brd)

PDF за 45415 (https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415ic.pdf)

(https://www.bulgaria21.net/cankov/modelrailroad/b45415/b45415icsch.png)


Иван
Титла: Осветление на вагони: Функционален декодер (дешифратор) с 5 изхода
Публикувано от: IvanC в 05 Септември 2023, 22:09:58
Направих този декодер за приложения, където няма място за декодер с Pro-Mini. Декодерът е версия на този на Paco: dccFunc5 (https://usuaris.tinet.cat/fmco/dccfunc_en.html#dccfunc5)

За база използвах схемата, платката и програмата на декодера на Paco, със следните промени:

1. Схемата (и платката) е с мостови изправител (Грец) с възможност да се монтира полу-периоден изправител (само с един диод). Схемата (и платката) на декодера на Paco е само за полу-периоден изправител. При монтиране на елементите за мостовия изправител, декодерът може да се използва и на аналогови участъци. С полу-периодния изправител (само с един диод), декодерът не може да работи нормално на участъци с аналогово захранване, по-точно ще работи само в едната посока, в другата диодът на захранването ще блокира напрежението от релсите.

2. Платката е с двустранно монтирани елементи. На "горната" страна на платката са монтирани микроконтролерът с баластните съпротивления, а на "долната" - елементите на изправителя и регулатора на напрежение. С това гоня две цели:
2.1. Малък размер - успях да намаля размерите до 15,6 x 8,9 мм.
2.2. Използване на платката във вагони, в които вече има монтиран изправител, регулатор на напрежението и буферен кондензатор. В този случай елементите от "долната" страна на декодера не се монтират, а се монтира мостово съпротивление със стойност 0 ома на "горната" страна.

Както и при декодера на Paco, запазих баластните съпротивления на платката. По желание, могат да се запоят съпротивления със стойност 0 ома или мостчета.

3. Промених програмата на Paco за PIC12F629:
3.1. Оптимизирах програмата, за да освободя място за подобряване възможностите на декодера.
3.2. Промених обработката на ефектите, за да се сведе до минимум нестабилността на ШИМ-а. При стойности на ШИМ-а от 5 и нагоре (максималната е 15) вече почти не се забелязва премигване.
3.3. Към CV-тата за ефектите добавих битове за управление на изходите в зависимост от избраната посока на движение и дали се подава команда за движение или покой.
3.4. Добавих CV-та за задаване състоянието на кои функционални бутони да се запази и CV-та за запазване на съответните състояния. Така при отпадане на захранването (краткотрайно или дълготрайно), декодерът възстановява работата си със същото състояние на функционалните бутони, което води до активиране или деактивиране на изходите, управлявани от съответните функционални бутони.

4. В момента пиша програма за PIC12F1572, който е по-бърз и разполага с повече програмна памет. Това позволява добавянето на ефекти. По изводи PIC12F1572 е еднакъв с PIC12F629 което позволява печатната платка да се използва без промени. Освен това, PIC12F1572 е и по-евтин на Mouser, откъдето купувам тези микроконтролери.

"Горната" страна на платката с микроконтролера, буферните съпротивления (или такива със стойност 0 ома) и DCC входа:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_t.png)

"Долната" страна на платката с изправителните диоди, филтриращия кондензатор, и регулатора на напрежението:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_b.png)

XML на платката на декодера (https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5.brd)


Иван
Титла: Осветление на вагони: Функционален декодер (дешифратор) с 5 изхода - схема
Публикувано от: IvanC в 06 Септември 2023, 00:11:06
Схемата на декодера:

(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_sch.png)

При използване на вградения изправител и регулатор на напрежение, не се монтира съпротивлението R7 от "горната" страна на платката. Всички други елементи се монтират от двете страни на платката:

"Горната" страна:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_brd_t.png)


"Долната" страна:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_brd_b.png)


Платката може да се направи и с едно-полупериоден изправител - не се монтират диодите D3, D4 и D5 на "долната" страна на платката, а се монтира съпротивлението R7 със стойност 0 ома на "горната" страна или се запоява мостче на неговото място.


Когато се използва външен изправител и регулатор на напрежението, елементите от "долната" страна не се монтират. Монтира се съпротивлението R7 със стойност 0 ома или се запоява мостче на неговото място. Масата на декодера е площадката H2, плюсът на захранването (от 2,5 до 5,0 волта) се подава на площадката H8, а DCC сигналът от една от релсите (няма значение коя) се подава на площадката H1.

Ако на платката със светлините (силно се препоръчва използването на светодиоди) вече има монтирани баластни съпротивления, съпротивленията на декодера R1 до R5 са със стойност 0 ома или се запояват мостчета на тяхно място.


Иван
Титла: Осветление на вагони: Функционален декодер с 5 изхода - програма за PIC12F629
Публикувано от: IvanC в 06 Септември 2023, 23:27:18
Това е HEX кодът на програмата за микроконтролер PIC12F629:

:100000008316FF239000E328A500030E8301A600BA
:10001000B330810020080B1D1E28820716281528E2
:10002000742892287B2894280000A00105080B1052
:100030000B11260E8300A50E250E090082077828D5
:100040009028162815288F28152896282108A206FA
:10005000031D1528851D9A285914D9109C2858105D
:10006000581A392A300EA800280C073982070800D0
:10007000D929E229E429F129FE29102A272A9C22DC
:100080003039103A031D4628B31B5B28303A031D54
:100090004B28B31F5B289C22C039403A031D5428CB
:1000A00033087E39031D5B28C03A031D60283308DE
:1000B0007E39031D6028162300302523A801A42AB9
:1000C0009C22073982079F2AB42AAA2AAE2AFE2A2E
:1000D000042B0A2B102B8207013402340434083419
:1000E00010342034403480342B30A300A2018A28FD
:1000F0001630A4009228A00AA40B1628A31D1528C8
:100100000408A7002308840021088000A206A30A8F
:10011000270884000930A4000330A0001628A0148A
:10012000A40B1628A00A1628031097280314A10D63
:1001300004308D285910D914A9012B080319DC2883
:10014000F039703A0319C528D81358122B08AB1F81
:10015000D41AB5285106031D15282C08B0002D0807
:10016000B1002E08B200581415285206AB1B031D0F
:1001700015282C085306D41A031D15282D08B00085
:100180002E08B1002F08B200B328D81FD928581F55
:10019000D72858135816D81123082D3A031DD815FF
:1001A0002B08B0002C08B1002D08B200B328581756
:1001B0001528D81358131528D81358122C08031DC6
:1001C000AD28D817DA2896158830810083120730B9
:1001D00099008F011014203084008001840A60305F
:1001E0000406031DED28D32388308B000230BA00AB
:1001F000BB00BC0A58182F20D81F0C1CFA28550821
:100200008E0056088F000C103C08F039031D46295B
:10021000B801341AD121DA0A3418D121DA0AB41813
:10022000D121DA0A3419D121DA0AB419D121DA0A32
:100230003518D121DA0AB518D121DA0A3519D121B8
:10024000DA0AB519D121DA0A351AD121DA0AB51A32
:10025000D121DA0A351BD121DA0AB51BD121DA0AFC
:100260003618D121DA0AB618D121DA0A3619D12185
:10027000DA0AB619D121DA0A361AD121DA0AB61AFF
:10028000D121DA0A361BD121DA0A9229703A031DEC
:100290009229B61BD121DA0A3718D121DA0AB71808
:1002A000D121DA0A3719D121DA0AB719D121DA0AAC
:1002B000371AD121DA0AB71AD121DA0A371BD1212C
:1002C000DA0AB71BD121DA0A33087E39031DDA0AAC
:1002D000D12159187E30D9187F30591CD918D62110
:1002E0003808B906391C7829381C42173818C21743
:1002F000B91C7E29B81C4317B818C317391D8429A7
:10030000381D44173819C417B91D8A29B81D451757
:10031000B819C517391E9029381E4617381AC6173E
:10032000B900DA018022D70A1030BC07A8013C08C6
:100330003D070318A8163C083E07031828163C087A
:100340003F07031828143C0840070318A8143C086A
:10035000410703182815280960225419A90BFA2807
:10036000A9168230851D0230DE210C306D23A800D5
:100370000F39B400280E0F39B5000D306D23A800D9
:10038000B31B281CC4293416B31FA81CC829341653
:10039000A80D280DF039B504B601B7015910D910D0
:1003A000FA280310B31F03145A0D403E6D23B804FE
:1003B000080030083F3A031D080031085418803AFD
:1003C000B30008000030E5298030DE2130081F39F5
:1003D000D41C0F39B304D41808003412301A341660
:1003E0000800D418ED21F030B40530080F39B404FA
:1003F00012306D233405DE001630722B301E052AB4
:10040000F030B50530080F39092A0F30B505300E28
:10041000F039B50413306D233505DE001730722B2B
:100420003008DE3A031D1C2A3108B60014306D2353
:100430003605DE001830722B013A031D0800310822
:10044000B70015306D233705DE001930722B581FA9
:10045000372A58133208DE00EC303006031D08003E
:1004600031084C23D81808005819862B4C2A5817E5
:100470000800D81D08003208DE00B01C3018080043
:1004800031084C23D8180800B019482A301D08003C
:10049000301D662AB01D512A5819862B7223552209
:1004A000D32B6D233206031D080000306022063076
:1004B000A8000030FF3E031D5A2AA80B5A2AFF301D
:1004C0000838850083168500831208006D23DE003E
:1004D0005E308400073032056B20321E772AB21955
:1004E0008004FF3AB21D800531084C234C2A0005D8
:1004F00003197D2AB219552A0800B21D552A080091
:100500005708FB3E031C3F28073A031D0800FF3035
:10051000D700BA0B922A3130D91932306D23BA0084
:100520000830D906BB0B08003330591A34306D231C
:10053000BB001030D90608005708203E6D2B16234B
:100540000030801B2F23A8003D3057078400280867
:10055000800008001623031DC22AB22A1623031D99
:10056000C22A80160016B72A1623031DC22A00309D
:10057000801FA32A212336230739033E42230A3052
:100580004723A22A013A031DDC2A4A23800B0800D4
:100590004523800BCD2A2123A22A57083D3E840003
:1005A0002F238006031DD82A36231F39143E472BDC
:1005B00036230739063E472B033A031DEC2A001E5B
:1005C000A22A362307390A3E47233030422321230B
:1005D000801EA22A1030A32A4523800B0800303049
:1005E00042234A23800B0800013025233623073994
:1005F000053E42230A3047230030A32A1623003049
:10060000801BD91DA32AA22A16230030801BD919CA
:10061000A32AA22A16230030801B591EA32AA22A2D
:1006200016230030801B591AA32AA22A1C23001B60
:10063000003080000F39080042305707840000085E
:1006400008005708423E8400000A0F39A8005708E6
:10065000423E8400F03080052808800408005708D6
:10066000253E6D23DE005E0E0F3808002A080E02BC
:1006700003191330A800A80CA80EA806A80C2A0C71
:10068000AA000800A8004730A52A47301D2BA80063
:100690004C30A52A4C301D2BD8105811A800A81F8B
:1006A000281B5E2B063A0319D814013A0319581572
:1006B00028080A3A0319D81428080800893E031CA0
:1006C000D814C03E0318D814803E0800DD005F082F
:1006D0007223DF0ADD0B672B080083169B001C14B6
:1006E0001A08842B6D235E06031908005E08831622
:1006F0009A001C158B1355309D00AA309D009C1448
:100700008B171C119C18822B831208003208083AA0
:10071000031D08000930DE002530DF0005306623A8
:10072000C030DE0010307223DE0E3130DF000430C6
:1007300066238030DE00113072230230DE001C3070
:1007400072230830DE004430DF00023066231030B0
:10075000DE004630DF0002306623FF30DE0012305C
:10076000DF0008306623DE010C3072232030DF000A
:10077000053066234830DF0038306623DE0A40301B
:100780007223DE0A41307223DE0A003072230D30FC
:100790007223DE0A4230DF00023066230930DE00B9
:1007A00008307223552200306D23D10010306D23A4
:1007B000D20011306D23D3001C306D23D4000830DB
:1007C0006D231F39A800A80EF0302805D5000F3082
:1007D0002805FD3ED60016306D23B40017306D237A
:1007E000B50018306D23B60019306D23B70008002E
:02400E00C431BB
:104200000300FF00FF00FF00FF00FF0000000D00A3
:104210000900FF000100FF0000000300FF00FF0095
:10422000C0008000FF00FF00FF00FF00FF00FF0054
:10423000FF00FF00FF00FF000200FF00FF00FF0083
:10424000000002000100040006000000090009004F
:1042500009000900FF00FF00FF00FF00FF00FF0052
:10426000FF0005005F00C3000500FF00FF00FF0026
:104270004900430061006E00200036003200390022
:1042800001000200040004000800080010001000F3
:10429000000000000000000000000000080008000E
:1042A000000000000000000000000000000000000E
:1042B00000000000000000000000000000000000FE
:1042C00000000000000000000000000000000000EE
:1042D00000000000000000000000000000000000DE
:1042E00000000000000000000000000000000000CE
:1042F00000000000000000000000000000000000BE
:00000001FF

Кодът трябва да се изкопира например в Notepad и да се запази в текстов файл с разширение .HEX.

Може да се свали и от тук: HEX код за PIC12F629 (https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_ic_629.hex)

Понеже HEX файловете са текстови, браузерът ги отваря директно. За да се избегне процесът copy-paste-save-и т.н., цъкайте с десния бутон на мишката на линка и изберете нещо от сорта "Запази препратката като...", което може да е различно за различните браузери.


Иван
Титла: Осветление на вагони: Функционален декодер с 5 изхода - CV-та за PIC12F629
Публикувано от: IvanC в 07 Септември 2023, 02:07:36
Описаните тук CV-та са за програмата за PIC12F629, която пуснах в предното мнение. Тези CV-та до голяма степен са същите, като на програмата на Paco. Ще ги опиша тук изцяло, за да ги имаме на български.

CV-та за идентифициране на декодера и зареждане на "заводските" стойности

CV
Обхват
Заводска
стойност
   Описание
CV8
-
13
Идентификация на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене
Зареждане на "заводските" стойности в CV-тата при запис на стойност 8 в CV8
CV7
-
0
Вид на декодера; твърдо зададен с константа в програмата на декодера, т.е. само за четене
CV11
-
1
Версия на програмата на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене


CV-та за задаване на адреса и основната конфигурация на декодера

CV
Обхват
Заводска
стойност
   Описание
CV1
1 - 127
3
Къс адрес на декодера; активира се от бит 5 в CV29 (0)
CV17
192 - 231
192
Дълъг адрес на декодера, старша част, активира се от бит 5 в CV29 (32)
CV18
0 - 255
128
Дълъг адрес на декодера, младша част, активира се от бит 5 в CV29 (32)
Дългият адрес се формира по формулата (CV17 - 192) * 256 + CV18
Формулата за изчисляване на CV17 и CV18 при желан дълъг адрес е
CV17 = адрес / 256 + 192
CV18 = остатъкът от разделянето на адреса на 256 = адрес по модул 256 = адрес - 256 * цялата часта от(адрес / 256)
CV29
0 - 39
2
Конфигурация на декодера:
   
         Бит:         
---------------
   
   
0
0
   Посока на движение:          напред (0);              назад (1)
   
1
2
   Брой стъпки на тротъла: 14 стъпки (0); 28/128 стъпки (2)
   
2
0
   Аналогов режим:             забранен (0);        разрешен (4)
   
3 - 4
0
   Не се използват                             (0)
   
5
0
   Вид адрес:                               къс (0);            дълъг (32)
   
6 - 7
0
   Не се използват                             (0)


CV-та за активиране на функционални бутони в аналогов режим

CV
   
Заводска
стойност
   Описание
CV13
0 - 255
0
Бутони F1 до F8 в аналогов режим:
   
         Бит:         
---------------
   
   
0
0
   Бутон F1 в аналогов режим:  изключен (0); включен   (1)
   
1
0
   Бутон F2 в аналогов режим:  изключен (0); включен   (2)
   
2
0
   Бутон F3 в аналогов режим:  изключен (0); включен   (4)
   
3
0
   Бутон F4 в аналогов режим:  изключен (0); включен   (8 )
   
4
0
   Бутон F5 в аналогов режим:  изключен (0); включен  (16)
   
5
0
   Бутон F6 в аналогов режим:  изключен (0); включен  (32)
   
6
0
   Бутон F7 в аналогов режим:  изключен (0); включен  (64)
   
7
0
   Бутон F8 в аналогов режим:  изключен (0); включен (128)
   
   
CV14
0 - 63
3
Бутони F0f, F0r и F9 до F12 в аналогов режим:
   
         Бит:         
---------------
   
   
0
1
   Бутон F0f в аналогов режим:  изключен (0); включен   (1)
   
1
2
   Бутон F0f в аналогов режим:  изключен (0); включен   (2)
   
2
0
   Бутон F9  в аналогов режим:  изключен (0); включен   (4)
   
3
0
   Бутон F10 в аналогов режим: изключен (0); включен   (8 )
   
4
0
   Бутон F11 в аналогов режим: изключен (0); включен  (16)
   
5
0
   Бутон F12 в аналогов режим: изключен (0); включен  (32)
   
6 - 7
0
   Не се използват                                    (0)


CV-та за задаване на бутоните за управление на изходите

CV
   
Заводска
стойност
   Описание
CV120
0 - 31
1
Изходи, управлявани от бутона F0 в посока напред:
   
         Бит:         
---------------
   
   
0
1
   Управление на изход FA от бутона: не (0); да  (1)
   
1
0
   Управление на изход FB от бутона: не (0); да  (2)
   
2
0
   Управление на изход FC от бутона: не (0); да  (4)
   
3
0
   Управление на изход FD от бутона: не (0); да  (8 )
   
4
0
   Управление на изход FE от бутона: не (0); да (16)
   
5 - 7
0
   Не се използват                                  (0)
   
   
CV
Обхват
Заводска
стойност
   Описание
CV121
0 - 31
2
Изходи, управлявани от бутона F0 в посока назад - като CV120
CV122
0 - 31
4
Изходи, управлявани от бутона F1 в посока напред - като CV120
CV123
0 - 31
4
Изходи, управлявани от бутона F1 в посока назад - като CV120
CV124
0 - 31
8
Изходи, управлявани от бутона F2 в посока напред - като CV120
CV125
0 - 31
8
Изходи, управлявани от бутона F2 в посока назад - като CV120
CV126
0 - 31
16
Изходи, управлявани от бутона F3 в посока напред - като CV120
CV127
0 - 31
16
Изходи, управлявани от бутона F3 в посока назад - като CV120
CV128
0 - 31
0
Изходи, управлявани от бутона F4 в посока напред - като CV120
CV129
0 - 31
0
Изходи, управлявани от бутона F4 в посока назад - като CV120
CV130
0 - 31
0
Изходи, управлявани от бутона F5 в посока напред - като CV120
CV131
0 - 31
0
Изходи, управлявани от бутона F5 в посока назад - като CV120
CV132
0 - 31
0
Изходи, управлявани от бутона F6 в посока напред - като CV120
CV133
0 - 31
0
Изходи, управлявани от бутона F6 в посока назад - като CV120
CV134
0 - 31
0
Изходи, управлявани от бутона F7 в посока напред - като CV120
CV135
0 - 31
0
Изходи, управлявани от бутона F7 в посока назад - като CV120
CV136
0 - 31
0
Изходи, управлявани от бутона F8 в посока напред - като CV120
CV137
0 - 31
0
Изходи, управлявани от бутона F8 в посока назад - като CV120
CV138
0 - 31
0
Изходи, управлявани от бутона F9 в посока напред - като CV120
CV139
0 - 31
0
Изходи, управлявани от бутона F9 в посока назад - като CV120
CV140
0 - 31
0
Изходи, управлявани от бутона F10 в посока напред - като CV120
CV141
0 - 31
0
Изходи, управлявани от бутона F10 в посока назад - като CV120
CV142
0 - 31
0
Изходи, управлявани от бутона F11 в посока напред - като CV120
CV143
0 - 31
0
Изходи, управлявани от бутона F11 в посока назад - като CV120
CV144
0 - 31
0
Изходи, управлявани от бутона F12 в посока напред - като CV120
CV145
0 - 31
0
Изходи, управлявани от бутона F12 в посока назад - като CV120
CV146
0 - 31
0
Изходи, управлявани от бутона F13 в посока напред - като CV120
CV147
0 - 31
0
Изходи, управлявани от бутона F13 в посока назад - като CV120
CV148
0 - 31
0
Изходи, управлявани от бутона F14 в посока напред - като CV120
CV149
0 - 31
0
Изходи, управлявани от бутона F14 в посока назад - като CV120
CV150
0 - 31
0
Изходи, управлявани от бутона F15 в посока напред - като CV120
CV151
0 - 31
0
Изходи, управлявани от бутона F15 в посока назад - като CV120
CV152
0 - 31
0
Изходи, управлявани от бутона F16 в посока напред - като CV120
CV153
0 - 31
0
Изходи, управлявани от бутона F16 в посока назад - като CV120
   
   
CV
Обхват
Заводска
стойност
   Описание
CV154
0 - 31
0
Изходи, управлявани от бутона F17 в посока напред - като CV120
CV155
0 - 31
0
Изходи, управлявани от бутона F17 в посока назад - като CV120
CV156
0 - 31
0
Изходи, управлявани от бутона F18 в посока напред - като CV120
CV157
0 - 31
0
Изходи, управлявани от бутона F18 в посока назад - като CV120
CV158
0 - 31
0
Изходи, управлявани от бутона F19 в посока напред - като CV120
CV159
0 - 31
0
Изходи, управлявани от бутона F19 в посока назад - като CV120
CV160
0 - 31
0
Изходи, управлявани от бутона F20 в посока напред - като CV120
CV161
0 - 31
0
Изходи, управлявани от бутона F20 в посока назад - като CV120
CV162
0 - 31
0
Изходи, управлявани от бутона F21 в посока напред - като CV120
CV163
0 - 31
0
Изходи, управлявани от бутона F21 в посока назад - като CV120
CV164
0 - 31
0
Изходи, управлявани от бутона F22 в посока напред - като CV120
CV165
0 - 31
0
Изходи, управлявани от бутона F22 в посока назад - като CV120
CV166
0 - 31
0
Изходи, управлявани от бутона F23 в посока напред - като CV120
CV167
0 - 31
0
Изходи, управлявани от бутона F23 в посока назад - като CV120
CV168
0 - 31
0
Изходи, управлявани от бутона F24 в посока напред - като CV120
CV169
0 - 31
0
Изходи, управлявани от бутона F24 в посока назад - като CV120
CV170
0 - 31
0
Изходи, управлявани от бутона F25 в посока напред - като CV120
CV171
0 - 31
0
Изходи, управлявани от бутона F25 в посока назад - като CV120
CV172
0 - 31
0
Изходи, управлявани от бутона F26 в посока напред - като CV120
CV173
0 - 31
0
Изходи, управлявани от бутона F26 в посока назад - като CV120
CV174
0 - 31
0
Изходи, управлявани от бутона F27 в посока напред - като CV120
CV175
0 - 31
0
Изходи, управлявани от бутона F27 в посока назад - като CV120
CV176
0 - 31
0
Изходи, управлявани от бутона F28 в посока напред - като CV120
CV177
0 - 31
0
Изходи, управлявани от бутона F28 в посока назад - като CV120
CV178
0 - 31
0
Изходи, задействани в покой и избрана посока напред - като CV120
CV179
0 - 31
0
Изходи, задействани в покой и избрана посока назад - като CV120
CV180
0 - 31
0
Изходи, задействани в движение и избрана посока напред - като CV120
CV181
0 - 31
0
Изходи, задействани в движение и избрана посока назад - като CV120
CV182
0 - 31
0
Изходи, задействани при активна фаза A на DCC сигнала - като CV120
CV183
0 - 31
0
Изходи, задействани при активна фаза B на DCC сигнала - като CV120

Продължението следва...


Иван
Титла: Осветление на вагони: Функционален декодер с 5 изхода - CV-та за PIC12F629
Публикувано от: IvanC в 07 Септември 2023, 03:09:40
CV-та за указване кои функции, задавани от бутоните, да се запазват при отпадане на захранването

CV
Обхват
Заводска
стойност
   Описание
CV19
0 - 255
255
Запазване на състоянието на функциите, зададени от бутони F0 до F4
   
         Бит:         
---------------
   
   
0
1
   Запазване състоянието на бутона F1: не (0); да   (1)
   
1
2
   Запазване състоянието на бутона F2: не (0); да   (2)
   
2
4
   Запазване състоянието на бутона F3: не (0); да   (4)
   
3
8
   Запазване състоянието на бутона F4: не (0); да   (8 )
   
4
16
   Запазване състоянието на бутона F0: не (0); да  (16)
   
5 - 7
224
   Не се използват                                               (224)
   
   
CV20
0 - 255
255
Запазване на състоянието на функциите, зададени от бутони F5 до F12
   
         Бит:         
---------------
   
   
0
1
   Запазване състоянието на бутона F5:  не (0); да   (1)
   
1
2
   Запазване състоянието на бутона F6:  не (0); да   (2)
   
2
4
   Запазване състоянието на бутона F7:  не (0); да   (4)
   
3
8
   Запазване състоянието на бутона F8:  не (0); да   (8 )
   
4
16
   Запазване състоянието на бутона F9:  не (0); да  (16)
   
5
32
   Запазване състоянието на бутона F10: не (0); да  (32)
   
6
64
   Запазване състоянието на бутона F11: не (0); да  (64)
   
7
128
   Запазване състоянието на бутона F12: не (0); да (128)
   
   
CV21
0 - 255
255
Запазване на състоянието на функциите, зададени от бутони F13 до F20
   
         Бит:         
---------------
   
   
0
1
   Запазване състоянието на бутона F13: не (0); да   (1)
   
1
2
   Запазване състоянието на бутона F14: не (0); да   (2)
   
2
4
   Запазване състоянието на бутона F15: не (0); да   (4)
   
3
8
   Запазване състоянието на бутона F16: не (0); да   (8 )
   
4
16
   Запазване състоянието на бутона F17: не (0); да  (16)
   
5
32
   Запазване състоянието на бутона F18: не (0); да  (32)
   
6
64
   Запазване състоянието на бутона F19: не (0); да  (64)
   
7
128
   Запазване състоянието на бутона F20: не (0); да (128)
   
   
CV22
0 - 255
255
Запазване на състоянието на функциите, зададени от бутони F21 до F28
   
         Бит:         
---------------
   
   
0
1
   Запазване състоянието на бутона F21: не (0); да   (1)
   
1
2
   Запазване състоянието на бутона F22: не (0); да   (2)
   
2
4
   Запазване състоянието на бутона F23: не (0); да   (4)
   
3
8
   Запазване състоянието на бутона F24: не (0); да   (8 )
   
4
16
   Запазване състоянието на бутона F25: не (0); да  (16)
   
5
32
   Запазване състоянието на бутона F26: не (0); да  (32)
   
6
64
   Запазване състоянието на бутона F27: не (0); да  (64)
   
7
128
   Запазване състоянието на бутона F28: не (0); да (128)
   
   
CV23
-
255
Памет за състоянието на бутоните F0 до F4; програмата сама пише в това CV
CV24
-
255
Памет за състоянието на бутоните F5 до F12; програмата сама пише в това CV
CV25
-
255
Памет за състоянието на бутоните F13 до F20; програмата сама пише в това CV
CV26
-
255
Памет за състоянието на бутоните F21 до F28; програмата сама пише в това CV


CV-та за задаване на ШИМ на изходите

Стойностите на тези CV-та са от 0 до 15, където 0 е минималният ШИМ на изхода и отговаря на около 6% ШИМ. Стойност 7 е около 50% ШИМ, а стойност 15 е 100% ШИМ, т.е. изходът е включен през цялото време. "Заводската" стойност е 9, което отговаря на приблизително 62% ШИМ.

CV
Обхват
Заводска
стойност
   Описание
CV38
     0 - 15     
9
ШИМ на изхода FA
CV39
0 - 15
9
ШИМ на изхода FB
CV40
0 - 15
9
ШИМ на изхода FC
CV41
0 - 15
9
ШИМ на изхода FD
CV42
0 - 15
9
ШИМ на изхода FE

Със CV9 може да се зададе честотата на ШИМ на изходите:

CV
Обхват
Заводска
стойност
   Описание
CV9 
     0 - 31     
9
Честота на ШИМ на изходите (приблизителна):
   
   
   
     0:   80 Hz
   
   
   
     9: 100 Hz (заводска стойност)
   
   
   
   16: 120 Hz
   
   
   
   21: 140 Hz
   
   
   
   27: 180 Hz
   
   
   
   31: 210 Hz


CV-та за задаване ефектите на изходите

CV
Обхват
Заводска
стойност
   Описание
CV33
     0 - 255     
0
Ефект на изхода FA:
   
   
   
       0: Лампа с нажежаема жичка, т.е. няма ефект
   
   
   
       1: Луминисцентна лампа
   
   
   
       2: Дефектираща луминисцентна лампа
   
   
   
       3: Дефектна луминисцентна лампа
   
   
   
       4: Мигаща светлина A, фаза 1
   
   
   
       5: Мигаща светлина A, фаза 2
   
   
   
       6: Мигаща светлина B, фаза 1
   
   
   
       7: Мигаща светлина B, фаза 2
   
   
   
Добавки за посока и в покой или в движение:
   
   
   
       0: Изходът е активен и в двете посоки
   
   
   
     16: Изходът е активен само в посока напред
   
   
   
     32: Изходът е активен само в посока назад
   
   
   
       0: Изходът е активен както в покой, така и в движение
   
   
   
     64: Изходът е активен само в покой
   
   
   
   128: Изходът е активен само в движение
   
   
CV34
     0 - 255     
0
Ефект на изхода FB - като CV33
CV35
     0 - 255     
0
Ефект на изхода FC - като CV33
CV36
     0 - 255     
0
Ефект на изхода FD - като CV33
CV37
     0 - 255     
0
Ефект на изхода FE - като CV33


CV-та за управление на ефектите

CV
Обхват
Заводска
стойност
   Описание
CV50
     0 - 255     
12
Продължителност на включеното състояние на мигаща светлина A в 8 милисекунди
CV51
     0 - 255     
12
Продължителност на изключеното състояние на мигаща светлина A в 8 милисекунди
CV52
     0 - 255     
12
Продължителност на включеното състояние на мигаща светлина B в 8 милисекунди
CV53
     0 - 255     
12
Продължителност на изключеното състояние на мигаща светлина B в 8 милисекунди


Иван
Титла: Осветление на вагони: Функционален декодер с 5 изхода - свързване
Публикувано от: IvanC в 12 Септември 2023, 18:58:25
Свързване на декодер с мостови изправител (Грец):
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_bridge_conns.png)

Свързване на декодер с едно-полупериоден изправител:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_half_conns.png)

Свързване на декодер без изправител и регулатор, при използване на външно захранване:
(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_ext_conns.png)


Декодерът е показан на схемите в съответното изпълнение, т.е. вижда се кои елементи се монтират в различните изпълнения на декодера. При последното изпълнение, платката няма елементи от долната страна, което я прави значително по-ниска (тънка) и може да се лепне на съществуваща платка за осветление с двустранно лепящо тиксо.

Аз използвам декодера предимно в последния вариант - с външно захранване. Монтирам го на вагони, на които вече съм направил осветление с регулатор на напрежение на 3,3 волта и буферен ("златен") кондензатор. Разкачам буферните съпротивленията на платката на осветлението от масата на захранването, групирам ги по подходящ начин и запоявам отделните групи към изходите на декодера. Ако буферните съпротивления са между плюса на захранването и анодите на светодиодите, откачам катодите на светодиодите от масата, групирам ги и ги свързвам към декодера.


Иван
Титла: Осветление на вагони: Функционален декодер с 5 изхода - снимки
Публикувано от: IvanC в 17 Септември 2023, 23:09:02
Снимки на декодера с мостови изправител и регулатор на напрежението:

(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_full_t.jpg)

(https://cankov.com/modelrailroad/dcc/dccFX5/dccFX5_full_b.jpg)


Иван
Титла: Осветление на вагони: Монтиране на функционалния декодер на вагон
Публикувано от: IvanC в 13 Октомври 2023, 17:40:49
Функционалният декодер, монтиран на второкласния вагон от комплекта Roco 74189:

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418911.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/r74189/r7418912.jpg)


Иван
Титла: Осветление на вагон Piko 58556, SZD WLABm спален вагон
Публикувано от: IvanC в 18 Януари 2024, 02:53:27
Още от дете имам спомени за спалните вагони на Съветските железни пътища (Советские железньiе дороги или СЖД / SZD), които преминаваха през Централна гара Русе. По-късно дори имах многократна възможност да пътувам с тях. Та затова реших да направя композиция от подобни на тези вагони. Казвам "подобни", защото вагоните на Пико и Тилиг, макар и със същата дължина, като тези, които пътуваха до София и  Варна, имаха някои значителни различия, едно от които, а и най-очевидното, беше, че вагоните на СЖД, пътуващи до София и Варна бяха по-широки от пътническите вагони на БДЖ, докато вагоните на Пико и Тилиг са репродукция на вагони със стандартна за UIC ширина, т.е. със същата ширина, като вагоните на БДЖ. Тези вагони, като модели на Пико и Тилиг, са били за маршрути до ГДР и Западна Европа, поради което са отговаряли на UIC стандартите.

Една от "особеностите" на пътническите вагони на Пико е, че са с едноцветно "обзавеждане", което в случая с този вагон е сравнително тъмно кафяво - вижда се по-долу на снимките. Това е за разлика с вагоните на Роко, чието "обзавеждане" е в два или повече цвята.

Вагонът на Пико 58556 изглежда така:

(https://www.bulgaria21.net/cankov/modelrailroad/p58556/p5855601.jpg)


Табелите с маршрута на вагона:

(https://www.bulgaria21.net/cankov/modelrailroad/p58556/p5855603.jpg)


Вагонът дойде без токоснемане, та се наложи да си го направя:

(https://www.bulgaria21.net/cankov/modelrailroad/p58556/p5855602.jpg)


Както се вижда на горната снимка, Пико са се постарали много добре да възпроизведат оборудването под пода на вагона, като детайлите са много прецизно изработени. Това е в контраст с вътрешното обзавеждане на вагона, което е доста постно, както споменах по-горе.

Заради разположението на купетата на този вагон, а и поради другите различия между вагоните на Пико и Роко, не можех да използвам платките, които разработих за Y-вагоните на Роко. Затова използвах универсална платка и се получи това:

(https://www.bulgaria21.net/cankov/modelrailroad/p58556/p5855604.jpg)


Оказа се, че буферният кондензатор не се събира под покрива и го преместих в едната от тоалетните:

(https://www.bulgaria21.net/cankov/modelrailroad/p58556/p5855605.jpg)

Както се вижда, поставих един от "моите" функционални декодери на платката на осветлението. Разделих на отделни групи осветлението на коридора с преддверията, купето на проводницата (проводника), както и останалите спални купета в три отделни групи.

Първата снимка е всъщност на завършения вагон с монтирано осветление и накичен с отделните детайли: кука на винтовия спряг, спирачни маркучи, кабели за ел. захранване и маршрутни табели.


Иван
Титла: Осветление на вагони - токоснемащи пластини за вагоните на Piko
Публикувано от: IvanC в 09 Март 2024, 19:34:26
Материалът, който използвам за токоснемащите пластини на вагоните на Piko е месингова ламарина с дебелина 0,075 мм.

Направих чертеж на пластината (https://www.bulgaria21.net/cankov/modelrailroad/p5966x/piko pickup.dxf), изкопирах пластината така, че да се съберат повечко на лист хартия, запазих в PDF файл (https://www.bulgaria21.net/cankov/modelrailroad/p5966x/piko pickup.pdf) и разпечатах на принтера:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x01.jpg)


Изрязвам едно шаблонче от разпечатаните и го залепвам към ламарината с двустранно лепяща лента (тиксо):

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x02.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x03.jpg)


С ножицата изрязвам пластината по външния контур:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x04.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x05.jpg)


С макетното ножче (скалпел) правя прорезите за зъбчетата, които ще захванат пластината към талигата:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x06.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x07.jpg)


Махам шаблона и почиствам тиксото, ако е останало по пластината.

С клещичките огъвам зъбчетата за монтиране:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x08.jpg)


С ножицата изрязвам излишния материал:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x09.jpg)


С пинсетата огъвам частта, която контактува в колелата и леко подгъвам в краищата:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x10.jpg)


Поставям пластината на талигата и подгъвам зъбчетата от едната страна, а после и от другата - второто зъбче е подгънато върху първото:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x11.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x12.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x13.jpg)


Дооформям сгъвката на пластината по талигата:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x14.jpg)

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x15.jpg)


Огъвам пластинките към колелата с пинсетата, като линията на огъване е вертикална:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x16.jpg)


Поставям колоосите:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x17.jpg)


Запоявам проводници с дължина 75 мм към пластините от страната към буферите на вагона:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x18.jpg)


Оформям проводниците така, че да не се прегъват в спойката при завъртане на талигата:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x19.jpg)


Монтирам талигата в рамата. Проводниците преминават през правоъгълния отвор зад пружината на кулисата на теглича:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x20.jpg)


Монтирам обзавеждането на вагона:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x21.jpg)

С това вагонът е готов за монтиране на платката с осветлението.


Пластините могат да се използват без промяна и на талигите с по-малка база, които са и с колела с по-малък диаметър:

(https://www.bulgaria21.net/cankov/modelrailroad/p5966x/p5966x22.jpg)


Иван