Проблема начинающего с двигателем постоянного тока

Я новичок в электронике, и у меня возникла проблема при создании проекта. Я создал марсоход, управляемый через Bluetooth, используя HC-06, драйвер двигателя с двойным H-мостом и 4 двигателя постоянного тока. Однако только два двигателя постоянного тока движутся, а два других остаются неподвижными.

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

Прилагается схема подключения двигателей и код.

char t;

void setup() {
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()) {
    t = Serial.read();
    Serial.println(t);
  }

  if(t == '1') {
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(12,LOW);
  }

  else if(t == '2') {
    digitalWrite(9,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(12,HIGH);
  }

  else if(t == '3') {
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(12,LOW);
  }

  else if(t == '4'){ 
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);
  }

  else if(t == '5') {
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);
  }

  delay(100);
}

Схема подключения

, 👍0

Обсуждение

Я видел этот вопрос несколько раз. Что вы сделали для исследования проблемы? Вы тестировали каждую вещь отдельно: плату Arduino, модуль драйвера и двигатели., @Jot

Почему вы публикуете новый вопрос, а не редактируете свой? Дубликат https://arduinoprosto.ru/q/56995/basic-question-on-dc-motors, @chrisl


1 ответ


3

Чтобы проанализировать вашу проблему:

  1. Переключите два провода между двумя двигателями (и повторите это, чтобы получить все комбинации), чтобы выяснить, неправильный ли код/проводка до двигателей или возникла проблема с двигателями.
  2. Распечатайте значения контактов 9, 10, 11 и 12, а также значение t/input, чтобы проверить, управляются ли контакты так, как вы ожидаете.
  3. Удалите все двигатели, кроме одного, по одному, чтобы проверить, нет ли между ними влияния.

Ниже не является ответом на ваш вопрос, но я могу только привести код в соответствие с ответом.

Лучше использовать следующую форму кодирования:

void loop() {
  if(Serial.available()){
    t = Serial.read();
    Serial.println(t);
  }

  if ((t >= '1') && (t <= '5'))      
  {
    int input = (int) t - (int)'0';

    digitalWrite( 9, (input == 1) || (input == 4) ? HIGH : LOW);
    digitalWrite(10, (input == 2)                 ? HIGH : LOW);
    digitalWrite(11, (input == 1) || (input == 3) ? HIGH : LOW);
    digitalWrite(12, (input == 2)                 ? HIGH : LOW);
  }

  delay(100);
}

Примечание: ? : – это тернарный оператор, который означает: a ? b : c => если a, то b else c.

Вместо использования 9, 10, 11, 12 определите номера контактов (например, PIN_MOTOR_X), а для номеров ввода 1, 2, 3, 4, 5 определите ВЛЕВО, ВПРАВО, ВВЕРХ/ВПЕРЕД, ВНИЗ/НАЗАД, СТОП.< /п>

,

Я не знаю, согласен ли я с тем, что код — лучший стиль кодирования, но он определенно намного компактнее. Я немного не согласен с тем, что это «лучше», потому что менее очевидно, что делает код. Часть хорошего стиля кода — сделать его читабельным. Это неплохой код, просто неочевидный. Я определенно согласен, что присвоение названия двигателям значительно улучшит ситуацию., @computercarguy

@computercarguy На самом деле, возможно, было бы лучше написать отдельный digitalWrite, в котором есть параметр для «логического значения», чтобы тройной оператор не требовался (четыре раза). (при условии, что вас беспокоит тернарный оператор, и я это понимаю)., @Michel Keijzers

Да, есть много разных способов написать это. Мне бы не хотелось поддерживать то, как вы это сделали, и это только из-за умственной нагрузки, связанной с выяснением того, что происходит. Я склонен писать вещи более ясно/просто, поэтому мне не нужно особо думать об этом, когда мне придется читать это позже. Абстрагирование digitalWrite, вероятно, было бы одним из лучших способов упростить эту задачу. И да, когда в блоке кода более одного троичного кода, у меня покрывается холодным потом. :-) Я знаю, как легко ими злоупотреблять., @computercarguy