Arduino Mega + L298N + 2 движка + беспроводной геймпад PS2 + нужна помощь
- Войдите на сайт для отправки комментариев
Чт, 04/02/2021 - 15:18
Собрал шасси на гусеницах с двумя движками. Электроника Arduino Mega, L298N и беспроводной геймпад PS2. Нашёл скетч, подредактировал под себя контакты. ЗАРАБОТАЛО. Кнопками вперёд назад влево вправо.
Нашёл скетч для джойстиков PS2. Одним одна гусеница вперёд-назад, другим другая. ЗАРАБОТАЛО. НО появилась проблема с этим скетчем: при вкл. и выкл. PS2 дёргается сам, чаще назад, реже вперёд.
ПОМОГИТЕ найти ошибку или дополнить!!!!
// PS2 Tank by Igor Fonseca @2019
// Controls a robotic tank using a PS2 joystick, using D-pad buttons
// based on an example using the PS2X library by Bill Porter 2011
// All text above must be included in any redistribution.
// include libraries
#include <PS2X_lib.h>
// These are used to set the direction of the bridge driver.
#define ENA 3 //ENA
#define MOTORA_1 4 //IN3
#define MOTORA_2 5 //IN4
#define MOTORB_1 8 //IN1
#define MOTORB_2 7 //IN2
#define ENB 6 //ENB
PS2X ps2x; // create PS2 Controller Class
//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you conect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;
void setup(){
// Configure output pins
pinMode(ENA, OUTPUT);
pinMode(MOTORA_1, OUTPUT);
pinMode(MOTORA_2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(MOTORB_1, OUTPUT);
pinMode(MOTORB_2, OUTPUT);
// Disable both motors
digitalWrite(ENA,0);
digitalWrite(ENB,0);
// Start serial communication
Serial.begin(57600);
error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
// Check for error
if(error == 0){
Serial.println("Found Controller, configured successful");
}
else if(error == 1)
Serial.println("No controller found, check wiring or reset the Arduino");
else if(error == 2)
Serial.println("Controller found but not accepting commands");
else if(error == 3)
Serial.println("Controller refusing to enter Pressures mode, may not support it.");
// Check for the type of controller
type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Unknown Controller type");
break;
case 1:
Serial.println("DualShock Controller Found");
break;
case 2:
Serial.println("GuitarHero Controller Found");
break;
}
}
// Main loop
void loop(){
if(error == 1) //skip loop if no controller found
return;
else { //DualShock Controller
ps2x.read_gamepad(false, vibrate); // disable vibration of the controller
int nJoyL = ps2x.Analog(PSS_LY); // read left stick
int nJoyR = ps2x.Analog(PSS_RY); // read right stick
nJoyL = map(nJoyL, 0, 255, 1023, -1023);
nJoyR = map(nJoyR, 0, 255, -1023, 1023);
// Perform movements based on both analog sticks
if(nJoyR>50) {
digitalWrite(MOTORA_1,HIGH);
digitalWrite(MOTORA_2,LOW);
analogWrite(ENA, 1023);
}
if(nJoyR<-50) {
digitalWrite(MOTORA_1,LOW);
digitalWrite(MOTORA_2,HIGH);
analogWrite(ENA, 1023);
}
if (abs(nJoyR)<50) {
analogWrite(ENA, 0);
}
if(nJoyL>50) {
digitalWrite(MOTORB_1,HIGH);
digitalWrite(MOTORB_2,LOW);
analogWrite(ENB, 1023);
}
if(nJoyL<-50) {
digitalWrite(MOTORB_1,LOW);
digitalWrite(MOTORB_2,HIGH);
analogWrite(ENB, 1023);
}
if (abs(nJoyL)<50) {
analogWrite(ENB, 0);
}
delay(50);
}
}
Задай вопрос автору
скачал с иностранного сайта, автора не найти
джойстик при подключении ставьте точно в среднюю точку
Почему дёргается?
analogWrite(ENB, 1023); - это бесценно.
b707, дёргается и при не подключенном джойстике
sadman41,
analogWrite(ENB, 1023); - это бесценно - поясните
https://www.arduino.cc/reference/en/language/functions/analog-io/analogw...
Раздел Parameters прочитайте
sadman41,
изменил, результат тотже
// include libraries #include <PS2X_lib.h> // These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define MOTORB_1 4 //IN3 #define MOTORB_2 5 //IN4 #define ENB 6 //ENB PS2X ps2x; // create PS2 Controller Class int error = 0; byte type = 0; byte vibrate = 0; void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error = ps2x.config_gamepad(9,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } // Main loop void loop(){ if(error == 1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, false); // disable vibration of the controller int nJoyL = ps2x.Analog(PSS_LY); // read left stick int nJoyR = ps2x.Analog(PSS_RY); // read right stick nJoyL = map(nJoyL, 0, 255, 1023, -1023); nJoyR = map(nJoyR, 0, 255, 1023, -1023); // Perform movements based on both analog sticks if(nJoyL>50) { digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORA_1,LOW); analogWrite(ENA, 255); } if(nJoyL<-50) { digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORA_1,HIGH); analogWrite(ENA, 255); } if (abs(nJoyL)<50) { analogWrite(ENA, 0); } if(nJoyR>50) { digitalWrite(MOTORB_2,HIGH); digitalWrite(MOTORB_1,LOW); analogWrite(ENB, 255); } if(nJoyR<-50) { digitalWrite(MOTORB_2,LOW); digitalWrite(MOTORB_1,HIGH); analogWrite(ENB, 255); } if (abs(nJoyR)<50) { analogWrite(ENB, 0); } delay(50); } }изменил, результат тотже
изменил, результат тотже
а так?
не помогло,
также хаотичные дёргания (почти всегда назад одновременно оба)
понимаю, что нужно выставить начальное положение, но не знаю как
Мы тоже не знаем, т.к. неведомо кто дёргает - наводка или пакет с пульта.
поставьте защитку не 50 а 100 к примеру, а вообще скетч надо переписать полностью, так как он явно не для avr
Это что? analogWrite(ENA, 1023);Вот как я делал для внучки
это я заменил меня интересует что выполняет
(abs(nJoyR)<50)analogWrite(ENA, 255)меня интересует что выполняет
(abs(nJoyR)<50) ?это я заменил меня интересует что выполняет
(abs(nJoyR)<50)analogWrite(ENA, 255)меня интересует что выполняет
(abs(nJoyR)<50) ?вы тему то почитайте, про тележку, там основные вопросы и заданы и решены )))
спасибо, попробую осилить
спасибо, попробую осилить
oboltus-РУ, это ваш проект?
Подогнал под себя совершенно другой скетч, предложенный oboltus-РУ
ситуация с самопроизвольным дёрганием осталась
#include <PS2X_lib.h> //for v1.6 PS2X ps2x; int PS2 = 0; const int in1 = 8; // direction pin 1 const int in2 = 7; // direction pin 2 const int ena = 3; // PWM pin to change speed const int in3 = 4; // direction pin 1 const int in4 = 5; // direction pin 2 const int enb = 6; // PWM pin to change speed int fspeed; // forward speed void setup(){ PS2 = ps2x.config_gamepad(9,11,10,12, true, true); //Настройка выводов: (clock, command, attention, data, true, true) pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); // connection to L298n pinMode(ena, OUTPUT); // connection to L298n pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n pinMode(enb, OUTPUT); // connection to L298n } void loop(){ ps2x.read_gamepad(); digitalWrite(1, LOW); if (ps2x.Analog(PSS_LY) == 128) analogWrite(ena, 0); if (ps2x.Analog(PSS_LY) == 128) analogWrite(enb, 0); if (ps2x.Analog(PSS_LY) > 128){ fspeed = map(ps2x.Analog(PSS_LY), 129, 255, 0, 255); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, fspeed); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, fspeed); } if (ps2x.Analog(PSS_LY) < 128){ fspeed = map(ps2x.Analog(PSS_LY), 0, 127, 255, 0); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, fspeed); } if (ps2x.Analog(PSS_LX) > 128){ fspeed = map(ps2x.Analog(PSS_LX), 129, 255, 0, 255); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, fspeed); } if (ps2x.Analog(PSS_LX) < 128){ fspeed = map(ps2x.Analog(PSS_LX), 0, 127, 255, 0); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, fspeed); } delay(50); }подскажите, что здесь не так?
oboltus-РУ, это ваш проект?
ситуация с самопроизвольным дёрганием осталась Значит джойстик глючит! Я пробовал этот скейч и баг был во вращении гусиниц при повороте. При повороте в право или лево - они крутились назад - а не вперёд! Хотя шасси поворачивало в заданном направлении!
ещё раз повторюсь: если не использовать аналоговый джойстик, а пользоваться кнопками, то дёрганий нет
ещё раз повторюсь: если не использовать аналоговый джойстик, а пользоваться кнопками, то дёрганий нет
так моторы дёргаются одновременно
пины на ардуино - джойстик менял,
13-й пин не использую
так моторы дёргаются одновременно
пины на ардуино - джойстик менял,
13-й пин не использую
Подогнал под себя совершенно другой скетч, предложенный oboltus-РУ
ситуация с самопроизвольным дёрганием осталась
#include <PS2X_lib.h> //for v1.6 PS2X ps2x; int PS2 = 0; const int in1 = 8; // direction pin 1 const int in2 = 7; // direction pin 2 const int ena = 3; // PWM pin to change speed const int in3 = 4; // direction pin 1 const int in4 = 5; // direction pin 2 const int enb = 6; // PWM pin to change speed int fspeed; // forward speed void setup(){ PS2 = ps2x.config_gamepad(9,11,10,12, true, true); //Настройка выводов: (clock, command, attention, data, true, true) pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); // connection to L298n pinMode(ena, OUTPUT); // connection to L298n pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n pinMode(enb, OUTPUT); // connection to L298n } void loop(){ ps2x.read_gamepad(); digitalWrite(1, LOW); if (ps2x.Analog(PSS_LY) == 128) analogWrite(ena, 0); if (ps2x.Analog(PSS_LY) == 128) analogWrite(enb, 0); if (ps2x.Analog(PSS_LY) > 128){ fspeed = map(ps2x.Analog(PSS_LY), 129, 255, 0, 255); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, fspeed); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, fspeed); } if (ps2x.Analog(PSS_LY) < 128){ fspeed = map(ps2x.Analog(PSS_LY), 0, 127, 255, 0); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, fspeed); } if (ps2x.Analog(PSS_LX) > 128){ fspeed = map(ps2x.Analog(PSS_LX), 129, 255, 0, 255); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, fspeed); } if (ps2x.Analog(PSS_LX) < 128){ fspeed = map(ps2x.Analog(PSS_LX), 0, 127, 255, 0); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, fspeed); } delay(50); }не помогло
и ещё моторы дёргаются только в одном направлении - вперёд
не помогло
не помогло
дело в том, что и при отключенном джойстике дёргается
когда заливаю скетч с управлением стрелками то всё нормально
дело в том, что и при отключенном джойстике дёргается
когда заливаю скетч с управлением стрелками то всё нормально
другого нет
Wolff_2020 - Вы где живёте? Может проще завтра новый моторшилд купить?
у нас в городе цена 350, у китайцев 100, жаба давит))))
попробую светодиод подключить минуя шилд
у нас в городе цена 350, у китайцев 100, жаба давит))))
подтяни A0 пин сопротивлением килоом 47 к земле, ты же его используешь для джойстика?
у меня беспроводной джойстик, А0 не используется
я цифру в аналог преобразовываю
у меня беспроводной джойстик, А0 не используется
я цифру в аналог преобразовываю
схема подключения соответствует?

И скейчь представленный мною то же для без проводного. Выложите свою схему подключенья - ибо где то у Вас косяк не программный !
схема подключения соответствует?

У меня нет резисторов.
Для чего они?
У меня нет резисторов.
Для чего они?
согласование уровней
У меня нет резисторов.
Для чего они?
согласование уровней