Nemám teď správný motor, abych mohl vyzkoušet driver.
Opravdu netuším, proč ty piny MS1 až MS3 musíš mít nastavené jako vstupní.
Program jsem tedy upravil a VYZKOUŠEL podle posledního zadání.
V předchozí verzi jsem ale měl chybu.
Blok příkazů, které se měly vykonávat po zastavení, se sice vykonával po zastavení, ale furt dokola.
To asi nebude ten zamýšlený účel.
Doplnil jsem tam proto ještě jednu značku, která umožní vykonat blok příkazů jen 1x po každém zastavení.
Ovládání tedy bude takové, že se tlačítkem roztočí motor.
Tlačítko se musí držet tak dlouho, než čidlo perforace přejde do HIGH.
Kratší stisk sice motorem pootočí, ale když čidlo zůstane v LOW, tak se po uvolnění tlačítka motor zastaví.
Blok příkazů "po zastavení" se v tomto případě nevykoná - to je myslím správně.
Když bude stisk dostatečně dlouhý na to, aby se čidlo perforace přepnulo do HIGH,
může se tlačítko uvolnit a motor bude pokračovat v automatickém otáčení tak dlouho, než ho čidlo zastaví signálem LOW.
Pak se 1x vykoná blok příkazů "po zastavení".
Kód: Vybrat vše
// prirazeni pinu - jsem musel zmenit, protoze je uz osazena DPS
#define pin_STEP 3
#define pin_tlacitko 10
#define pin_cidlo 8
#define pin_DIR 2
#define pin_ENABLE 9
#define pin_SLEEP 4
#define pin_MS1 7
#define pin_MS2 6
#define pin_MS3 5
// globalni promenne
bool tocit_motorem = false; // false = po zapnuti napajeni motor stoji
bool blokuj_prikazy = false; // prikazy "po zastaveni" se vykonaji jen 1x
void setup(void)
{
pinMode(pin_tlacitko, INPUT_PULLUP); // tlacitko spina proti GND, rozepnute je v HIGH
pinMode(pin_cidlo, INPUT); // cidlo dava LOW nebo HIGH (LOW zastavuje motor)
pinMode(pin_STEP , OUTPUT); // krokovani motoru
pinMode(pin_DIR , OUTPUT); // smer otaceni
digitalWrite(pin_DIR, HIGH);
pinMode(pin_ENABLE , OUTPUT); // spusteni napajeni do motoru
digitalWrite(pin_ENABLE, LOW);
pinMode(pin_SLEEP , OUTPUT); // probudit motor
digitalWrite(pin_SLEEP, HIGH);
pinMode(pin_MS1 , INPUT_PULLUP); // ??? mikrostepovaci piny ...
pinMode(pin_MS2 , INPUT_PULLUP);
pinMode(pin_MS3 , INPUT_PULLUP);
digitalWrite(pin_MS1, HIGH); // ... nastavit podle potreby
digitalWrite(pin_MS2, HIGH);
digitalWrite(pin_MS3, HIGH);
}
void loop(void)
{
if (digitalRead(pin_cidlo) == LOW) // LOW signal od cidla ...
{
tocit_motorem = false; // ... zastavuje motor
if (blokuj_prikazy == false) // blok prikazu, ktere se maji vykonat po zastaveni se vykona jen 1x od kazdeho rozbehu
{
// ************
// prikazy provadene po zastaveni
// ************
blokuj_prikazy = true; // dokud se motor znova nerozjede, predchozi blok prikazu se vykonavat nebude
}
}
else // cidlo odjelo mimo perforaci (stav HIGH)
{
blokuj_prikazy = false; // tim se odblokuje vykonani bloku prikazu po dalsim zastaveni
}
if (digitalRead(pin_tlacitko) == LOW) // stisk spousteciho tlacitka ...
{
tocit_motorem = true; // ... zapina motor
// Tlacitko ma vyssi prioritu nez cidlo, takze dokud bude stisknute,
// motor se bude tocit i v pripade, ze cidlo perforace bude pozadovat zastaveni
}
if (tocit_motorem == true) // kdyz se ma motor tocit, vykona se jeden (mikro)krok
{
digitalWrite(pin_STEP, HIGH);
delayMicroseconds(50); // pauzy upravit na pozadovanou rychlost otaceni (vetsi cislo = pomalejsi otaceni)
digitalWrite(pin_STEP, LOW);
delayMicroseconds(50);
}
}