Официальный сайт компании Arduino по адресу arduino.cc
Скетч управления роботом-пауком от джойстика PS2. Нужна помощь.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Доброго всем дня. Вот решил перейти в управлении роботом с ИК на джойстик PS2. Взял скетч управления танком jeka_tm и как мог приколхозил к своему. Предполагается, что робот должен управляться левым стиком. Но, при включении, робот занимает начальное положение (строки 047-058) и сразу начинает выполнение блока "назад" на джойстик не реагирует. Монитор порта выдаёт
@ OUT:IN Configure 1:FF 43:FF 0:FF 1:FF 0:FF OUT:IN Configure 1:FF 44:FF 0:FF 1:FF 3:FF 0:FF 0:FF 0:FF 0:FF OUT:IN Configure 1:FF 43:FF 0:FF 0:FF 5A:FF 5A:FF 5A:FF 5A:FF 5A:FF OUT:IN Configure 1:FF 43:FF 0:FF 1:FF 0:FF OUT:IN Configure 1:FF 44:FF 0:FF 1:FF 3:FF 0:FF 0:FF 0:FF 0:FF OUT:IN Configure 1:FF 43:FF 0:FF 0:FF 5A:FF 5A:FF 5A:FF 5A:FF 5A:FF OUT:IN Configure 1:FF 43:FF 0:FF 1:FF 0:FF OUT:IN Configure 1:FF 44:FF 0:FF 1:FF 3:FF 0:FF 0:FF 0:FF 0:FF OUT:IN Configure 1:FF 43:FF 0:FF 0:FF 5A:FF 5A:FF 5A:FF 5A:FF 5A:FF OUT:IN Configure 1:FF 43:FF 0:FF 1:FF 0:FF OUT:IN Configure 1:FF 44:FF 0:FF 1:FF 3:FF 0:FF 0:FF 0:FF 0:FF OUT:IN Configure 1:FF 43:FF 0:FF 0:FF 5A:FF 5A:FF 5A:FF 5A:FF 5A:FF OUT:IN Configure 1:FF 43:FF 0:FF 1:FF 0:FF OUT:IN Configure 1:FF 44:FF 0:FF 1:FF 3:FF 0:FF 0:FF 0:FF 0:FF OUT:IN Configure 1:FF 43:FF 0:FF 0:FF 5A:FF 5A:FF 5A:FF 5A:FF 5A:FF OUT:IN 1:FF 42:FF 0:FF 0:FF 0:FF 0:FF 0:FF 0:FF 0:FF 0:0 0:0 0:0 0:0 0:0 0:0 0:0 0:0 0:0 0:0 0:0 0:0 и повторяет это без изменений, не реагируя на стик. Питание приёмника 3,3В, подключил вроде правильно плата Мега 2560. Скажите, пожалуйста, где я ошибся?
#include <PS2X_lib.h> #include <Servo.h> PS2X ps2x; // Создаём объект для библиотеки джойстика int error = 0; byte type = 0; byte vibrate = 0; byte UP1; boolean DOWN1; byte LEFT1; boolean RIGHT1; Servo servoLG1; // Создаём объекты для библиотеки Сервы Servo servoLV1; Servo servoLG2; Servo servoLV2; Servo servoLG3; Servo servoLV3; Servo servoRG1; Servo servoRV1; Servo servoRG2; Servo servoRV2; Servo servoRG3; Servo servoRV3; unsigned long currentTime2; //Переменная для pause byte var = 0; byte run = 0; // Переменная для движения void setup() { error = ps2x.config_gamepad(8,6,5,7, true, true); //Настройка выводов: (clock, command, attention, data, Pressures?, Rumble?) servoLG1.attach(26); // Подключаем сервы к пинам servoLV1.attach(34); servoLG2.attach(27); servoLV2.attach(35); servoLG3.attach(28); servoLV3.attach(36); servoRG1.attach(30); servoRV1.attach(38); servoRG2.attach(31); servoRV2.attach(39); servoRG3.attach(32); servoRV3.attach(40); Serial.begin(9600); // устанавливает скорость обмена данными с компьютером servoLG1.write(90); // 1-я нога начальное положение после включения servoLG2.write(90); // 2-я нога servoLG3.write(90); // 3-я нога servoRG1.write(90); // 4-я нога servoRG2.write(90); // 1-я нога servoRG3.write(90); // 2-я нога servoLV1.write(90); // 3-я нога servoLV2.write(90); // 4-я нога servoLV3.write(90); // 3-я нога servoRV1.write(90); // 4-я нога servoRV2.write(90); // 3-я нога servoRV3.write(90); // 4-я нога } //Функция паузы int pause(int y) { bool x = 0; if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis(); return x; } void loop() { ps2x.read_gamepad(false, vibrate); //=========================================================================================== // Граничные условия для X и Y //=========================================================================================== if (ps2x.Analog(PSS_LX) == 128){ LEFT1 = 0; } if (ps2x.Analog(PSS_LX) < 128){ LEFT1 = 255-ps2x.Analog(PSS_LX)*2; RIGHT1 = 0; } if (ps2x.Analog(PSS_LX) > 128){ LEFT1 = ps2x.Analog(PSS_LX)*2-255; RIGHT1 = 1; } if (ps2x.Analog(PSS_LY) == 128){ UP1 = 0; } if (ps2x.Analog(PSS_LY) < 128){ UP1 = 255-ps2x.Analog(PSS_LY)*2; DOWN1 = 1; } if (ps2x.Analog(PSS_LY) > 128){ UP1 = ps2x.Analog(PSS_LY)*2-255; DOWN1 = 0; } //=========================================================================================== // Вперед1 //=========================================================================================== if (UP1 > 0 && DOWN1 == 1) { run = 2; } //=========================================================================================== // Назад1 //=========================================================================================== if (UP1 > 0 && DOWN1 == 0) { run = 1; } //=========================================================================================== // Разворот влево1 //=========================================================================================== if (LEFT1 > 0 && UP1 == 0 && RIGHT1 == 0) { run = 3; } //=========================================================================================== // Разворот вправо1 //=========================================================================================== if (LEFT1 > 0 && UP1 == 0 && RIGHT1 == 1) { run = 4; } //=========================================================================================== // Остановка //=========================================================================================== if (UP1 == 0 && DOWN1 == 0) { run = 0; var = 0; servoLG1.write(90); // 1-я нога servoLG2.write(90); // 2-я нога servoLG3.write(90); // 3-я нога servoRG1.write(90); // 4-я нога servoRG2.write(90); // 1-я нога servoRG3.write(90); // 2-я нога servoLV1.write(90); // 3-я нога servoLV2.write(90); // 4-я нога servoLV3.write(90); // 3-я нога servoRV1.write(90); // 4-я нога servoRV2.write(90); // 3-я нога servoRV3.write(90); // 4-я нога } if (run == 1) { //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 200, при этом можно без тормозов опрашивать другие датчики if (pause (200)) { switch (var) { case 0: servoLV1.write(120); // 1-я нога вверх servoLG1.write(60); // 1-я нога вперёд servoLV3.write(60); // 3-я нога вверх servoLG3.write(60); // 3-я нога вперёд servoRV2.write(60); // 2-я нога вверх servoRG2.write(120); // 2-я нога вперёд servoLG2.write(120); // 1-я нога вперёд servoRG1.write(60); // 3-я нога вперёд servoRG3.write(60); // 2-я нога вперёд var = 1; break; case 1: servoLV1.write(90); // 3-я нога вниз servoLV3.write(90); // 3-я нога вверх servoRV2.write(90); // 2-я нога вверх var = 2; break; case 2: servoRV1.write(60); // 1-я нога вверх servoRG1.write(120); // 1-я нога вперёд servoRV3.write(120); // 3-я нога вверх servoRG3.write(120); // 3-я нога вперёд servoLV2.write(120); // 2-я нога вверх servoLG2.write(60); // 2-я нога вперёд servoRG2.write(60); // 1-я нога вперёд servoLG1.write(120); // 3-я нога вперёд servoLG3.write(120); // 2-я нога вперёд var = 3; break; case 3: servoRV1.write(90); // 3-я нога вниз servoRV3.write(90); // 3-я нога вверх servoLV2.write(90); // 2-я нога вверх var = 0; break; } } } if (run == 2) { //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 200, при этом можно без тормозов опрашивать другие датчики if (pause (200)) { switch (var) { case 0: servoLV1.write(120); // 1-я нога вверх servoLG1.write(120); // 1-я нога вперёд servoLV3.write(60); // 3-я нога вверх servoLG3.write(120); // 3-я нога вперёд servoRV2.write(60); // 2-я нога вверх servoRG2.write(60); // 2-я нога вперёд servoLG2.write(60); // 1-я нога вперёд servoRG1.write(120); // 3-я нога вперёд servoRG3.write(120); // 2-я нога вперёд var = 1; break; case 1: servoLV1.write(90); // 3-я нога вниз servoLV3.write(90); // 3-я нога вверх servoRV2.write(90); // 2-я нога вверх var = 2; break; case 2: servoRV1.write(60); // 1-я нога вверх servoRG1.write(60); // 1-я нога вперёд servoRV3.write(120); // 3-я нога вверх servoRG3.write(60); // 3-я нога вперёд servoLV2.write(120); // 2-я нога вверх servoLG2.write(120); // 2-я нога вперёд servoRG2.write(120); // 1-я нога вперёд servoLG1.write(60); // 3-я нога вперёд servoLG3.write(60); // 2-я нога вперёд var = 3; break; case 3: servoRV1.write(90); // 3-я нога вниз servoRV3.write(90); // 3-я нога вверх servoLV2.write(90); // 2-я нога вверх var = 0; break; } } } if (run == 3) { //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 200, при этом можно без тормозов опрашивать другие датчики if (pause (200)) { switch (var) { case 0: servoLV1.write(120); // 1-я нога вверх servoLG1.write(120); // 1-я нога вперёд servoLV3.write(60); // 3-я нога вверх servoLG3.write(120); // 3-я нога вперёд servoRV2.write(60); // 2-я нога вверх servoRG2.write(120); // 2-я нога вперёд servoLG2.write(60); // 1-я нога вперёд servoRG1.write(60); // 3-я нога вперёд servoRG3.write(120); // 2-я нога вперёд var = 1; break; case 1: servoLV1.write(90); // 3-я нога вниз servoLV3.write(90); // 3-я нога вверх servoRV2.write(90); // 2-я нога вверх var = 2; break; case 2: servoRV1.write(60); // 1-я нога вверх servoRG1.write(120); // 1-я нога вперёд servoRV3.write(120); // 3-я нога вверх servoRG3.write(60); // 3-я нога вперёд servoLV2.write(120); // 2-я нога вверх servoLG2.write(120); // 2-я нога вперёд servoRG2.write(60); // 1-я нога вперёд servoLG1.write(60); // 3-я нога вперёд servoLG3.write(60); // 2-я нога вперёд var = 3; break; case 3: servoRV1.write(90); // 3-я нога вниз servoRV3.write(90); // 3-я нога вверх servoLV2.write(90); // 2-я нога вверх var = 0; break; } } } if (run == 4) { //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 200, при этом можно без тормозов опрашивать другие датчики if (pause (200)) { switch (var) { case 0: servoLV1.write(120); // 1-я нога вверх servoLG1.write(60); // 1-я нога вперёд servoLV3.write(60); // 3-я нога вверх servoLG3.write(60); // 3-я нога вперёд servoRV2.write(60); // 2-я нога вверх servoRG2.write(60); // 2-я нога вперёд servoLG2.write(120); // 1-я нога вперёд servoRG1.write(120); // 3-я нога вперёд servoRG3.write(120); // 2-я нога вперёд var = 1; break; case 1: servoLV1.write(90); // 3-я нога вниз servoLV3.write(90); // 3-я нога вверх servoRV2.write(90); // 2-я нога вверх var = 2; break; case 2: servoRV1.write(60); // 1-я нога вверх servoRG1.write(60); // 1-я нога вперёд servoRV3.write(120); // 3-я нога вверх servoRG3.write(60); // 3-я нога вперёд servoLV2.write(120); // 2-я нога вверх servoLG2.write(60); // 2-я нога вперёд servoRG2.write(120); // 1-я нога вперёд servoLG1.write(120); // 3-я нога вперёд servoLG3.write(120); // 2-я нога вперёд var = 3; break; case 3: servoRV1.write(90); // 3-я нога вниз servoRV3.write(90); // 3-я нога вверх servoLV2.write(90); // 2-я нога вверх var = 0; break; } } } }
а ты пульт сначала проверял?
А чем его лучше проверить? Я в Уно что-то залил для проверки, вроде в мониторе порта есть изменения при нажатии. Джойстик с приёмником вроде вяжутся (перестают зелёные диоды мигать при включении обоих). Какой тест лучше использовать?
тест который с библиотекой идет. посомотри данные. тебе же нужно их преобразовать к нужному тебе виду. а нужный вид не получится сделать пока не будет четкого понимания как должно все работать, но более глубоко чем пульт управляет роботом))
Буду пробывать
Сам джойстик поборол. 3,3В с Меги приёмник не запускают, а вот от 5В работает. Теперь буду скетч пилить, кое-что начинаю догонять.
только от 5в сдохнуть у тебя может приемник. и где ты новый возьмешь? они вроде как друг на друга запрограммированы. и другой не подойдет. ставь лучше отдельный стабилизатор
Ур-ра догнал я всё-таки своими куриными мозгами! Поправил скетч и всё заработало! Спасибо jeka_tm! Всегда помогаешь и наставляешь на путь истинный! А на счёт стабилизатора, буду искать, спасибо.
видео выложи как бегает
Стабилизатор привинчу и выложу.
привет! собираю четырех лапого , но мозги кипят при написании скеча решил твою копирнуть ,если не трудно покажи поправки
в скейче
привет! собираю четырех лапого , но мозги кипят при написании скеча решил юрца скейч копирнуть ,если не трудно покажи поправки