Otevírání a zavírání dveří pomocí krokového motoru
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Re: Otevírání a zavírání dveří pomocí krokového motoru
Jsem take něco takoveho dělal a použil heblo na oteviraní okna v autě z vrakače za 100 kč.
Re: Otevírání a zavírání dveří pomocí krokového motoru
Aby ti krokáč "držel" musíš do něj neustále pouštět proud ... topí pak jak motor, tak driver. Bez proudu ti bude držet pouze na síle odporu "převodovky". Nebo koupit mnohem složitější a pokročilejší driver, který umí měnit výstupní proud dle zátěže motoru.
Když bych za každou cenu chtěl krokáče, šel bych cestou převodovky. Osobně bych použil DC motor s převodovkou a koncové spínače. Není špatný nápad mít ty koncáky na každé straně dva.
Jeden, ten první, ten obsluhuje MCU a vypíná motor SW cestou. Za ním je ještě jeden a ten HW odpojuje napájení motoru. Pokud ty dvířka nabourají do druhého koncáku, je nutno je rukou posunout (resetovat), aby motor dostal šťávu.
A pojistku na zdroji máš ?
Když bych za každou cenu chtěl krokáče, šel bych cestou převodovky. Osobně bych použil DC motor s převodovkou a koncové spínače. Není špatný nápad mít ty koncáky na každé straně dva.
Jeden, ten první, ten obsluhuje MCU a vypíná motor SW cestou. Za ním je ještě jeden a ten HW odpojuje napájení motoru. Pokud ty dvířka nabourají do druhého koncáku, je nutno je rukou posunout (resetovat), aby motor dostal šťávu.
A pojistku na zdroji máš ?
Re: Otevírání a zavírání dveří pomocí krokového motoru
Asi ste mě přesvědčili. Koupím dva DC motory a dva koncáky. Motor pojede do té doby, dokud nesepne koncák.
V tom případě by měl být použitý v programu interupt? S těma to ještě neumím .... budu muset vyzjistit
V tom případě by měl být použitý v programu interupt? S těma to ještě neumím .... budu muset vyzjistit
Re: Otevírání a zavírání dveří pomocí krokového motoru
Teoreticky ano, prakticky přesně naopak.
Motor pojede dokud nerozepne koncák. Tyhle věci radno zapojovat inverzně. Slépka překlovne kabel a motor se bude točit dokud neshoří i s kurníkem, to raději ať to funguje naopak a s překlovnutým kabelem mi kurník zůstane otevřený celou noc.
Motor pojede dokud nerozepne koncák. Tyhle věci radno zapojovat inverzně. Slépka překlovne kabel a motor se bude točit dokud neshoří i s kurníkem, to raději ať to funguje naopak a s překlovnutým kabelem mi kurník zůstane otevřený celou noc.
Re: Otevírání a zavírání dveří pomocí krokového motoru
Dal jsem na rad zde a začal to přepracovávat na DC motor. Mám teď ale problém s interrupty. Napsal jsem program, kde chci jen vyzkoušet interrupty, ale nefunguje to. Po stisku koncáku by se měla detekovat sestupná hrana a měla by se spustit bud funkce ,,otevri,, nebo funkce ,,zavri,,. Problem je, že misto otevreni nebo zavreni motor jen ťukne a nic víc. Když napíšu velmi jednoduchý program na ověření, že funguje funkce ,,otevri / zavri,, tak to funguje a motor jezdi jak ma. Když přidám ty interrupty, tak už jen ťukne.
Čím to ?
Čím to ?
Kód: Vybrat vše
#define in1 6 //jeden pól motoru
#define in2 7 //druhý pól motoru
#define koncak_dole 2 // piny 2 a 3 fungujou s interupty
#define koncak_nahore 3 // piny 2 a 3 fungujou s interupty
unsigned long doba_otvirani = 10000;
void setup() {
//pinMode(enA, OUTPUT);
pinMode(koncak_dole, INPUT_PULLUP);
pinMode(koncak_nahore, INPUT_PULLUP);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
//pinMode(button, INPUT);
digitalWrite(in1, LOW); // Set initial rotation direction
digitalWrite(in2, LOW); // Set initial rotation direction
attachInterrupt(digitalPinToInterrupt(koncak_dole), otevri, FALLING);
attachInterrupt(digitalPinToInterrupt(koncak_nahore), zavri, FALLING);
}
void otevri() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(10000);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(10000);
}
void zavri() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(doba_otvirani);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(2000);
}
void loop() {
delay(8000);
}
Re: Otevírání a zavírání dveří pomocí krokového motoru
V interruptu nefunguje funkce delay().
Navíc by měl ten interruptový podprogram trvat co nejkratší dobu.
V tomhle případě bych se ale na interrupt vykašlal a v nějaké rychlé hlavní smyčce bych jen kontroloval stav kontaktů.
- Když jsou oba sepnuté, toč motorem v požadoveném směru.
- Když je horní rozepnutý, zastav a připrav se, že příští směr bude DOLU.
- Když je dolní rozepnutý, zastav a připrav se, že příští směr bude NAHORU.
Navíc by měl ten interruptový podprogram trvat co nejkratší dobu.
V tomhle případě bych se ale na interrupt vykašlal a v nějaké rychlé hlavní smyčce bych jen kontroloval stav kontaktů.
- Když jsou oba sepnuté, toč motorem v požadoveném směru.
- Když je horní rozepnutý, zastav a připrav se, že příští směr bude DOLU.
- Když je dolní rozepnutý, zastav a připrav se, že příští směr bude NAHORU.
Re: Otevírání a zavírání dveří pomocí krokového motoru
Přepracováno dle doporučení....
Odzkoušet budu moct až někdy příští víkend...
Odzkoušet budu moct až někdy příští víkend...
Kód: Vybrat vše
#define in1 6 //jeden kontakt motoru
#define in2 7 //druhý kontakt motoru
#define koncak_dole 2
#define koncak_nahore 3
#include "RTClib.h"
DS3231 rtc;
int doba_otvirani = 60000; //po prekroceni teto doby otvirani se vypne motor a ukonci program
int casOtevreniHod = 8;
int casOtevreniMin = 30;
int casZavreniHod = 20;
int casZavreniMin = 30;
int casOtevreni = casOtevreniHod * 60 + casOtevreniMin; //prevod hodin a minut pouze na minuty
int casZavreni = casZavreniHod * 60 + casZavreniMin; //prevod hodin a minut pouze na minuty
int aktualniCas;
void setup() {
Serial.begin(9600);
pinMode(koncak_dole, INPUT_PULLUP); //použité koncáky jsou NO, takže na pinech pro koncák bude HIGH stav (díky pullup), dokud nesepne koncák a připojí je k GND
pinMode(koncak_nahore, INPUT_PULLUP);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW); // vypnutí motoru
digitalWrite(in2, LOW); // vypnutí motoru
}
void otevri() { // Funkce pro otevirani. Roztoci motor do doby, než sepne horní koncák.
int doba = 0;
int doba_sek;
Serial.print("Zahajeno otevirani")
while (digitalRead(koncak_nahore) == HIGH)
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(200);
doba++;
doba_sek=doba/5; // doba trvání funkce ,,otevri,, - POZOR! závislé na délce předchozího delay
if (doba_sek > doba_otvirani){ //Pokud je překročen limit času otvírání, tak se zapne delay, až do sepnutí koncáku, aby se nezničil motor
digitalWrite(in1, LOW); //vypnout motor
digitalWrite(in2, LOW); //vypnout motor
while (digitalRead(koncak_nahore) == HIGH){
delay (60000);
}
}
}
digitalWrite(in1, LOW); //vypnout motor
digitalWrite(in2, LOW); //vypnout motor
delay(60000);
}
void zavri() { //Analogie k funkci ,,otevri,,
int doba = 0;
int doba_sek;
while (digitalRead(koncak_dole) == HIGH)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(200);
doba++;
doba_sek=doba/5; // doba trvání funkce ,,otevri,, - POZOR! závislé na délce předchozího delay
if (doba_sek > doba_otvirani){ //Pokud je překročen limit času otvírání, tak se zapne delay, až do sepnutí koncáku, aby se nezničil motor
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
while (digitalRead(koncak_dole) == HIGH){
delay (60000);
}
}
}
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(60000);
}
void loop() { //Zjištuje se čas. Pokud je čas, kdy má být otevřeno a není, tak zahájí funkci otevři - a naopak.
DateTime now = rtc.now();
aktualniCas = now.hour() * 60 + now.minute(); //převedení aktuálního čas z hodin a minut na pouze minuty
if (aktualniCas >= casOtevreni && aktualniCas <= casZavreni)
{
if (digitalRead(koncak_dole) == HIGH)
{
otevri();
delay(1000);
}
else
{
delay(1000);
}
}
else if (aktualniCas > casZavreni || aktualniCas < casOtevreni)
{
if (digitalRead(koncak_nahore) == HIGH)
{
zavri();
delay(1000);
}
else
{
delay(1000);
}
}
delay(1000); // One second delay
}
Re: Otevírání a zavírání dveří pomocí krokového motoru
Zdravím
Ako ti napísali. Použi motor. Smer jazdy sa bude prepínať pomocou mostíka.
Pri prevodovke sa zväčší možnosť tlačiť ťažšiu vec. NM
na motor možno použiť zapojenie pre AKTUÁTOR(motor s dvíhaciou pákou)
na oboch koncoch sú spínače(tlačidla normálne zatvorené, čiže rozpínacie) a diódy.
Ak motor dôjde na jeden koniec, tak sa jeden spínač rozpojí a motor sa zastaví a potom môže ísť len druhým smerom zmenou polarity, ktorá ide cez diódu a druhý spínač.
Ak sa motor zastaví niekde medzi tak môže ísť oboma smermi lebo oba spínače so zopnuté.
Ďalšie dva malé koncové spínače sú pre arduino aby pri otváraní/zatváraní prepol polaritu na mostíku, čiže vie či je na konci alebo sa zastavil ešte predtým.
Spínacie alebo rozpínacie lebo motor je ošetrený mechanický
Ovládanie motora je ošetrené mechanický aby neišiel viac ako ma ísť. Takže netreba prúdovú poistku a podobne a ešte arduino vypne mostík.
Treba mostíkové zapojenie pre arduino napr. IO LN398N podľa výkonu .
Diódy(výkonové) a spínače pre motor podľa výkonu motora.
zelené a modré štvorčeky sú spínače
Ako ti napísali. Použi motor. Smer jazdy sa bude prepínať pomocou mostíka.
Pri prevodovke sa zväčší možnosť tlačiť ťažšiu vec. NM
na motor možno použiť zapojenie pre AKTUÁTOR(motor s dvíhaciou pákou)
na oboch koncoch sú spínače(tlačidla normálne zatvorené, čiže rozpínacie) a diódy.
Ak motor dôjde na jeden koniec, tak sa jeden spínač rozpojí a motor sa zastaví a potom môže ísť len druhým smerom zmenou polarity, ktorá ide cez diódu a druhý spínač.
Ak sa motor zastaví niekde medzi tak môže ísť oboma smermi lebo oba spínače so zopnuté.
Ďalšie dva malé koncové spínače sú pre arduino aby pri otváraní/zatváraní prepol polaritu na mostíku, čiže vie či je na konci alebo sa zastavil ešte predtým.
Spínacie alebo rozpínacie lebo motor je ošetrený mechanický
Ovládanie motora je ošetrené mechanický aby neišiel viac ako ma ísť. Takže netreba prúdovú poistku a podobne a ešte arduino vypne mostík.
Treba mostíkové zapojenie pre arduino napr. IO LN398N podľa výkonu .
Diódy(výkonové) a spínače pre motor podľa výkonu motora.
zelené a modré štvorčeky sú spínače
Kdo je online
Uživatelé prohlížející si toto fórum: luger a 20 hostů