Управление двумя DC моторами от Джойстика

Тема в разделе "Закажу проект", создана пользователем Шевчук 1966, 29 янв 2016.

  1. Sergante

    Sergante Нуб

    Нет, сожалею.. изменил - как вы сказали..
    1. Мотор1 слабо гудит - будто на него слабое питание подается. Окно монитора: 264 / 246 - бегущие строки снизу вверх..
    2. Мотор1 вращается вперед/назад при управлении джойстиком вверх/вниз. Данные на окне монитора вниз - 407 / 0, а если вверх джойстик - 263 / 509
     
  2. Sergante

    Sergante Нуб

    Перепроверил все контакты джойстика.. Все верно.. :(
     
  3. Sergante

    Sergante Нуб

    Код (C++):
    int enA = 9, in1 = 10, in2 = 11;
    int enB = 6, in3 = 7,  in4 = 8;
    int xValue, yValue;  
    void setup() {
      pinMode(enA, OUTPUT);
      pinMode(enB, OUTPUT);
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      Serial.begin(9600);
    }
    void loop() {
      xValue = map(analogRead(A0), 0, 1024, -255, 255);
      yValue = map(analogRead(A1), 0, 1024, -255, 255);
      Serial.print(xValue);    //выводим значение x
      Serial.print("\t");      //отступ
      Serial.print(yValue);    //выводим значение y
      Serial.print("\t");      //отступ
      if (xValue == 0)  {
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
      }
      if (xValue > 0)  {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        analogWrite(enA, xValue);
      }
      if (xValue < 0)  {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(enA, -xValue);
      }
      if (yValue == 0)  {
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
      }
      if (yValue > 0)  {
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        analogWrite(enB, yValue);
      }
      if (yValue < 0)  {
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        analogWrite(enB, -yValue);
      }
    }
    Вот с этим скетчем оба мотора вращаются назад ПОСТОЯННО в нейтральном положении джойстика..
    Джойстиком могу поменять направление вращения моторов (в одну сторону - противоположную), но в нейтрале и в сторону направления по джойстику - они опять постоянно вращаются.
     
  4. Sergante

    Sergante Нуб

    В окне монитора следующие цифры - в зависимости от джойстика::
    Нейтрал 8 ____ -10
    Вверх 8, ____ 254
    Вниз 8, 69, 243,125, 254.._____ -255
    Влево -255 _____ -8, -3, -6...
    Вправо 254 ______ ... -9, 123
     
  5. Sergante

    Sergante Нуб

    IMG_5258.jpg IMG_5261.jpg
    джойстик..
     
  6. Тема хорошая, пришел на неё через поиск в Google. Приведённый скетч от Onkel,16 авг 2016 рабочий, спасибо очень сильно выручил. Здесь была дискуссия о плавном старте и торможении, неплохо было бы добавить в этот скетч, код для плавного старта и торможения, а то движки при реверсе сильно дёргаются.
     
  7. Onkel

    Onkel Гуру

    можно xValue и yValue присваивать значения как скользящей экспоненциальной средней с периодом N

    было
    xValue = map(analogRead(xPin), 0, 1024, 0, 510);
    yValue = map(analogRead(yPin), 0, 1024, 0, 510);

    сделать

    xValue = xValue + ( (map(analogRead(xPin), 0, 1024, 0, 510) -xValue)*2)/(N+1) ;
    yValue = yValue + ( (map(analogRead(yPin), 0, 1024, 0, 510) -yValue)*2)/(N+1) ;

    N- период усреднения

    Ну и не забыть в начале
    float N=10. ;
    например. float лучше ее брать чтобы мягче усреднялось.
     
    chetverkin.vasil нравится это.
  8. Спасибо Onkel! Изменил скетч, как вы написали, всё отлично работает, рывки при реверсе исчезли.
     
  9. Onkel

    Onkel Гуру

    Пожалуйста. пользуйтесь на здоровье.
     
  10. mag155

    mag155 Нуб

    Доброго времени суток кто напишит скетч управление двигателем постоянного тока с реверсом поддержанием момента и торможением ?
     
  11. Onkel

    Onkel Гуру

    Более детальное техническое задание присылайте- какой двигатель, величины момента и торможения- по току, по энкодеру? Пишите ydom@mail.ru сделаем.
     
  12. Вопрос по поводу как расширить диапазон "нулей" по обоим осям, чтобы в определенном диапазоне около нейтрали на моторы шли четко нули. Уважаемый Onkel, можно чуть расшифровать, где в скетче надо чего подправить.
    А проблема вот какая. Разные джойстики в нейтральном положении на разных осях имеют разные показания и они не стоят на мести , а со временем могут гулять то есть изменяться. Фото монитора порта..png
    Я боролся с этим прописывая ручками в скетче

    if(xValue<220 && zValue==0 && zValue1==1)
    {
    analogWrite(ENA, 220-xValue);
    digitalWrite(in1, LOW);
    }
    if(yValue>255 && zValue==0 && zValue1==1)
    {
    analogWrite(ENB, yValue-255);
    digitalWrite(in2, HIGH);
    }

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

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

    int xValue, yValue, zValue, xValue1, yValue1, zValue1;
    int ENA = 11;
    int ENB = 10;
    int in1 = 9;
    int in2 = 8;
    int xPin = A1;
    int yPin = A0;
    int zPin = 7;
    float N=5.;
    int xPin1 = A3;
    int yPin1 = A2;
    int zPin1 = 6;

    void setup()
    {
    pinMode(ENA, OUTPUT);
    pinMode(ENB, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
    pinMode(zPin, INPUT_PULLUP);
    pinMode(xPin1, INPUT);
    pinMode(yPin1, INPUT);
    pinMode(zPin1, INPUT_PULLUP);
    Serial.begin(9600);
    }

    void loop()
    {
    if(zValue == 0)
    {
    xValue = xValue + ( (map(analogRead(xPin), 0, 1024, 0, 510) -xValue)*2)/(N+1);
    yValue = yValue + ( (map(analogRead(yPin), 0, 1024, 0, 510) -yValue)*2)/(N+1);
    Serial.print(" | X : ");
    Serial.print(xValue);
    Serial.print(" | Y : ");
    Serial.print(yValue);
    }
    zValue = digitalRead(zPin);
    zValue = zValue ^ 1;
    Serial.print(" | Z : ");
    Serial.print(zValue);
    if(zValue1 == 0)
    {
    xValue1 = xValue1 + ( (map(analogRead(xPin1), 0, 1024, 0, 510) -xValue1)*2)/(N+1);
    yValue1 = yValue1 + ( (map(analogRead(yPin1), 0, 1024, 0, 510) -yValue1)*2)/(N+1);
    Serial.print(" | X1 : ");
    Serial.print(xValue1);
    Serial.print(" | Y1 : ");
    Serial.print(yValue1);
    }
    zValue1 = digitalRead(zPin1);
    zValue1 = zValue1 ^ 1;
    Serial.print(" | Z1 : ");
    Serial.println(zValue1);
    if(xValue>255 && zValue==0 && zValue1==1)
    {
    analogWrite(ENA, xValue-255);
    digitalWrite(in1, HIGH);
    }
    if(xValue<220 && zValue==0 && zValue1==1)
    {
    analogWrite(ENA, 220-xValue);
    digitalWrite(in1, LOW);
    }
    if(yValue>255 && zValue==0 && zValue1==1)
    {
    analogWrite(ENB, yValue-255);
    digitalWrite(in2, HIGH);
    }
    if(yValue<255 && zValue==0 && zValue1==1)
    {
    analogWrite(ENB, 255-yValue);
    digitalWrite(in2, LOW);
    }
    if(xValue1>255 && zValue1==0 && zValue==1)
    {
    analogWrite(ENA, xValue1-255);
    digitalWrite(in1, HIGH);
    }
    if(xValue1<255 && zValue1==0 && zValue==1)
    {
    analogWrite(ENA, 255-xValue1);
    digitalWrite(in1, LOW);
    }
    if(yValue1>255 && zValue1==0 && zValue==1)
    {
    analogWrite(ENB, yValue1-255);
    digitalWrite(in2, HIGH);
    }
    if(yValue1<255 && zValue1==0 && zValue==1)
    {
    analogWrite(ENB, 255-yValue1);
    digitalWrite(in2, LOW);
    }
    }
     
  13. vvr

    vvr Инженерище

    не надо ничего исправлять.
    нужно сразу один раз прописать "мёртвые зоны" по обоим осям с гарантированным запасом.
     
  14. А можно чуть поточнее, где и как эти "мертвые зоны" прописать. Я по местным меркам Нуб и пока не сильно с кодом дружу.
     
  15. ostrov

    ostrov Гуру

    Операторы больше-меньше самые они.
     
  16. Извиняюсь, что потревожил, народ местный нынче не словоохотлив. По операторам больше меньше я в курсе, для меня проблема куда и как их правильно прописать. Ладно Google мне в помощь, ну и метод научного тыка вроде пока не отменяли, будем сами пробовать стараться.
     
  17. ostrov

    ostrov Гуру

    Ну для готовых ответов есть специальный раздел. А тут подсказывают и направляют. Дают советы. Вот еще один: джойстик выдает от 0 до 1023 по кажой оси. Середина примерно 512, у кого больше у кого меньшес вот сделайте плюс минус сто от середины мертвой зоной. А что меньше ее то минус, а что больше то плюс.
     
  18. Спасибо за подсказку.
     
  19. В скетче который я привел есть такие строки xValue = xValue + ( (map(analogRead(xPin), 0, 1024, 0, 510) -xValue)*2)/(N+1); и скорее всего среднее значение в коде это 255.
     
  20. Jogovskiy

    Jogovskiy Нерд

    А есть возможность помочь, написал код, но реализовать для него ПД регулятор не хватает ума/умений/знаний. А серво реагируют очень быстро на отклонения джойстика. Файл прикрепил
     

    Вложения:

    • 2servo.ino
      Размер файла:
      1,2 КБ
      Просмотров:
      231