NEMA17 - ruční krokování

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
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.
hafca
Příspěvky: 103
Registrován: 23 říj 2017, 23:05

NEMA17 - ruční krokování

Příspěvek od hafca » 06 lis 2024, 17:15

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
}

Uživatelský avatar
kiRRow
Příspěvky: 1268
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: NEMA17 - ruční krokování

Příspěvek od kiRRow » 07 lis 2024, 15:37

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

hafca
Příspěvky: 103
Registrován: 23 říj 2017, 23:05

Re: NEMA17 - ruční krokování

Příspěvek od hafca » 07 lis 2024, 17:17

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.

Uživatelský avatar
kiRRow
Příspěvky: 1268
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: NEMA17 - ruční krokování

Příspěvek od kiRRow » 07 lis 2024, 17:47

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

Uživatelský avatar
kiRRow
Příspěvky: 1268
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: NEMA17 - ruční krokování

Příspěvek od kiRRow » 07 lis 2024, 18:12

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

hafca
Příspěvky: 103
Registrován: 23 říj 2017, 23:05

Re: NEMA17 - ruční krokování

Příspěvek od hafca » 07 lis 2024, 18:27

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.

Uživatelský avatar
kiRRow
Příspěvky: 1268
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: NEMA17 - ruční krokování

Příspěvek od kiRRow » 07 lis 2024, 20:04

Jak máš dost volných pinů, proč ne ... já zpřeházel jumpery a v programu změnil konstantu

hafca
Příspěvky: 103
Registrován: 23 říj 2017, 23:05

Re: NEMA17 - ruční krokování

Příspěvek od hafca » 08 lis 2024, 18:15

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

Uživatelský avatar
kiRRow
Příspěvky: 1268
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: NEMA17 - ruční krokování

Příspěvek od kiRRow » 08 lis 2024, 19:17

Dle křišťálové koule máš chybu v programu ... a nemáš koule, aby jsi se s ní popral. Bez kódu ti poradit nemohu.

hafca
Příspěvky: 103
Registrován: 23 říj 2017, 23:05

Re: NEMA17 - ruční krokování

Příspěvek od hafca » 08 lis 2024, 19:55

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);
}
   }
   }
 } 

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host