Набросал небольшой код.
// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
#include <AFMotor.h>
long randSpeed_1;
long randsteps_1;
long randSpeed_2;
long randsteps_2;
// Connect a stepper motor with 48 steps per revolution (7.5 degree)
// to motor port #2 (M3 and M4)
AF_Stepper motor_1(20, 2);
AF_Stepper motor_2(20, 1);
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test");
}
void loop() {
randSpeed_1 = random(4, 70);
motor_1.setSpeed(randSpeed_1);
randsteps_1 = random(5, 17);
randSpeed_2 = random(4, 70);
motor_2.setSpeed(randSpeed_1);
randsteps_2 = random(5, 17);
motor_1.step(randsteps_1, FORWARD, MICROSTEP);
motor_2.step(randsteps_2, FORWARD, MICROSTEP);
motor_1.step(randsteps_1, BACKWARD, MICROSTEP);
motor_2.step(randsteps_2, BACKWARD, MICROSTEP);
}
Двигатели работают в нужных условиях, но не одновременно....
Можете подсказать как организовать данный алгоритм?
Чтобы моторы ходили влево\вправо на случайное число шагов(одно число на цикл туда-сюда), с разной скоростью и делали это одновременно оба двигателя.
Погуглив, понял что не ту либу использовал.
Переписал.
Получилось черти что....
// MultiStepper
// -*- mode: C++ -*-
//
// Control both Stepper motors at the same time with different speeds
// and accelerations.
// Requires the AFMotor library (<a href="https://github.com/adafruit/Adafruit-Motor-Shield-library" title="https://github.com/adafruit/Adafruit-Motor-Shield-library" rel="nofollow">https://github.com/adafruit/Adafruit-Motor-Shield-library</a>)
// And AccelStepper with AFMotor support (<a href="https://github.com/adafruit/AccelStepper" title="https://github.com/adafruit/AccelStepper" rel="nofollow">https://github.com/adafruit/AccelStepper</a>)
// Public domain!
#include <AccelStepper.h>
#include <AFMotor.h>
long randSpeed_1;
long randsteps_1;
long randSpeed_2;
long randsteps_2;
long randAcell_1;
long randAcell_2;
// two stepper motors one on each port
AF_Stepper motor1(20, 1);
AF_Stepper motor2(20, 2);
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {
motor1.onestep(FORWARD, SINGLE);
}
void backwardstep1() {
motor1.onestep(BACKWARD, SINGLE);
}
// wrappers for the second motor!
void forwardstep2() {
motor2.onestep(FORWARD, SINGLE);
}
void backwardstep2() {
motor2.onestep(BACKWARD, SINGLE);
}
// Motor shield has two motor ports, now we'll wrap them in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
void setup()
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
}
void loop()
{
randSpeed_1 = random(4, 70);
randSpeed_2 = random(4, 70);
randAcell_1 = random(30, 70);
randAcell_2 = random(30, 70);
randsteps_1 = random(1, 8);
randsteps_2 = random(1, 8);
stepper1.setMaxSpeed(randSpeed_1);
stepper2.setMaxSpeed(randSpeed_1);
stepper1.setAcceleration(randAcell_1);
stepper2.setAcceleration(randAcell_2);
stepper1.moveTo(randsteps_1);
stepper2.moveTo(randsteps_2);
// Change direction at the limits
if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
stepper1.run();
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
stepper2.run();
Serial.println(randsteps_1);
Serial.println(randsteps_2);
Serial.println(randSpeed_1);
Serial.println(randSpeed_2);
Serial.println(randAcell_1);
Serial.println(randAcell_2);
}
1. скорость хоть и падает в терминал разная - двиглу абсолютно на это начхать... как взял при включении одну, так с ней и работает.
2. шаги рандомны во всех случаях, а необходимо только для цикла туда-обратно. а то получается что влево идет на 7 шагов, вправо на 3....
3. setAcceleration тоже не работает....
в общем еще сильнее запутался в ней....