Uno, motor shield, 2 шаговика. работа одновременно...

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

для теста код набрал код:



// 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); 
  
}

как заставить ходить оба движка одновременно?

а то получается что сначала один ходит влево, затем второй влево, потом так же по очереди вправо.... а заставить одновременно ходить их... не смог.

 

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

почитал форум, уяснил что не ту библиотеку использую...

написал на новой библиотеке...

// MultiStepper
// -*- mode: C++ -*-
//
// Control both Stepper motors at the same time with different speeds
// and accelerations. 
// Requires the AFMotor library (https://github.com/adafruit/Adafruit-Motor-Shield-library)
// And AccelStepper with AFMotor support (https://github.com/adafruit/AccelStepper)
// 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 тоже не работает....

в общем еще сильнее запутался в ней....

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

Доброго дня.

В общем спустя кучу времени, засел снова, тем более что пришли шаговые движки нормальные, а не вырванные\выпиленные из флопов и сд-ромов.

код получился такой:

#include <AccelStepper.h>
#include <AFMotor.h>

AF_Stepper motor1(2048, 1);
AF_Stepper motor2(2048, 2);

// SINGLE DOUBLE INTERLEAVE MICROSTEP!

void forwardstep1() {  
  motor1.onestep(FORWARD, SINGLE);
}
void backwardstep1() {  
  motor1.onestep(BACKWARD, SINGLE);
}
void forwardstep2() {  
  motor2.onestep(FORWARD, SINGLE);
}
void backwardstep2() {  
  motor2.onestep(BACKWARD, SINGLE);
}
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

void setup()
{
    
}

void loop()
{
    if (stepper1.distanceToGo() == 0)
    {
      stepper1.moveTo(random(10, 90));
      stepper1.setMaxSpeed((random(100, 200)) + 1);
      stepper1.setAcceleration((random(30, 200)) + 1);
    }
    if (stepper2.distanceToGo() == 0)
    {
      stepper2.moveTo(random(80, 700));
      stepper2.setMaxSpeed((random(150, 300)) + 1);
      stepper2.setAcceleration((random(30, 300)) + 1);
    }
    stepper1.run();
    stepper2.run();
}

 получается примерно такой алгоритм:

включается, и начинает ходить влево на случайное число, потом возвращается на ту же точку, откуда включился и так в цикле пока не отключишь....

Но нужно немного другое, ход полностью примерно 125 градусов, соответственно влево\право делится на пополам и сейчас код отрабатывает как раз только половину.... то есть от "нулевой" точки двиг ходит только влево, вправо он ни на один шаг не проходит?

полностью программно не знаю как решить эту проблему... а вот частично аппаратно и прораммно немного представляю.

на какую нибудь цифровую ногу вешаю кнопку....

при включении двиг начинает движение вправо, до тех пор пока не сработает кнопка, путем нажатия на кнопку рычагом одетым на ось двигателя и только потом начинает работать по циклу loop(с переделанными значениями конечно)...

как задать при void setup движение вправо - могу, а как остановить его по прерыванию и задать рабочий режим?

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

Доброго всем дня.

Можете подсказать, куда в вышеуказанный код включить функцию включения\выключения ноги ардуины?

#include <AccelStepper.h>
#include <AFMotor.h>

AF_Stepper motor1(2048, 1);
AF_Stepper motor2(2048, 2);

// SINGLE DOUBLE INTERLEAVE MICROSTEP!

void forwardstep1() {  
  motor1.onestep(FORWARD, SINGLE);
}
void backwardstep1() {  
  motor1.onestep(BACKWARD, SINGLE);
}
void forwardstep2() {  
  motor2.onestep(FORWARD, SINGLE);
}
void backwardstep2() {  
  motor2.onestep(BACKWARD, SINGLE);
}
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

void setup()
{
    
}

void loop()
{
    if (stepper1.distanceToGo() == 0)
    {
      stepper1.moveTo(random(10, 90));
      stepper1.setMaxSpeed((random(100, 200)) + 1);
      stepper1.setAcceleration((random(30, 200)) + 1);
    }
    if (stepper2.distanceToGo() == 0)
    {
      stepper2.moveTo(random(80, 700));
      stepper2.setMaxSpeed((random(150, 300)) + 1);
      stepper2.setAcceleration((random(30, 300)) + 1);
    }
    stepper1.run();
    stepper2.run();
}

так чтобы моторы вращались непрерывно, но в случайный момент времени на случайно заданное число секунд выключалась нога ардуинки? 

код вида:

for (int i=0; i < 5+ random(10); i++)
  {
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED,LOW);
  delay(200);
  }

работает только когда все моторы стоят...

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так

uint16_t variant = random(5000);
uint32_t time;
bool led_f;

#define LED 4

void setup(){
  pinMode(LED, OUTPUT);
}

void loop(){

  if(millis() - time >= variant)
  {
    variant = random(5000);
    time = millis();
    led_f = !led_f;
    digitalWrite(LED, led_f);
  }  
}

 

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

после добавления данного кода:

ошибка:

collect2.exe: error: ld returned 5 exit status

по советам в инете добавил:

build.path=C:\TEMP

не помогло.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Не знаю куда и как Вы добавил, но сам код компилится и работает без ошибки. Добавлять его можно в любой скетч и если отсутствуют заддержки типа (delay, while) то работать должен коректно. 

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

нашел, сделал. спасибо.