petan
Vytvořené odpovědi
-
AutorPříspěvky
-
petanÚčastník
Hoď dotaz do novýho fóra: https://www.arduino-forum.cz/viewforum.php?f=3 a nějak rozumě ho pojmenuj (např. Jak nastavit barvu RGB LEDky) a někdo ti tam odpoví. A když né nikdo, tak já 😉
petanÚčastníkÚplně nejjednodušejc by to šlo udělat takhle:
Je tam delay, takže na stisk tlačítka to bude reagovat vždy až po zhasnutí výstupu. Ale to při krátkých časech nemá vliv.int time1 = 10; //čas svícení (počáteční nastavení 10 ms) int time2 = 10; //čas nesvícení (počáteční nastavení 10 ms) void setup() { pinMode (5, INPUT); //vstup 1 pinMode (6, INPUT); //vstup 2 pinMode (7, INPUT); //vstup 3 pinMode (8, INPUT); //vstup a tak dále pinMode (13, OUTPUT); //výstup } void loop() { //tady se řeší rozřazování if digitalRead(5){ //stisknuto tlačítko 1 //nastavit parametry 1 time1 = 10; time2 = 10; } if digitalRead(6){ //stisknuto tlačítko 2 //nastavit parametry 2 time1 = 20; time2 = 20; } //tady se řeší blikání digitalWrite(13, HIGH); delay(time1); digitalWrite(13, LOW); delay(time2); }
petanÚčastníkRomanB má pravdu. Signál pro relé je LOW, ne HIGH. To není moc dobré, pokud Arduino vypadne a nenaběhne. Tak se všechny zapnou? WTF?
V mým programu by mělo stačit přehodit LOW za HIGH a opačně. Ale tím že relé je sepnuto v log. 0 me nepřijde úplně nejlepší varianta.Pokud je rozběh řízen pomocí PLC, tak je často vhodné zapojit první stykač za reléovou logiku (popřípadě bezpečnostní modul) a ostatní spínat pomocí PLC (nahradí v podstatě časový spínač). Stejně jako to je v tomto článku: https://www.mylms.cz/text-rozbeh-hvezda-trojuhelnik-s-modulem-siemens-logo/ Stykač KM1 je ovládán přímo tlačítky (včetně nouzového vypnutí) a zbylé dva stykače (běh do Y a do D) je ovládán z PLC.
petanÚčastníkSnad to bude pochopitelný. Nezkoušel jsem to, ale mělo by to snad fungovat.
Samozřejmě, není nutný po celou dobu zapínat digitální výstupy, ale ničemu to nevadí. Doporučuji vyvarovat se použití příkazu delay();//Rozběh Y-D //Je nutné elektricky a nejlépe i mechanicky blokovat stykače Y a D #define tlStart A0 #define tlStop A1 #define stStart 1 #define stStar 2 #define stDelta 3 int systemState; //stav systému 0 - vypnuto, 1 - provoz Y, 2 - přepínání, 3 - provoz D long casBehu; //čas po který je motor spuštěn do hvězdy void setup() { pinMode(tlStart, INPUT); //tlačítko START pinMode(tlStop, INPUT); //tlačítko STOP pinMode(stStart, OUTPUT); //hlavní stykač pinMode(stStar, OUTPUT); //stakač pro hvězdu pinMode(stDelta, OUTPUT); //stakač pro trojuhelník } void loop() { if (digitalRead(tlStop)){ //stisknuto tlačítko STOP systemState = 0; //vypnout motor } switch (systemState) { case 0: //motor je vypnut digitalWrite(stStart, LOW); //pro sichr vypnout stykač digitalWrite(stStar, LOW); //pro sichr vypnout stykač digitalWrite(stDelta, LOW); //pro sichr vypnout stykač if (digitalRead(tlStart)){ systemState = 1; //zapnout motor casBehu = millis(); //uložit čas sepnití motoru } break; case 1: //motor se rozbíhá zadaný čas v konfiguraci Y digitalWrite(stStart, HIGH); //zapnout hlavní stykač digitalWrite(stStar, HIGH); //zapnout stykač Y if (millis() >= casBehu + 5000){ //pokud motor běží už 5s tak přepni stav systému na 2 systemState = 2; //další krok casBehu = millis(); //uložení aktuálního času } break; case 2: //před přepnutím do D je nutné vypnout stykač pro běh do Y a počkat digitalWrite(stStart, HIGH); //zapnout hlavní stykač digitalWrite(stStar, LOW); //pro sichr vypnout stykač if (millis() >= casBehu + 500){ //pokud od vypnutí stykače uplynulo 0,5s zapni stykač pro běh do trojuhelníka systemState = 3; //další krok } break; case 3: //provoz do D digitalWrite(stStart, HIGH); //zapnout hlavní stykač digitalWrite(stStar, LOW); //pro sichr vypnout stykač break; } }
petanÚčastníkTady něco je: https://www.youtube.com/watch?v=t5gkg645xGE Zdá se, že to funguje.
Jen pro zajímavost. K čemu by to mělo sloužit? Pokud to není tajný?
petanÚčastníkDělají se čtečky čárových kódu s RS232. Pak jednoduše vytvořit pole, ve kterém budou uložené načtené kódy. Kus projde čidlem, uloží se kód do mezipaměťi, porovná se z databází. Pokud už existuje nepřidá se, jinak ano. Připočte se kus a jede se dál. Rozhodně by to bylo zajímavé na velikost paměti a rychlost porovnání – ideálně nějaký optimalizace…třídění apod.). Asi bych se to nesnažil nacpat do nějakýho mrňavýho Arduina ve stylu Nano apod.
Problém akorát s tou čtečkou, protože s RS232 jsou dražší. Většinou fungují jako klávesnice. Načtený kód se jakoby napíše na klávesnici. Ale myslím, že jsem někde zahlídl jak připojit klávesnici k Arduinu. Takže by to bylo v podstatě stejný. Akorát by se místo portu obsluhovala nějaká knihovna na komunikaci s kliávesnicí.
petanÚčastníkMusíš si vytvořit několik proměnných. V jedné potom budou hodiny, ve druhé minuty, … Pak musíš nějak detekovat stisk tlačítka – aby to při stisku vyvolalo pouze jednu událost. Na to můžeš použít např. knihovnu Bounce2…
Budeš mít tedy nějaké proměnné a při stisknutí tlačítka se ti vždy jednou provede nějaká funkce. Při stisknutí tlačítka A tedy zvýšíš hodnotu např. hodin; při stisknutí tl. B snížíš počet hodin. Při stisknutí C to nahrneš do modulu…
A nebo si vygůgli něco jako Arduino set time ds1307 by button, nebo tak. Určitě půjde část kódu z něčeho vyseparovat.
petanÚčastníkMrkni sem: http://playground.arduino.cc/Main/ACPhaseControl (bacha, mají přehozeno in a out na Arduinu). Jinak, když zadáš do gůglu „AC Phase Control“ tak toho určitě najdeš dost. Je to v podstatě řízená triaková regulace.
petanÚčastníkPo restartu je proměnná otevřeno false. A vlastně všechny proměnný jsou po restartu 0, LOW, false, …
A protože si ji nikde neukládáš a ani nezjišťuješ koncákem, tak se ti spustí kód za else (je světlo) a druhá podmínka taky (negované false je true).
Právě takovejhle problém se řeší u těch dveří. Po restartu nevědí kde jsou (během výpadku napájení s nimi někdo mohl pohnout atd.). Takže se po zapnutí napájení provede inicializace. Najde si to koncovou polohu, zresetuje se to a už to frčí…
Jedna varianta je ukládat poslední stav do EEPROM, ale ta na to není moc vhodná. Lepší by byl ten koncák, který by definoval jednu jistou stranu.
petanÚčastníkPokud budeš dokupovat enkodér, tak je lepší ho dát na co nejrychlejší část motorku. Ono by potom mohlo dělat na tej hlavní hřídeli jenom pár pulzů a rozlišení je rázem v tahu. To se mi pak jeví lepší ten motor „vše v jednom“ jak si posílal.
Kolik potřebuješ otáček motoru (myslím už za převodovkou) na přetočení žaluzií do poloh? pokud by to bylo do deseti otáček, tak by si mohl koupit nějaký mrňavý servo, to vykuchat, potenciometr připojit na hřídel, posílit výstupy původní elektroniky a v podstatě by si měl výkonný servo vlastní konstrukce. Navíc velice jednoduše ovládatelný (jsou na to knihovny).
Serva bez zpětné vazby se používají třeba u kotlů. To se otočí o 90° třeba za dvě minuty. Rychlost je celkem spolehlivá, takže se dá dobře řídit. Když se pak vrací do „nulové polohy“ a tak kontrolér pustí ovládací impulz delší, aby byla jistota, že je v nulové poloze – provede se najetí na referenční bod.
petanÚčastníkV 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
petanÚčastníkNa otevření/zavření ti stačí jenom jedna proměnná. Bool může nabývat dvou hodnot true = otevřeno a false = zavřeno. Když budeš mít pro otevřeno a zavřeno dvě proměnné, tak si v tom uděláš akorát guláš. Nehledě na to, že existuje možnost mít obě aktivní. Co by pak platilo? Otevřeno, nebo zavřeno?
bool otevreno = false; //pokud je true, je otevřeno; pokud je false, je zavřeno
V podmínce „else“ už neřeš intenzitu osvatělení pomocí IF. Když se neprovede první IF (když je dost světla), tak se provedou příkazy za ELSE. Už to namusíš komplikovat další podmínou.
Koukni se na můj starší příspěvek. Tam je v podstatě celej program, kromě setupu a deklarací proměnných. Příkazy pro otevření a zavření žaluzií si doplníš s tvýho příspěvku (DigitalWrite atd). Deklaraci před a v vouid setup(); doplň taky od sebe + tu deklaraci proměnné bool… Případně dopřejmenuj nějaký proměnný (já mám int ldr_value označenou jako intenzita).
PS.: Nemělo by být ldr = A0?
PPS.: Já jsem taky začátečník. Jedinej program, kterej jsem zatím naprogramoval je v tomto sodobaru
PPPS.: Doporučuji zkouknout tu knížku, co tu furt vyskakuje. Je tam spousta základů
PPPPS.: Docela mě překvapuje, jak je to tu mrtvý. Doteď jsem si myslel, že si s Arduinem hrajou uplně všichni kromě mě 🙂
PPPPPS.: Přešel bych na PHPbb fórum (nebo jak se jmenuje). Tohle je celkem nepřehledný a pomalýýýýýýýýýýý 😛petanÚčastníkPřipoj k motoru ještě enkodér např. jako tento: https://goo.gl/xbrZ63 a počítej impulsy. Pak s tím můžeš dělat víc věcí – zatáhnout/roztáhnout, zavřít/otevřít. Dalo by se detekovat třeba zaseknutí žaluzií apod…
petanÚčastníkČemu nerozumíš? Zkus si projít kód řádek po řádku. Schválně jsem ho rozdělil na jednotlivý funkce, aby si mohl každou pochopit zvlášť. Navíc rozdělení na jednotlivý funkce (procedury) usnadňuje úpravy v programu.
Nebo zkus servo. To se umí jednoduchým příkazem otočit o 180°. Ráno nastavíš, aby se servo otočilo např. na 0° a večer na 180°. Servo má v sobě elektroniku, která si sama měří úhel, takže opravdu jenom pošleš hodnotu a o nic jinýho se nestaráš.
Pro servo by to mohlo vypadat takhle:
#include <Servo.h> Servo servopohon; //instance objektu (to neřeš) void setup() { servopohon.attach(8); //servo připojeno na pinu 8 } void loop() { //opakuj stále dokola intenzita = analogRead(A0); //načti intenzitu osvětlení if (intenzita > 500){ //pokud je tma servopohon.write(0); // nastavit úhel na 0 } else{ //pokud není tma servopohon.write(180); // nastavit úhel na 180 } }
petanÚčastníkvoid loop(){ if (intenzita > 500){ //pokud je tma if(otevreno){ //pokud je tma (z předchozí podmínky) a žaluzky jsou otevřeny zavri(); } } else{ //pokud není tma if (!otevreno){ //pokud není tma (z předchozí podmínky else) a žaluzie jsou zavřeny otevri(); } } } void zavri(){ //zde napsat příkazy k zavření žaluzií (zapnutí výstupů apod) delay(5000); otevreno = false; vypni(); } void otevri(){ //zde napsat příkazy k otevření žaluzií (zapnutí výstupů apod) delay(5000); otevreno = true; vypni(); } void vypni(){ //příkazy k vypnutí pohonu žaluzií }
Asi takhle bych to viděl… Psal jsem to „poslepu“, ale mělo by to fungovat. Možná budou šatně velikosti písmen.
-
AutorPříspěvky