Пищит мотор в РУ машинке, при откл. джойстика.

sashka_good

✩✩✩✩✩✩✩
3 Мар 2022
2
0
Добрый день, сделал машинку на РУ от джойстика PS2 (готовое шасси от китайского бренда конструкторов CADA). Все работает как надо кроме одной вещи, когда джойстик отключен motor1 начинает пищать и крутить на холостых. Этот мотор через редуктор и планетарное сцепление крутит рулевую рейку. Ткните плиз что исправить.
Мой код:
/*
    Пример плавного управления мотором при помощи драйвера полного моста и потенциометра
*/
// пины ресивера ps2
#define PS2_DAT A0
#define PS2_CMD A1
#define PS2_SEL A2
#define PS2_CLK A3

#include "GyverMotor.h"
GMotor motor(DRIVER2WIRE, 2, 3, HIGH);
GMotor motor1(DRIVER2WIRE, 4, 5, HIGH);

// варианты инициализации в зависимости от типа драйвера:
// GMotor motor(DRIVER2WIRE, dig_pin, PWM_pin, (LOW / HIGH) )
// GMotor motor(DRIVER3WIRE, dig_pin_A, dig_pin_B, PWM_pin, (LOW/HIGH) )
// GMotor motor(RELAY2WIRE, dig_pin_A, dig_pin_B, (LOW/HIGH) )
/*
  DRIVER2WIRE - двухпроводной драйвер (направление + ШИМ)
  DRIVER3WIRE - трёхпроводной драйвер (два пина направления + ШИМ)
  RELAY2WIRE - реле в качестве драйвера (два пина направления)

  dig_pin, dig_pin_A, dig_pin_B - любой цифровой пин МК
  PWM_pin - любой ШИМ пин МК
  LOW / HIGH - уровень драйвера. Если при увеличении скорости мотор наоборот тормозит - смени уровень
*/

#include <PS2X_lib.h>
PS2X ps2x;

void setup() {
  Serial.begin(9600);

  // установка скорости изменения скорости (ускорения) мотора
  motor.setSmoothSpeed(80);
  motor1.setSmoothSpeed(100);

  // ключ на старт!
  motor.setMode(AUTO);
  motor1.setMode(AUTO);

  motor.setDirection(REVERSE);
  motor1.setDirection(NORMAL);

  motor.setMinDuty(0);
  motor1.setMinDuty(50);

  // подрубаем геймпад
  ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false);
}

void loop() {
  // читаем геймпад
  bool success = ps2x.read_gamepad(false, 0);  // читаем
  ps2x.reconfig_gamepad(); // костыль

  if (success) {
    // преобразуем значение в -255.. 255
    int LY = map(ps2x.Analog(PSS_LY), 255, 0, -255, 255);
    int LX = map(ps2x.Analog(PSS_RX), 255, 0, -70, 70);

  // данную функцию рекомендуется вызывать чаще чем каждые 50 мс
  // (работает по встроенному таймеру)
  // она будет плавно менять скорость мотора к заданной
    motor.smoothTick(LY);
    motor1.smoothTick(LX);

  // отладка. Откройте Инструменты/Плоттер по последовательному порту   
   //Serial.print(LY);            // первый график - установленная скорость
  //Serial.print(',');
  //Serial.println(motor._duty);  // второй график - реальный сигнал на мотор
 
    delay(10);  // задержка просто для "стабильности"
    
  } else {
    // проблема с геймпадом - остановка
   motor.setSpeed(0);
   motor1.setSpeed(0);
 }
}
 

sashka_good

✩✩✩✩✩✩✩
3 Мар 2022
2
0
@poty, ну этому мотору крутить редуктор которому сопротивляются пружина достаточно тугая. Поэтому чтоб мотор не пищал в половине диапазона джойстика я и установил такую величину опытным путем.
Исправил на 0 писк пропал! Спасибо, поясните почему так было пожалуйста?
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,237
942
Я с этой библиотекой не работал, но по смыслу метода устанавливается минимальный уровень напряжения на моторе при нулевом управляющем воздействии.
Для регулировки любой системы с нелинейным откликом лучше подходит либо использование обратной связи, либо использование экстраполированных кривых. Методы map здесь работают грубо.
 
  • Лойс +1
Реакции: sashka_good