Проблема с кодом для колёсного робота

Тема в разделе "Arduino & Shields", создана пользователем _Assassin_, 30 мар 2018.

  1. _Assassin_

    _Assassin_ Нерд

    Всем привет! Сегодня я пытался привязать моего четырёхколёсного робота и ИК-приёмник, и возникла одна проблема: в скетче, приведённом ниже, D1 и D2 обозначают направление колёс с помощью команд HIGH и LOW, где HIGH– вперёд, а LOW– назад. Но когда я нажимаю на кнопку, например, обозначающую движение назад, то двигатели просто отключаются, или когда я нажимаю на кнопку поворота вправо, то левая пара двигателей начинает движение, а правая – нет.

    Сам скетч:

    Код (C++):
    #include <IRremote.h>
    #include <Wire.h>
    #define D1 11
    #define M1 6
    #define D2 10
    #define M2 9
    int value = 110;
    const int IR_PIN = A0;
    IRrecv irrecv(IR_PIN);
    decode_results results;
    const unsigned long vpered = 16736925;
    const unsigned long nazad = 16754775;
    const unsigned long vlevo = 16720605;
    const unsigned long vpravo = 16761405;
    const unsigned long stopp = 16712445;
    void setup() {
    irrecv.enableIRIn();
    pinMode(D1, OUTPUT);
    pinMode(D2, OUTPUT);
    pinMode(M1, OUTPUT);
    pinMode(M2, OUTPUT);
    Serial.begin(9600);
    }
    void loop() {
    if(irrecv.decode(&results))
    {
    Serial.println(results.value);
    if(results.value == vpered)
    {
    digitalWrite(D1, HIGH);
    digitalWrite(D2, HIGH);
    analogWrite(M1, value);
    analogWrite(M2, value);
    }
    if(results.value == nazad)
    {
    digitalWrite(D1, LOW);
    digitalWrite(D2, LOW);
    analogWrite(M1, value);
    analogWrite(M2, value);
    }
    if(results.value == vlevo)
    {
    digitalWrite(D1, HIGH);
    digitalWrite(D2, LOW);
    analogWrite(M1, 100);
    analogWrite(M2, 200);
    }
    if(results.value == vpravo)
    {
    digitalWrite(D1, LOW);
    digitalWrite(D2, HIGH);
    analogWrite(M1, 200);
    analogWrite(M2, 100);
    }
    if(results.value == stopp)
    {
    digitalWrite(D1, HIGH);
    digitalWrite(D2, HIGH);
    analogWrite(M1, 0);
    analogWrite(M2, 0);
    }
    irrecv.resume();
    }
    }
     
  2. ostrov

    ostrov Гуру

    С чего взято, что LOW включает назад?
     
  3. parovoZZ

    parovoZZ Гуру

    LOW - это стоп, а не назад. Тогда все встает на свои места.
     
  4. _Assassin_

    _Assassin_ Нерд

    А можно ли заменить какими-либо командами HIGH и LOW, чтобы робот работал по задумке?
     
  5. parovoZZ

    parovoZZ Гуру

    Ну ты же должен понимать, что программа очень тесно связана со схемотехникой?
     
  6. a1000

    a1000 Гуру

    А что в нём за схемотехника? На чём он ездит?
     
  7. _Assassin_

    _Assassin_ Нерд

    Четыре коллекторных мотора.
     

    Вложения:

    • 9wAnPlMInv4.jpg
      9wAnPlMInv4.jpg
      Размер файла:
      186,9 КБ
      Просмотров:
      633
    • COIiEsxAXmA.jpg
      COIiEsxAXmA.jpg
      Размер файла:
      209,1 КБ
      Просмотров:
      400
  8. parovoZZ

    parovoZZ Гуру

    И?
     
  9. a1000

    a1000 Гуру

    И как я понимаю драйвер
    L298N
     
  10. a1000

    a1000 Гуру

    Судя по рисунку на тележке установлен модуль двухканального драйвера двигателей L298N. Не имея такого под рукой и не имея опыта работы с ним (да и с коллекторными двигателями) покопал немного на просторах интернета. Выкопал такую статью http://zelectro.cc/motor_shield_l298n_arduino
    Возник ряд вопросов по подключению и скетчу.
    Что скрывается за обозначениями D1 и D2, M1 и M2? В каком режиме работает драйвер - "активный", "пассивный"? Судя по тому, что каждый канал подключен то двум линиям - "пассивный". Но в скетче с помощью ШИМ задаётся скорость вращения. Можно предположить, что схему упростили - IN2 сразу посадили на "землю", а IN1 это D1 и ENA это М1 (по второму каналу аналогично). Тогда всё немного начинает сходиться. Скетч действительно будет работать с указанными _Assassin_ ошибками и реверс двигателей при таком подключении невозможен. Если я прав, то всё исправимо. Для начала прошу автора внимательно посмотреть и сообщить схему подключения драйвера к arduino. Меня интересует куда подключены выводы драйвера (он у вас виден на первом фото) которые на моём рисунке обозначена как "Управляющие выводы"? И стоят-ли у вас джамперы как на рисунке а2?
     

    Вложения:

    • L298N_pins.jpg
      L298N_pins.jpg
      Размер файла:
      146,9 КБ
      Просмотров:
      376