#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(3200, A0, A1, 38); //инициализация шагового мотора (число шагов на 1 полный оборот, пин STEP, пин DIR, пин EN)
#define FULL_SPEED 5000 // максимальная скорость мотора в шагах в секунду - реомендуется ставить не более 7000 и предел 30000, если не хватает скорости уменьшать микрошаги на моторе
#define MOTOR_OFFSET 1000000000L // смещение до остановки, добавление минуса инвертирует движение мотора
#define POT_PIN A4 //пин подключения потенциометра на рампсе AUX
#define OPT_MIN_PIN 3 //пин подключения концевика в начале садим на рампсе X MIN
#define OPT_MAX_PIN 2 //пин подключения концевика в конце садим на рампсе X MAX
#define MIN_PIN 14 //пин подключения концевика в начале садим на рампсе Y MIN
#define MAX_PIN 15 //пин подключения концевика в конце садим на рампсе Y MAX
#define INVERT_OPT -1 // инвертируем сигнал с оптического датчика если -1 и оставляем как есть если 1
#define INVERT_END -1 // инвертируем сигнал с концевика если -1 и оставляем как есть если 1
int flag_reset=-1; //флаг сброса позиции в ноль
int pot_pos = 0;
void setup() {
Serial.begin(9600);
pinMode(OPT_MIN_PIN, INPUT_PULLUP); //подтягиваем оптодатчик к питаню внутреним резистором
pinMode(OPT_MAX_PIN, INPUT_PULLUP); //подтягиваем оптодатчик к питаню внутреним резистором
pinMode(MIN_PIN, INPUT_PULLUP); //подтягиваем концевик к питаню внутреним резистором
pinMode(MAX_PIN, INPUT_PULLUP); //подтягиваем концевик к питаню внутреним резистором
stepper.setRunMode(FOLLOW_POS); //режим мотора
stepper.reset(); //сбрасываем положение мотора на ноль
}
void loop() {
stepper.tick();
pot_pos = map(analogRead(POT_PIN), 0, 1023, 0, FULL_SPEED); //считываем положению потенциомера
stepper.setMaxSpeed(pot_pos); //установка скорости мотора согласно положению потенциомера
int min_opt = digitalRead(OPT_MIN_PIN) * INVERT_OPT; //считываем состояние концевиков
int max_opt = digitalRead(OPT_MAX_PIN) * INVERT_OPT;
int min_end = digitalRead(MIN_PIN) * INVERT_END;
int max_end = digitalRead(MAX_PIN) * INVERT_END;
if ((max_opt || max_end) && (min_opt || min_end)) { // обработка нештатных ситуаций: если достигли любого максимума и любого минимума тогда случилась нештатная ситуация, отключаем мотор
stepper.brake(); //отключаем мотор
Serial.println("ERROR: min and max is reached");
} else if (min_opt || min_end) { // Если достигли минимум оптики, но не совместно с максимумом оптики и максимумом концевика, тогда крутим мотор в сторону максимума
if (flag_reset!=0){
stepper.reset();
} // сброс позиции в ноль единожды
stepper.setTarget(MOTOR_OFFSET, RELATIVE); // смещаем на MOTOR_OFFSET шагов с установленой потенциометром скоростью
flag_reset=0; //флаг сброса позиции в ноль
Serial.println("min reached");
} else if (max_opt || max_end) { // Если достигли максимум оптики , но не совместно с минимумом оптики и минимумо концевика, тогда крутим мотор в сторону минимума
if (flag_reset!=1){
stepper.reset();
} // сброс позиции в ноль единожды
stepper.setTarget(-MOTOR_OFFSET, RELATIVE); // смещаем на -MOTOR_OFFSET шагов с установленой потенциометром скоростью
flag_reset=1; //флаг сброса позиции в ноль
Serial.println("max reached");
}
Serial.print("potentiometer = ");
Serial.println(pot_pos);
Serial.print("ENDS:");
Serial.print(max_opt);
Serial.print(min_opt);
Serial.print(max_end);
Serial.println(min_end);
}