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

Ардуино: управление двигателем постоянного тока, L293D

Двигатели есть практически в каждом роботе. В одних роботах они приводят в действие колеса, заставляя машину перемещаться в нужном направлении. В других — двигатели крутят пропеллеры, создавая вертикальную тягу для полета. Двигатели позволяют вращаться суставам промышленного робота-манипулятора, и перемещают каретку 3D-принтера . В общем, без хорошего двигателя робота не сделать.

DSC01178

Существует множество типов двигателей. К самым распространенным в робототехнике можно отнести двигатель постоянного тока, шаговый двигатель, и бесколлекторный двигатель. У каждого типа есть свои особенности, плюсы и минусы. Одни больше подходят для точных перемещений, другие позволяют легко поднять в небо мультикоптер. Под каждый проект нужно тщательно выбирать нужный тип двигателей.

На этом уроке мы разберем, как управлять обычным двигателем постоянного тока (DC Motor), а именно жёлтым мотор-редуктором на основе моторчика F130. Двигатели этого типа части применяются в роботах на колесных и гусеничных платформах. И начнем мы с самого простого способа управления — с помощью транзистора.

Компоненты для урока "Ардуино: управление двигателем постоянного тока, L293D" на shop.robotclass.ru
5+

Изменено:

Ардуино: управление двигателем постоянного тока, L293D: Один комментарий

  1. На эмуляторе не работает, в коде ошибок не показывает, но ничего не происходит.

    0
  2. Поправочка, работает с жутким падением напряжения управляющего сигнала.

    1+
  3. Игорь, скорее всего дело в том, что в данном примере напряжение питания двигателя подано с Ардуины. Используйте второй (другой) источник тока для питания двигателей.

    0
  4. А у меня всё заработало, как на примере, с первого раза. Никаких проблем не было.

    2+
  5. Чего нужно в программе дописать что бы моторчик менял вращение не через секунду а например через 5 секунд

    0
    • digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(1000);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delay(1000);
      значение (1000) это 1 секунда. меняешь на 5000 и будет 5 секунд работать

      2+
  6. В реальности -схема и скетч работаеют-использовал микросхему.В эмуляторе не пробывал.

    0
  7. Добрый день. Собирал как на схеме, не работает. Транзистор использовал 2222а, резистор 1 кОм, питание от платы 5В. Питание платы от USB от ноутбука. Скетч нижеследующий (взят из книги):
    const int motor=9;
    void setup() {
    pinMode (motor, OUTPUT);
    }
    void loop() {
    for (int i=0; i=0; i—)
    {
    analogWrite (motor, i);
    delay (10);
    }
    delay (2000);
    }
    Итог, не работает. Один раз, правда заработал, но двигатель работал на полных оборотах вместо плавного затухания, а транзистор моментально нагревался. Другой раз, что-то с платой случилось а ноут выдал сообщение, падение напряжения на концентраторе USB.
    Вообще не понимаю чего не хватает.

    0
    • Смотря что за двигатель. Но я подразумеваю для ваших целей транзистор 2n2222 слабоват, рекомендую попробовать полевой транзистор IRF540, к примеру.
      Ну и насчет того, что работает всегда на 100%, но попробуйте delay(200) сделать, вместо delay(10). Может он слишком быстро выходит на макс обороты и вы не замечаете.

      0
  8. Подскадите, а как запрограмировать обычный двигатель постоянного тока (не шаговый) , так что бы он вращался в одну и другую сторону не по времени, а по количеству оборотов?

    0
    • Для этого нужно будет считать обороты. Делается это с помощью энкодера: магнитного или оптического. То есть к мотору нужно приделать колесо с магнитом, и установить мотор так, чтобы колесо это крутилось рядом с датчиком магнитного поля (датчик Холла).

      Каждый раз, когда магнит будет пролетать мимо датчика, последний будет срабатывать и контроллер будет фиксировать один оборот. Собственно, зная сколько оборотов сделано, можно уже будет остановить мотор в нужный момент!

      Рекомендую просто поискать моторы уже со встроенным магнитным энкодером.

      1+
  9. В этом и многих других проектах не рассматривается задача защиты двигателя и блока управления от перегрузки при механической остановке двигателя во время его работы.
    Такая ситуация вероятна и её необходимо предусмотреть. Есть ли у Вас решение такой задачи? Наверное такое решение есть, но я его никак не найду. Предполагаю, что нужно измерять напряжение на шунте в цепи питания и при его критическом увеличении останавливать двигатель.
    Удачи! С уважением!

    1+
    • Вероятно вам подойдет драйвер с ограничением по току. Просто настраиваете нужный максимальный ток и при его превышении питание мотора отрубается.
      Или как вариант, можно использовать драйвер с датчиком тока, тот же:
      https://shop.robotclass.ru/index.php?route=product/product&path=63_114&product_id=402
      контроллер будет считывать значение тока и принимать решение, что дальше делать.

      1+
  10. Вопрос — почему, если сначала запустить двигатель, потом после остановки его проиграть какую-нибудь мелодию (команда tone) на пищалке (на другом пине), то потом команда на запуск двигателя не работает? При перезагрузке Ардуино двигатель запускается, но после проигрывания мелодии запуска двигателя опять нет…

    1+
  11. Здравствуйте. Объясните пожалуйста про Н мост. У меня получается КЗ. Если допустим на схеме напряжение VCC 12в, а INA 5в (как с пина ардуины) то оба левых транзистора на схеме открываются. У PNP тразисторе на базе 5в на эмиттере 12в — он открыт, у NPN на базе 5 на эмиттере 0 тоже открыт — КЗ.

    1+

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.