Управление двумя шаговыми двигателями 28BYJ-48 5V одновременно по сигналу прерывания.
- Войдите на сайт для отправки комментариев
Нужна помощь. В 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();
}
Странно, что он вообще работал.
вы бы посмотрели примеры в библиотеке AccelStepper и поигрались с ними, а потом за проект брались.
jur47mih04bryu, а зачем Вы поворачиваете шаговики в разные стороны?
Вращайте в одну и ту же, и тогда управление существенно упростится. (возможно, поменяь местами обмотки)