Spouštění a zastavení motoru 28BYJ-48 Arduinem
Moderátor: Moderátoři
Pokud páka dojede dolů vlastní váhou a dosedne na dolní koncový spínač pro rozběh tak ten sepne a motor se tedy rozeběhne. To se dle vašeho vyjádření provede vždy.hafca píše:Jen je zajímavé, že zastavování funguje až na několikátý pokus, ale rozběh hned.
Následně by měl motor běžet trvale až do té doby kdy páka dojede do horní polohy kde sepne horní koncák. Jakmile sepne horní koncák tak by měl motor zastavit.
Problém může být v tom, že dokud motor běží tak se vždy volá step(stepsPerRotation) což znamená vždy provedení jedné celé otáčky hřídele. Dokud není dokončena celá otáčka, tak motor stále běží a záleží na konstrukci a pevnosti osazení koncového spínače tj. zda celá otáčka není příliš mnoho a zda při tom třeba nedochází k odtlačení koncového spínače takovým způsobem, že se mírně posune a tím k sepnutí dojde až na několikátý pokus. Pokud je to tak pak by asi stálo za zvážení volat step po menších částech než je celé otočení hřídele tj. třeba jen step(stepsPerRotation/8), ale v závislosti na konstrukci ani to nemusí být dostatečně účinné.
Ano. Pokud tam bude magnet, který po najetí na úroveň čidla způsobí sepnutí, a čidlo zůstane sepnuté i při mírném přejetí v důsledku dokončení celé otáčky hřídele tak to by to mohlo vyřešit.hafca píše:Ale možná je to tím, že to zatím mám na "prkénku". Uvažuji o spínání buď magnetem a jazýčkovým zátavem nebo magnet a Hallovo čidlo.
Motor nezastavuje a když náhodou zastaví, tak po deaktivaci čidla zase běží.
Aby opravdu zastavil a zůstal stát přidal jsem žádek s myStepper.step(256);. Pak zastaví, ale dolní čidlo ho už nespustí. Někde je problém v podmínkách, ale já to nedokážu najít. Ležím v tom víc jak týden a nehnu se z místa.
Kde hledat chybu?
Kód: Vybrat vše
#include <Stepper.h>
#define OUTPUT1 11
#define OUTPUT2 10
#define OUTPUT3 9
#define OUTPUT4 8
#define SW_H 12
#define SW_D 13
int chod = 0;
const int stepsPerRotation = 2048;
Stepper myStepper(stepsPerRotation, OUTPUT2, OUTPUT4, OUTPUT1, OUTPUT3);
void setup()
{
pinMode(SW_H,INPUT_PULLUP);
pinMode(SW_D,INPUT_PULLUP);
myStepper.setSpeed(15);
chod = 1;
Serial.begin(9600);
}
void loop()
{
if (chod) {
myStepper.step(256);
};
if (digitalRead(SW_H)==LOW) {
// sepnul horní koncák tj. vypnout motor
// páka pojede samočinně dolů bez motoru
chod = 0;
delay(20);
} else {
if (digitalRead(SW_D)==LOW) {
// sepnul dolní koncák tj. zapnout motor
// motor začne zvedat páku nahoru
chod = 1;
delay(20);
};
};
}Kód: Vybrat vše
void loop()
{
if (chod) {
myStepper.step(16);
};
if (digitalRead(SW_D)==LOW) {
// sepnul dolní koncák tj. zapnout motor
// motor začne zvedat páku nahoru
chod = 1;
};
if (digitalRead(SW_H)==LOW) {
// sepnul horní koncák tj. vypnout motor
// páka pojede samočinně dolů bez motoru
chod = 0;
};
}
Měl jsem tam výpis stavů těch koncáků. Mám to na NANO. Ale je to jedno, funguje to pořád blbě s i bez toho UART.lesana87 píše:A ten Serial.begin() je tam proč? Není UART na stejném pinu jako ten koncák? Nevím, jaké tam máš arduino.
Ten motor se musí točit pořád jedním směrem. Horní koncák ho vypne a dolní zase stejným směrem spustí.