Kontinuální otáčení NEMA17
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.
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.
Re: Kontinuální otáčení NEMA17
A máš jistotu, že ten motor, když je zastavován pomocí senzoru, tak se vždy zastaví ve správném místě ? Já pokud potřebuji udělat přesně jednu otočku, tak raději počítám kroky, kolik jich je třeba udělat a senzor používám pro automatickou kalibraci, kontrolu, popř automatickou korekci. Se setrvačnýma silama se dá pobojovat pomocí akcelerace/deakcelerace.
Ale jak se říká, co funguje, to neopravuj.
Ale jak se říká, co funguje, to neopravuj.
Re: Kontinuální otáčení NEMA17
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í".
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);
}
}
Re: Kontinuální otáčení NEMA17
tohle je fakt blbost ...
dej tam tohle ...
Kód: Vybrat vše
pinMode(pin_MS1 , INPUT_PULLUP); //pin je jako vstup s pull up rezistorem
pinMode(pin_MS2 , INPUT_PULLUP);
pinMode(pin_MS3 , INPUT_PULLUP);
digitalWrite(pin_MS1, HIGH); //tohle v pinu zapne pull up rezistor (který je zaplý)
digitalWrite(pin_MS2, HIGH); //takže ten high signal je vlastně připojený pull up rezistor
digitalWrite(pin_MS3, HIGH);
Kód: Vybrat vše
pinMode(pin_MS1 , OUTPUT); //pin je jako output
pinMode(pin_MS2 , OUTPUT);
pinMode(pin_MS3 , OUTPUT);
digitalWrite(pin_MS1, HIGH); //jeho vystup je skutečny high signal
digitalWrite(pin_MS2, HIGH);
digitalWrite(pin_MS3, HIGH);
Re: Kontinuální otáčení NEMA17
Dík oběma za pomoc, začínám z toho blbnout.
S tím počítáním kroků jsem to měl. Problém je v tom, že jak je film starý a seschlý, případně se slepkou nebo vypáleným políčkem, tak nikdy nezastaví úplně přesně. Výsledkem je roztřesený film. Asi bude částečně chyba i v ozubeném podávacím kolu. Mám ho jen vytištěné a obyčejný i když zkalibrovaný Ender3v2 není zrovna etalon přesnosti. Proto to zkouším s indikací podle perforace.
Ty výstupy tam tak mám, nevím kde jsem k tomu přišel.
@ AstroMiK
Asi jsem špatně napsal jak to má fungovat. Tlačítko slouží jen na spuštění celého automatu. To znamená, jeden stisk a pak už to běží samo, dokud nevypnu napájení. Po stisku by měl motor najít první díru v perforaci, zastavit, udělat fotku , rozjet se, najít další díru v perforaci, zastavit atd..
S tím počítáním kroků jsem to měl. Problém je v tom, že jak je film starý a seschlý, případně se slepkou nebo vypáleným políčkem, tak nikdy nezastaví úplně přesně. Výsledkem je roztřesený film. Asi bude částečně chyba i v ozubeném podávacím kolu. Mám ho jen vytištěné a obyčejný i když zkalibrovaný Ender3v2 není zrovna etalon přesnosti. Proto to zkouším s indikací podle perforace.
Ty výstupy tam tak mám, nevím kde jsem k tomu přišel.

@ AstroMiK
Asi jsem špatně napsal jak to má fungovat. Tlačítko slouží jen na spuštění celého automatu. To znamená, jeden stisk a pak už to běží samo, dokud nevypnu napájení. Po stisku by měl motor najít první díru v perforaci, zastavit, udělat fotku , rozjet se, najít další díru v perforaci, zastavit atd..
Re: Kontinuální otáčení NEMA17
no astromik je měl nastavené jako LOW ... pravděpodobně se stalo to, že vlivem změny mikrokrokování jsi nedokázal ten motor rozběhnout, protože jsi mu posílal kroky příliš moc rychle na tohle nastavení ...
no právě u automatu bych jel asi nějak takhle ...
ještě k tomu, když to chce člověk nechat běžet o samotě ... raději i počítat pokusy o rekalibraci, po třetím neuspěšném raději ať to pípá, než vesele likviduje starý film
no právě u automatu bych jel asi nějak takhle ...
Kód: Vybrat vše
setup :
krok 1a - pokud na senzoru nic nemám, jedu velmi pomalinku dopředu až na něm něco mám
krok 1b - něco na senzoru mám, popojedu vzad pár kroku a provedu krok 1a
krok 2 - provedu přesně odsledovaný počet kroků správným směrem abych byl na tzv pozici 0 a přitom furt měl něco na tom senzoru (snímá v nějakém rozsahu, že ...)
konec kalibrace ... nastavím si první počet kroků na jednu otočku
loop :
stisk tlacitka bude jen prepinat motorBezet = !motorBezet
pokud motor ma bezet
a pocet kroku je větší než nula
provedu krok, odečtu si ho
nebo pocet je nula
pokud je senzor aktivni a vim ze se mi to nerozhodilo moc
provedu prikazy a nakonci nastavim pocet kroku na další otočku
senzor aktivni neni, provedu kalibraci jako v setupu
Re: Kontinuální otáčení NEMA17
Tady se popojíždět zpátky nedá. To ozubené kolo to popotahuje z cívky přes okénko kde se fotí. Potom to jede přes čidlo a navíjí se na prázdnou cívku. Odkaz je na první verzi posunu.
https://youtu.be/k0cO5Mfsd00
https://youtu.be/k0cO5Mfsd00
Re: Kontinuální otáčení NEMA17
Tak snad poslední verze:
Tlačítko má teda jen funkci spuštění hlavní smyčky a až do vypnutí napájení je nepužité.
Motor se točí pořád.
Když se na čidle objeví LOW a zároveň je povolené fotografování, fotografování se vykoná.
Pak se fotografování zakáže až do doby, kdy čidlo zahlásí HIGH.
HIGH na čidle fotografování povolí, ale ještě nevykoná. K tomu dojde až při dalším LOW na čidle.
V okamžiku fotografování asi bude potřeba motor na chvilku zastavit aby film neodjel během osvitu- to se provede nějakou pauzou.
Tlačítko má teda jen funkci spuštění hlavní smyčky a až do vypnutí napájení je nepužité.
Motor se točí pořád.
Když se na čidle objeví LOW a zároveň je povolené fotografování, fotografování se vykoná.
Pak se fotografování zakáže až do doby, kdy čidlo zahlásí HIGH.
HIGH na čidle fotografování povolí, ale ještě nevykoná. K tomu dojde až při dalším LOW na čidle.
V okamžiku fotografování asi bude potřeba motor na chvilku zastavit aby film neodjel během osvitu- to se provede nějakou pauzou.
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 blokuj_prikazy = false; // fotografovani se vykona jen 1x po stavu LOW na cidle
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 , OUTPUT); // mikrostepovaci piny ...
pinMode(pin_MS2 , OUTPUT);
pinMode(pin_MS3 , OUTPUT);
digitalWrite(pin_MS1, HIGH); // ... nastavit podle potreby
digitalWrite(pin_MS2, HIGH);
digitalWrite(pin_MS3, HIGH);
while (digitalRead(pin_tlacitko) == HIGH) ; // na teto radce se bude cekat, nez dojde ke stisku tlacitka (LOW = pokracuj dal)
// pak uz je tlacitko az do vypnuti napajeni zbytecne
}
void loop(void)
{
if (digitalRead(pin_cidlo) == LOW) // prvni LOW signal od cidla provede fotografovani
{
if (blokuj_prikazy == false) // blok prikazu, ktere se maji vykonat po prvnim zjisteni LOW stavu na cidle
{
// *************************
// *** FOTOGRAFOVANI ***
// *************************
delay(1000); // pozastaveni motoru na provedení zaznamu (aby film neujel behem osvitu)
blokuj_prikazy = true; // nez se objevi HIGH signal na cidle, dalsi fotografovani se nebude provadet
}
}
else
{
blokuj_prikazy = false;
}
digitalWrite(pin_STEP, HIGH); // jeden impulz do motoru (motor se toci porad)
delayMicroseconds(50); // pauzy upravit na pozadovanou rychlost otaceni (vetsi cislo = pomalejsi otaceni)
digitalWrite(pin_STEP, LOW);
delayMicroseconds(50);
}
Re: Kontinuální otáčení NEMA17
Mrzí mě to, ale někde je chyba. Motor po stisku tlačítka jen cvakne, stojí a periodicky cvaká a fotí.
Re: Kontinuální otáčení NEMA17
Změnil jsem ti tam ty piny MS1 až MS3 na OUTPUT, jak psal kiRRow.
Dobře, tak si je přepni zpátky na INPUT_PULLUP jestli to teda pomůže.
Jinak mi to tady běží na stole bez problémů.
(místo motoru mám LEDku, zpomalil jsem si impulzy a místo foťáku mám druhou LED)
video:
https://youtu.be/8K2dzX3GFgk
Dobře, tak si je přepni zpátky na INPUT_PULLUP jestli to teda pomůže.
Jinak mi to tady běží na stole bez problémů.
(místo motoru mám LEDku, zpomalil jsem si impulzy a místo foťáku mám druhou LED)
video:
https://youtu.be/8K2dzX3GFgk
Re: Kontinuální otáčení NEMA17
Ty piny tam jsou jak už jsem napsal.
Dík za tvůj čas, ale pusť to z hlavy, něco z toho co se tu psalo určtě nějak zužitkuji.
Dík za tvůj čas, ale pusť to z hlavy, něco z toho co se tu psalo určtě nějak zužitkuji.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host