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

Я использую Arduino Uno с двумя двигателями постоянного тока. Я также использую встроенный светодиод, чтобы сообщить мне, когда моторы должны быть включены, в качестве инструмента отладки. Код представляет собой простой цикл while, который включает моторы и светодиод на 10 секунд, выключает на 5 и повторяет, пока горит ведьма. Это прекрасно работает, когда двигатели не подключены к источнику питания (когда переключатель включен, светодиод включается на 10 секунд, выключается на 5 и так далее), но когда драйвер двигателя подключен к источнику питания, синхронизация изменяется. Двигатели и светодиод горят менее секунды и гаснут на 5. индикатор «вкл.» период немного меняется, как только он даже достигает намеченных 10 секунд.

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

Arduino подключен к 9-вольтовой батарее, а двигатели подключены к 4 батареям AA через драйвер двигателя L298N.

это мой код:

#include <Arduino.h>
int RightSpeedPin = 5;
int Rdir2 = 6;
int Rdir1 = 7;
int led = 13;
int LeftSpeedPin = 10;
int Ldir2 = 8;
int Ldir1 = 9;
int SwitchPin = 4;
int ReadVal;
void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(Rdir1, OUTPUT);
  pinMode(Rdir2, OUTPUT);
  pinMode(RightSpeedPin, OUTPUT);
  pinMode(LeftSpeedPin, OUTPUT);
  pinMode(Ldir1, OUTPUT);
  pinMode(Ldir2, OUTPUT);
  pinMode(SwitchPin, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {  
  ReadVal = digitalRead(SwitchPin);
  while (ReadVal == 1)
  {
    digitalWrite(led, HIGH);
  // исходная ситуация - оба двигателя движутся вперед
    // работает 10 секунд
    digitalWrite(Rdir1, HIGH);
    digitalWrite(Ldir1, HIGH);
    digitalWrite(Rdir2, LOW);
    digitalWrite(Ldir2, LOW);
    analogWrite(RightSpeedPin, 255);
    analogWrite(LeftSpeedPin, 255);
    delay(10000);
    // выключено на 5
    analogWrite(RightSpeedPin, 0);
    analogWrite(LeftSpeedPin, 0);
    digitalWrite(led, LOW);
    ReadVal = digitalRead(SwitchPin);
    delay(5000);
  }
}

ссылка на схемы. это грубо, я не очень опытен в рисовании схем. Обратите внимание, что все заземляющие провода подключены к шине заземления макетной платы, отличной от 9В, которая питает Arduino. он подключен к круглой вилке, поэтому у меня нет отдельных проводов. РЕДАКТИРОВАТЬ: исправлена схема схема

, 👍1

Обсуждение

Схема вашей установки не помешала бы. Можно фото, если все провода хорошо видны. Также ваше предложение: "...и работает от отдельного источника питания)". звучит важно, но сбивает с толку. Я бы написал ОТВЕТ, но я только предполагаю без схемы ... вы подключили питание 5 В между платой двигателя Arduino и L298N?, @st2000

мое первое предположение состоит в том, что состояние переключателя не определяется правильно ... используйте подтягивающий резистор ... второе предположение заключается в том, что arduino сбрасывает ... у вас нет кода, чтобы сообщить вам, когда выполняется setup() .. , используйте Serial.print() для отладки сообщений... или дважды помигайте светодиодом внутри setup(), @jsotola

добавил схемы. что мне подскажет мигание внутри настройки?, @young marx

подумайте о том, когда выполняется setup () ... снова прочитайте весь мой комментарий, @jsotola

Пожалуйста, вставьте схему в свой вопрос, не используйте внешние ресурсы, так как они могут исчезнуть., @the busybee

символы батареи нарисованы назад, @jsotola


1 ответ


Лучший ответ:

0

После отладки путем печати:

sTime = millis();
analogWrite(RightSpeedPin, 255);
analogWrite(LeftSpeedPin, 255);
delay(5000);
analogWrite(RightSpeedPin, 0);
analogWrite(LeftSpeedPin, 0);
Serial.print(millis() - stime);

Время меньше 300 мс, сброса нет (в настройки добавлена печать). Я до сих пор понятия не имею, почему. после этого я просто заменил задержку на while (millis() < Stime + t) {, что решило мою проблему.

,