Stránka 1 z 2

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

Napsal: 31 kvě 2020, 15:40
od sklipky
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.

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

Napsal: 31 kvě 2020, 17:17
od kiRRow
Posíláš pulzy tomu driveru moc rychle. Motor se nestíhá otáčet a proto dělá, co dělá.

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

Napsal: 31 kvě 2020, 17:45
od sklipky
Zkoušel jsem tam dát delší dobu. Kolik ms delay mezi pulzy by to mělo zvládat?

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

Napsal: 31 kvě 2020, 20:01
od pavel1tu
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

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

Napsal: 31 kvě 2020, 20:14
od sklipky
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ě.

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

Napsal: 01 čer 2020, 16:11
od kiRRow
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).

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

Napsal: 05 čer 2020, 21:52
od sklipky
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?

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

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

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

Napsal: 06 čer 2020, 18:15
od pavel1tu
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.

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

Napsal: 12 čer 2020, 21:02
od sklipky
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ě