Добрый день, сделал машинку на РУ от джойстика 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);
}
}