Не синхронно работают моторы

Тема в разделе "Arduino & Shields", создана пользователем Blackgeneral, 10 апр 2021.

  1. Blackgeneral

    Blackgeneral Нерд

    Добрый день!
    Имеется сборка машинки на Arduino UNO и Motor Shield L293D.
    Питание от двух 18650 через клеммы на Motor Shield L293D.
    Перемычка стоит.

    Загруженный код:
    Код (C++):

    #include<AFMotor.h>
    int d;
    AF_DCMotor motor3(3);
    AF_DCMotor motor4(4);

    void setup() {
    motor3.setSpeed(150);
    motor3.run(RELEASE);
    motor4.setSpeed(150);
    motor4.run(RELEASE);
    }

    void loop() {

    motor3.run(FORWARD);
    motor4.run(FORWARD);
    for(d=0;d<150;d++){
    motor4.setSpeed(d);
    motor3.setSpeed(d);
    delay(10);
    }
    }
     
    Проблема в не одновременном запуске моторов: вначале запускается один мотор, а через 0,5-1 секунду - второй.
    Не могу понять причину.
     
  2. alp69

    alp69 Форумчанин

    У Вас цикл выполняется от значения d=0 до 150 с шагом 0. Попробуйте поменять d=0 на d=1
     
  3. akl

    akl Гуру

    обычно мотору чтобы стартануть нужна какая-то минимальная мощность. естественно эта величина индивидуальна для каждого мотора и один начинает двигаться при d например 100, а другой при например 80.
     
  4. Blackgeneral

    Blackgeneral Нерд

    И что, никак не синхронизировать? Получается, что как только стартует машина, так начинает ехать влево.
     
  5. alp69

    alp69 Форумчанин

    Выведите в монитор порта изменения d на каждом шаге цикла. Зафиксируйте при каком зачении d стартует второй мотор. Подставьте это значение в код. И (важно) в условии не используйте d как переменную счетчика шагов. Лучше будет записать for (int i=1; i<=d; i++).
    Например:
    Код (C++):
    #include<AFMotor.h>
    int dmin=50; // стартовое значение второго двигателя
    int dmax=150; // максимальное значение
    AF_DCMotor motor3(3);
    AF_DCMotor motor4(4);

    void setup() {
    motor3.setSpeed(dmin);
    motor3.run(RELEASE);
    motor4.setSpeed(dmin);
    motor4.run(RELEASE);
    }

    void loop() {

    motor3.run(FORWARD);
    motor4.run(FORWARD);
    for(int i=1; i<(dmax-dmin); i++){
    motor4.setSpeed(dmin);
    motor3.setSpeed(dmin);
    dmin=dmin+1;
    delay(10);
    }
    }
    Если без монитора порта - поиграйтесь со значением dmin в приведенном коде.
     
    Последнее редактирование: 10 апр 2021
    Blackgeneral нравится это.
  6. akl

    akl Гуру

    это еще пол беды - обычно моторчики даже на максимальном газу с разной скоростью крутятся - для этого их надо калибровать.
    вот в обучалке есть проект подобный http://wiki.amperka.ru/projects:bottleboat
     
    Blackgeneral нравится это.
  7. b707

    b707 Гуру

    alp69, вы сегодня не проснулись еще... ? Каждое сообщение как откровение :) То у вас шаг ноль, то у вас переменную нельзя использовать...
    простыми методами никак. И даже калибровка не поможет. Вы сейчас откалибровали, а завтра запустили машинку на чуть другом покрытии, сопротивление изменилось - и моторы опять по-разному стартуют...
    Единственный вариант - это по энкодеру на каждый мотор и крутить их на одинаковое число шагов.
    Чуть попроще - поставить шаговые моторы, но это не гарантия, ШМ под нагрузкой дают пропуски, так что опять без внешнего энкодера никакой уверенности в синхронной работае не будет.
     
    Blackgeneral нравится это.
  8. alp69

    alp69 Форумчанин

    Отчего же нельзя использовать переменную. "Лучше" это не "нельзя". В данном конкретном случае, на мой непросвещенный взгляд, валить в кучу параметр цикла и аргумент функции - не самая лучшая затея. Сложнее отлаживать.
    И про нулевой шаг
    Возможно недостаточно владею тонкостями, но полагаю, что инициализация цикла for нулевым значением с модификацией этого же значения им же самим ведет в никуда. С учетом условия этого конкретного цикла - это бесконечный цикл. Буду признателен, если объясните в чем я заблуждаюсь.

    P.S.
    Исправил условие цикла чтобы dmin не превысило dmax.
     
    Последнее редактирование: 10 апр 2021
    Blackgeneral нравится это.
  9. akl

    akl Гуру

    если это все же не станок какой-то, а например машинка дистанционная или типа того, то как раз вполне хорошее решение - триммирование - то есть едем - на ходу подкрутили чтоб поменьше косило и едем дальше довольные.
     
    Blackgeneral нравится это.
  10. Blackgeneral

    Blackgeneral Нерд

    Спасибо, на d=1 как до компа доберусь )))
    НО не совсем понимаю, почему эта строка:
    Цикл не будет прибавлять шаг? Т.е. "0+1" не случиться?

    Т.е. просто
    Serial.begin(9600) + Serial.println(d) перед последней скобкой?
    P.S.: Увидел у себя одну ошибку
    Код (C++):
    for(d=0;d<150;d++){
    менять на
    Код (C++):
    for(d=0;d<=150;d++){
    Я понимаю, что потом нужно энкодер (колесо) и датчик скорости (типа FC-03) ставить, но сейчас хотя бы запустить на одном стабильном покрытии.
    P.S.: кстати, FC-03 нужно ставить на каждое колесо (если машинка двухколесная)?

    Именно машинка, но пока без дистанционного управления. "Триммирование" это что: колесо энкодера + FC-03?
    Спасибо, посмотрю.
     
  11. akl

    akl Гуру

    это такой режим, в котором можно вручную менять некоторые установки по умолчанию. ваще это стандартная штука для всяких там джойстиков, радиомоделей, и даже настоящих самолетов.
    то есть запускаем машинку, смотрим на глаз в какую сторону ее клонит, нажимаем на определенную кнопочку нужное количество раз (или еще как угодно), и при этом в программе меняется в нужную сторону величина, которая будет вычитаться из того двигателя что крутится быстрее.
     
    Blackgeneral нравится это.
  12. b707

    b707 Гуру

    точно не проснулись :)
    Вот, взял из конкретного проекта
    Код (C++):
    for(int i=0;i<NUM_LEDS;i++){
      leds[i] = CRGB::red;
    }
    считаете, что этот код не сможет закрасить ленту красным цветом - потому что цикл for не может начинаться с нуля?:)
    честно говоря. я даж затрудняюсь, как вам такие очевидные вещи обьяснить-то... вы такую несуразицу пишете...
     
    Последнее редактирование: 10 апр 2021
  13. Un_ka

    Un_ka Гуру

    Да, вроде нет ошибки массив размера n индексируется от 0 до n-1. Первый элемент - ноль n-ый - n-1.
     
  14. Blackgeneral

    Blackgeneral Нерд

    А где про это почитать можно подробнее. При вводе запроса "триммирование ардуино" в своей массе выдача про диммер.

    Я про диапазон. Явной ошибки тут нет, но задумывалось до 150 включительно )))
     
    Последнее редактирование: 11 апр 2021
  15. Blackgeneral

    Blackgeneral Нерд

    И еще, "вдогонку" к первому посту: пробовал "играться" разными версиями библиотеки AFMotor (нашел 4 версии): машинка ведет себя совершенно по-разному. Более того, "последняя" версия библиотеки вообще отказалась в плату загружаться, а после попытки загрузки и на остальных библиотеках ошибка выходит:
    Чтобы исправить нужно все библиотеки из папки "libraries" удалить и установить заново через "управление библиотеками"?
     
  16. akl

    akl Гуру

    не существует такого понятия "триммирование ардуино". есть просто триммирование
    а уж осуществить такое на ардуино - дело техники.
     
    Blackgeneral нравится это.
  17. Blackgeneral

    Blackgeneral Нерд

    Я думал, что есть машинки с таким кодом , ну или хотя бы видео работы машинок: интересно было бы посмотреть
     
  18. akl

    akl Гуру

    вон же в бутылочном катере это есть, там жмут на разные кнопки меняя поправку пока движки не начнут крутиться одинаково
     
    Blackgeneral нравится это.
  19. Blackgeneral

    Blackgeneral Нерд

    Попробовал Ваш код - работает.
    В своем поменял "d" на "i" - работает.
    Не понял в чем прикол с заменой буквы?

    P.S.: При запуске или плата, или моторы (не разобрал) пищат противно. Так и должно быть?
    P.P.S.: Пока экспериментировал с запуском пробовал более простой код:
    Код (C++):
    #include <AFMotor.h>
    int sped1=77;
    int sped2=77;
    AF_DCMotor motor1(3);
    AF_DCMotor motor2(4);

    void setup() {
    motor1.setSpeed(128);
    motor1.run(RELEASE);
    motor2.setSpeed(128);
    motor2.run(RELEASE);
    }
    void loop() {
      motor1.run(FORWARD);
      motor2.run(FORWARD);
      motor1.setSpeed(sped1);
      motor2.setSpeed(sped2);
     
    При этом заметил такую странность: начиная со значений sped1 и sped2 с 1 до 76 моторы не запускаются. Плата или моторы пищат (также, как я описал выше).
    При значении (sped1, sped2) =77 моторы запускаются. Что это за мистика?
    Питание два аккумулятора 18650. Заряд полный.
     
  20. akl

    akl Гуру

    это норма
    [​IMG]