Otevírání a zavírání dveří pomocí krokového motoru

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
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.
BigSandy
Příspěvky: 219
Registrován: 23 zář 2017, 07:09
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od BigSandy » 13 čer 2020, 07:32

Jsem take něco takoveho dělal a použil heblo na oteviraní okna v autě z vrakače za 100 kč.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od kiRRow » 13 čer 2020, 12:37

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áš ? :)

sklipky
Příspěvky: 14
Registrován: 01 srp 2018, 07:55
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od sklipky » 20 čer 2020, 09:45

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

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od kiRRow » 20 čer 2020, 11:02

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.

sklipky
Příspěvky: 14
Registrován: 01 srp 2018, 07:55
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od sklipky » 08 srp 2020, 19:03

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 ? :?:

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);
  
    
}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od AstroMiK » 08 srp 2020, 20:51

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.

sklipky
Příspěvky: 14
Registrován: 01 srp 2018, 07:55
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od sklipky » 08 srp 2020, 23:25

Přepracováno dle doporučení....
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
  
    
}

marh
Příspěvky: 37
Registrován: 19 bře 2018, 15:13
Reputation: 0

Re: Otevírání a zavírání dveří pomocí krokového motoru

Příspěvek od marh » 10 srp 2020, 00:54

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



Obrázek

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: luger a 20 hostů