/*
* Для управления ШД в программе используется библиотека AccelStepper 1.48-1.51
*
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 INT_PIN 12 // номер вывода на MS
#define LED_PIN 6 // номер вывода светодиода
#define BUTTON_PIN 7 // номер вывода кнопки B1
// Органы управления и индикации
#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
#define BTN1 0 // Кнопка РЕЖИМ 2 СТАРТ/СТОП
#define LED_MODE 1 // Индикатор режима:
// 0=РЕЖИМ 2 (светодиод горит)
// 1=РЕЖИМ 1 (светодиод не горит)
// переменные и константы для обработки сигнала кнопки
boolean flagPress= false; // признак кнопка в нажатом состоянии
boolean flagClick= false; // признак нажатия кнопки (фронт)
byte buttonCount= 0; // счетчик подтверждений состояния кнопки
#define TIME_BUTTON 12 // время устойчивого состояния кнопки (* 2 мс)
boolean ledState; // переменная состояния светодиода
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();
pinMode(INT_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
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;
}
if ( flagPress == (! digitalRead(BUTTON_PIN)) ) {
buttonCount= 0;
}
else {
buttonCount++;
if ( buttonCount >= TIME_BUTTON ) {
flagPress= ! flagPress;
if ( flagPress == true ) flagClick= true;
}
}
// блок управления светодиодом и выходом управления
if ( flagClick == true ) {
flagClick= false;
ledState= ! ledState;
digitalWrite(LED_PIN, ledState);
digitalWrite(INT_PIN, ledState);
}
}
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(); // Выполняем движение с заданной скоростью
}