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

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

  1. Прошу,на писать программу прошивки Ардуино Уно,для управления двумя моторами модель ДП25-1,6-3
    (3000об/мин.27В 0,14А) от джоя Ардуино.Принцип такой:Джой в центральном положении(моторы стоп),Первый мотор.Влево: 5%-поворот влево(ШИМ 25%);полный Влево-ШИМ 100%.Вправо аналогия.только реверс.
    Вверх-вниз.Второй мотор.Угол +/-5% выбран для остоновки двигателей и реверса без бросков.
    В наличии:- Arduino Uno;
    - плата драйвера двигателя L298N;
    - 2 двигателя;
    - аналоговый джойстик;
    блок питания.
     
  2. Onkel

    Onkel Гуру

    что за аналоговый джойстик? Знать бы, может и взялся бы. Что должно быть результатом вашего заказа- схема и программа?
     
  3. DrProg

    DrProg Вечный нерд

    Плавный разгон, остановка и реверс организуются программно. Плавность можно регулировать налету.


    Сделать на джойстике не проблема, но по опыту больше понравился "тракторный" способ с двумя раздельными рычагами для каждого двигателя.
     
  4. Напишите скетч.пожалуйста.
     
  5. DrProg

    DrProg Вечный нерд

    Трудно писать скетч не имея всех комплектующих. Варианта два, или вы мне предоставите на время или я вам вышлю скетч в том виде как у меня есть (под Монстрмотошилд и управление на Андроид через блютуз). В принципе, подключение к L298N выглядит похожим, скорее всего подойдет. Для джойстика потребуется доработка с тестами в любом случае.
     
  6. Попробовать,изменения готовых скетчей,так пишут знатоки,Времени учить програму нет.
     
  7. DrProg

    DrProg Вечный нерд

    Если программы сами не писали, то изменить конечно не сможете. Тем более, схема подключение вашего драйвера отличается от Монстра, я тут посмотрел. Значит вариант первый. Посмотрю, можно ли получить ваш драйвер и джойстик в аренду.
     
  8. ;)Просмотрите Вариант:
    //переменные для значений с джойстика
    int xValue, yValue;

    #include <AFMotor.h> //Подключаем заголовочный файл библиотеки
    AF_DCMotor motor(1);//Создаем объект для двигателя на 1 канале (M1)
    AF_DCMotor motor2(2);//Создаем объект для двигателя на 2 канале (M2)
    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    //читаем значения с джойстика и ремапим их от 0 до 252
    xValue = map(analogRead(A0), 0, 1024, 0, 252);
    yValue = map(analogRead(A1), 0, 1024, 0, 252);

    Serial.print(xValue); //выводим значение x
    Serial.print("\t"); //отступ
    Serial.print(yValue); //выводим значение y
    Serial.print("\t"); //отступ

    if (xValue <= 100)
    {
    motor.run(FORWARD);
    }
    else if (xValue > 101 && xValue <149)
    {
    motor.run(RELEASE);
    }
    if (xValue >= 150)
    {
    motor.run(BACKWARD);
    }
    else if (xValue > 101 && xValue <149)
    {
    motor.run(RELEASE);
    }
    /////////////////////
    if (yValue <= 100)
    {
    motor2.run(FORWARD);
    }
    else if (yValue > 101 && yValue <149)
    {
    motor2.run(RELEASE);
    }
    if (yValue >= 150)
    {
    motor2.run(BACKWARD);
    }
    else if (yValue > 101 && yValue <149)
    {
    motor2.run(RELEASE);
    }
    }
    Пожалуйста,:)
     
  9. DrProg

    DrProg Вечный нерд

    В общем, я нашел где взять эти детальки на попробовать. Если актуально, пишите подробно что хотите видеть от этой конструкции. Лучше в приват или на мыло.
     
  10. Управление Двумя двигателями Панорамирующей видео головы,голова собрана,осталось приписать скетч.
    Моторы от БП уже работают.
    Принцип такой:Джой в центральном положении(моторы стоп),
    Первый мотор.Влево: 5%-поворот влево(ШИМ 25%);полный Влево-ШИМ 100%
    .Вправо аналогия.только реверс.
    Вверх-вниз работает второй мотор.
    Угол +/-5% выбран для остоновки двигателей и реверса без бросков,
    Принцип:джой вверх-камера вверх,жжой вниз-камера вниз,Джой влево -камера влево.Джой вправо-камера вправо.
    От угла наклонов джоя зависит скорость работы двигателей.
     
  11. DrProg

    DrProg Вечный нерд

    Вот тут меня клинит.
     
  12. DrProg

    DrProg Вечный нерд

    Так надо делать скетч или уже никто ничего не пишет?
     
  13. Приблизительный скетч уже готов:
    constintPOS_Y_PIN=6;// Горизонтальное положение джойстика (аналоговый пин)
    constintPOS_X_PIN=7;// Вертикальное положение джойстика (аналоговый пин)
    constintENABLE_A=9;// Включение 1 движка (цифровой пин ШИМ)
    constintENABLE_B=3;// Включение 2 движка (цифровой пин ШИМ)
    constintINPUT_1=7;// Поворот 1 движка (цифровой пин)
    constintINPUT_2=6;// Поворот 1 движка (цифровой пин)
    constintINPUT_3=5;// Поворот 2 движка (цифровой пин)
    constintINPUT_4=4;// Поворот 2 движка (цифровой пин)
    constintSWITCH=8;// Кнопка джойстика
    constintMAX_POS=1023;// VRx и VRy выдают значения от 0 до 1023
    constintMAX_ANGLE=180;// Джойстик отклоняется на угол 0..180
    constintMAX_VALUE=255;// Максимальное подаваемое на ШИМ значение
    constintSTART_VALUE=20;// Начальное подаваемое на ШИМ значение

    voidsetup()
    {
    Serial.begin(9600);
    pinMode(ENABLE_A, OUTPUT);
    pinMode(ENABLE_B, OUTPUT);
    pinMode(INPUT_1, OUTPUT);
    pinMode(INPUT_2, OUTPUT);
    pinMode(INPUT_3, OUTPUT);
    pinMode(INPUT_4, OUTPUT);
    pinMode(SWITCH, INPUT);
    }

    voidloop()
    {
    // Вычисляем угол поворота джойстика
    intyVal=analogRead(POS_Y_PIN);
    intxVal=analogRead(POS_X_PIN);
    floatyAngle=1.0*yVal*MAX_ANGLE/MAX_POS;// Переводим выходные данные VRy в угол наклона джойстика (от 0 до 180)
    floatxAngle=1.0*xVal*MAX_ANGLE/MAX_POS;// Аналогично VRx
    intstartValue=150;
    Serial.print(xAngle);
    Serial.print(" ");
    Serial.println(yAngle);

    // Если джойстик в иначально положении (90 градусов с погрешностью 5)
    if(xAngle>85&&xAngle<95)
    {
    // Выключаем движки
    analogWrite(ENABLE_A,0);
    analogWrite(ENABLE_B,0);
    digitalWrite(INPUT_1, LOW);
    digitalWrite(INPUT_2, LOW);
    digitalWrite(INPUT_3, LOW);
    digitalWrite(INPUT_4, LOW);
    // Если джойстик отклонен влево
    }elseif(xAngle<=85)
    {
    // Включаем движок
    digitalWrite(INPUT_1, HIGH);
    digitalWrite(INPUT_2, LOW);
    intvalue=0;
    xAngle=85-xAngle;
    // Подаем на ШИМ значение в зависимости от угла отклонения
    floatshift=1.0*(MAX_VALUE-START_VALUE)/85*xAngle;
    analogWrite(ENABLE_A, START_VALUE+shift);
    Serial.print("ValueX1 = ");
    Serial.println(START_VALUE+shift);
    // Если джойстик отклонен вправо, действуем аналогично
    }else
    {
    digitalWrite(INPUT_1, LOW);
    digitalWrite(INPUT_2, HIGH);
    intvalue=0;
    xAngle=xAngle-95;
    floatshift=1.0*(MAX_VALUE-START_VALUE)/85*xAngle;
    analogWrite(ENABLE_A, START_VALUE+shift);
    Serial.print("ValueY1 = ");
    Serial.println(START_VALUE+shift);
    }

    // Аналогично для 2 движка и вертикального отклонения джойстика
    if(yAngle>85&&yAngle<95)
    {
    analogWrite(ENABLE_B,0);
    }elseif(yAngle<=85)
    {
    digitalWrite(INPUT_3, HIGH);
    digitalWrite(INPUT_4, LOW);
    intvalue=0;
    yAngle=85-yAngle;
    floatshift=1.0*(MAX_VALUE-START_VALUE)/85*yAngle;
    analogWrite(ENABLE_B, START_VALUE+shift);
    Serial.print("ValueX2 = ");
    Serial.println(START_VALUE+shift);
    }else
    {
    digitalWrite(INPUT_3, LOW);
    digitalWrite(INPUT_4, HIGH);
    intvalue=0;
    yAngle=yAngle-95;
    floatshift=1.0*(MAX_VALUE-START_VALUE)/85*yAngle;
    analogWrite(ENABLE_B, START_VALUE+shift);
    Serial.print("ValueY2 = ");
    Serial.println(START_VALUE+shift);
    }

    delay(100);
    }
    Прошу проверить на "синтаксис".
     
  14. DrProg

    DrProg Вечный нерд

    Не работает в таком виде или что? Плавности перехода из одной скорости/направления в другие не вижу, не боитесь что долбить и дергать будет при резком повороте джойстика? А это делается не в лоб: положение джойстика = скорости движка, чуть сложнее.

    Мне сейчас проще сделать свой код, чем искать ошибки или допиливать чужой. Тем более все компоненты есть в наличии, могу сразу проверить. В общем решайте, я не настаиваю и не напрашиваюсь. Если хотите совсем безвозмездно, то советов дам.
     
  15.  
  16. constint POS_Y_PIN =6;// Горизонтальное положение джойстика (аналоговый пин)
    constint POS_X_PIN =7;// Вертикальное положение джойстика (аналоговый пин)
    constint ENABLE_A =9;// Включение 1 движка (цифровой пин ШИМ)
    constint ENABLE_B =3;// Включение 2 движка (цифровой пин ШИМ)
    constint INPUT_1 =7;// Поворот 1 движка (цифровой пин)
    constint INPUT_2 =6;// Поворот 1 движка (цифровой пин)
    constint INPUT_3 =5;// Поворот 2 движка (цифровой пин)
    constint INPUT_4 =4;// Поворот 2 движка (цифровой пин)
    constint SWITCH =8;// Кнопка джойстика
    constint MAX_POS =1023;// VRx и VRy выдают значения от 0 до 1023
    constint MAX_ANGLE =180;// Джойстик отклоняется на угол 0..180
    constint MAX_VALUE =255;// Максимальное подаваемое на ШИМ значение
    constint START_VALUE =20;// Начальное подаваемое на ШИМ значение

    void setup()
    {
    Serial.begin(9600);
    pinMode(ENABLE_A, OUTPUT);
    pinMode(ENABLE_B, OUTPUT);
    pinMode(INPUT_1, OUTPUT);
    pinMode(INPUT_2, OUTPUT);
    pinMode(INPUT_3, OUTPUT);
    pinMode(INPUT_4, OUTPUT);
    pinMode(SWITCH, INPUT);
    }

    void loop()
    {
    // Вычисляем угол поворота джойстика
    int yVal = analogRead(POS_Y_PIN);
    int xVal = analogRead(POS_X_PIN);
    float yAngle =1.0* yVal * MAX_ANGLE / MAX_POS;// Переводим выходные данные VRy в угол наклона джойстика (от 0 до 180)
    float xAngle =1.0* xVal * MAX_ANGLE / MAX_POS;// Аналогично VRx
    int startValue =150;
    Serial.print(xAngle);
    Serial.print(" ");
    Serial.println(yAngle);

    // Если джойстик в иначально положении (90 градусов с погрешностью 5)
    if(xAngle >85&& xAngle <95)
    {
    // Выключаем движки
    analogWrite(ENABLE_A, 0);
    analogWrite(ENABLE_B, 0);
    digitalWrite(INPUT_1, LOW);
    digitalWrite(INPUT_2, LOW);
    digitalWrite(INPUT_3, LOW);
    digitalWrite(INPUT_4, LOW);
    // Если джойстик отклонен влево
    }elseif(xAngle <=85)
    {
    // Включаем движок
    digitalWrite(INPUT_1, HIGH);
    digitalWrite(INPUT_2, LOW);
    int value =0;
    xAngle =85- xAngle;
    // Подаем на ШИМ значение в зависимости от угла отклонения
    float shift =1.0*(MAX_VALUE - START_VALUE)/85* xAngle;
    analogWrite(ENABLE_A, START_VALUE + shift);
    Serial.print("ValueX1 = ");
    Serial.println(START_VALUE + shift);
    // Если джойстик отклонен вправо, действуем аналогично
    }else
    {
    digitalWrite(INPUT_1, LOW);
    digitalWrite(INPUT_2, HIGH);
    int value =0;
    xAngle = xAngle -95;
    float shift =1.0*(MAX_VALUE - START_VALUE)/85* xAngle;
    analogWrite(ENABLE_A, START_VALUE + shift);
    Serial.print("ValueY1 = ");
    Serial.println(START_VALUE + shift);
    }

    // Аналогично для 2 движка и вертикального отклонения джойстика
    if(yAngle >85&& yAngle <95)
    {
    analogWrite(ENABLE_B, 0);
    }elseif(yAngle <=85)
    {
    digitalWrite(INPUT_3, HIGH);
    digitalWrite(INPUT_4, LOW);
    int value =0;
    yAngle =85- yAngle;
    float shift =1.0*(MAX_VALUE - START_VALUE)/85* yAngle;
    analogWrite(ENABLE_B, START_VALUE + shift);
    Serial.print("ValueX2 = ");
    Serial.println(START_VALUE + shift);
    }else
    {
    digitalWrite(INPUT_3, LOW);
    digitalWrite(INPUT_4, HIGH);
    int value =0;
    yAngle = yAngle -95;
    float shift =1.0*(MAX_VALUE - START_VALUE)/85* yAngle;
    analogWrite(ENABLE_B, START_VALUE + shift);
    Serial.print("ValueY2 = ");
    Serial.println(START_VALUE + shift);
    }

    delay(100);
    }
     
  17. vvr

    vvr Инженерище

    а зачем вам делэй в коде
     
  18. Это писл не я