Как управлять скоростью двигателя с помощью L298N и Node MCU?
Я хочу управлять машинкой с радиоуправлением с помощью джойстика в мобильном телефоне. В настоящее время я могу заставить двигатель двигаться только вперед и назад, но не могу контролировать скорость. Узел mcu используется как процессор для получения сообщения.
Вот код ниже:-
#include <ESP8266WiFi.h>
#define PubNub_BASE_CLIENT WiFiClient
#include <PubNub.h>
#define PUBNUB_DEFINE_STRSPN_AND_STRNCASECMP
#include <L298N.h>
const char *ssid = "mym404"; // замените на ваш Wi-Fi ssid и ключ wpa2
const char *pass = "786110786";
const char * pubkey = "";
const char * subkey = "";
const char * subchannel = "base";
#define ENB D6
#define IN1 D3
#define IN2 D4
L298N motorL(ENB, IN1, IN2);
#define ENA D5
#define IN3 D1
#define IN4 D7
L298N motorR(ENA, IN3, IN4);
void setup() {
/* For debugging, set to speed of your choice */
Serial.begin(115200);
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
/* Start the Pubnub library by giving it a publish and subscribe
keys */
PubNub.begin(pubkey, subkey);
}
void loop() {
int tim = millis();
PubSubClient *sclient = PubNub.subscribe(subchannel);
if (!sclient) return; // ошибка
String msg;
SubscribeCracker ritz(sclient);
if (!ritz.finished()) {
ritz.get(msg);
if (msg.length() > 0) {
Serial.print("Received: "); Serial.println(msg);
String X = getStringPartByNr(msg, ':', 0);
String Y = getStringPartByNr(msg, ':', 1);
X.remove(0,1);
int Xcord = X.toInt();
int Ycord = Y.toInt();
Serial.print("X: "); Serial.println(Xcord);
Serial.print("Y: "); Serial.println(Ycord);
int angle;
int throttle = (Xcord + Ycord)/2;
if ((Xcord > 100) && (Ycord > 100)) {
angle = round(atan2(Ycord-100,Xcord-100)*(180/3.14));
motorR.forward();
motorL.forward();
motorR.setSpeed(abs(int(throttle*sin(angle))));
motorL.setSpeed(throttle);
Serial.print("R speed: "); Serial.println(abs(int(throttle*sin(angle))));
Serial.print("L speed: "); Serial.println(throttle);
//motorR.forward();
//двигательL.forward();
}
else if ((Xcord < 100) && (Ycord > 100)) {
angle = 180 - round(atan2(Ycord-100,100-Xcord)*(180/3.14));
motorR.setSpeed(throttle);
motorL.setSpeed(abs(int(throttle*sin(angle))));
Serial.print("R speed: "); Serial.println(throttle);
Serial.print("L speed: "); Serial.println(abs(int(throttle*sin(angle))));
motorR.forward();
motorL.forward();
}
else if ((Xcord < 100) && (Ycord < 100)) {
angle = 180 + round(atan2(100-Ycord,100-Xcord)*(180/3.14));
motorR.setSpeed(200-throttle);
motorL.setSpeed(abs(int((200-throttle)*sin(angle)*(-1))));
Serial.print("R speed: "); Serial.println(200-throttle);
Serial.print("L speed: "); Serial.println(abs(int((200-throttle)*sin(angle)*(-1))));
motorR.backward();
motorL.backward();
}
else if ((Xcord > 100) && (Ycord < 100)) {
angle = 270 + round(atan2(Xcord-100,100-Ycord)*(180/3.14));
motorR.setSpeed(abs(int((200-throttle)*sin(angle)*(-1))));
motorL.setSpeed(200-throttle);
Serial.print("R speed: "); Serial.println(abs(int((200-throttle)*sin(angle)*(-1))));
Serial.print("L speed: "); Serial.println(200-throttle);
motorR.backward();
motorL.backward();
}
Serial.print("Angle: "); Serial.println(angle);
//Serial.print("время:"); Serial.println(тим);
}
}
sclient->stop();
}
String getStringPartByNr(String data, char separator, int index)
{
// разбиваем строку и возвращаем индекс номера части
// разделить по разделителю
int stringData = 0; //переменная для подсчета части данных nr
String dataPart = ""; //переменная для удаления возвращаемого текста
for(int i = 0; i<data.length()-1; i++) { //Проходим по тексту по одной букве за раз
if(data[i]==separator) {
//Подсчитываем, сколько раз символ-разделитель появляется в тексте
stringData++;
}else if(stringData==index) {
//получаем текст, если разделитель правильный
dataPart.concat(data[i]);
}else if(stringData>index) {
// возвращаем текст и останавливаемся, если появляется следующий разделитель - для экономии процессорного времени
return dataPart;
break;
}
}
// возвращаем текст, если это последняя часть
return dataPart;
}
Чтение порта:-
В чем может быть проблема?
@suu, 👍-1
Обсуждение1 ответ
Это связано с тем, что библиотека l298n используется для arduino или других микроконтроллеров, в системах которых есть аппаратная ШИМ. Библиотека использует аппаратный ШИМ, генерируя импульсы и делая вариации циклического раппорта, известного как «альфа». Esp8266 не имеют ШИМ в своих системах Поэтому попробуйте использовать программную библиотеку pwm для esp8266
это ссылка. https://www.arduinolibraries.info/libraries/soft-pwm
Также не включайте эту библиотеку и пытайтесь заставить ее работать с помощью простых строк кода.
Вы имеете в виду управление ШИМ с помощью рабочих циклов или аналоговой записи?, @suu
- ESP8266 не подключается к Wi-Fi
- WebSocketsServer.h: No such file or directory
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- Как установить связь между веб-камерой и Arduino UNO и получать прямую трансляцию на мобильном телефоне с помощью ESP8266?
- Как получить текущий уровень сигнала WiFi?
- Обнаружение ESP8266 в сети
- L298N Dual Motor Controller Enable Pin имеет питание, но двигатели не работают
- L298N, HC-05 Простой автомобиль с дистанционным управлением через Bluetooth, не работающий в Arduino
Я полагаю, что ШИМ NodeMCU колеблется от 0 до 1024. Не только 0-255. Кроме того, убедитесь, что вывод поддерживает ШИМ. И попробуйте минимальный скетч вроде: motorL.speed(1000); скорость двигателя(500); моторR.вперед(); моторL.вперед();, @Paul
спасибо попробую, @suu