Серводвигатель и драйвер двигателя l298n не работают вместе с esp32

arduino-uno esp32 servo l298n esp8266webserver

поэтому в основном я использую 4 серводвигателя для нашей роботизированной руки и 1 драйвер двигателя l298n для привода 2 двигателей для основания руки. когда я индивидуально тестировал роботизированную руку и управлял 4 серводвигателями, она работала отлично, в то же время, когда я индивидуально тестировал линейное движение с драйвером двигателя, она также работала нормально. Но когда я объединил их, работали только сервоприводы, а l298n-нет. когда я закомментирую строку servos.attach (), то снова заработает драйвер двигателя. Вывод бывают разные. Вот почему даже я не мог понять, почему у меня возникла эта проблема.

#include <WiFi.h>
#include <WebServer.h>
#include <Robojax_L298N_DC_motor.h>
#include<Servo.h>

WebServer server(80);
Servo myservo,shoulder,elbow,wrist;
int grippos=0,shoulderpos=0,elbowpos=0,wristpos=0;



// motor 1 settings
#define CHA 0
#define ENA 19 // this pin must be PWM enabled pin if Arduino board is used
#define IN1 18
#define IN2 5

// motor 2 settings
#define IN3 15
#define IN4 2
#define ENB 4// this pin must be PWM enabled pin if Arduino board is used
#define CHB 1

const int CCW = 2; // do not change
const int CW  = 1; // do not change

#define motor1 1 // do not change
#define motor2 2 // do not change

String prev="";

Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA,  IN3, IN4, ENB, CHB);

void gripopen()
{
  Serial.println("open");
  grippos+=30;
  if(grippos>180)
  {
    grippos=180;
  }
  myservo.write(grippos);
  
}

void gripclose()
{
  grippos-=30;
  Serial.println("close");

  if(grippos<0)
  {
    grippos=0;
  }
  myservo.write(grippos);
  
}

void wristleft()
{
  wristpos-=30;
  Serial.println("wristleft");
  if(wristpos<0)
  {
    wristpos=0;
  }
  wrist.write(wristpos);
}

void wristright()
{
  Serial.println("wristright");
  wristpos+=30;
  if(wristpos>180)
  {
    wristpos=180;
  }
  wrist.write(wristpos);
}

void elbowup()
{
  Serial.println("elbow up");
  elbowpos+=15;
  if(elbowpos>180)
  {
    elbowpos=180;
  }
  elbow.write(elbowpos);
}

void elbowdown()
{
  Serial.println("elbow down");
  elbowpos-=15;
  if(elbowpos<0)
  {
    elbowpos=0;
  }
  elbow.write(elbowpos);
}

void shoulderup()
{
  Serial.println("shoulder up");
  shoulderpos+=15;
  if(shoulderpos>180)
  {
    shoulderpos=180;
  }
  shoulder.write(shoulderpos);
}

void shoulderdown()
{
  Serial.println("shoulder down");
  shoulderpos-=15;
  if(shoulderpos<0)
  {
    shoulderpos=180;
  }
  shoulder.write(shoulderpos);
}

void forward()
{
    Serial.println("forward");
    robot.rotate(motor1,100,CW);
    robot.rotate(motor2,100,CCW);
  
Serial.println("end reached");
  
}

void backward()
{
    Serial.println("backward");
        robot.rotate(motor1,100,CCW);
    robot.rotate(motor2,100,CW);
  Serial.println("end reached");
  
}

void left()
{
    Serial.println("left");
        robot.rotate(motor1,100,CW);
    robot.rotate(motor2,100,CW);
Serial.println("end reached");
  
}

void right()
{
    Serial.println("right");
      robot.rotate(motor1,100,CCW);
    robot.rotate(motor2,100,CCW);
Serial.println("end reached");
  
}

void stopbot()
{
  Serial.println("stopbot");
  robot.brake(1);
  robot.brake(2);
  prev="";
  Serial.println("end reached");
}

void reset()
{
  myservo.write(0);
  shoulder.write(0);
  elbow.write(0);
  wrist.write(0);
}

void handleRoot() {
  server.send(200, "text/plain", "Ready");
}

void handleGet() {
  if (server.hasArg("data")) {
    String data = server.arg("data");
    if(data=="gripper_open")
    {
      gripopen();
    }
    else if(data=="reset")
    {
      Serial.println("Reset");
    }
    else if(data=="Stop")
    {
      stopbot();
    }
    else if(data=="Forward")
    {
     // forward();
      if(prev!=data)
      {
        forward();
        prev=data;
      }
    }
    else if(data=="Backward")
    {
     // backward();
      if(prev!=data)
      {
        backward();
        prev=data;
      }
    }
    else if(data=="Left")
    {
      //left();
      if(prev!=data)
      {
        left();
        prev=data;
      }
    }
    else if(data=="Right")
    {
      //right();
      if(prev!=data)
      {
        right();
        prev=data;
      }
    }
    else if(data=="gripper_close")
    {
      gripclose();
    }
    else if(data=="elbow_up")
    {
      elbowup();
    }
    else if(data=="elbow_down")
    {
      elbowdown();
    }
    else if(data=="shoulder_up")
    {
      shoulderup();
    }
    else if(data=="shoulder_down")
    {
      shoulderdown();
    }
    else if(data=="Wrist_left")
    {
      wristleft();
    }
    else if(data=="Wrist_right")
    {
      wristright();
    }
    Serial.println("Data: " + data);
   
  }
  server.send(200, "text/plain", "Data Received");
}

void handlePost() {
    if (server.hasArg("data")) {
    String data = server.arg("data");
    Serial.println("Data: " + data);
  }
 // server.send(200, "text/plain", "Data Received");
  server.send(200, "text/plain", "Processing Data");
}

void handleUpload() {
  HTTPUpload& upload = server.upload();
  if (upload.status == UPLOAD_FILE_START) {
    Serial.println("Receiving data:");
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    Serial.write(upload.buf, upload.currentSize);
  } else if (upload.status == UPLOAD_FILE_END) {
    server.send(200, "text/plain", "Data: ");
  }
}

void setup() {
  Serial.begin(9600);
  WiFi.softAP("ESP32");
  myservo.attach(13);
  shoulder.attach(12);
  elbow.attach(14);
  wrist.attach(27);
  
  
  myservo.write(0);
  shoulder.write(0);
  elbow.write(0);
  wrist.write(0);

  // motordriver pins
  robot.begin();
  
  server.on("/", handleRoot);
  server.on("/get", HTTP_GET, handleGet);
  server.on("/pot", HTTP_POST,handlePost);
  server.begin();
}

void loop() {
  server.handleClient();
}

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

, 👍1

Обсуждение

Как вы все приводите в действие?, @chrisl

12v литий-полимерный аккумулятор 2200mAh. @крисл, @aditya gupta

И я предполагаю, что вы подключили 12 В от батареи непосредственно к L298N для питания двигателя 12 В, я прав? Я не вижу очевидной ошибки. Является ли последовательный выход ожидаемым? Вы проверили напряжения (если они действительно остаются такими, как ожидалось, и не снижаются при работе двигателя)?, @chrisl

да, входное напряжение для l298n показывает, что оно составляет около 12 В. Кроме того, я сохранил общее заземление с esp32. Последовательный монитор также выдает правильный вывод, указывающий на то, что вызывается правильная функция. вот почему я тоже не понимаю, в чем проблема. @крисл, @aditya gupta

[Этот учебник](https://dronebotworkshop.com/esp32-servo/) указывает, что вы не можете использовать стандартную библиотеку сервоприводов для ESP32. Честно говоря, я бы подумал, что это уже не проблема, но вы могли бы попробовать библиотеку, которая там упоминается., @chrisl

честно говоря, библиотека, которую я использовал, предназначена только для servo с esp32. библиотека-это не проблема, я думаю @chrisl, @aditya gupta


3 ответа


1

Привет, у меня такая же проблема здесь, и все указывает на то, что проблема может быть связана с каналами, разделяемыми для ШИМ. В Robojax lib есть контроль каналов, которые нужно назначить для каждого двигателя, но в ESP32Servo каналы назначаются библиотекой автоматически в последовательном порядке (см. ESP32PWM.cpp). Я бы попробовал использовать другой канал при вызове Robojax, который не конфликтует с количеством управляемых сервоприводов, может быть, это поможет. Например, в моем случае у меня есть один сервопривод и 2 двигателя постоянного тока, управляемые LN98. Итак, сервопривод использует канал 0 для ШИМ, два других двигателя на Robojax я попробую CHA= 2 и CHB = 3. Может быть, это поможет.

Есть общие таймеры, которые объясняются на ESP32PWM.cpp, строка 259, но я считаю, что конфликты каналов-это то, что вызывает эту проблему.

Я постараюсь дать вам знать. Спасибо

Я уже закончил, и для меня это работает сейчас. Просто нужно изменить CHA и CHB на другой номер канала PWM (0-15), но > чем количество сервопривода у вас есть. Спасибо

,

на самом деле даже я чувствовал то же самое, и я собирался попробовать это сегодня. Думаю, это сработает. Спасибо, братан, @aditya gupta


1

У меня было так, что EnA от L298N был пин № 10, а мой сервопривод был пин № 2, и это не работало. Но потом я их поменял местами, и все заработало.

,

0

Я столкнулся с той же проблемой. Но после некоторых R&D изменил номер канала ШИМ двигателя l298n. И теперь он работает правильно.

Спасибо, что поделились этим.

,

Не могли бы вы [отредактировать] и подробнее рассказать, как вы изменили номер канала ШИМ и что для этого нужно?, @Greenonline