А сделать нужно и побыстрее, то на основании скетча "Панорамная головка на Ардуино", очень плохо понимая, что же я все таки делаю, методом тупого тыка вылепил сие... Но оно работает! Эх если бы у кого нашлось бы пяток минуток прокомментировать "творение", был бы безмерно рад! Допустимы любые цензурные выражения! ))
Код: Выделить всё
/*
Для управления ШД в программе используется библиотека AccelStepper
*/
#include <AccelStepper.h>
#define MOTOR1_DIR_PIN 8 //контакт DIR
#define MOTOR1_STEP_PIN 9 // контакт STEP
#define MOTOR1_LS_PIN 6 // контакт концевика
#define UPRAV_PIN 3 // управление поворотом с основной платы
#define ENABL_PIN 10 // контакт вкл. выкл драйвера
#define MOTOR1_SPR 2048 // Кол-во шагов на 1 оборот вала двигателя
#define MOTOR1_MAX_SPEED 600.0
#define MOTOR1_INIT_SPEED 150.0
AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
int nMotor1SP;
int nSpeedSP;
int nMotor1MV;
void setup() {
phInit();
}
void loop()
{
phGetCommand();
phMotorRun();
}
// end loop
void phInit()
{
pinMode(MOTOR1_DIR_PIN, OUTPUT);
pinMode(MOTOR1_STEP_PIN, OUTPUT);
pinMode(ENABL_PIN, OUTPUT);
pinMode(MOTOR1_LS_PIN, INPUT_PULLUP);
pinMode(UPRAV_PIN, INPUT_PULLUP);
nMotor1MV = 0;
stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED);
stpMotor1.setAcceleration(10);
stpMotor1.setSpeed(40);
stpMotor1.setSpeed(MOTOR1_INIT_SPEED);
while (digitalRead(MOTOR1_LS_PIN) != 0) {
stpMotor1.runSpeed();
}
delay(500);
stpMotor1.setCurrentPosition(0);
stpMotor1.setSpeed(-MOTOR1_INIT_SPEED);
while (abs(stpMotor1.currentPosition()) < 200) //обратный ход после стопа
{
stpMotor1.runSpeed();
}
stpMotor1.setCurrentPosition(0);
stpMotor1.setSpeed(0);
return;
}
// end phInit
void phGetCommand()
{
nMotor1SP = 1023;
nSpeedSP = 500;
if (nMotor1SP > 100) {
nMotor1MV = nSpeedSP;
}
else if (nMotor1SP < -100) {
nMotor1MV = -nSpeedSP;
}
else {
nMotor1MV = 0;
}
nMotor1MV = nMotor1MV / 5;
}
void phMotorRun()
{
//stpMotor1.setSpeed(nMotor1MV);
digitalWrite(ENABL_PIN, LOW); // драйвер вкл.
if (digitalRead(UPRAV_PIN) == 0) { // если поворот ноль стоим на месте
stpMotor1.runToNewPosition(0);
digitalWrite(ENABL_PIN, HIGH);
}
else if (digitalRead(UPRAV_PIN) != 0) { //Идем в поворот
digitalWrite(ENABL_PIN, LOW);
stpMotor1.runToNewPosition(-2500); // шагов на поворот лотков
digitalWrite(ENABL_PIN, HIGH); // драйвер выкл чтоб не греть обмотки двига
}
}