Управление двигателем постоянного тока

Тема в разделе "Arduino & Shields", создана пользователем KeriLs, 6 сен 2016.

  1. KeriLs

    KeriLs Нуб

    Здравствуйте. Хочу протестировать процесс управление двигателем постоянного тока через ИК датчик. Но пока что у меня ничего не получается.

    Для подключения двигателя к ардуине использую плату Мотор Шилд. Шилд и датчик проверял отдельно на тестовых скетчах - оба работают.

    Соединил всё как показано на рисунке. Написал вот такой скетч. Подскажите, пожалуйста в чём ошибка. Спасибо.
    Код (C++):
    #include "IRremote.h"
    #include <AFMotor.h>

    IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    decode_results results;

    // создаем объект motor №2, ШИМ 64 кГц
    AF_DCMotor motor2(2, MOTOR12_64KHZ);

    void setup() {
      irrecv.enableIRIn(); // запускаем прием

    Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод
    motor2.setSpeed(200); // устанавливаем скорость вращения 200/255

    }

    void loop() {
      if ( irrecv.decode( &results )) { // если данные пришли
        switch ( results.value ) {
        case 0xFD00FF: // нажимаем кнопку "1"
            motor2.run(FORWARD); // вращение вперед
            break;
        case 0xFD807F: // нажимаем кнопку "2"
            motor2.run(BACKWARD); // в другую сторону
            break;
        }
        irrecv.resume(); // принимаем следующую команду
      }
    }
    Датчик подключал ко второму выводу (как указано в скетче). Всё питается от 5 вольт подаваемых через юсб кабель на ардуино. Я также пробовал зажигать и гасить светодиод через датчик с помощью команд от пульта- у меня всё работало.

    [​IMG]
    [​IMG]
    [​IMG]
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    возможно у выхода USB не хватает мощности для запуска мотора. Нужен внешний БП.

    У меня нет такой библиотеки, но есть подозрение что метод .run требует постоянного обращения, а не разового.
    Вот этот код как работает?
    Код (C++):
    #include "IRremote.h"
    #include <AFMotor.h>
    IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    decode_results results;
    // создаем объект motor №2, ШИМ 64 кГц
    AF_DCMotor motor2(2, MOTOR12_64KHZ);
    void setup() {
      irrecv.enableIRIn(); // запускаем прием
    Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод
    motor2.setSpeed(200); // устанавливаем скорость вращения 200/255
    }

    void loop()
    {
       motor2.run(FORWARD); // вращение вперед
       delay(10000);                  // а если убрать эту строку, то как будет работать?
    }
     
  3. KeriLs

    KeriLs Нуб

    У этой библиотеки есть тестовый скетч. С помощью него я тестировал шилд. Также питал через юсб и мотор крутился 3 секунды в одну сторону и 3 секунды в другую.

    Ваш код не работает. Мотор не крутится. Совсем. Даже после удаления строки
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    а если убрать все, что относится к IRremote?
    Код (C++):
    //#include "IRremote.h"
    #include <AFMotor.h>
    //IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    //decode_results results;
    // создаем объект motor №2, ШИМ 64 кГц
    AF_DCMotor motor2(2, MOTOR12_64KHZ);
    void setup() {
    //  irrecv.enableIRIn(); // запускаем прием
    Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод
    motor2.setSpeed(200); // устанавливаем скорость вращения 200/255
    }

    void loop()
    {
       motor2.run(FORWARD); // вращение вперед
       delay(10000);                  // а если убрать эту строку, то как будет работать?
    }
     
  5. KeriLs

    KeriLs Нуб

    Если убрать всё от IRremote, то можно составить примерно следующее:
    Код (C++):
    #include <AFMotor.h>

    // создаем объект motor №2, ШИМ 64 кГц
    AF_DCMotor motor2(2, MOTOR12_64KHZ);

    void setup() {

    Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод
    motor2.setSpeed(200); // устанавливаем скорость вращения 200/255

    }

    void loop() {

      motor2.run(FORWARD); // вращение вперед
      delay(3000);
      motor2.run(BACKWARD); // в другую сторону
      delay(3000);
    }
    Этот код работает
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    значит библиотеки IRremote.h и AFMotor.h используют одно и то же прерывание и вместе работать не могут (без ковыряния в недрах).
     
  7. KeriLs

    KeriLs Нуб

    Да, я тоже что то подобное прочитал на форумах. Эх... надо разбираться
     
  8. KeriLs

    KeriLs Нуб

    дело действительно было в несовместимости работы этих двух библиотек. Но я с этим разобрался. Теперь работает.

    Сейчас другая проблема. При нажатии на кнопку двигатель начинает вращаться. Вращается он так до тех пор, пока не поступит другая команда.

    Я хочу сделать так, чтобы при нажатии на кнопку он как обычно вращался, а как отпускаю кнопку - прекращал работу.

    Вот что я составил:
    Код (C++):
    #include <IRremote.h>
    #include <IRremoteInt.h>
    #include <AFMotor.h>

    IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    decode_results results;

    // создаем объект motor №2, ШИМ 64 кГц
    AF_DCMotor motor2(2, MOTOR12_64KHZ);

    char 1_BUTTON = "FD00FF"
    char 2_BUTTON = "FD807F"

    void setup() {
      irrecv.enableIRIn(); // запускаем прием

    Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод
    motor2.setSpeed(200); // устанавливаем скорость вращения 200/255

    }

    void loop() {
      if (digitalRead(1_BUTTON) ==HIGH) { // нажимаем кнопку "1"
         digitalWrite(motor2.run(FORWARD); // вращение вперед
         }
      else {
         digitalWrite(motor2.run(RELEASE);
         }
      if (digitalRead(2_BUTTON) ==HIGH) { // нажимаем кнопку "2"
         digitalWrite(motor2.run(BACKWARD); // вращение назад
         }
      else {
         digitalWrite(motor2.run(RELEASE);
         }
        irrecv.resume(); // принимаем следующую команду
      }
    }
    Но, дело в том, что мои переменные BUTTON_1 и BUTTON_2 программа бракует. Как следует их задать?

    Может есть и другие замечания по коду?
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    переменные не должны начинаться с цифры.
    char - это строго один символ, а ты впихиваешь строку.
    digitalRead считывает состояние пина, т.е. применим только для физически подключенных проводами кнопок. Насколько я вижу, у тебя кнопки на пульте, digitalRead их не увидит.