Драйвер управления коллекторным двигателем

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Niki19, 15 сен 2020.

  1. Niki19

    Niki19 Нерд

    Доброго времени суток, недавно я столкнулся с новым драйвером управления. И я как новичок прошу помощи, как примерно подключить такой вид драйверов? И если есть, то желательно узнать, есть ли библиотека для таких драйверов. Вот сама ссылка на драйвер:
    https://www.pololu.com/product/2992
    Буду очень признателен за помощь или объяснения в этом виде драйверов.
     
  2. Nekto_nikto

    Nekto_nikto Гик

  3. Niki19

    Niki19 Нерд

    Спасибо огромное за весь материал, но проблема в ином теперь, когда писал простой код для оборотов двигателя вперёд и назад, то почему-то движение вперёд производилось без разных проблем, а вот при движение назад, драйвер начал издавать звук

    Код (C++):
    #include <G2MotorDriver.h>

    #define DIR 2
    #define PWM_Motor 3

    int pwm = 0;
    void setup() {
      int i;
      digitalWrite(DIR, LOW); // Устанавливаем направление
      delay(100);
      for (i = 0; i<255; i++)
    {
      digitalWrite(PWM_Motor, LOW);
      digitalWrite(PWM_Motor, HIGH);
      delay(5000);
    }
      digitalWrite(DIR, HIGH); // Смена направления
      delay(100);
      for (i = 0; i<255; i++)
    {
      digitalWrite(PWM_Motor, LOW);
      digitalWrite(PWM_Motor, HIGH);
      delay(5000);
    }
    }
     
  4. Nekto_nikto

    Nekto_nikto Гик

    Я в вашем случае могу разве что предположить, что дело в том, что мотор еще крутится в другую сторону и от этого драйвер работает не в штатном режиме. А поэтому сначала его нужно затормозить, после чего уже крутить в другую сторону. Да и звуки у вас скорее всего издают обмотки мотора.
    Собственно судя по вашему коду так оно и есть вы на полной скорости пытаетесь резко изменить направление вращения и на драйвер падает двойная нагрузка по ЭДС по отношению к той на которую он рассчитан и его корежит от этого не по детски, если я правильно все понимаю. Но может быть и какие то другие причины.
     
  5. Niki19

    Niki19 Нерд

    Ага, понял вас. Вообще вы правы, нужно было сразу поставить таймер на торможение.... Просто я думал почему драйвер сразу начал нагревать себя, а тут оказалось что я допустил оплошность в самом коде.
    Огромное спасибо.
     
  6. Nekto_nikto

    Nekto_nikto Гик

    плюс ко всему у вас в коде совершенно не используется ШИМ, как я понял его у вас заменяет порнография
    Код (C++):
    for (i = 0; i<255; i++)
    {
      digitalWrite(PWM_Motor, LOW);
      digitalWrite(PWM_Motor, HIGH);
      delay(5000);
    }
    где у вас 256 раз с паузой в 5 секунд пин сначала уходит в состояние логического нуля, а потом практически сразу же в состояние логической единицы, отчего особого смысла лично я в этом коде не вижу.
     
  7. Niki19

    Niki19 Нерд

    Ага, тогда можете подсказать как могу упростить сам код?? Или как исправить саму проблему в программе??
     
  8. Niki19

    Niki19 Нерд

    Просто проверял я саму программу на движение двигателя вперёд потенциометром, но после подумал просто убрать сам ШИМ и сделать по времени движение вперёд и назад.
     
    Последнее редактирование: 16 сен 2020
  9. Nekto_nikto

    Nekto_nikto Гик

    Я уже подсказал.
     
  10. Niki19

    Niki19 Нерд

    Доброго времени суток, я примерно изменил сам код на изменение направления двигателя. Но вопрос иной, куда лучше поставить таймер на торможение(задержку).

    Код (C++):
    #include <G2MotorDriver.h>

    #define dir 2
    #define motor 3

    int pwm = 0;

    void setup() {
      pinMode(dir, OUTPUT);
      pinMode(motor, OUTPUT);
    }

    void demoOne()
    {
      int i;
      digitalWrite(dir, LOW); // Устанавливаем направление назад
      delay(2000);
      for (i = 0; i < 255; i++){
        analogWrite(motor, i);
        delay(20);
      }
      for (int i = 255; i >= 0; --i);{
        analogWrite(motor, i);
        delay(20);
      }
    }

    void demoTwo()
    {
      int i;
      digitalWrite(dir, HIGH); // Устанавливаем направление вперёд
      delay(2000);
      for (i = 0; i < 255; i++){
        analogWrite(motor, i);
        delay(20);
      }
      for (int i = 255; i >= 0; --i);{
        analogWrite(motor, i);
        delay(20);
      }
    }

    void loop() {
      demoOne();
      delay(1000);
      demoTwo();
      delay(1000);
    }
     
  11. Nekto_nikto

    Nekto_nikto Гик

    Вопрос ваш не понял, а по части алгоритма исходил бы из условия, что каждый раз когда у вас меняется направление у вас должен отрабатывать
    код
    Код (C++):
    for (int i = 255; i >= 0; --i);{
        analogWrite(motor, i);
        delay(20);
      }
    задержку в delay подбирайте методом научного тыка с помощью монитора порта и Serial, подставив вместо 20 свою переменную, задавая ее значение через этот самый монитор порта.
     
  12. Niki19

    Niki19 Нерд

    Ну типа когда я вначале подключил ардуино и драйвер к источнику питания, то весь код RC машина отработала, но как вы говорили выше, что проблема в быстром изменении направления. Я просто заметил как двигатель за одну секунду, или даже быстрее поменял направление..... И я вот думал куда лучше поставить переменную задержки после каждого движения. Или в void loop(), ну или есть возможность поставить таймер отдельно для каждого направления отдельно в void demoTwo() и voidOne().
     
  13. Niki19

    Niki19 Нерд

    Но теперь я понял, сейчас проверю как вы посоветовали...
     
  14. Niki19

    Niki19 Нерд

    Доброго времени суток. Сразу начну с вопроса который меня заинтересовал. У меня есть датчик Sharp 2y0a21 ссылка на библиотеку тоже есть, но я не могу понять как именно добавить переменную на изменение оборотов двигателя...
    Сам скетч на вычисление данных у меня есть

    Код (C++):
    #include <SharpIR.h>

    #define sensor A0
    #define model 20150

    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      float volts = analogRead(sensor)*0.0048828125;   // считываем значение сенсора и переводим в напряжение
      float distance = 65*pow(volts, -1.10);        
      Serial.println(distance);                       // отображение в порт
      delay(1000);                                     // ждём
    }
    А вот сам код на движение вперёд

    Код (C++):
    #include <G2MotorDriver.h>

    #define DIR 2
    #define PWM_Motor 3

    int PWM = 0;

    void setup() {
      pinMode(DIR, OUTPUT);
      pinMode(PWM_Motor, OUTPUT);
    }
    void loop(){
      int i;
      digitalWrite(DIR, LOW); // Устанавливаем направление
      delay(2000);
      for (i = 0; i<255; i++)
    {
      digitalWrite(PWM_Motor, LOW);
      digitalWrite(PWM_Motor, HIGH);
      delay(5000);
    }
    И как вы посоветуете соединить два скетча?