// https://wokwi.com/projects/426679769057908737
// 2-axis jogging button, adjustable speed stepper based on Mobatools
// for
// https://forum.arduino.cc/t/adding-stepper-motors-to-replace-manual-winding-knobs/1362341/44?u=davex
// Modified from this 1-axis example
// pins changed to match a Protoneer CNC Shield V3
////////// Modified Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
// https://github.com/MicroBahner/MobaTools/blob/master/examples/_Stepper/Stepper_03/Stepper_03.ino
// https://wokwi.com/projects/386819655605368833
// for https://forum.arduino.cc/t/using-accelstepper-with-button-control-and-home/1210347/10
/* Example for the control of a bipolar stepper with 4 buttons and a potentiometer ( for the speed ).
In this example, besides the stepper class (MoToStepper), the classes MoToButtons and MoToTimebase
are also used.
The stepper current is switched off, if the stepper is not moving.
The buttons must switch to Gnd, no resistors are needed.
Button1: Rotates X right as long as the button is pressed and held
Button2: Rotates X left as long as the button is pressed and held
Button3: Rotates Y right as long as the button is pressed and held
Button4: Rotates Y left as long as the button is pressed and held
*/
/* Beispiel für die Ansteuerung eines bipolaren Steppers über 4 Taster und
ein Poti ( für die Geschwindigkeit )
In diesem Beispiel werden neben der Stepperklasse (MoToStepper), auch die MoToButtons
und der MoToTimebase genutzt.
Der Spulenstrom wird abgeschaltet, wenn der Stepper nicht läuft.
Die Taster müssen gegen Gnd schalten, es sind keine Widerstände notwendig
Button1: X Dreht rechts, solange Taster gedrückt
Button2: X Dreht links, solange Taster gedrückt
Button3: Y Dreht rechts, solange Taster gedrückt
Button4: Y Dreht links, solange Taster gedrückt
*/
#define MAX8BUTTONS // spart Speicher, da nur 4 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
// Pindefinitions - change to your needs
const byte dirPinX = 5;
const byte stepPinX = 2;
const byte dirPinY = 6;
const byte stepPinY = 3;
const byte enaPin = 8;
const byte button1Pin = A1;
const byte button2Pin = A2;
const byte button3Pin = A3;
const byte button4Pin = A4;
const byte potPin = A0; // must be an analog input
const int STEPS_REVOLUTION = 800;
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR ); // 800 Steps/ Umdrehung
MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR ); // 800 Steps/ Umdrehung
// Taster einrichten
enum { Button1=0, Button2, Button3, Button4 } ; // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin }; // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );
MoToTimebase speedIntervall; // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms
int vspeed = 0; //Steppergeschwindigkeit in U/min*10
void setup()
{
myStepperX.attach( stepPinX, dirPinX );
myStepperX.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepperX.setSpeed( 200 );
myStepperX.setRampLen( 10 ); // Rampenlänge 100 Steps bei 20U/min
myStepperY.attach( stepPinY, dirPinY );
myStepperY.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepperY.setSpeed( 200 );
myStepperY.setRampLen( 10 ); // Rampenlänge 100 Steps bei 20U/min
speedIntervall.setBasetime( 100 ); // 100ms Tickerzeit
}
void loop() {
button.processButtons(); // Taster einlesen und bearbeiten
// Speed alle 100ms neu einlesen und setzen
if ( speedIntervall.tick() ) {
// wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
vspeed = map((analogRead(potPin)), 0, 1023, 20, 1800); //Poti mappen auf 2 ... 180 Umdr/Min
//min speed =2 and max speed =180 rpm
myStepperX.setSpeed( vspeed );
myStepperY.setSpeed( vspeed );
}
// Drehen rechtsrum
if (button.pressed(Button1) ) {
//Taster1 gedrückt
myStepperX.rotate( 1 ); // Stepper dreht vorwärts
}
if ( button.released(Button1) ) {
//Taster1 losgelassen
myStepperX.rotate(0); // Stepper stoppt
}
//Drehen linksrum
if (button.pressed(Button2) ) {
//Taster2 gedrückt
myStepperX.rotate( -1 ); // Stepper dreht rückwärts
}
if ( button.released(Button2) ) {
//Taster2 losgelassen
myStepperX.rotate(0); // Stepper stoppt
}
// Drehen rechtsrum
if (button.pressed(Button3) ) {
//Taster3 gedrückt
myStepperY.rotate( 1 ); // Stepper dreht vorwärts
}
if ( button.released(Button3) ) {
//Taster3 losgelassen
myStepperY.rotate(0); // Stepper stoppt
}
//Drehen linksrum
if (button.pressed(Button4) ) {
//Taster4 gedrückt
myStepperY.rotate( -1 ); // Stepper dreht rückwärts
}
if ( button.released(Button4) ) {
//Taster4 losgelassen
myStepperY.rotate(0); // Stepper stoppt
}
}
X CCW or CW while pressed
(Arrow keys < > also work)
Y CCW or CW while pressed
(Arrow keys ^ v also work)
Speed