Accelstepper, bys musel použít samostatně, ale tam nevim jak bys dopadl s koncákama, protože to moc neznám
tady je upravenej program, napsal sem to přehledně, aby ses vtom neztratil, je potřeba doladit nastavení pro tvoje motory, když se pak bude předělávat na víc os aby běžely současně, musí se tam dodělat stavový indikátory, do toho se mi zatim moc nechtělo
. Jinak různý koncáky a spínače se dají dodělat na jakoukoli funkci, takže nejsi omezen jako třeba u Machu3.
#include <SoftwareSerial.h>
#define DIR_PIN 2
#define STEP_PIN 3
int keyStart = A0; // PIN pro připojení tlačítka Start
int keyHome = A1; // PIN pro připojení tlačítka Home
int limitRefer = 1; // PIN pro připojení tlačítka Pause
void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(keyStart, INPUT_PULLUP); // tady připojuješ tlačítko na pullup, takže stačí zapojit jako normální vypínač (ne přes rezistor na GND)
pinMode(keyHome, INPUT_PULLUP); //tlačítko Home
pinMode(limitRefer, INPUT_PULLUP); //referenční snímač 1 na ose x
}
void loop() {
if (digitalRead(keyStart) == LOW) {
delay(500);
rotate(15000, 4.00); //Rychloposuv + 5000 kroků
delay(100);
rotate(6000, 0.2); //posuv + 6000 kroků
delay(100);
rotate(-6000, 4.0); //rychloposuv - 6000 kroků
delay(300);
rotate(5500, 4.0); //rychloposuv + 5500 kroků
delay(100);
rotate(4500, 0.2); //posuv + 4500 kroků
delay(100);
rotate(-10000, 4.0); //rychloposuv - 10000 kroků
delay(100);
}
if (digitalRead(keyHome) == LOW) {
delay(100);
rotate(-100000, 1.00); //Hledání výchozí polohy. Při najetí koncáku na výchozí poloze sepne reset
}
}
void rotate(int steps, float speed) {
//rotate a specific number of steps - (negitive for reverse movement)
//speed is any number from .01 -> 70 with 1 being fastest - Slower is stronger
int dir = (steps > 0) ? HIGH : LOW;
steps = abs(steps);
int zrychleni = 20; // tady se mění zrychlení motoru při rozjezdu (počet kroků na plnou rychlost)
float maxDelay = 700; // tady se mění prudkost náběhu motoru (když dělá velký rázy, zvýší se číslo)
digitalWrite(DIR_PIN, dir);
int stepsStart = zrychleni;
int stepsMid = steps-zrychleni*2;
int stepsEnd = zrychleni;
float oneStep = maxDelay/zrychleni;
float usDelay = (1 / speed) * 70;
if (steps < 2){
limits(); // kontrola jestli se má něco řešit před dalším pohybem
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
return;
}
if (steps <=(zrychleni*2)+1){
int stepsMod = steps % 2;
int stepsDiv = steps-stepsMod;
stepsStart = (stepsDiv/2)+stepsMod;
stepsEnd = stepsDiv/2;
stepsMid = 0;
}
for (int i = 0; i <= stepsStart; i++){ //rozjezd motoru
limits();
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay+(maxDelay-oneStep*i));
}
for (int i = 0; i <= stepsMid; i++) { // středová vzdálenost
limits();
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
for (int i = 0; i <= stepsEnd; i++){ //zastavení motoru
limits();
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay+(oneStep*i));
}
}
void rotateDeg(float deg, float speed) {
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0) ? HIGH : LOW;
digitalWrite(DIR_PIN, dir);
int steps = abs(deg) * (1 / 0.225);
float usDelay = (1 / speed) * 70;
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
void limits(){
// if (koncák 1 tak...
// if (koncák 2 tak...
// if (spínač 1 tak...
if (digitalRead(limitRefer) == LOW) delay(100);
}
*****
tady je něco Accelstepper na hraní a zkoušení:
#include <AccelStepper.h>
AccelStepper stepper(1, 9,
; // driver, step, dir
void setup()
{
stepper.setMaxSpeed(300);
stepper.setAcceleration(40);
stepper.setEnablePin(6);
}
void loop(){
stepper.setMaxSpeed(400);
stepper.moveTo(500);
stepper.run();
stepper.setMaxSpeed(400);
stepper.moveTo(-600);
stepper.run();
stepper.setMaxSpeed(200);
stepper.moveTo(70);
stepper.run();
stepper.setMaxSpeed(400);
stepper.moveTo(-70);
stepper.run();
}