NEMA17 - ruční krokování
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: NEMA17 - ruční krokování
Dík za vysvětlení, nechám to podle tebe.
Re: NEMA17 - ruční krokování
Konečně se mi podařilo dotánhout mechanickou část. Ale objevil se zásadní problém. Motor se po každém pohybu chová jako při vypnutém napájení. A při dalším pootočení se nejdřív nastaví na nejbližší pozici a tím dochází k rozházení nastavení délky posunu. Jednou okénko o kousek přejede, jindy nedojede.
Potřeboval bych aby se motor po zastavení "nevypínal", ale zůstal stát zabržděný a startoval z pozice kde zůstal po zastavení.
Co mi v programu chybí?
[/code]
Potřeboval bych aby se motor po zastavení "nevypínal", ale zůstal stát zabržděný a startoval z pozice kde zůstal po zastavení.
Co mi v programu chybí?
Kód: Vybrat vše
[code]#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 = 11;
int ENB_pin = 9;
int STEP_pin = 10;
int BUTT_pin = 8;
//Motor Specs
const int spr =160; //Steps per revolution
int RPM = 3; //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() {
Serial.begin(9600);
pinMode(MS1, INPUT_PULLUP);
pinMode(MS2, INPUT_PULLUP);
pinMode(MS3, INPUT_PULLUP);
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);
digitalWrite(STEP_pin, HIGH);
// Set target motor RPM to and microstepping setting
stepper.begin(RPM, Microsteps);
delay(5000);
}
void loop() {
digitalRead(STEP_pin);
// STEP_pin - zapínání ručního krokování
if(digitalRead(STEP_pin) == LOW){
digitalWrite(Sleep, HIGH); //A logic high allows normal operation of the A4988 by removing from sleep
stepper.move(159);//Move steps clockwise 800 = 50 kroků
digitalWrite(Sleep, LOW);
delay(200);//Wait 1000 milliseconds
digitalWrite(BLT_pin, LOW);
delay(500);//Wait 1000 milliseconds
digitalWrite(BLT_pin, HIGH);
delay(2500);//Wait 1000 milliseconds
digitalWrite(STEP_pin, LOW);
}
else {
if(digitalRead(BUTT_pin) == LOW) // krok na stisk tlačítka
{
digitalWrite(Sleep, HIGH);
delay(600);
stepper.move(32);//Move steps clockwise 1 krok
digitalWrite(Sleep, LOW);
}
}
}
Re: NEMA17 - ruční krokování
Není problém v tom, že po každém pootočení přepínáš pin 'Sleep' do LOW?
Co se stane, když ho necháš trvale v HIGH?
Podle mě se asi bude motor víc hřát, ale měl by držet pozici.
Co se stane, když ho necháš trvale v HIGH?
Podle mě se asi bude motor víc hřát, ale měl by držet pozici.
Re: NEMA17 - ruční krokování
Bude, pokud má motor držet pozici nesmí být ve sleep modu (povypínáno skoro vše) a musí být enabled (tj povoleny FET tranzostory na výstupu pro motor).
Re: NEMA17 - ruční krokování
Hlavně jak člověk používá mikrokrokování, program se zastaví na 8mém kroku z 16ti, pak se uspí/vypne driver - vzhledem k tomu jak rychle procesor pracuje, tak se uspí/vypne dříve než se zastaví - a motor setrvační silou ještě kousek otočky udělá, takže se dostane třeba do pozice prvního kroku z 16ti. Po obživnutí driveru je ale na cívkách napětí odpovídající osmému kroku a motor se prostě do toho stavu dostane škubnutím jedním, nebo druhým směrem.
Takže, fakt, nevypínat/neuspávat. A pokud i přesto budou problémy se setrvačnými silami, tak hodně pomáhá postupná akcelerace/deakcelerace. Ani to nemusí být nějak brutálně šílený kód, stačí si jen určit počet kroků na akceleraci, počet kroků na aktualizaci rychlosti, minimální rychlost, maximální rychlost a konstantu kterou budu dělit rozdíl mezi maximem a současnou rychlostí.
RychlostMotoru = minimalka
pokud počet kroků co udělal motor je menší než počet kroků na akceleraci tak
dokud RychlostMotoru není větší jak maximálka, tak to každých početKrokuNaAkceleraci/početKrokuNaAktualizaci přepočtu ...
RychlostMotoru = RychlostMotoru + (MaximalníRychlost - RychlostMotoru) / konstanta ...
pokud výpočet překročí maximálku, tak nastavím maximálku ... stejně ji nakonec vždy nastavím na maximálku ať se vypočte cokoliv
Takže, fakt, nevypínat/neuspávat. A pokud i přesto budou problémy se setrvačnými silami, tak hodně pomáhá postupná akcelerace/deakcelerace. Ani to nemusí být nějak brutálně šílený kód, stačí si jen určit počet kroků na akceleraci, počet kroků na aktualizaci rychlosti, minimální rychlost, maximální rychlost a konstantu kterou budu dělit rozdíl mezi maximem a současnou rychlostí.
RychlostMotoru = minimalka
pokud počet kroků co udělal motor je menší než počet kroků na akceleraci tak
dokud RychlostMotoru není větší jak maximálka, tak to každých početKrokuNaAkceleraci/početKrokuNaAktualizaci přepočtu ...
RychlostMotoru = RychlostMotoru + (MaximalníRychlost - RychlostMotoru) / konstanta ...
pokud výpočet překročí maximálku, tak nastavím maximálku ... stejně ji nakonec vždy nastavím na maximálku ať se vypočte cokoliv
Re: NEMA17 - ruční krokování
Tak dlouho do toho koukám a toho sleep jsem si nevšiml.
Rychlost nepotřebuji, jde o přesnost posunu. Ale s ní je to horší. Je to mechanická záležitost, která teď vyplavala. Jsou to staré filmy, mají slepky nebo vypálená políčka a tam to poskočí a je to jinde. S tím se budu muset nějak poprat.
Dík všem za nakopnutí.

Rychlost nepotřebuji, jde o přesnost posunu. Ale s ní je to horší. Je to mechanická záležitost, která teď vyplavala. Jsou to staré filmy, mají slepky nebo vypálená políčka a tam to poskočí a je to jinde. S tím se budu muset nějak poprat.
Dík všem za nakopnutí.
Re: NEMA17 - ruční krokování
Jestli ti jde spíše o přesnost než o rychlost, tak zvol motor s převodem a velmi doporučuji jinačí driver ... TMC vyrábí brutálně kvalitní drivery s pokročilými funkcemi.
Re: NEMA17 - ruční krokování
Převodu jsem se chtěl vyhnout kvůli možným vůlím v převodech. Tady to jede prakticky bez zatížení. S tím driverem uvidím, podle toho jestli to bude koktat.
Re: NEMA17 - ruční krokování
Kvalitní zpřevodovaný motor má vůli prakticky nulovou.
Re: NEMA17 - ruční krokování
Zkusím jiný driver. Mám objednaný DRV8825, ale asi nebude sedět program. Je to sice pin to pin náhrada, ale softwarově to asi neklapne. Ale hodilo by se mi to krokování s krokem až 32.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host