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.
sklipky
Příspěvky: 14
Registrován: 01 srp 2018, 07:55
Reputation: 0

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

Příspěvek od sklipky » 31 kvě 2020, 15:40

Tento projekt má za cíl v nastavený čas dveře otevřít a pak je v určitý čas zase zavřít. Používám A4988 driver spolu s Nema17 motorem (ten otáčí závitovou tyč, která otevírá/zavírá dveře). Deska je arduino Nano. Dále pak časový modul DS3231 + dva mechanické koncáky.

Napsal jsem následující kód a myslím, že problém už bude asi ve funkci ,,otevri,, která je vnořená do programu a má být vyvoláva v určený čas.

V současné době moje zapojení dělá tohle ihned po tom, co zapnu napájení log obvodů (5V) a motoru (12V):

https://www.youtube.com/watch?v=9DwJA3zm2sk

Skoro se to netočí a nebo jen málo a vibrace jsou šílené.
Zkoušel jsem na driveru A4988 měnit z plného kroku na různé mikrokroky, ale to nepomohlo. Dále jsem zkoušel trošku přidat napětí, taky nepomohlo. Zkusil jsem proházet přívody k cívkám motoru, ale bez úspěchu. Zkoušel jsem i měnit délku pauzy mezi jednotlivými impulzy pro otáčení krokového motoru - nyní mam nastaveno 1, což je možná málo a hardware to nedá.

Tady je kód:

Kód: Vybrat vše

// defines pins numbers
// DS3231:  SDA A4
//          SCL A5
// A4988  step D5
// A4988  direction D6
// Koncák otevřeno D7
// Koncák zavřeno D8

#include <Wire.h>
#include "RTClib.h"

DS3231 rtc;
char daysOfTheWeek[7][12] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

const int stepPin = 5;
const int dirPin = 6;
const int koncakOtevreno = 7;
const int koncakZavreno = 8;


int casOtevreniHod = 6;
int casOtevreniMin = 30;
int casZavreniHod = 19;
int casZavreniMin = 0;

int casOtevreni = casOtevreniHod * 60 + casOtevreniMin;
int casZavreni = casZavreniHod * 60 + casZavreniMin;

int aktualniCas;


void otevri() {
  Serial.println("oteviram dvere");
  digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
  // Makes 200 pulses for making one full cycle rotation, M5 závit má stoupání 0,8mm/otáčku, potřebuji 250 otáček = 250*200= 50000 pulzů
  for (int x = 0; x < 50000; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1);
  }
}

void zavri() {
  Serial.println("zaviram dvere");
  digitalWrite(dirPin, LOW); //Changes the rotations direction
  // Makes 200 pulses for making one full cycle rotation
  for (int x = 0; x < 50000; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1);
  }
}

void setup() {

  Serial.begin(9600);
  delay(3000);
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //Nastavení aktuálního času dle času kompilace.
  DS3231 rtc; // inicializace RTC z knihovny


  pinMode(stepPin, OUTPUT); //Nastavení pinů pro krokový motor jako výstup
  pinMode(dirPin, OUTPUT);
  pinMode(koncakOtevreno, INPUT_PULLUP); //Koncáky co používám mají HIGH při rozepnutém stavu.PULLUP neguje původní funkci, tím pádem bude HIGH při sepnutém koncáku.
  pinMode(koncakZavreno, INPUT_PULLUP);
}


void loop() {
  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(koncakZavreno) == HIGH)
    {
      otevri();
      delay(3000);
    }
    else
    {
      delay(3000);
    }
  }

  else if (aktualniCas > casZavreni || aktualniCas < casOtevreni)
  {
    if (digitalRead(koncakOtevreno) == HIGH)
    {
      zavri();
      delay(3000);
    }
    else
    {
      delay(3000);
    }
  }


  delay(1000); // One second delay

}



PS:Je to dárek pro tátu, říkal jsem si jednoduchá věc, ale nějak to nedávám :D Budu moc vděčný za pomoc.

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 » 31 kvě 2020, 17:17

Posíláš pulzy tomu driveru moc rychle. Motor se nestíhá otáčet a proto dělá, co dělá.

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 » 31 kvě 2020, 17:45

Zkoušel jsem tam dát delší dobu. Kolik ms delay mezi pulzy by to mělo zvládat?

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

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

Příspěvek od pavel1tu » 31 kvě 2020, 20:01

Nevím co přesně máš za motor NEMA17,
ale já po pokusech se stejným driverem skončil nakonec u TB6600.

Nastavení pro daný typ motoru najdeš v datasheetu, NEMA17 je asi 10 typů ?

PS: Můj sice motor bral jen něco přes 1A, ale původní driver šíleně topil
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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 » 31 kvě 2020, 20:14

Mám tento: 17HS4401S

Parametry viz třeba zde (jen mám bez té integrované tyče):
https://www.google.com/url?sa=i&url=htt ... AdAAAAABAH

Skoro stejný mám i na 3D tiskárně a tam běhal s A4988 v pohodě.

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 » 01 čer 2020, 16:11

zkus

Kód: Vybrat vše

  for (int x = 0; x < 50000; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
jen pro test
....
ale těch cyklů for se pak zbav, řiď to pomocí millis, nebo časovače. V momentě kdy budeš točit motorem, nebudeš moct dělat nic jiného (třeba snímat koncáky).

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 » 05 čer 2020, 21:52

Díky, můžeš mi dát tip, jak tu funkci opravit tak, aby byl v ní vnořen interupt, který by funkci ukončil, když dojde k sepnutí koncáku?

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 » 06 čer 2020, 07:30

No já s krokáčma točívám pomocí millis ... respektive micros. Princip je stejný jen se děje 1000x rychleji. Vypadá to asi nějak takhle

Kód: Vybrat vše

loop(){
casTedkom = micros(); // načtu si počet mikrovteřin od spuštění programu

	if(casTedkom - casPosledníhoKroku >= 1000){ // měřím čas kdy jsem provedl poslední krok - místo tý 1000 muže být proměnná rychlostMotoru
		if(motorMáBezet == true){ // motor je zaplej nebo vyplej ?
			//udělej ten impulz ... ten fakt může trvat jednu mikrovteřinu
		}
		casPosledníhoKroku = micros(); // zapamatuji si kdy jsem krokoval
	}

// tady čtu koncáky
	if(koncákHorní nebo koncákDolní == true){ // do jednoho to nabourá
		motorMáBezet = false; // vypni motor
	}
}
Pak to stejně budeš muset pozměnit :D ... protože když bude nabourán horní koncák, tak ti to takhle nespustí motor ani v opačném směru ... ale to už domyslíš, že horní koncák sepnutý a motor má jet dolů, tak je to už jinačí káva než že horní koncák sepntnutý a motor má jet nahoru :) ... pomaličku a po kouskách ... program nikdy není jedna složitá věc, ale hromada prkotin ... dekompozice je důležitá schopnost programátora

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

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

Příspěvek od pavel1tu » 06 čer 2020, 18:15

A je tam potřeba krokový motor ?
Jakmile jsou někde koncáky, nadrátuju vypnutí dojezdu přes ně. Musím mít ale se 2 kontakty, jeden na odpínání motoru, druhý na signalizaci pro Arduino kde jsem.
Použiji DC motor a k němu natvrddo desku se "soft" rozjezdem.

V programu pak jen hlídám kde jsem (nahoře/dole) a dávám povely na OPEN/CLOSE. Zdá se mi zbytečné dávat krokový motor kde se jezdí ode-zdi ke-zdi - chápal bych to kde chcem popojíždět o kousek.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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 » 12 čer 2020, 21:02

Asi máš pravdu, jdu na to moc složitě ... už mám ale koupené ty krokáče. Mají výhodu i v tom, že jsou silný a dobře drží břemeno v idle stavu, což se mi hodí. Zkusím asi prvně jiný zdroj. Na tom mém sice píšou 12V a 2,5A, ale třeba to není pravda s proto dr to chová dívně

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů