Skip to content
Snippets Groups Projects
Commit 5fb3d129 authored by Quentin Bolsee's avatar Quentin Bolsee
Browse files

Add new file

parent bf66840d
No related branches found
No related tags found
No related merge requests found
#include <TMC2209.h>
#include <AccelStepper.h>
#include <Adafruit_SSD1306.h>
#define PIN_STEP1 28
#define PIN_DIR1 29
#define PIN_STEP2 26
#define PIN_DIR2 27
#define PIN_BTN 2
#define PIN_ENC_A 3
#define PIN_ENC_B 4
#define READ_FAST(pin) ((sio_hw->gpio_in & (1 << pin)) > 0)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define LENGTH_MIN (0.05)
#define LENGTH_MAX (4000.0)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SERIAL_BAUD_RATE 115200
#define RUN_CURRENT_PERCENT 80
#define STALL_GUARD_THRESHOLD 80
#define HOMING_VELOCITY 400
#define MOVE_SPEED 800
#define MOVE_ACC 1200
HardwareSerial & serial_stream = Serial1;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
AccelStepper stepper1(AccelStepper::DRIVER, PIN_STEP1, PIN_DIR1);
AccelStepper stepper2(AccelStepper::DRIVER, PIN_STEP2, PIN_DIR2);
TMC2209 stepper_driver1;
TMC2209 stepper_driver2;
int state_now = 0b00;
int state_prev = 0b00;
int lookup_move[] = {0,-1,1,-2,1,0,2,-1,-1,2,0,1,-2,1,-1,0};
float length = 5.00;
int counter = 0;
int active = false;
bool update_screen = true;
int k = 0;
inline void update_knob() {
int key = (state_now << 2) | state_prev;
if (!active) {
k += lookup_move[key];
if (k >= 4) {
length += 0.05;
k -= 4;
if (length > LENGTH_MAX) {
length = LENGTH_MAX;
}
} else if (k <= -4) {
length -= 0.05;
k += 4;
if (length < LENGTH_MIN) {
length = LENGTH_MIN;
}
}
update_screen = true;
}
state_prev = state_now;
}
void pin_AB_change() {
state_now = (READ_FAST(PIN_ENC_B) << 1) | READ_FAST(PIN_ENC_A);
update_knob();
}
void homing() {
stepper_driver2.moveAtVelocity(-HOMING_VELOCITY);
delay(200);
stepper_driver2.moveAtVelocity(HOMING_VELOCITY);
delay(100);
bool done = false;
while (!done) {
uint16_t stall_guard_result = stepper_driver2.getStallGuardResult();
done = stall_guard_result < STALL_GUARD_THRESHOLD;
}
stepper_driver2.moveAtVelocity(0);
stepper_driver2.enable();
}
void setup() {
Serial.begin(0);
pinMode(PIN_ENC_A, INPUT);
pinMode(PIN_ENC_B, INPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.display();
delay(100);
display.clearDisplay();
display.cp437(true);
stepper_driver1.setup(serial_stream, SERIAL_BAUD_RATE, TMC2209::SERIAL_ADDRESS_1);
stepper_driver1.setRunCurrent(RUN_CURRENT_PERCENT);
stepper_driver1.setMicrostepsPerStep(4);
delay(50);
stepper_driver2.setup(serial_stream, SERIAL_BAUD_RATE, TMC2209::SERIAL_ADDRESS_0);
stepper_driver2.setRunCurrent(RUN_CURRENT_PERCENT);
stepper_driver2.setMicrostepsPerStep(4);
stepper_driver2.enable();
delay(50);
display.clearDisplay();
display.setCursor(0, 0);
display.print("Homing...");
display.display();
homing();
stepper1.setMaxSpeed(MOVE_SPEED);
stepper1.setAcceleration(MOVE_ACC);
stepper2.setMaxSpeed(MOVE_SPEED);
stepper2.setAcceleration(MOVE_ACC);
state_now = READ_FAST(PIN_ENC_A) | (READ_FAST(PIN_ENC_B) << 1);
state_prev = state_now;
attachInterrupt(digitalPinToInterrupt(PIN_ENC_A), pin_AB_change, CHANGE);
attachInterrupt(digitalPinToInterrupt(PIN_ENC_B), pin_AB_change, CHANGE);
}
void loop() {
static int btn_pressed = false;
int btn_pressed_now = !digitalRead(PIN_BTN);
if (btn_pressed_now && !btn_pressed) {
active = !active;
update_screen = true;
if (active) {
stepper_driver1.enable();
} else {
stepper_driver1.disable();
}
}
if (active) {
stepper1.moveTo(800);
stepper1.runToPosition();
stepper1.setCurrentPosition(0);
active = false;
update_screen = true;
}
if (update_screen) {
update_screen = false;
display.clearDisplay();
display.setCursor(0, 0);
display.printf("Length: %8.2f in\n", length);
display.setCursor(0, 16);
display.printf("Counter: %7d cuts\n", counter);
display.setCursor(0, 40);
display.println(active ? "RUNNING..." : "STOPPED");
display.setCursor(0, 56);
display.println(active ? "[ press to stop ]" : "[ press to start ]");
display.display();
}
delay(1);
btn_pressed = btn_pressed_now;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment