Серводвигатель и драйвер двигателя l298n не работают вместе с esp32
поэтому в основном я использую 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();
}
Я получаю правильные данные из приложения. Это тоже я перепроверил. Если кто-нибудь может помочь с этим или помочь мне, как я могу решить эту проблему.
@aditya gupta, 👍1
Обсуждение3 ответа
Привет, у меня такая же проблема здесь, и все указывает на то, что проблема может быть связана с каналами, разделяемыми для ШИМ. В Robojax lib есть контроль каналов, которые нужно назначить для каждого двигателя, но в ESP32Servo каналы назначаются библиотекой автоматически в последовательном порядке (см. ESP32PWM.cpp). Я бы попробовал использовать другой канал при вызове Robojax, который не конфликтует с количеством управляемых сервоприводов, может быть, это поможет. Например, в моем случае у меня есть один сервопривод и 2 двигателя постоянного тока, управляемые LN98. Итак, сервопривод использует канал 0 для ШИМ, два других двигателя на Robojax я попробую CHA= 2 и CHB = 3. Может быть, это поможет.
Есть общие таймеры, которые объясняются на ESP32PWM.cpp, строка 259, но я считаю, что конфликты каналов-это то, что вызывает эту проблему.
Я постараюсь дать вам знать. Спасибо
Я уже закончил, и для меня это работает сейчас. Просто нужно изменить CHA и CHB на другой номер канала PWM (0-15), но > чем количество сервопривода у вас есть. Спасибо
на самом деле даже я чувствовал то же самое, и я собирался попробовать это сегодня. Думаю, это сработает. Спасибо, братан, @aditya gupta
У меня было так, что EnA от L298N был пин № 10, а мой сервопривод был пин № 2, и это не работало. Но потом я их поменял местами, и все заработало.
Я столкнулся с той же проблемой. Но после некоторых R&D изменил номер канала ШИМ двигателя l298n. И теперь он работает правильно.
Спасибо, что поделились этим.
Не могли бы вы [отредактировать] и подробнее рассказать, как вы изменили номер канала ШИМ и что для этого нужно?, @Greenonline
- PIN Arduino Vin не работает, но питание 5-вольтового контакта Arduino работает
- Использование контактов IN1/IN2 для ШИМ вместо ENA в L298N
- Драйвер двигателя L298N с Nodemcu/ESP32
- LM7805 сильно нагревается с четырьмя серводвигателями
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Как установить связь между веб-камерой и Arduino UNO и получать прямую трансляцию на мобильном телефоне с помощью ESP8266?
Как вы все приводите в действие?, @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