Arduino Uno R3 + L298N + 2DC мотора + Джойстик, проверьте пожалуйста код

Тема в разделе "Arduino & Shields", создана пользователем GGV, 9 июн 2016.

  1. GGV

    GGV Нуб

    Здравствуйте!
    в наличии Arduino Uno R3 + L298N + 2DC мотора + Джойстик

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

    Заранее огромное СПАСИБО!

    Код (C++):
    int xValue, yValue;
    int ENA = 8;
    int in1 = 9;
    int in2 = 10;
    int ENB = 13;
    int in3 = 11;
    int in4 = 12;
    int xPin = A1;
    int yPin = A0;   // Ось Y подключена к Analog 0
    void setup()
    {
      pinMode(ENA, OUTPUT);
      pinMode(ENB, OUTPUT);
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(xPin, INPUT);
      pinMode(yPin, INPUT);
      Serial.begin(9600);
    }
    void loop()
    {
    //читаем значения с джойстика и ремапим их от 0 до 252
    xValue = map(analogRead(xPin), 0, 1024, 0, 252);
    yValue = map(analogRead(yPin), 0, 1024, 0, 252);
    Serial.print(xValue); //выводим значение x
    Serial.print("\t"); //отступ
    Serial.print(yValue); //выводим значение y
    Serial.print("\t"); //отступ
    if (xValue <= 100)
    {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    }
    else if (xValue > 101 && xValue <149)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    }
    if (xValue >= 150)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    }
    else if (xValue > 101 && xValue <149)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////
    if (yValue <= 100)
    {
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    }
    else if (yValue > 101 && yValue <149)
    {
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    }
    if (yValue >= 150)
    {
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    }
    else if (yValue > 101 && yValue <149)
    {
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    }
    }

    схема подключения прилагается
     

    Вложения:

    • Arduino.jpg
      Arduino.jpg
      Размер файла:
      120,5 КБ
      Просмотров:
      2.204
    Последнее редактирование: 9 июн 2016
  2. AlexU

    AlexU Гуру

    Первое -- посмотрите внимательней на этот участок кода:
    Код (C++):
    int ENA = 8;
    int in1 = 9;
    int in2 = 10;
    int ENB = 13;
    int in3 = 11;
    int in4 = 12;
    и на схему подключения.

    Второе -- пины 'ENA' и 'ENB' по задумке должны управлять включением/выключением каналов, но в коде нет этого "управления". Нужно добавить что-то вроде:
    Код (C++):
    .....
    digitalWrite(ENA, LOW); // выключаем канал A
    .....
    digitalWrite(ENB, HIGH);  // включаем канал B
    .....
     
  3. GGV

    GGV Нуб

    спасибо, попробую!
     
  4. GGV

    GGV Нуб

    Еще раз спасибо! Действительно, схема подключения была не правильна, я тупо слизал оттуда где нашел)
    сейчас соединил все правильно, добавил в код ваши рекомендации, теперь движки работают как надо, но вот скорость не регулируется : (

    посоветуйте, пожалуйста, что можно подправить чтобы скорость регулировалась от джойстика, спасибо)

    Код (C++):
    int xValue, yValue;
    int ENA = 8;
    int in1 = 9;
    int in2 = 10;
    int ENB = 13;
    int in3 = 11;
    int in4 = 12;
    int xPin = A1;
    int yPin = A0;   // Ось Y подключена к Analog 0
    void setup()
    {
      pinMode(ENA, OUTPUT);
      pinMode(ENB, OUTPUT);
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(xPin, INPUT);
      pinMode(yPin, INPUT);
      Serial.begin(9600);
    }
    void loop()
    {
    //читаем значения с джойстика и ремапим их от 0 до 252
    xValue = map(analogRead(xPin), 0, 1024, 0, 252);
    yValue = map(analogRead(yPin), 0, 1024, 0, 252);
    Serial.print(xValue); //выводим значение x
    Serial.print("\t"); //отступ
    Serial.print(yValue); //выводим значение y
    Serial.print("\t"); //отступ
    if (xValue <= 100)
    {
    digitalWrite(ENA, HIGH); // выключаем канал A
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    }
    else if (xValue > 101 && xValue <149)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    }
    if (xValue >= 150)
    {
    digitalWrite(ENA, HIGH); // выключаем канал A
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    }
    else if (xValue > 101 && xValue <149)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////
    if (yValue <= 100)
    {
    digitalWrite(ENB, HIGH); // выключаем канал A
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    }
    else if (yValue > 101 && yValue <149)
    {
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    }
    if (yValue >= 150)
    {
    digitalWrite(ENB, HIGH);  // включаем канал B
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    }
    else if (yValue > 101 && yValue <149)
    {
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    }
    }
     
  5. AlexU

    AlexU Гуру

    Первое, что приходит в голову -- это ШИМ (PWM). Читайте про функцию 'analogWrite()'.
    В случае с L298 возможны два варианта:
    1. сигнал ШИМ подавать на контакты ENA, ENB драйвера -- потребуется два канала ШИМ;
    2. ШИМ подавать на контакты 'in1' .. 'in4' -- потребуется четыре канала.
    В чём особенности этих способов можно посмотреть в документации к драйверу L298.
     
  6. GGV

    GGV Нуб

    спасибо)
     
  7. Sergante

    Sergante Нуб

    GGV, если не составит труда - поделитесь еще соображениями по скетчу..
    С вашим скетчем у меня происходит следующее..
    Стоит только перевести джойстик с нейтрального положения в направлении управления Мотором2, то:
    1. Один мотор крутится постоянно "назад".
    2. Мотор2 управляется джойстиком, но только при движении рычага вверх(вперед) и влево (назад)

    Вы изменяли еще как-то свой скетч?
    Схема та же - все соединения несколько раз перепроверил..
     
  8. DIGITALex

    DIGITALex Нуб

    тоесть нужна конвертация на оборот. тоесть считывать значение и принемать их от 0 до 254
     
  9. DIGITALex

    DIGITALex Нуб

    Код (C++):

    int xValue, yValue;
    int xValue1, yValue1;
    int xValue2, yValue2;

    int in1 = 9;
    int in2 = 10;

    int in3 = 11;
    int in4 = 6;
    int xPin = A1;
    int yPin = A0;   // Ось Y подключена к Analog 0
    void setup()
    {

      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(xPin, INPUT);
      pinMode(yPin, INPUT);
      Serial.begin(9600);
    }
    void loop()
    {
    //читаем значения с джойстика и ремапим их от 0 до 252
    xValue = map(analogRead(xPin), 0, 1024, 0, 252);
    yValue = map(analogRead(yPin), 0, 1024, 0, 252);
    xValue1 = map(xValue, 117, 0, 0, 252);
    yValue1 = map(yValue, 117, 0, 0, 252);
    xValue2 = map(xValue, 129, 252, 0, 252);
    yValue2 = map(yValue, 129, 252, 0, 252);

    if (xValue <= 114)
    {
    analogWrite(in1, xValue1);
    analogWrite(in2, LOW);
    }
    else if (xValue > 115 && xValue <129)
    {
    analogWrite(in1, LOW);
    analogWrite(in2, LOW);
    }
    if (xValue >= 131)
    {
    analogWrite(in1, LOW);
    analogWrite(in2, xValue2);
    }
    else if (xValue > 115 && xValue <129)
    {
    analogWrite(in1, LOW);
    analogWrite(in2, LOW);
    }



    ///////////////////////////////////////////////////////////////////////////////////////////////
    if (yValue <= 114)
    {
    analogWrite(in3, yValue1);
    analogWrite(in4, LOW);
    }
    else if (yValue > 115 && yValue <129)
    {
    analogWrite(in3, LOW);
    analogWrite(in4, LOW);
    }
    if (yValue >= 131)
    {
    analogWrite(in3, LOW);
    analogWrite(in4, yValue2);
    }
    else if (yValue > 115 && yValue <129)
    {
    analogWrite(in3, LOW);
    analogWrite(in4, LOW);
    }
    }
     
     
    Последнее редактирование: 4 фев 2019
  10. DIGITALex

    DIGITALex Нуб

    этот скетч подходит для гусинечной техники :)
     
  11. DIGITALex

    DIGITALex Нуб

    так касак обнаружил, 12пин не может быть шим заменил на 6 пин
     
  12. b707

    b707 Гуру

    DIGITALex - вставляйте код правильно.
     
  13. DIGITALex

    DIGITALex Нуб

    как правельно?
     
  14. b707

    b707 Гуру

    ПравИльно - перед тем как постить что-то на форум, ознакомиться с его правилами. В каждом разделе вверху прикреплена тема "Как пользоваться редактором"

    Ну и в 33 года можно было бы уже выучить, как пишутся слова "правИльно", "гусЕничный" - или хотя б начать пользоваться словариком..
    ЗЫ Если русский - неродной, последнее замечание снимается..
     
    Последнее редактирование: 31 янв 2019
  15. parovoZZ

    parovoZZ Гуру

    :eek: :confused:
     
    Kamikadze и b707 нравится это.
  16. b707

    b707 Гуру

    молодец! поделом мне :)
     
    Kamikadze нравится это.
  17. DIGITALex

    DIGITALex Нуб

    ну в принципе русский язык это мой минус я особо не вдаюсь в тонкости как меня поймут, тем что я не поэт я особо не расстраиваюсь. я знаю свои сильные стороны. я увидел в первые ардуино в утубе загорелся-> купил-> пришло-> взял с первого форума и понял как все работает и не пойму почему же ты гуру, что не смог помочь нубу, или ты наверное все таки не за содержанием следишь своих мысли, а за качеством исполнения в передачи их. ну тем немение увидеть толку по теме от такого гуру не представилось. ты наверное модератор, ну так возьми да исправь. полезнее будет для форума.
     
    Последнее редактирование: 3 фев 2019
  18. Kamikadze

    Kamikadze Гик

    Господа сори за офтоп, НО после таких вот постов, волей не волей вспоминаешь песенку Вани Воробья "..поколение пепси сменилось поколением, ЯГУАР...", а фильм "Идиократия" становится пророческим...
     
  19. DIGITALex

    DIGITALex Нуб

    покумекал есчо часик и решил сделать чтобы одним джойстиком управляться машинка одновременно в перед и при наклоне в лево или вправо одно из колесиков притормаживает и при этом получается поворот.
    задача решина, небольшое неудобство нужна калибровка.
    Код (C++):
    int xValue, yValue;
    int in1 = 9;
    int in2 = 10;

    int in3 = 11;
    int in4 = 6;
    int xPin = A1;
    int yPin = A0;   // Ось Y подключена к Analog 0
    void setup()
    {

      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(xPin, INPUT);
      pinMode(yPin, INPUT);
      Serial.begin(9600);
    }
    void loop()
    {
    //читаем значения с джойстика и ремапим их от 0 до 252
    xValue = map(analogRead(xPin), 0, 1024, 0, 252);
    yValue = map(analogRead(yPin), 0, 1024, 0, 252);



    if (xValue <= 114)
      {

        int xVa1, yVa1;

    xVa1 = map(xValue, 114, 0, 0, 252); //функция для масштабирования можно изменять для изменения скорости
    yVa1 = map(yValue, 114, 0, 0, 252); //функция для масштабирования можно изменять для изменения скорости


            if (yValue <= 114)
               {
                int xV;
                   xV = xVa1-yVa1; //притормаживание левого колеса во время движения в перед можно по другой формуле
                      analogWrite(in1,  xV);
                      analogWrite(in3, xVa1);
                }
                else if (yValue > 115 && yValue <129)
                   {
                      analogWrite(in1, xVa1);
                      analogWrite(in3, xVa1);
                      analogWrite(in2, LOW);
                      analogWrite(in4, LOW);
                    }
            if (yValue >= 131)
                {
                  int xV;
                  xV = xVa1-yVa1;//притормаживание правого колеса во время двежения в перед можно по другой формуле
                      analogWrite(in1,  xVa1);
                      analogWrite(in3, xV);
                }
                else if (yValue > 115 && yValue <129)
                  {
                      analogWrite(in1, xVa1);
                      analogWrite(in3, xVa1);
                      analogWrite(in2, LOW);
                      analogWrite(in4, LOW);
                  }

     
      }
        else if (xValue > 115 && xValue <129)
          {
              analogWrite(in1, LOW);
              analogWrite(in2, LOW);
              analogWrite(in3, LOW);
              analogWrite(in4, LOW);
          }
    if (xValue >= 131)
      {

    int xVa2, yVa2;

    xVa2 = map(xValue, 129, 252, 0, 252); //функция для масштабирования можно изменять для изменения скорости
    yVa2 = map(yValue, 129, 252, 0, 252); //функция для масштабирования можно изменять для изменения скорости

     
            if (yValue <= 114)
               {
                int xV;
                   xV = xVa2-yVa2; //притормаживание правого колеса во время движения назад можно по другой формуле
                      analogWrite(in2,  xV);
                      analogWrite(in4, xVa2);
                }
                else if (yValue > 115 && yValue <129)
                   {
                      analogWrite(in1, LOW);
                      analogWrite(in3, LOW);
                      analogWrite(in2, xVa2);
                      analogWrite(in4, xVa2);
                    }
            if (yValue >= 131)
                {
                  int xV;
                  xV = xVa2-yVa2; //притормаживание левого колеса во время движения назад можно по другой формуле
                      analogWrite(in2,  xVa2);
                      analogWrite(in4, xV);
                }
                else if (yValue > 115 && yValue <129)
                  {
                      analogWrite(in1, LOW);
                      analogWrite(in3, LOW);
                      analogWrite(in2, xVa2);
                      analogWrite(in4, xVa2);
                  }
      }
        else if (xValue > 115 && xValue <129)
          {
              analogWrite(in1, LOW);
              analogWrite(in2, LOW);
              analogWrite(in3, LOW);
              analogWrite(in4, LOW);
          }
    }
     
    Последнее редактирование: 4 фев 2019