Управление двумя шаговыми двигателями 28BYJ-48 5V одновременно по сигналу прерывания.

jur47mih04bryuio
jur47mih04bryuio аватар
Offline
Зарегистрирован: 14.07.2016

Нужна помощь.  В 2017 году сконструировал скетч: по сигналу прерывания одновременно вращались шаговики  -28BYJ-48 5v, один вправо на 140 град., другой влево на -140 град. (Открывались две половинки ворот.) Через некоторое время то же по сигналу прерывания две половинки ворот одновременно закрывались. После перерыва в работе полтора года в 2019 г вновь пытался запустить скетч. Но компиляция не проходила.  Появились ошибки.   Загрузил последнюю редакцию IDE, новые библиотеки. Компиляция стала проходить без замечаний, но скетч стал работать не правильно: на открытие стал работать только один шаговик (ШД). По второму сигналу прерывания на закрытие работал уже другой ШД. Первый не двигался. И так далее. Не могу разобраться, что произошло в скетче. Прошу помочь. Работал с Arduino Mega и Мотор Шилдом. В скетче ещё включён  код на проигрование колокольных звонов.  Привожу сам скетч.

#include <MultiStepper.h>
#include <AFMotor.h>
#include <AccelStepper.h>
#include <DFPlayer_Mini_Mp3.h>
volatile byte intruder;
// two stepper motors one on each port
AF_Stepper motor1(64, 1);
AF_Stepper motor2(64, 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);
    mp3_set_serial (Serial);    //set Serial for DFPlayer-mini mp3 module 
    delay (100);
    mp3_set_volume (20);
    delay (100);
    mp3_play (1);  // Проигрываем "mp3/0001.mp3" 

 attachInterrupt (0,intruder_detect,FALLING);  //Initialize the intterrupt pin for the motion sensor (Arduino digital pin 2)
intruder = 0;     //Инициализировать вывод прерывания для датчика движения (цифровой контакт 2 Arduino)
  
    stepper1.setMaxSpeed(120.0);
    stepper1.setAcceleration(100.0);
    stepper1.moveTo(750);
    
    stepper2.setMaxSpeed(100.0);
    stepper2.setAcceleration(100.0);
    stepper2.moveTo(-760);
    }
void loop()
{
    stepper1.run();
    stepper2.run();
}

void intruder_detect()  //This function is called whenever an intruder is detected by the arduino

{                      
  
intruder++;
{ 
    Serial.begin (9600);
    mp3_set_serial (Serial);    //set Serial for DFPlayer-mini mp3 module 
    delay (100);
    mp3_set_volume (20);
    delay (100);
    mp3_play (1);  // Проигрываем "mp3/0001.mp3" 
  
    stepper1.setMaxSpeed(100.0);
    stepper1.setAcceleration(80.0);
    stepper1.moveTo(-40);
    
    stepper2.setMaxSpeed(120.0);
    stepper2.setAcceleration(80.0);
    stepper2.moveTo(-7);
}   
    stepper1.run();
    stepper2.run();
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Странно, что он вообще работал.

vvadim
Offline
Зарегистрирован: 23.05.2012

вы бы посмотрели примеры в библиотеке AccelStepper и поигрались с ними, а потом за проект брались.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

jur47mih04bryu, а зачем Вы поворачиваете шаговики в разные стороны?

Вращайте в одну и ту же, и тогда управление существенно упростится. (возможно, поменяь местами обмотки)