Прошу помощи в маппинге джойстика для бота с маканум-колесами

skunss

✩✩✩✩✩✩✩
1 Авг 2023
5
0
Приветствую всех!

Решил попробовать реализовать принцип управления всенаправленными колесами как в ролике про "телегу". 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);
}
 

Вложения

Изменено:

skunss

✩✩✩✩✩✩✩
1 Авг 2023
5
0
Путем проб и ошибок понимаю, что наверное дело не в маппинге, а в том что код начинает исполняться как только в Serial, что то приходит. То есть если в "пульт" залить условно говоря скетч "hello world" и его передавать в Serial , то телега его примет за логическую "1" и начнет крутиться. Короче не понимаю.
Пробовал и диапазон ограничивать, чтобы центральную часть джойстиков ограничить, менял HC-12 на голубозубые НС-05, пробовал подружить ее RemoteXY, одно и тоже. Проблема сохраняется.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@skunss, для начала в приёмнике и передатчике параллельно организуйте вывод данных в монитор порта Serial. И затем смотрите, что там передаётся и принимается. Иначе гадать будете до второго пришествия.
 

skunss

✩✩✩✩✩✩✩
1 Авг 2023
5
0
Сделал Serial.read тех int что должны фомироваться.... дичь какая-то идет.

Кто нибудь собирал такую телегу по проекту именно с джоями ps2? Все ровно работало?
 

skunss

✩✩✩✩✩✩✩
1 Авг 2023
5
0
Программирование требует аккуратности)) Кто бы мог подумать)) Вчера наконец закончил простую задачу несинхронного управления машинкой-балванкой от двух джоев. По сути основная проблема была в создании массива и тому что в него залетает. Библиотека Гайвера весьма толковая - советую, она убирает необходимость устранения проблемы нулевой позиции или мёртвой зоны джоя, то есть не учитывает "дребезг" который есть у всех дешманских модулей джойстиков. Сейчас управление четкое - один джой отвечает за ускорение и стрейфы, второй за повороты. Можно подумать как уменьшить инпутлаг, так как он сейчас достаточно сильно ощущается. Всем спасибо кто включился и помог. Файлы прошивок пульта и тушки во вложении.
 

Вложения

Изменено: