Приветствую всех!
Решил попробовать реализовать принцип управления всенаправленными колесами как в ролике про "телегу". https://alexgyver.ru/mecanumbot/ "Телега" сама в наличии, собрана по той же схеме. Только управление идет не от джойстика PS2, а от собранного пульта (Мозги Уна, два модулями джойстика KY-023). Связь "телеги" и пульта идет по двум HC-12, то есть Serial. Драйвера mx1508 - соединены как и указано - два провода на цифре два на ШИМе. Проблема - не могу попасть в логический "0", то есть колеса все время крутятся как только модули законектятся. Такое ощущение что не правильно мапятся значения с джоев, и в итоге все время идет высокий сигнал на моторы. Пробовал и пины другие, джойстики другие, и маппинг по другим интервалам.... по разному. Но результат один - колеса не стоят на месте.
У Алекса в ролике есть момент, что со стиков ps2 должны приходить значания от -255 до 255, или я чего то не понимаю, поскольку с джоев ps2 приходит по умолчанию от 0 до 255 (среднее 127 соответственно). Либо мапится неправильно либо вычисления для скорости моторов не правильно происходят. Прошу помощи!
Скетч пульта
Скетч телеги (слегка доработанный скетч Алекса, 99% исходный код)
Решил попробовать реализовать принцип управления всенаправленными колесами как в ролике про "телегу". https://alexgyver.ru/mecanumbot/ "Телега" сама в наличии, собрана по той же схеме. Только управление идет не от джойстика PS2, а от собранного пульта (Мозги Уна, два модулями джойстика KY-023). Связь "телеги" и пульта идет по двум HC-12, то есть Serial. Драйвера mx1508 - соединены как и указано - два провода на цифре два на ШИМе. Проблема - не могу попасть в логический "0", то есть колеса все время крутятся как только модули законектятся. Такое ощущение что не правильно мапятся значения с джоев, и в итоге все время идет высокий сигнал на моторы. Пробовал и пины другие, джойстики другие, и маппинг по другим интервалам.... по разному. Но результат один - колеса не стоят на месте.
У Алекса в ролике есть момент, что со стиков ps2 должны приходить значания от -255 до 255, или я чего то не понимаю, поскольку с джоев ps2 приходит по умолчанию от 0 до 255 (среднее 127 соответственно). Либо мапится неправильно либо вычисления для скорости моторов не правильно происходят. Прошу помощи!
Скетч пульта
Код пульта:
int pin1 = A0; //пин для приема сигнала с первого потенциометра
int pin2 = A1; //пин для приема сигнала со второго потенциометра
int pin3 = A2; //пин для приема сигнала с первого потенциометра
int pin4 = A3; //пин для приема сигнала со второго потенциометра
byte arr[] = {0, 0, 0, 0}; //массив, в котором будем отправлять данные
void setup() {
Serial.begin(9600); //инициализация работы порта на скорости 9600 бод
pinMode(pin1, INPUT); //настройка пина A0 на прием данных
pinMode(pin2, INPUT); //настройка пина A1 на прием данных
pinMode(pin3, INPUT); //настройка пина A2 на прием данных
pinMode(pin4, INPUT); //настройка пина A3 на прием данных
}
void loop() {
arr[0] = map(analogRead(pin1), 0, 1023, 0, 256);//
arr[1] = map(analogRead(pin2), 0, 1023, 0, 256);//
arr[2] = map(analogRead(pin3), 0, 1023, 0, 256);//
arr[3] = map(analogRead(pin4), 0, 1023, 0, 256);//
Serial.write(arr, 4); //передача сигнала другому модулю
delay(50); //пауза на 0.2 секунды для стабилизации
}
Скетч телеги (слегка доработанный скетч Алекса, 99% исходный код)
Код телеги:
#define MAX_SPEED 170 // максимальная скорость моторов (0-255)
byte arr[] = {0, 0, 0, 0};
const int MOTOR1_A=34;
const int MOTOR1_B=5;
const int MOTOR2_A=35;
const int MOTOR2_B=4;
const int MOTOR3_A=36;
const int MOTOR3_B=3;
const int MOTOR4_A=37;
const int MOTOR4_B=2;
#include <GyverMotor.h>
// тут можно поменять моторы местами
GMotor motorFL(DRIVER2WIRE, MOTOR1_A, MOTOR1_B, HIGH);
GMotor motorBL(DRIVER2WIRE, MOTOR2_A, MOTOR2_B, HIGH); //FL
GMotor motorFR(DRIVER2WIRE, MOTOR3_A, MOTOR3_B, HIGH);
GMotor motorBR(DRIVER2WIRE, MOTOR4_A, MOTOR4_B, HIGH);
void setup() {
Serial3.begin(9600);
motorFR.setMinDuty(30);
motorBR.setMinDuty(30);
motorFL.setMinDuty(30);
motorBL.setMinDuty(30);
motorFR.setMode(AUTO);
motorBR.setMode(AUTO);
motorFL.setMode(AUTO);
motorBL.setMode(AUTO);
motorFR.setSmoothSpeed(60);
motorBR.setSmoothSpeed(60);
motorFL.setSmoothSpeed(60);
motorBL.setSmoothSpeed(60);
delay(1000); // ждём запуска контроллера
}
void loop() {
bool success = Serial3.readBytes(arr, 4); // читаем
if (success) {
int valLX = map(arr[0], 0, 255, -MAX_SPEED, MAX_SPEED);
int valLY = map(arr[1], 255, 0, -MAX_SPEED, MAX_SPEED); // инвертируем
int valRX = map(arr[3], 0, 255, -MAX_SPEED, MAX_SPEED);
int valRY = map(arr[4], 255, 0, -MAX_SPEED, MAX_SPEED); // инвертируем
int dutyFR = valLY + valLX;
int dutyFL = valLY - valLX;
int dutyBR = valLY - valLX;
int dutyBL = valLY + valLX;
dutyFR += valRY - valRX;
dutyFL += valRY + valRX;
dutyBR += valRY - valRX;
dutyBL += valRY + valRX;
motorFR.smoothTick(dutyFR);
motorBR.smoothTick(dutyBR);
motorFL.smoothTick(dutyFL);
motorBL.smoothTick(dutyBL);
}
else {
// страшно, вырубай
motorFR.setSpeed(0);
motorBR.setSpeed(0);
motorFL.setSpeed(0);
motorBL.setSpeed(0);
}
delay(50);
}
Вложения
-
193.4 KB Просмотры: 9
-
113.6 KB Просмотры: 9
Изменено: