Arduino pro železniční přejezd - úprava logiky programu

Software pro železniční modelářství, simulátory, ovládání, plánování....

Moderátoři: Michal Dalecký, Jarda H.

Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod OndraTT » úte 06 dub, 2021 7:01 pm

Kolegové, prosím o radu s naprogramováním systému pro řízení přejezdu (bez závor) s Arduinem v ANALOGOVÉM kolejišti (PWM napájení).
Původně jsem vycházel z příkladů na Vejrov.cz a snažím se již delší dobu předělat zde uváděné programy Arduino 5 a Arduino 8 pro přejezd bez závor, řízený Arduinem na dvojkolejnou trať a nedaří se a nedaří. Ambicí ještě k tomu bylo předělat to na pouze na dva IR senzory na každé koleji, ale tam jsem asi nejvíc narazil.
Po diskuzi s autorem jsem změnil systém z IR senzorů na snímání proudu do odděleného úseku s přejezdem pomocí modulu ACS712 (Hallova sonda) bez použití IR senzorů.
Zapojení je jednoduché, napájení úseku s přejezdem je přes tento senzor, jinak nic jiného.
Ve chvíli kdy se v úseku objeví lokomotiva, má odběr, senzor detekuje proud a to splní podmínku pro výstražné červené světlo. Když úsek opustí, opět se rozsítí bílá. Dvojkolejnost přejezdu je v takové chvíli jednoduše řešitelná, prostě se bude odběr kontrolovat ve dvou větvích.

Základní program takto funguje pěkně, co jsem ale nevyřešil je situace kdy lokomotiva v úseku zastaví. Zkoušel jsem to přes variantu měření napětí na kolejích, problém je se smyčkovitostí programu, kdy se musí srovnávat aktuální měření se stavem z minula - a to se mi nepodařilo. Vždycky se nějak zacyklím v logice a syntaxi a neprolomím to.
Níže je zjednodušená forma programu, finální by byla pro dvě koleje a taky pro vyzvánění s PCM samplem (vyzkoušeno funkční)

Dokázal by někdo navrhnout úpravu té logiky aby bylo to zastavení lokomotivy správně detekováno a stav zůstal obsazeno, dokud lokomotiva úsek neopustí? Díky

const int analogIn = A0; // vstup pro usek prejezdu
const int analogV = A1; // vstup pro napajeci napeti
int konstanta = 185; // konstanta pro přepočet naměřeného napětí na proud
int offset = 2500; // proměnná pro nastavení offsetu, polovina Vcc
int red1 = 2; // vystup cervene svetlo 1
int red2 = 3; // vystup cervene svetlo 2
int white1 = 4; // vystup bile svetlo
int stav = 0; // stav obsazeni prejezdu
int ledDelay = 400;
bool wait = true;
double zdroj = 0; //napajeci napeti
double proud = 0; //proud do useku prejezdu
int analog = 0;
double napeti = 0; // napeti na Hallove sonde
double soucet = 0; // vypocet proudu

void setup(){
pinMode(analogIn, INPUT);
pinMode(analogV, INPUT);
pinMode(red1, OUTPUT);
pinMode(red2, OUTPUT);
pinMode(white1, OUTPUT);
}
void loop()
{
for(int i=0;i<100;i++) // provedení stovky měření pro ustálení výsledku
{
// načtení hodnoty analogovych vstupu
analog = analogRead(analogIn);
zdroj = analogRead(analogV);
// přepočet napětí na proud
napeti = (analog * 5000.0) / 1023.0;
proud = (napeti - offset) / konstanta;
// uložení výsledku pro následné zprůměrování
soucet += proud;
}

proud = (soucet/100);// výpočet průměru ze stovky měření

if (proud < 0.05 || proud > 0.05)
{
stav = 0; // usek prejezdu neni obsazen
}

if (proud > 0.05 || proud < -0.05)
{
stav = 1; // usek prejezdu je obsazen

}

if (stav == 0)
{
if (wait == true){delay (1000);} //delay - délka zpoždění bílého světla 6000 = 6 sekund - max 32 000 = 32 sekund
wait = false;
digitalWrite(white1, HIGH);
delay(ledDelay);
digitalWrite(white1, LOW);
delay(ledDelay);
}

else
{
wait = true;
delay(10);
digitalWrite(red1, HIGH);
delay(ledDelay);
digitalWrite(red1, LOW);
delay(100);
digitalWrite(red2, HIGH);
delay(ledDelay);
delay(200);
digitalWrite(red2, LOW);
}
OndraTT
 
Příspěvky: 42
Registrován: pon 18 lis, 2019 5:00 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod ohruska » úte 06 dub, 2021 8:41 pm

Asi tomu nerozumím.
Když mašina jede, odebírá proud, úsek sepne přejezd, do doby než mašina úsek opustí, úsek neodebírá žádný proud, přejezd se vypne.
Pokud mašina vjede do úseku, sepne přejezd, ale pokud v úseku zastaví, tak neteče žádný proud a přejezd se zase vypne, i když na přejezdu stojí mašina.
Tady asi žádná logika nepomůže.
Asi by musely být ty měřené úseky dva a dost daleko od sebe.
Pokud by mašina vjela do prvního úseku, sepnul by přejezd, potom by přejel do druhého úseku, a až by ho opustil tak by se přejezd vypnul.
Druhý úsek by musel být krátký a dostatečně daleko od přejezdu, jinak by mohla nastat stejná situace se zastavením mašiny ve druhém úseku.
A jak to bude fungovat , když bude mašina tlačit vagony?
Ota
ohruska
 
Příspěvky: 133
Registrován: sob 04 led, 2020 9:50 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod belgarat » úte 06 dub, 2021 8:44 pm

if (proud < 0.05 || proud > 0.05)
{
stav = 0; // usek prejezdu neni obsazen
}

if (proud > 0.05 || proud < -0.05)
{
stav = 1; // usek prejezdu je obsazen

}

Prvni "if" je (temer) nadbytecny. Pdo hodnoty (-inf; 0,05) + (0,05; inf) se nejprve nastavi stav = 0 (proud = -1V vyhovi prvnimu IFu) a nasledne premasti na 1. Neudela to chybu, ale napis
Kód: Vybrat vše
stav = (proud > 0.05 || proud < -0.05);

je to jednodussi, a neriskujes zapomenute minus (prvni IF, druha cast podminky)

Nepracujes vubec s namerenym napetim "zdroj" - jen se meri; neprumeruje se, s nicim se neporovnava. OK ?
TT ep. IVa-b; analog + NanoX, DR5000. Pseudoprogramator, pindac nesmyslu
http://modelwiki.klfree.net
belgarat
 
Příspěvky: 2370
Registrován: čtv 27 pro, 2012 9:36 pm
Bydliště: Hřebeč u Kladna

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod OndraTT » úte 06 dub, 2021 9:00 pm

Belgarat, díky.
To napájecí napětí jsem dělal pokusy ale nechtěl jsem to tam nechávat abych případného poradce nezmatl. Nepodařilo se mi totiž tu kontrolu správně vystavět.

Pro ohruska - toto v podstatě odpovídá klasické funkci přejezdu se 4 senzory a to jak historická klasika tak náhradou za IR senzory. V tomto zapojeni to funguje pekne přesně podle zapojeni na Vejrov.cz

Slovně řečeno chybí podmínka/logika na zachování výstrahy pro případ nulového napájecího napětí v situaci ze predtim běžela výstraha.
OndraTT
 
Příspěvky: 42
Registrován: pon 18 lis, 2019 5:00 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod belgarat » úte 06 dub, 2021 9:08 pm

OndraTT píše:Slovně řečeno chybí podmínka/logika na zachování výstrahy pro případ nulového napájecího napětí v situaci ze predtim běžela výstraha.


Potrebujes taky pozdrzet pad stav 1 > 0, po nejakou ochrannou dobu a behem ni sledovat napajeci napeti. Diky nejake uchylarne totiz muzes namerit odebirany proud 0 driv nez spadne merene napajeci napeti, staci kdyz se ti spatne trefi ta blikajici smycka :) Vzhledem k tomu ze ti blikani LEDkami blokuje to mereni ... no, shodil bych to na 0 az v nasledujicim cyklu, prejezd bude pri uvolneni blikat o malinko dele.

Zkus tohle: https://www.diffchecker.com/QhJTvq2e (budou tam chyby, nezkousel jsem to ani prelozit)

Jinak - Pouzij Serial.begin(115200); a vypisuj si namerene hodnoty a stavove promenne ... pri ladeni a zkoumani co vlastne ti program dela to DOST pomaha :)
TT ep. IVa-b; analog + NanoX, DR5000. Pseudoprogramator, pindac nesmyslu
http://modelwiki.klfree.net
belgarat
 
Příspěvky: 2370
Registrován: čtv 27 pro, 2012 9:36 pm
Bydliště: Hřebeč u Kladna

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod OndraTT » stř 07 dub, 2021 4:59 pm

Tak jsem vyzkoušel na kolejích a protože to nefungovalo (jen při vypnutí napájení jsem získal 2 cykly červené a stejně se to přeplo do bílé), tak jsem začal zkoumat kde je chyba. No a dalšímy kroky jsem dospěl k tomu že ta kontrola pomocí napájecího napětí nebude tak přímočará

a) v programu jsem to měl špatně napsané, napětí z analogového vstupu se totiž nepřepočítávalo na reálné napětí, ale zůstalo jen 0-1023...drobnost
b) málem jsem si odpálil Arduino, než jsem si uvědomil že max. na vstupu AD převodníku je 5 V - kdežto napájení bude až třeba 14V..naštěstí jsem zkoušel jezdit krokem
c) ok, tak udělám odporový dělič 1:3 aby bylo vždy pod 5V - jenže pak mi došlo že se může měnit polarita napětí a tím vlastně i dělicí poměr - takže to zase odpálí vstup AD

Takže varianta je zřejmě dát tam usměrňovací můstek, za ním dělič 1:3, upravit SW tak aby toto napětí správně počítal a pak pokračovat s funkcí kódu...uff uff
Kdybych koupil hotový modul za pětikilo už do dávno mám :(
OndraTT
 
Příspěvky: 42
Registrován: pon 18 lis, 2019 5:00 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod belgarat » stř 07 dub, 2021 5:10 pm

Dej si tam ten Serial.println() at vidis co se deje :)
Pokud napajeci napeti spadlo na 0 (lhostejno jakym zpusobem) a zustalo tam 2 cykly -- nech si vypisovat hodnotu "zdroj", "odebiraProud", a "stojime" a vysledky hod sem :)

Jeste mne napada: meris napeti, ale mas k analogV nejaky pulldown odpor pro pripad, ze napeti neni zadne - zdroj odpojeny ?
TT ep. IVa-b; analog + NanoX, DR5000. Pseudoprogramator, pindac nesmyslu
http://modelwiki.klfree.net
belgarat
 
Příspěvky: 2370
Registrován: čtv 27 pro, 2012 9:36 pm
Bydliště: Hřebeč u Kladna

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod OndraTT » stř 07 dub, 2021 6:38 pm

Puvodne jsem tam pull down nemel, ale tim ze to ted budu muset predelat kvuli vysokemu napeti tak tsm bude ofporovy delic..nebo je to špatná uvaha?

Serial.print jsem si dal diky tomu jsem prusel na to ze neco s merenim napeti nefunguje...jeste zkusim s prilozim
OndraTT
 
Příspěvky: 42
Registrován: pon 18 lis, 2019 5:00 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod belgarat » stř 07 dub, 2021 6:50 pm

OndraTT píše:Puvodne jsem tam pull down nemel, ale tim ze to ted budu muset predelat kvuli vysokemu napeti tak tsm bude ofporovy delic..nebo je to špatná uvaha?

Serial.print jsem si dal diky tomu jsem prusel na to ze neco s merenim napeti nefunguje...jeste zkusim s prilozim


No zarazi mne, ze po 2 cyklech to preslo do stavu 'volno', pricemz pokud je spravne detekovano 'regulator bez napeti' tak se 'stav' vubec nemeni :) Ja mam v programech chyb jak maku, ale zrovna tohle je opodminkovany dobre. Kdyztak mi hod aktualni verzi kodu do SZ, at to tu neplevelime mezivysledkama.
TT ep. IVa-b; analog + NanoX, DR5000. Pseudoprogramator, pindac nesmyslu
http://modelwiki.klfree.net
belgarat
 
Příspěvky: 2370
Registrován: čtv 27 pro, 2012 9:36 pm
Bydliště: Hřebeč u Kladna

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod zdeno » stř 07 dub, 2021 7:23 pm

nevim, ci neuvazujete spatne ?
Pokud loko stoji, tak nevidim problem v tom, ze se prejezd uvolni.
Uživatelský avatar
zdeno
 
Příspěvky: 3010
Registrován: pon 11 črc, 2011 8:54 am

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod belgarat » stř 07 dub, 2021 7:59 pm

Samozrejme ze tam MAM chybu. Prehlidl jsem ze 'zdroj' se neupravuje rozsahem, zustava nikoliv V ale 0-1023. takze namisto nejakeho stojime = +-0.05 pekne usmernit diodovym mustkem, a staci treba zdroj < 20 (nejake dostatecne male cislo odpovidajici napeti tak 1.5V, kdy motorek tutove stoji). Mea culpa.
TT ep. IVa-b; analog + NanoX, DR5000. Pseudoprogramator, pindac nesmyslu
http://modelwiki.klfree.net
belgarat
 
Příspěvky: 2370
Registrován: čtv 27 pro, 2012 9:36 pm
Bydliště: Hřebeč u Kladna

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod look23 » stř 07 dub, 2021 8:50 pm

OndroTT příklad ošetření vstupů před odpálením
Obrázek
Obrázek
Celý článek odkaz
TT/H0, ČSD epocha IV, V - z21+MM
look23
 
Příspěvky: 1179
Registrován: ned 17 lis, 2013 2:20 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod OndraTT » stř 07 dub, 2021 10:01 pm

Děkuji všem, s belgaratem v pozadí probíráme postupně krok za krokem.
Co se týče vstupu, dal jsem tam můstek a dělič 10k/47k (jinou kombinaci jsem rychle nenašel), Zenerku žádnou nemám. S tímto děličem tam dostávám cca max 2V. Země jsem spojil tu na - můstku a Gnd Arduina napájeného z USB notebooku. Zatím přežilo i s ntb v síti. V kolejišti to bude s PWM pro koleje a přes 7805 pro Arduino, napájení ze stejného adaptéru.

Nicméně v případě nulové polohy tam čísla na analog vstupu poskakuji mezi cca 50-120, nějaká duchařina (testují na stole s analogovým Tillig ovladačem), tak to ma ještě nějaké mouchy ve funkci.

To zdeno - měl jsem za to ze i když loko zastaví v chráněném úseku, tak výstraha pořád běží i ve skutečnosti, dokud jej neopustí - nebo to myslíš jinak?

Když se zadaří, dam sem finální kód pro další použití
OndraTT
 
Příspěvky: 42
Registrován: pon 18 lis, 2019 5:00 pm

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod zdeno » čtv 08 dub, 2021 7:37 am

OndraTT píše:To zdeno - měl jsem za to ze i když loko zastaví v chráněném úseku, tak výstraha pořád běží i ve skutečnosti, dokud jej neopustí - nebo to myslíš jinak?

Nemusi to tak byt, vsak existuji prejezdy, ktere se daji vypnout, protoze by je posun neustale zapinal.
Ten analog je proste hodne omezujici a pokud neni napajeni, neni proudova detekce.
---
Mozna by pomohlo pocitani naprav ?
Teda pokud jsou v useku napocitane napravy, tak se usek neuvolni.
Uživatelský avatar
zdeno
 
Příspěvky: 3010
Registrován: pon 11 črc, 2011 8:54 am

Re: Arduino pro železniční přejezd - úprava logiky programu

Příspěvekod Pater » čtv 22 dub, 2021 10:27 pm

OndraTT píše:Nicméně v případě nulové polohy tam čísla na analog vstupu poskakuji mezi cca 50-120, nějaká duchařina (testují na stole s analogovým Tillig ovladačem), tak to ma ještě nějaké mouchy ve funkci.
Já bych se až tak nedivil. Málokterý PWM ovladač při nulové poloze nedává žádné impulsy, většinou fungují se střídou v rozsahu 5 - 95%. Pokud chceš na analogovém vstupu měřit napětí (střední hodnotu PWM), chtělo by to nějaký filtr, pouhé usměrnění můstkem + napěťový dělič nebude stačit.
N, DCC, NanoX, Rocrail, Paterweb
Uživatelský avatar
Pater
 
Příspěvky: 471
Registrován: stř 20 črc, 2011 4:52 pm
Bydliště: Karviná


Zpět na Software

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků