Hallo allemaal,
Ik heb een schakeling met een stepper motor die wat moet bewegen.
Bij het inschakelen van de schakeling gebeurd er eerst niet. Als we dan op Start drukken, gaat er eerst gehomed worden, dat werkt.
Als er gehomed is, en er wordt weer gestart, gaat de stepper motor de andere kant op draaien en komt uiteindelijk een andere schakelaar tegen welke de stepper nog 140 keer laat steppen en dan wordt er 30 seconden gewacht.
Na 30 seconden gaat de stepper weer naar de home positie.
Nu heb ik ook een stopknop welke ik middels een interrupt wil aanroepen dat zodra deze wordt ingedrukt, de home functie wordt aangeroepen en de stepper weer terugkeert.
Ik heb verschillende zaken geprobeerd, rising, falling, change, met en zonder debounce maar de interrupt wordt wel aangeroepen maar de functie home stop, ik zie stroom door de wikkelingen lopen maar de stepper motor draait niet.
Wat mis ik hier?
#include <Arduino.h>
#include "BasicStepperDriver.h"
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
// All the wires needed for full functionality
#define DIR 8
#define STEP 9
#define ENBL 11
// Since microstepping is set externally, make sure this matches the selected mode
// 1=full step, 2=half step etc.
#define MICROSTEPS 1
BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP, ENBL);
const int buthome = 7; // the number of the pushbutton pin
const int buteut = 6; //Aanslag
const int ledPin = 13; // the number of the LED pin
const int faultPin = 5; //fault pin van de DRV8825
const int butstart = 4; // startknop
const int butstop = 2; // stopknop
boolean stop1 = false;
boolean homed = false;
void setup() {
/*
* Set target motor RPM.
*/
stepper.setRPM(250);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbuttons pins as an input:
pinMode(buthome, INPUT);
pinMode(buteut, INPUT);
pinMode(faultPin, INPUT);
pinMode(butstart, INPUT);
pinMode(butstop, INPUT);
attachInterrupt(digitalPinToInterrupt(butstop), back, RISING); //attach the interrupt
}
void loop() {
stepper.setMicrostep(MICROSTEPS);
stepper.disable();
digitalWrite(ledPin, LOW);
if (digitalRead(butstart) == HIGH){
if (homed == false) {
home();
}
else {
homed = false;
moveeut();
if (stop1 == false) {
holdeut();
}
}
}
}
void home() {
stepper.enable();
while (digitalRead(buthome) == LOW)
{
stepper.rotate(-45);
if (digitalRead(buthome) == HIGH){
homed = true;
break;
}
}
}
void moveeut(){
stepper.enable();
while (digitalRead(buteut) == HIGH) {
stepper.rotate(45);
if (digitalRead(butstop) == HIGH) {
home();
stepper.disable();
break;
}
}
while (digitalRead(buteut) == LOW) {
stepper.move(500*MICROSTEPS);
if (digitalRead(butstop) == LOW) {
stepper.disable();
break;
}
}
}
void holdeut(){
stepper.disable();
for (int i=0; i <= 140; i++){
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
stepper.enable();
home();
}
void back() {
digitalWrite(ledPin, HIGH);
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
// If interrupts come faster than 200ms, assume it's a bounce and ignore
if (interrupt_time - last_interrupt_time > 100)
{
home();
}
last_interrupt_time = interrupt_time;
}