Из-за сервопривода происходит ошибка отработки операций

Здравствуйте, подскажите, почему из-за сервопривода sr90 происходит баг в схеме, пробовал подключать 3, и на каждом это происходит, без него все ок. При шаге меньше 3, происходит рандомно, раз через раз. Нашёл в интернете, что это может быть из-за короткого замыкания которое происходит из-за нехватки питания, подключаю к ПК, блока питания и кроны 9 в. Ниужели модуль не тянет какую простую схему? Видел в интернете, что подключали и 3 сервопривода без внешнего питания для них в Nano. Или же где-то косячу в конде?
Подключено:сервопривод, пьезоизлучатель, датчик движения инфорокрасный, светодиод, arduino uno(орег.) .
По сценарию: при срабатывании датчика движения происходит движение сервопривода, мигание светодиода, проигрывается милодия, потом все в переходит в режим ожидания.
На факту: при срабатывании датчика движения происходит движение сервопривода, мигание светодиода, проигрывается милодия, потом все повторяется по кругу без остановки.

cpp
#include <Servo.h>

#define servoPin 9
#define motionSensorPin 6
#define piezoPin 11
#define ledPin 13

Servo myservo;
int pos = 0;
int motionState = LOW;
bool servoStopped = false;

const int melodyNotes = {392, 392, 392, 311, 466, 392, 311, 466, 392, 587, 587, 587, 622, 466, 369, 311, 466, 392, 784, 392, 392, 784, 739, 698, 659, 622, 659, 415, 554, 523, 493, 466, 440, 466, 311, 369, 311, 466, 392};
const int melodyTimes = {350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 250, 100, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 750};
int melodyLength = 39;
int currentNote = 0;

void setup() {
myservo.attach(servoPin);
pinMode(motionSensorPin, INPUT);
pinMode(piezoPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println(“Скетч запущен”);
}

void loop() {
motionState = digitalRead(motionSensorPin);

if (motionState == HIGH) {
Serial.println(“Обнаружено движение!”);
turnServo(90);
blinkLED(4);
playMelody();
turnServo(180);
delay(1000);
}

if (servoStopped && motionState == LOW) {
delay(5000);
servoStopped = false;
}

delay(100);
}

void turnServo(int angle) {
int step = 1;

if (angle < pos) {
step = -1;
}

while (pos != angle) {
pos += step;
myservo.write(pos);
delay(15);
}

servoStopped = true;
}

void blinkLED(int numTimes) {
for (int i = 0; i < numTimes; i++) {
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(250);
}
}

void playMelody() {
for (int i = 0; i < melodyLength; i++) {
tone(piezoPin, melodyNotes[i]);
delay(melodyTimes[i]);
noTone(piezoPin);
delay(melodyTimes[i]);
}
}

сразу ко всем трем? Схему нарисуйте?

Или вы не поняли, как подключено, или автор наврал

Я две синие подключал к nano - все нормально было.
Возьмите пример от библиотеки Servo и погоняйте - сразу узнаете, на что рассчитывать.

В какой?

Мы не видели никакой схемы.

1 лайк

Вот схема :upside_down_face:
Подключается всегда один.

IMG_20231017_215331_049_edit_1119877306421825

Сам по себе в любом скетче работает: при управлении с кнопки и пр. А с датчикоми почему-то так.

Питание платы какое?
На первой картинке в круглый разъем, а на второй схеме в на пин 5в.
Где правильно?

Сколько раз выполнится данное условие, как только датчик движения сработает: if (motionState == HIGH) ?

Проблема остаётся при любом из 2 подключений питания.

1 раз.
Также 1 раз если отключить серво и если шаг поставить на 1(работает через раз) .
Лог датчика показывает low, значит проблема не в нем.
Эмулятор arduino тоже делает правильно, а по факту все идёт по кругу.

А я вижу, что неограниченно - пока датчик удерживает HIGH, все мотается туда-сюда.

с чего вы так решили?
Что помешает вашей мелодии играть еще и еще - покажите в коде?

В каком месте у вас в коде выводится “лог датчика”?

Да, верно, пока датчик движения (Hc-sr505) отдаёт H или 1, будет отрабатывать все по кругу. Если он не фиксирует движения он отдаёт L или 0 и тогда действия не выполняются.

задача решена?

Не в этом коде, я переписывал его, чтобы проверить.
Повторюсь - если отключить серво, действия выполняются 1 раз, все переходит в режим ожидания команды от датчика движения.

Что-то я потерялся, мы какой код проверяем - этот или какой-то другой?
Говорите только то, что относится к этому коду.

Если речь про него - тогда снова повторю свой вопрос - покажите мне что-либо в этом коде, что не даст вашей мелодии проигрыватся снова при сохранении сигнала на сенсоре?

И да - раз уж вы упомянули некий “лог датчика” - то добавьте его в код и посмотрите, какой состояние датчика будет печататься, когда у вас снова все пойдет по кругу.

Мой вопрос был не про код, а почему из-за сервопривода код выполняется бесконечно.

if (servoStopped && motionState == LOW) {
delay(5000);
servoStopped = false;

Это не даст проигрываться бесконечно.
Думаю вы и сами знаете, что этот датчик и его младшая версия могут работать и без ардуино, в связке с реле могут выполнять все тоже что и в скетче.)
Я потерял суть, к чему это. Если я уже объяснял, что если подключить что-то другое, или же шаговый мотор тогда все работает как нужно.

С какой стати?
Это условие сработает только тогда, когда датчик УЖЕ ВЫКЛЮЧИЛСЯ. А мы обсудаем случай, когда он выдает сигнал.

Еще раз - добавьте вывод состояния датчика в Сериал - сразу после digotalRead() - и посмотрите, что там будет печататься. Тогда можно будет делать выводы.

А пока вы явно сами не ориентируйтесь в ошибках этого кода.

Я пока не уверен, что это так. Я не к тому, что вы врете - просто похоже что вы вообще не понимаете, что происходит.

Мне и нужно, чтобы он работал непрерывно пока датчик выдаёт сигнал. Поэтому я добавил только проверку остановки серво, а не датчика. Естественно можно добавить задержку, отключение, но зачем?)