/*
* Для управления ШД в программе используется библиотека AccelStepper 1.48
*
http://www.open.com.au/mikem/arduino/AccelStepper/index.html*
*/
#include <AccelStepper.h>
// Назначение входов/выходов
// Шаговые двигатели
#define MOTOR1_DIR_PIN 8
#define MOTOR2_DIR_PIN 11
#define MOTOR1_STEP_PIN 9
#define MOTOR2_STEP_PIN 10
#define MOTOR1_SPR
1600 //
Кол-во шагов на 1 оборот вала двигателя#define MOTOR2_SPR
1600 #define MOTOR1_MAX_SPEED
8000.0 //
Максимальная скорость моторов в режиме 1#define MOTOR2_MAX_SPEED
8000.0 #define MODE2_MAX_SPEED
14.35 //
Скорость в режиме 2 Звёздная скорость // Органы управления и индикации
#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
#define BTN1 0 // Кнопка РЕЖИМ 2 СТАРТ/СТОП
#define LED_MODE 1 // Индикатор режима:
// 0=РЕЖИМ 2 (светодиод горит)
// 1=РЕЖИМ 1 (светодиод не горит)
int nMotor1SP, nMotor2SP; // Задание направления от джойстика
int nMode2SP; // Задание скорости для работы в РЕЖИМ 2
int nMotor1MV, nMotor2MV; // Задание скорости после ограничителя
int nModeControllerState = 0; // Текущее состояние конечного автомата ModeController
int nMode = 0; // Текущий номер режима
// 0=РЕЖИМ 1. Управление от джойстика
// 1=РЕЖИМ 2. Движение с заданной скоростью по одной оси
bool bBTN1Value; // Состояние кнопки BTN1
AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);
void setup() {
phInit();
}
void loop() {
static int nBTN1Counter;
phGetCommand();
switch (nModeControllerState) {
case 0:
if (bBTN1Value == false) {
nBTN1Counter++;
} else {
nBTN1Counter = 0;
}
if ((bBTN1Value == false) && (nBTN1Counter > 10)) {
nModeControllerState = 1;
nBTN1Counter = 0;
}
break;
case 1:
if (bBTN1Value==true) {
nModeControllerState = 2;
nMode = 1;
digitalWrite(LED_MODE, 0);
}
break;
case 2:
if (bBTN1Value == false) {
nBTN1Counter++;
} else {
nBTN1Counter = 0;
}
if ((bBTN1Value == false) && (nBTN1Counter > 10)) {
nModeControllerState = 3;
nBTN1Counter = 0;
}
break;
case 3:
if (bBTN1Value==true) {
nModeControllerState = 0;
nMode = 0;
digitalWrite(LED_MODE, 1);
}
break;
default:
break;
}
switch (nMode) {
case 0:
phMotorRunMode1();
break;
case 1:
phMotorRunMode2();
break;
default:
break;
}
}
void phInit()
{
pinMode(MOTOR1_DIR_PIN, OUTPUT);
pinMode(MOTOR2_DIR_PIN, OUTPUT);
pinMode(MOTOR1_STEP_PIN, OUTPUT);
pinMode(MOTOR2_STEP_PIN, OUTPUT);
pinMode(BTN1, INPUT_PULLUP);
pinMode(LED_MODE, OUTPUT);
nMotor1MV = 0;
nMotor2MV = 0;
stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED);
stpMotor2.setMaxSpeed(MOTOR2_MAX_SPEED);
stpMotor1.setAcceleration(10.0);
stpMotor2.setAcceleration(10.0);
stpMotor1.setSpeed(0);
stpMotor2.setSpeed(0);
digitalWrite(LED_MODE, 1);
return;
}
void phGetCommand()
{
bBTN1Value = digitalRead(BTN1);
nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика
nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика
nMode2SP = MODE2_MAX_SPEED * 1; //
Задание скорости режима 2 Поменять на -1 если требуется реверс if ((nMotor1SP < -40) || (nMotor1SP > 40)) {
nMotor1MV = map(nMotor1SP, -512, 511, -1*MOTOR1_MAX_SPEED, MOTOR1_MAX_SPEED);
} else {
nMotor1MV = 0;
}
nMotor1MV = nMotor1MV * 1; //
Поменять на -1 если требуется реверс if ((nMotor2SP < -40) || (nMotor2SP > 40)) {
nMotor2MV = map(nMotor2SP, -512, 511, -1*MOTOR2_MAX_SPEED, MOTOR2_MAX_SPEED);
} else {
nMotor2MV = 0;
}
nMotor2MV = nMotor2MV * 1; //
Поменять на -1 если требуется реверс}
void phMotorRunMode1()
{
stpMotor1.setSpeed(nMotor1MV); // Задаем скорость для мотора 1
stpMotor2.setSpeed(nMotor2MV); // Задаем скорость для мотора 2
stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
stpMotor2.runSpeed();
}
void phMotorRunMode2()
{
stpMotor1.setSpeed(nMode2SP); // Задаем скорость для мотора 1
stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
}