Привод двигателя работает только в одну сторону

У меня есть 3 водителя, и все 3 других, похоже, работают только с одной из 2 сторон. Я использовал вольтметр для проверки напряжений в каждой из 2 секций каждого драйвера двигателя. Для всех 3 драйверов двигателей 2 из них имели одну сторону, на которой было напряжение 5 В (которое должно составлять 7,2 вольта, поскольку это источник питания), а другие стороны 2 драйверов двигателей были 0-0,05 В (так что фактически никакого напряжения). У другого водителя двигателя не было напряжения ни с одной из 2 сторон. Все ли 3 водителя неисправны или я их сломал? Схема для водителей была следующей:

(Кроме источника 12 В вместо источника 12 В используется источник 7,2 В, но это то количество вольт, которое мне нужно для двигателей. Arduino, который я использовал, был Arduino mega, а не UNO, показанным на этой диаграмме, поскольку я получил эту диаграмму из Интернета) Вот ссылка на место, откуда я заказывал водителей: https://thepihut.com/products/l298n-motor-stepper-driver

Вот мой код:

    #include <PS2X_lib.h> //для версии v1.6
    int enA = 3;
    int in1 = 8;
    int in2 = 7;
    int enB = 9;
    int in3 = 5;
    int in4 = 4;
    int error = 0; 
    byte type = 0;
    byte vibrate = 0;
    int light_one_pin = 36;
    int light_two_pin = 38;
    bool lights_on = false;
    PS2X ps2x;
    void setup(){
     Serial.begin(9600);
     pinMode(enA, OUTPUT);
     pinMode(in1, OUTPUT);
     pinMode(in2, OUTPUT);
     pinMode(in3, OUTPUT);
     pinMode(in4, OUTPUT);
     pinMode(light_one_pin, OUTPUT);
     pinMode(light_two_pin, OUTPUT);
    
     //ИЗМЕНЕНИЯ для версии v1.6 ЗДЕСЬ!!! **************ОБРАТИТЕ ВНИМАНИЕ*************
     for(int x = 0; x < 100; x++)
     {
      error = ps2x.config_gamepad(13,11,10,12, true, true);   //контакты и настройки:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
     }
     error = 0;
      
    }
    
    void loop() {
      ps2x.read_gamepad(false, vibrate);
    
      if(ps2x.ButtonPressed(PSB_GREEN) && lights_on == false)
      {
         digitalWrite(light_one_pin, HIGH);  
         digitalWrite(light_two_pin, HIGH);  
         lights_on = true;
         Serial.println("on"); 
      }
      else if(ps2x.ButtonPressed(PSB_GREEN) && lights_on == true)
      {
          digitalWrite(light_one_pin, LOW);  
          digitalWrite(light_two_pin, LOW);  
          lights_on = false;
          Serial.println("off");
      }
    
      if(ps2x.Analog(PSS_LY) < 128)
        {
          digitalWrite(in1, LOW);//все колеса вперед
          digitalWrite(in2, HIGH);
          digitalWrite(in3, HIGH);
          digitalWrite(in4, LOW);
          analogWrite(enA, 255);
          analogWrite(enB, 255);
          Serial.println("forwards");
          
        }
    
        else if(ps2x.Analog(PSS_LY) > 128)
        {
          digitalWrite(in1, HIGH);//все колеса задом наперед
          digitalWrite(in2, LOW);
          digitalWrite(in3, LOW);
          digitalWrite(in4, HIGH);
          analogWrite(enA, 255);
          analogWrite(enB, 255);
          Serial.println("backwards");
    
        }
    
        else if(ps2x.Analog(PSS_LY) == 128)
        {
          analogWrite(enA, 0);
          analogWrite(enB, 0);
          Serial.println("stationary");
    
        }
    
        else if(ps2x.Analog(PSS_LX) == 128)
        {
            //Serial.println("still");
            //wheel_steering_servo.write(wheel_steering_servo_angle);
        }
    
        Serial.println(ps2x.Analog(PSS_LX));
        
    }

, 👍1

Обсуждение

Пожалуйста, предоставьте ссылку на точный продукт, который вы используете для водителей. А также покажите нам свой код. Вы можете включить эту информацию в свой вопрос, отредактировав его, @chrisl

@chrisl Я это сделал., @DigitalRookie4

У вас есть UNO с пинами 36 и 38, да?, @timemage

@timemage О да, извините, я виноват, я забыл упомянуть, что я использую arduino Mega, @DigitalRookie4

правильная вещь, которую нужно сделать, - это отредактировать свой пост, вместо того, чтобы указывать важные детали в комментариях, @jsotola

Поменяйте местами двигатели влево и вправо и посмотрите, не следует ли проблема за двигателем. Поменяйте местами наборы контактов INx/EN влево и вправо и посмотрите, следует ли проблема за набором контактов., @timemage

вы проверяли, требуется ли для библиотеки/экрана, чтобы некоторые контакты были ШИМ-контактами?, @Juraj


2 ответа


1

Есть пара вещей, которые вы можете проверить-

Ваш код-

Скорее всего, все драйверы двигателя функционируют (поскольку производственные дефекты очень редки) и что-то не так с кодом.

1- мотор, который вы используете, имеет 2 контакта, которые должны быть помечены как "ENA", "ENB" (или какой-то вариант этих), Для того, чтобы водитель мотора для работы на обе стороны, обе эти контакты должны быть высокими, если любой из этих низкие, то с этой стороны не получится. Я настоятельно рекомендую вам напрямую подключить эти 2 контакта к 5 В и использовать 4 входа для управления.

2- 4 входных контакта с надписями "IN1", "IN2", "IN3", "IN4" - это контакты, которые указывают водителю перемещать каждую сторону вперед или назад, проверьте свой код, чтобы убедиться, что эти контакты высокие или низкие в соответствии с вашими требованиями.

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

Ваше оборудование-

Если вы обнаружите, что что-то становится ненормально горячим на платах или еще хуже, если что-то сгорело, вам следует проверить свою схему и убедиться, что проблем нет.

-- Проблема в вашем коде заключается в том, что "ENB" не задан в качестве выходного и, следовательно, не является высоким, вам также следует изменить настройку, чтобы установить "ENA", "ENB" на высокий, чтобы убедиться, что он включен.

Так что ваша настройка должна быть примерно такой-

     Serial.begin(9600);
     pinMode(enA, OUTPUT);
     pinMode(enB, OUTPUT);
     digitalWrite(enA, HIGH);
     digitalWrite(enB, HIGH);
     pinMode(in1, OUTPUT);
     pinMode(in2, OUTPUT);
     pinMode(in3, OUTPUT);
     pinMode(in4, OUTPUT);
     pinMode(light_one_pin, OUTPUT);
     pinMode(light_two_pin, OUTPUT);
,

2

Просто поправка к тому, что написал Кодер9390:

Контакты ENA и ENB на этом электроприводе не должны использоваться в качестве цифровых контактов и принимать ВЫСОКИЕ или НИЗКИЕ значения, а в качестве аналоговых контактов и получать значение в диапазоне 0-255 с помощью ШИМ-вывода (ШИМ-контакты отмечены на плате знаком ~). Это позволяет управлять скоростью двигателя, имитируя низкое напряжение.

В своем коде вы, похоже, делаете это правильно, поэтому я не думаю, что в этом проблема. Установка контакта ENA и ENB для вывода, с другой стороны, правильна, так что на самом деле это может быть проблемой. Однако я не смог воспроизвести вашу ошибку таким образом, так что это может быть что-то другое.

В случае, если вам не нужно контролировать скорость двигателя и хотим, чтобы всегда идти полным ходом, вы можете использовать перемычки на короткий каждой ванной контакт с ортогонально-рядом штифт (которые отмечены на изображении 5В) для достижения того же эффекта их подключении к 5В "вручную", а Coder9390 предложил (в основном поместив перемычки есть вы делаете именно это - соединяющий в собственной пене до 5В).

Coder9390, если вы неявно хотели предложить использовать такие перемычки, то извините за искажение вашего ответа. Я думал, что новичкам неясно, кто может сюда попасть, и что это требует доработки.

Смотрите это использование драйвера двигателя, объясненное здесь: https://create.arduino.cc/projecthub/ryanchan/how-to-use-the-l298n-motor-driver-b124c5

,

Очень верно, у меня не было большого опыта работы с этими платами, я знал только, что они обеспечивают выходы, а не контролируют скорость, хорошая информация ., @Coder9390