Как управлять скоростью двигателя с помощью 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;
}

Чтение порта:-

В чем может быть проблема?

, 👍-1

Обсуждение

Я полагаю, что ШИМ NodeMCU колеблется от 0 до 1024. Не только 0-255. Кроме того, убедитесь, что вывод поддерживает ШИМ. И попробуйте минимальный скетч вроде: motorL.speed(1000); скорость двигателя(500); моторR.вперед(); моторL.вперед();, @Paul

спасибо попробую, @suu


1 ответ


1

Это связано с тем, что библиотека l298n используется для arduino или других микроконтроллеров, в системах которых есть аппаратная ШИМ. Библиотека использует аппаратный ШИМ, генерируя импульсы и делая вариации циклического раппорта, известного как «альфа». Esp8266 не имеют ШИМ в своих системах Поэтому попробуйте использовать программную библиотеку pwm для esp8266

это ссылка. https://www.arduinolibraries.info/libraries/soft-pwm

Также не включайте эту библиотеку и пытайтесь заставить ее работать с помощью простых строк кода.

,

Вы имеете в виду управление ШИМ с помощью рабочих циклов или аналоговой записи?, @suu