1 (edited by laybeach 2024-05-14 13:13:20)

Topic: Неадекватная работа джойстика

Решил сделать машинку на р/у. Всего 1 мотор(2 соединенных параллельно)(в дальнейшем добавлю сервопривод, поэтому руления нет), драйвер используется тот, что на машинке, плата NodeMCU CP2102.
Проблема в следующем: при управлении джойстиком, если его допустим из верхнего положения(вперед) резко отпустить, то джойстик возвращается на 0, а машинка при этом продолжает движение вперед. Если же из верхнего положения джойстик плавно перемесить к центру, то все в порядке. Так же если из верхнего положения резко дернуть назад, то машинка тоже продолжает движение вперед, только с меньшей скоростью, хотя должна ехать вообще назад. Код вроде вообще простецкий, не понимаю, в чем проблема. Если делать все плавно проблем нет, стоит только начать резко управлять появляются проблемы.
На кнопки не обращайте внимание, забыл удалить после тестов

 //////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// можете включить вывод отладочной информации в Serial на 115200
//#define REMOTEXY__DEBUGLOG    

// определение режима соединения и подключение библиотеки RemoteXY 
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h>

// настройки соединения 
#define REMOTEXY_WIFI_SSID "RemoteXY"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377


#include <RemoteXY.h>

// конфигурация интерфейса RemoteXY  
#pragma pack(push, 1)  
uint8_t RemoteXY_CONF[] =   // 60 bytes
  { 255,4,0,0,0,53,0,17,0,0,0,31,2,106,200,200,84,1,1,3,
  0,5,52,144,49,49,129,32,46,46,37,2,26,31,1,3,135,22,22,68,
  45,26,26,0,2,31,0,1,28,134,22,22,37,45,26,26,0,2,31,0 };
  
// структура определяет все переменные и события вашего интерфейса управления 
struct {

    // input variables
  int8_t joystick_01_x; // oт -100 до 100
  int8_t joystick_01_y; // oт -100 до 100
  uint8_t button_01; // =1 если кнопка нажата, иначе =0
  uint8_t button_02; // =1 если кнопка нажата, иначе =0

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;   
#pragma pack(pop)
 
/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


#define MOTOR_FORWARD D2
#define MOTOR_BACKWARD D3

unsigned char MOTOR[2] = 
{MOTOR_FORWARD, MOTOR_BACKWARD};
void Motor (unsigned char * motor, int v)
{
  if (v>100) v=100;
  if (v<-100) v=-100;
  
  if (v>0) {
    analogWrite(motor[0], v*2.55);
  }
  else if (v<0) {
    analogWrite(motor[1], (-v)*2.55);
  }
  else {
    analogWrite(motor[1], 0);
    analogWrite(motor[2], 0);
  }
}
void setup() {
  RemoteXY_Init (); 

  // TODO you setup code
  analogWriteFreq(20000);
  pinMode (MOTOR_FORWARD, OUTPUT);
  pinMode (MOTOR_BACKWARD, OUTPUT);
}

void loop() 
{ 
  RemoteXY_Handler ();
  Motor (MOTOR, RemoteXY.joystick_01_y);
  // TODO you loop code
  // используйте структуру RemoteXY для передачи данных
  // не используйте функцию delay(), вместо нее используйте RemoteXY_delay() 


}

2

Re: Неадекватная работа джойстика

А, все, поглядев внимательно нашел ошибку в коде.
Вместо
analogWrite(motor[0], 0);
analogWrite(motor[1], 0);
Было
analogWrite(motor[1], 0);
analogWrite(motor[2], 0);