Создание анимации с помощью шаговых двигателей

Здравствуйте!

помогите создать скеч для ардуино 256 и 4 Шаговых двигателя 28BYJ-48 с драйвером на микросхеме ULN2003.

пины на 1 мотор 2, 3, 4, 5

пины на 2 мотор 6, 7, 8, 9

пины на 3 мотор 10, 11, 12, 13

пины на 4 мотор 14, 15, 16, 17

> концевики нужны для высталения шариков в одну линию

пин 22 на коцевик 1 ( который останавливает мотор 1 при нажатии на концевик)

пин 23 на коцевик 2 ( который останавливает мотор 2 при нажатии на концевик)

пин 24 на коцевик 3 ( который останавливает мотор 3 при нажатии на концевик)

пин 25 на коцевик 4 ( который останавливает мотор 4 при нажатии на концевик)

**

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

**

описание логики:

> это выполняется только раз при включении ардуино:

когда подали питание на ардуино моторы 1 - 4 стали крутиться против часовой стрелки (шарик на нитке стал опускаться) и когда шарик 1 нажал концевик 1 - мотор 1 остановиля до выполения следующей команды. так и с дугими моторами должно быть.

когда все 4 шарика опущены и все 4 концевика нажаты переходим к выполнению анимации.

> это повторяется

АНИМАЦИЯ для примера:

мотор 1 сделал 8 оборотов по часовой стрелке ( и поднял шарик на 10см)

мотор 2 сделал 6 оборотов по часовой стрелке ( и поднял шарик на 8см)

мотор 3 сделал 4 оборотов по часовой стрелке ( и поднял шарик на 6см)

мотор 4 сделал 2 оборотов по часовой стрелке ( и поднял шарик на 4см)

пауза 5 секунд

мотор 1 сделал 8 оборотов против часовой стрелке ( и опустил шарик на 10см)

мотор 2 сделал 6 оборотов против часовой стрелке ( и опустил шарик на 8см)

мотор 3 сделал 4 оборотов против часовой стрелке ( и опустил шарик на 6см)

мотор 4 сделал 2 оборотов против часовой стрелке ( и опустил шарик на 4см)

пауза 5 секунд

и потом запускает анимацию сначала и так пока не выключим питание.

Как вы представляете оказание этой помощи?

1 лайк

Да всё банально. В строке 72 точку с запятой забыли.
Не стоит благодарностей.

Ничего оригинального тут нет.

Сначала надо научиться двумя моторами вращать, вот так хотя бы.


А потом можно и большим числом.

1 лайк

Вот вижу вы дельный человек , сразу все решили :slight_smile: , не то что другие начинают деньги вымогат.

Вы раскрыли мой замысль :slight_smile: типо такой анимации хотел сделать но в очень украшенном виде. Один знакомый написал мне код но он с пультом и на 1000 строк я там не разбираюсь как пульт убрать и что к чему , сам попробывал вникнуть в написании программы на симуляторе но с концевиками не хочет рвботат . Вот и обратился сюда

@sadman41 уже сказал. Повторюсь. Что конкретно требуется от нас? Общие рекомендации? Ок.
У Гайвера есть соответствующая библиотека для ШД. Объявляйте 4 движка и крутите их как угодно. Там всё разжевано. Концевики на прерывания.

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

Видимо, на 727-ой странице третьего тома краткого списка хотелок знакомый сломался.

2 лайка

Долгие вы все. ТС наверняка уже хочет другую хотелку, 728ю, а вы всё о старом. Поэтому и исчез.

сударь я был занят работой к сожалению. вот код который сгенерировал искусстенный интелект . все вроде бы правильно написано но на симуляторе не работает. сегодня попробую загрузить на ардуинку.

#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 2, 3, 4, 5);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 14, 15, 16, 17);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 6, 7, 8, 9);
AccelStepper stepper4(AccelStepper::FULL4WIRE, 10, 11, 12, 13);

const int limitswitch1 = A1;
const int limitswitch2 = A2;
const int limitswitch3 = A3;
const int limitswitch4 = A4;

void setup() {
stepper1.setMaxSpeed(1000);
stepper1.setAcceleration(500);

stepper2.setMaxSpeed(1000);
stepper2.setAcceleration(500);

stepper3.setMaxSpeed(1000);
stepper3.setAcceleration(500);

stepper4.setMaxSpeed(1000);
stepper4.setAcceleration(500);

pinMode(limitswitch1, INPUT_PULLUP);
pinMode(limitswitch2, INPUT_PULLUP);
pinMode(limitswitch3, INPUT_PULLUP);
pinMode(limitswitch4, INPUT_PULLUP);
}

void loop() {
// START 1
stepper1.setSpeed(-100); // Rotate counter-clockwise
stepper2.setSpeed(-100);
stepper3.setSpeed(-100);
stepper4.setSpeed(-100);

if (digitalRead(limitswitch1) == LOW)
stepper1.setCurrentPosition(0); // Stop stepper and reset position

if (digitalRead(limitswitch2) == LOW)
stepper2.setCurrentPosition(0);

if (digitalRead(limitswitch3) == LOW)
stepper3.setCurrentPosition(0);

if (digitalRead(limitswitch4) == LOW)
stepper4.setCurrentPosition(0);

stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();
stepper4.runSpeed();

delay(1500);

// START 2
stepper1.moveTo(stepper1.currentPosition() + 10 * stepper1.stepsPerRevolution()); // Rotate clockwise by 10 revolutions
stepper2.moveTo(stepper2.currentPosition() + 8 * stepper2.stepsPerRevolution());
stepper3.moveTo(stepper3.currentPosition() + 6 * stepper3.stepsPerRevolution());
stepper4.moveTo(stepper4.currentPosition() + 4 * stepper4.stepsPerRevolution());

while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0 || stepper3.distanceToGo() != 0 || stepper4.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
}

delay(1500);

// START 3
stepper1.moveTo(stepper1.currentPosition() + 8 * stepper1.stepsPerRevolution()); // Rotate clockwise by 8 revolutions
stepper2.moveTo(stepper2.currentPosition() + 6 * stepper2.stepsPerRevolution());
stepper3.moveTo(stepper3.currentPosition() + 4 * stepper3.stepsPerRevolution());
stepper4.moveTo(stepper4.currentPosition() + 2 * stepper4.stepsPerRevolution());

while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0 || stepper3.distanceToGo() != 0 || stepper4.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
}

delay(1500);
}

вот другой вариан но на эмуляторе wokwi тоже не работает

#include <AccelStepper.h>

// Подключение пинов для мотора
#define MOTOR_PIN1 2
#define MOTOR_PIN2 3
#define MOTOR_PIN3 4
#define MOTOR_PIN4 5

// Подключение пина для конечного выключателя
#define LIMIT_SWITCH 22

// Инициализация мотора
AccelStepper stepper(AccelStepper::FULL4WIRE, MOTOR_PIN1, MOTOR_PIN2, MOTOR_PIN3, MOTOR_PIN4);

// Текущее состояние для работы в switch
enum State {
WAITING_LOW,
CW_ROTATION,
WAITING_HIGH,
STOPPED,
PAUSE,
CCW_ROTATION,
SECOND_LOW,
FINAL_PAUSE,
FINAL_ROTATION
};

State currentState = WAITING_LOW;

void setup() {
// Установка скорости мотора
stepper.setMaxSpeed(1000);

// Установка конечного выключателя как входа
pinMode(LIMIT_SWITCH, INPUT);
}

void loop() {
switch (currentState) {
case WAITING_LOW:
if (digitalRead(LIMIT_SWITCH) == LOW) {
currentState = CW_ROTATION;
stepper.moveTo(200); // Направление и расстояние для поворота по часовой стрелке
stepper.setSpeed(500); // Установка скорости
}
break;

case CW_ROTATION:
  if (stepper.distanceToGo() == 0) {
    currentState = WAITING_HIGH;
    stepper.stop();
  }
  stepper.run();
  break;

case WAITING_HIGH:
  if (digitalRead(LIMIT_SWITCH) == HIGH) {
    currentState = STOPPED;
    stepper.stop();
  }
  break;

case STOPPED:
  delay(5000); // Пауза 5 секунд
  currentState = PAUSE;
  break;

case PAUSE:
  currentState = CCW_ROTATION;
  stepper.moveTo(-1600); // Направление и расстояние для поворота против часовой стрелки (3 оборота)
  stepper.setSpeed(500); // Установка скорости
  break;

case CCW_ROTATION:
  if (stepper.distanceToGo() == 0) {
    currentState = SECOND_LOW;
    stepper.stop();
  }
  stepper.run();
  break;

case SECOND_LOW:
  if (digitalRead(LIMIT_SWITCH) == LOW) {
    currentState = FINAL_PAUSE;
  }
  break;

case FINAL_PAUSE:
  delay(5000); // Пауза 5 секунд
  currentState = FINAL_ROTATION;
  stepper.moveTo(200); // Направление и расстояние для поворота (1 оборот)
  stepper.setSpeed(500); // Установка скорости
  break;

case FINAL_ROTATION:
  if (stepper.distanceToGo() == 0) {
    currentState = WAITING_LOW;
    stepper.stop();
  }
  stepper.run();
  break;

}
}

у Гайвера это где ?

он уже устал от меня :slight_smile:

Проблему нельзя решить на том же уровне,на котором она возникла.
Блин,на сайте alexgyver.ru поищи,там 99% всего что используется в Ардуино.

1 лайк

ага поподался мне этот сайт на просторах интернета. но там того что надо не нашел. зато нашел программу для управлени жалюзями. но пробывал модифицировать ее под мои требования и не как :frowning:

const int buttonPin0 = 14; //14 контакт он же А0 для концевека

          const int buttonPin1 = 15; //15 контакт он же A1 мотор 1 вправо
          const int buttonPin2 = 16; //16 контакт он же A2 мотор 1 влево
          const int buttonPin3 = 17; //17 контпкт он же A3 мотор 2 вправо
          const int buttonPin4 = 18; //18 контпкт он же A4 мотор 2 влево

int buttonState0 = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;

int i = 0;
int i1 = 0;
int i2 = 0;

const int t1 = 4; //НАСТРОЙКА!!!//
const int t2 = 4; //НАСТРОЙКА!!!//
const int x1 = 1000; //НАСТРОЙКА!!!//
const int x2 = 1000; //НАСТРОЙКА!!!//

void setup() {
pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT);
pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT);
pinMode(14, INPUT_PULLUP);
pinMode(15, INPUT_PULLUP);
pinMode(16, INPUT_PULLUP);

}

void vyhod() { //функция для выхода из цикла
buttonState1 = digitalRead(buttonPin1); buttonState2 = digitalRead(buttonPin2);

if (buttonState1 == LOW) {
i1 = x1;
i2 = x2;
delay(500);
} if (buttonState2 == LOW) {
i1 = x1;
i2 = x2;
delay(500);
}

}

void vpravo1() {
digitalWrite(7, HIGH); digitalWrite(5, LOW); delay(t1);
digitalWrite(6, HIGH); digitalWrite(4, LOW); delay(t1);
digitalWrite(5, HIGH); digitalWrite(7, LOW); delay(t1);
digitalWrite(4, HIGH); digitalWrite(6, LOW); delay(t1);
}

void vlevo1() {
digitalWrite(4, HIGH); digitalWrite(6, LOW); delay(t1);
digitalWrite(5, HIGH); digitalWrite(7, LOW); delay(t1);
digitalWrite(6, HIGH); digitalWrite(4, LOW); delay(t1);
digitalWrite(7, HIGH); digitalWrite(5, LOW); delay(t1);
}

void vpravo2() {
digitalWrite(13, HIGH); digitalWrite(11, LOW); delay(t2);
digitalWrite(12, HIGH); digitalWrite(10, LOW); delay(t2);
digitalWrite(11, HIGH); digitalWrite(13, LOW); delay(t2);
digitalWrite(10, HIGH); digitalWrite(12, LOW); delay(t2);
}

void vlevo2() {
digitalWrite(10, HIGH); digitalWrite(12, LOW); delay(t2);
digitalWrite(11, HIGH); digitalWrite(13, LOW); delay(t2);
digitalWrite(12, HIGH); digitalWrite(10, LOW); delay(t2);
digitalWrite(13, HIGH); digitalWrite(11, LOW); delay(t2);
}

void vyklPins() {
digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW);
digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); delay(500);
}

void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 == LOW) {
delay(500);
while (i1 < x1) { //цикл для вращения мотора 1 вправо
vpravo1(); i1++; vyhod();
buttonState0 = digitalRead(buttonPin0);
if (buttonState0 == LOW) {
delay(100); i1 = x1;
while (i < 50) { //НАСТРОЙКА!!!//
vlevo1(); i++;
} i = 0; vyklPins();
}
}
i1 = 0; vyklPins();
}

buttonState2 = digitalRead(buttonPin2);
if (buttonState2 == LOW) {
delay(500);
while (i1 < x1) { //цикл для вращения мотора 1 влево
vlevo1(); i1++; vyhod(); //функция для выхода из цикла
buttonState0 = digitalRead(buttonPin0);
if (buttonState0 == LOW) {
delay(100); i1 = x1;
while (i < 50) { //НАСТРОЙКА!!!//
vpravo1(); i++;
} i = 0; vyklPins();
}
} i1 = 0; vyklPins();
}
}

Пробывайте ещё, не отступайте, мы в Вас верим!

1 лайк

Спасибо за очень содержательную помощь :wink:

Не за что. Всегда рады. Обращайтесь ещё.

Пропробывай еще русский язык подтянуть и IQ нарастить, хотя бы силиконом