Stránka 1 z 3
NEMA17 - ruční krokování
Napsal: 06 lis 2024, 17:15
od hafca
Zkouším si postavit skener na 8mm filmy. Program běží, ale potřeboval bych do něj zakomponovat tlačítko na ruční krokování.
Teď se po zapnutí motor otočí o 1/4 otáčky na opačnou stranu než potom správně běží. Netuším, proč to dělá ani jak to odstranit. Zapojení je klasické s NANO a A4988.
Potřeboval bych aby po zapnutí motor stál a čekal na jednostlivé pulsy, tak aby film nakrokoval do správné pozice proti okénku. A potom se spustilo automatické otáčení. V programu je výstup na BLT, což je ovládání spouště fotoaparátu přes Bluetooth.
Moh by mi někdo poradit, jak dál?
Kód: Vybrat vše
#include <Arduino.h>
#include "A4988.h"
int Step = 3; //GPIO3 in Arduino UNO --- Step of stepper motor driver
int Dire = 2; //GPIO2 in Arduino UNO --- Direction of stepper motor driver
int Sleep = 4; //GPIO4 in Arduino UNO --- Control Sleep Mode on A4988
int MS1 = 7; //GPIO7 in Arduino UNO --- MS1 for A4988
int MS2 = 6; //GPIO6 in Arduino UNO --- MS2 for A4988
int MS3 = 5; //GPIO5 in Arduino UNO --- MS3 for A4988
int BLT_pin = 8;
//Motor Specs
const int spr = 200; //Steps per revolution
int RPM = 30; //Motor Speed in revolutions per minute
int Microsteps = 8; //Stepsize (1 for full steps, 2 for half steps, 4 for quarter steps, etc)
//Providing parameters for motor control
A4988 stepper(spr, Dire, Step, MS1, MS2, MS3);
void setup() {
pinMode(BLT_pin, OUTPUT);
Serial.begin(9600);
pinMode(Step, OUTPUT); //Step pin as output
pinMode(Dire, OUTPUT); //Direcction pin as output
pinMode(Sleep, OUTPUT); //Set Sleep OUTPUT Control button as output
digitalWrite(Step, LOW); // Currently no stepper motor movement
digitalWrite(Dire, LOW);
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
delay(5000);//Wait 1000 milliseconds (1 second) proceeding
// Set target motor RPM to and microstepping setting
stepper.begin(RPM, Microsteps);
}
void loop() {
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
stepper.move(200);//Move 200 steps clockwise
digitalWrite(Sleep, LOW);
delay(1000);//Wait 1000 milliseconds
digitalWrite(BLT_pin, HIGH);
delay(200);//Wait 1000 milliseconds
digitalWrite(BLT_pin, LOW);
delay(1000);//Wait 1000 milliseconds
}
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 15:37
od kiRRow
Tu knihovnu znám a raději nepoužívám. Neuměla točit tak rychle a obsluhovat 8 krokových motorů najednou. Raději jsem to řešil timer interuptem, motory pak jako třídy měly své atributy - Pause 0/1 (nekrokuje, ale je zaplý a drží motor v pozici) Stop 0/1 (nekrokuje, vyplý driver) StepsToDo (poček kroků který má udělat) Dir(směr) Position (pozice motoru) Speed(ryhlost) a své metody run(kroky), stop, pause, set/getPosition, set/getSpeed, set/getDir. Interupt pak spouštíš tak často jak musíš abys obsloužil nejrychlejší motor a těm pomalejším se věnuješ třeba co třetí interupt ...
Zkus tohle : v setupu nejprve nastav že pin je LOW a pak že je OUTPUT ... a jako první nastav sleep a ten driver vypni (on se neuspí, ale vypne).
a není nutné si zapráskávat ramku konstantníma hodnotama... které za běhu programu stejně neměníš ...
Kód: Vybrat vše
int Step = 3; //GPIO3 in Arduino UNO --- Step of stepper motor driver
// takhle procesor vytáhne z programu číslo 3 a zapíše někde do ram paměti třeba na adresu 0100 číslo tři
digitalWrite(Step, LOW);
// kompilátor to přeloží jako digitalWrite(běž se podívat na adresu 0100 co tam je, LOW);
Kód: Vybrat vše
const int Step = 3; //GPIO3 in Arduino UNO --- Step of stepper motor driver
// takhle se to číslo nemusí z programu přetahovat do ramky a procesor ušetří pár kroků tím, že nemusí furt hledat někde v ramce
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 17:17
od hafca
Tu čtvrt otáčku hned po zapnutí jsem nakonec vyřešil. Vstup ENABLE u driveru jsem pustil na +5V přes odpor 10k. V programu je v SETUP nastaven pin 9 připojený na ENABLE na HIGH a po delay(1000); na LOW a je po počátečním cukání.
Upravil jsem tu konstantu a bádám na tlačítku. Kam a jak ho dát.
Rychlost nepotřebuji žádnou velkou. Tady jde spíš o přesnost posunu.
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 17:47
od kiRRow
a co řešíš ? ... vykuchej example s debounce tlačítkem ... vytvoř funkci dalsiSnimek(); .... a tu pak volej v tom deboucnutým čudlu ...
něco jako
Kód: Vybrat vše
void dalsiSnimek(){
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
stepper.move(200);//Move 200 steps clockwise
digitalWrite(Sleep, LOW);
}
btw to nebyla jen ta jedna ... všechno co v programu nikdy nebudeš měnit označ jako konstantu .... kdykoliv to budeš chtít změnit, jen z toho odstraníš příznak konstanty a můžeš stím pak pracovat v průběhu programu.
Důvod proč se tady tohle dělá, je že chceš mít všechny důležité proměnné co ovlivňují chování programu pěkně nahoře, abys je mohl rychle měnit a nemusel je hledat rozházené po celém programu na bůh ví kolika místech ... to že se nekonstatní proměnné dávají taky nahoru programu má smysl v tom, že takhle zase lehce nastavíš jejich počáteční hodnotu při restartu programu, nemusíš scrollovat a hledat to v setupu ...
jako třeba na driveru zapojovat piny MS1-3 na arduino ... to má cenu jen když chci za běhu programu měnit způsob mikrokrokování ... při testování jsem si tam dal jumpery, na finálním výrobku je to nadrátovaný napevno
jako na tohle rolování bude ta knihovna stačit ... i program jako slepenec několika examplů bude fungovat, když se to udělá správně, tady se nemusí šetřit každým taktem procesoru ... moc nerad píšu lidem program za ně, budu raději, když to napíšeš (nebo slátáš z ukradených kódů - to je fuk) sám .... rád poradím co a jak dál
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 18:12
od kiRRow
jinak ten 10k ohm odpor je ještě lepší nápad než ten můj

... stejně tak jde i pomocí kondenzátoru a rezistoru deboucnout to tlačítko HW ... a v programu se pak můžeš vykašlat na nějaké sledování millis a rovnou číst stav pinu
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 18:27
od hafca
Dík za rady, zítra to zkusím. Ty piny MS1-3 tam nechám. Líp se to bude ladit, protože nevím, jak velký krok budu potřebovat.
Re: NEMA17 - ruční krokování
Napsal: 07 lis 2024, 20:04
od kiRRow
Jak máš dost volných pinů, proč ne ... já zpřeházel jumpery a v programu změnil konstantu
Re: NEMA17 - ruční krokování
Napsal: 08 lis 2024, 18:15
od hafca
Zkoušel jsem kde co, ale žádný úspěch. Ztroskotal jsem už na if (STEP_pin = HIGH). S jedním = to funguje, ale nejde to dál. S dvěmi == to zase jde dál, ale nefungují tlačítka.
Nechám to být, přesnou pozici dorovnám ručně.
Dík za pomoc
Re: NEMA17 - ruční krokování
Napsal: 08 lis 2024, 19:17
od kiRRow
Dle křišťálové koule máš chybu v programu ... a nemáš koule, aby jsi se s ní popral. Bez kódu ti poradit nemohu.
Re: NEMA17 - ruční krokování
Napsal: 08 lis 2024, 19:55
od hafca
Chyb tam asi bude na tak jednoduchou věc moc. Myslel jsem si, že to udělám jen se zpožděním a kdyby to neklaplo, přidám HW úpravu. Je mi trapně, že to nedokážu sám. Vážím si tvé snahy mi pomoct, na druhou stranu, nechci tě okrádat o čas.
Kód: Vybrat vše
#include <Arduino.h>
#include "A4988.h"
const int Step = 3; //GPIO3 in Arduino UNO --- Step of stepper motor driver
int Dire = 2; //GPIO2 in Arduino UNO --- Direction of stepper motor driver
int Sleep = 4; //GPIO4 in Arduino UNO --- Control Sleep Mode on A4988
int MS1 = 7; //GPIO7 in Arduino UNO --- MS1 for A4988
int MS2 = 6; //GPIO6 in Arduino UNO --- MS2 for A4988
int MS3 = 5; //GPIO5 in Arduino UNO --- MS3 for A4988
int BLT_pin = 8;
int ENB_pin = 9;
int STEP_pin = 10;
int BUTT_pin = 11;
//Motor Specs
const int spr = 200; //Steps per revolution
int RPM = 10; //Motor Speed in revolutions per minute
int Microsteps = 16; //Stepsize (1 for full steps, 2 for half steps, 4 for quarter steps, etc)
//Providing parameters for motor control
A4988 stepper(spr, Dire, Step, MS1, MS2, MS3);
void setup() {
pinMode(BUTT_pin, INPUT);
pinMode(STEP_pin, INPUT);
pinMode(BLT_pin, OUTPUT);
pinMode(ENB_pin, OUTPUT);
pinMode(Step, OUTPUT); //Step pin as output
pinMode(Dire, OUTPUT); //Direcction pin as output
pinMode(Sleep, OUTPUT); //Set Sleep OUTPUT Control button as output
digitalWrite(Step, LOW); // Currently no stepper motor movement
digitalWrite(Dire, LOW);
digitalWrite(Sleep, LOW); //A logic high allows normal operation of the A4988 by removing from sleep
digitalWrite(ENB_pin, HIGH);
delay(1000);//Wait 1000 milliseconds (1 second) proceeding
digitalWrite(BLT_pin, LOW);
digitalWrite(ENB_pin, LOW);
digitalWrite(BUTT_pin, HIGH);
// Set target motor RPM to and microstepping setting
stepper.begin(RPM, Microsteps);
}
void loop() {
if (STEP_pin == HIGH){
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
stepper.move(400);//Move steps clockwise
digitalWrite(Sleep, LOW);
delay(500);//Wait 1000 milliseconds
digitalWrite(BLT_pin, HIGH);
delay(200);//Wait 1000 milliseconds
digitalWrite(BLT_pin, LOW);
delay(1000);//Wait 1000 milliseconds
}
else {
digitalWrite(BLT_pin, LOW);
BUTT_pin = digitalRead(BUTT_pin);
if(BUTT_pin == LOW)
{
BUTT_pin = digitalRead(BUTT_pin);
if(BUTT_pin == LOW)
delay(20);
BUTT_pin = digitalRead(BUTT_pin);
if(BUTT_pin == LOW)
{
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
stepper.move(10);//Move steps clockwise
digitalWrite(Sleep, LOW);
}
}
}
}