#include <FastAccelStepper.h>
// Määritellään step ja dir pin
const int stepPin = 3;
const int dirPin = 4;
// Määritellään enkooderin kanavat
const int encoderA = 2;
const int encoderB = 5;
const int encoderZ = 6;
// Määritellään optohaarukan pin
const int optoPin = 7;
// Luodaan askelmoottori objekti
FastAccelStepperEngine engine = FastAccelStepperEngine();
FastAccelStepper *stepper = NULL;
// Muuttujat enkooderin ja optohaarukan lukemiseen
volatile long encoderPosition = 0;
volatile bool encoderZFlag = false;
volatile bool optoFlag = false;
void setup() {
Serial.begin(9600);
// Määritellään stepperin nopeus ja kiihdytys
engine.init();
stepper = engine.stepperConnectToPin(stepPin);
if (stepper) {
stepper->setDirectionPin(dirPin);
stepper->setAutoEnable(true);
stepper->setSpeedInHz(1000);
stepper->setAcceleration(500);
}
// Määritellään enkooderin ja optohaarukan pinien tilat
pinMode(encoderA, INPUT);
pinMode(encoderB, INPUT);
pinMode(encoderZ, INPUT);
pinMode(optoPin, INPUT);
// Keskeytykset enkooderin kanaville ja optohaarukalle
attachInterrupt(digitalPinToInterrupt(encoderA), readEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderZ), readEncoderZ, RISING);
attachInterrupt(digitalPinToInterrupt(optoPin), readOpto, RISING);
}
void loop() {
// Tarkistetaan, onko referenssisignaali havaittu
if (encoderZFlag) {
encoderZFlag = false;
stepper->setCurrentPosition(0);
}
// Tarkistetaan, onko optohaarukka havaittu
if (optoFlag) {
optoFlag = false;
stepper->setCurrentPosition(0);
}
// Liikutetaan askelmoottoria
if (stepper) {
stepper->move(100); // Esimerkki liikkeestä, voit muuttaa tätä tarpeen mukaan
}
}
void readEncoder() {
static int lastStateA = LOW;
int stateA = digitalRead(encoderA);
int stateB = digitalRead(encoderB);
if (stateA != lastStateA) {
if (stateA == stateB) {
encoderPosition++;
} else {
encoderPosition--;
}
lastStateA = stateA;
}
}
void readEncoderZ() {
encoderZFlag = true;
}
void readOpto() {
optoFlag = true;
}