Close

Odpověď na: Rada pro začátečníka -stmívač a žaluzie

Úvodní stránka Fórum Vaše projekty Arduino Rada pro začátečníka -stmívač a žaluzie Odpověď na: Rada pro začátečníka -stmívač a žaluzie

#8712
petan
Účastník

V jakým stavu bude výstup 9, když bude DigitalRead(7) v log. 1? 😎

Osobně bych použil buď dva koncáky, nebo koncák a inkrementální snímač (ideální řešení), nebo krokáč, nebo servo.

Koncák a inkrementální snímač by měl výhodu v najetí na referenční polohu (třeba zcela otevřené žaluzie) a pak by si to mohlo žít vlastním životem – např. 500 impulsů otevřené žaluzie, 1200 impulsů zavřené žaluzie, 1500 impulsů zatažené žaluzie apod. Kdyby se to ztratilo, najelo by si to znovu na referenční polohu.
Takhle fungují vyjíždějící dveře např. Efaflex. Nemají jediný koncák – referenční polohu si najdou pomocí přetížení měniče a od této polohy si odpočítávají pozici. Když se ztratí (výpadek proudu), najedou si nahoru, snulují si vnitřní počítadlo a jedou dál. Dá se pak nastavit, aby dolní poloha byla 5 cm nad zemí, horní třeba v půlce atd. atd.

Potom by se u těch žaluzií neřešil nějaký čas, který je závislý mimo jiné i na teplotě (pokud je převodovka mazaná tukem, tak má nějakej odpor), ale vždy počet pulzů, který by měl být konstantní.

Inkrementální snímač jsem zatím nikdy neřešil, ale ačkoliv není potřeba řešit směr počítání (ten je daný podle spuštění motoru), tak se bude zřejmě jednat jenom o připojení snímače na pin, který umí přerušení a v každém přerušení přičíst, nebo odečíst hodnotu podle směru otáčení motoru. Při najetí na koncák hodnotu vynulovat… Jen takovej nástřel by mohl vypadat třeba takto.


int aktualni_pozice = 0; //proměnná s aktuální pozicí
int smer = 0; //0 - stop, 1 nahoru, 2 dolu

void reset(){
//najelo se na koncák (referenční poloha)
aktualni_pozice = 0;
}

void preruseni(){
//provede se při přijmutí impulzu ze snímače. Tohle si zapíná sám procesor.
//ještě jsem to nezkoušel, tak nevím jak to funguje
//ale na netu toho určitě bude mrtě

//provede zvýšení, nebo snížení počtu podle směru pohybu žaluzií
switch(smer)
case 0:
//stojí
break;
case 1:
//jede nahoru, pozice se zvyšuje
aktualni_pozice++;
break;
case 2:
//jede dolu, pozice se zmenšuje
aktualni_pozice--;
break;
}

void pohyb(){
switch(smer)
case 0:
//zastav vole
stop();
break;
case 1:
//příkaz pro jetí nahoru
if(aktualni_pozice == 0){
//je v pozici 0, což by mohly být zatažené žaluzie, takže zastav (viz níž)
stop();
}
break;
case 2:
//příkaz pro jetí dolu
if(aktualni_pozice == 100){
//je v pozici 100, což by mohly být otevřené žaluzie, takže zastav (viz níž)
stop();

break;
}

void stop(){
//příkazy pro zastavení motoru (různý didžitl outputy atd..)
smer = 0;
}

Je to jen takovej nástřel. Ani jsem to kloudně neprohlížel, protože tahlecta internetová mašinérie neformátuje text.
V reálu by bylo asi dobrý nehlídat přesně 0, nebo 100 impulzů, ale třeba od 95 do 105. Mohlo by se stát, že by Arduino nestihlo něco zaznamenat atd… I když tady by to asi nehrozilo. Ale sichr je sichr…

Jak na to pak koukám, tak by šel udělat ovladač na otevřený, zavřený atd. žaluzie, který by z jakékoliv polohy vždycky na první dobrou zajely do pozice kam chceš. Vědí, kde jsou, vědí kam mají jet. Tak no-problem….

A nebo to ovládej táhlem jako do teď a nic neřeš 😀 Ale zas na druhou stranu, tohle je taková bejkárna, že to má cenu zkusit. Člověk se alespoň něčemu přiučí.

Ps.: Bejt tebou, tak si nejdřív rozbyslím, jak budeš ovládat ty žaluzky na hardwarovej úrovni – servo, krokáč, dc-motor. Čas, koncáky, inkrementální snímač, kombinace, … Zdar, jdu spát