Arduino Mega + L298N + 2 движка + беспроводной геймпад PS2 + нужна помощь

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

Собрал шасси на гусеницах с двумя движками. Электроника 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);
 }    
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Задай вопрос автору

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

скачал с иностранного сайта, автора не найти

b707
Offline
Зарегистрирован: 26.05.2017

джойстик при подключении ставьте точно в среднюю точку

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему дёргается?

analogWrite(ENB, 1023); - это бесценно.

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

b707, дёргается и при не подключенном джойстике

 

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

sadman41,

analogWrite(ENB, 1023); - это бесценно   - поясните

sadman41
Offline
Зарегистрирован: 19.10.2016
Wolff_2020
Offline
Зарегистрирован: 04.02.2021

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);
 }    
}

 

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

изменил, результат тотже

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Wolff_2020 пишет:

изменил, результат тотже

а так?
 

 // Configure output pins
 pinMode(ENA, OUTPUT);
 digitalWrite(ENA,0);
 pinMode(MOTORA_1, OUTPUT);
 pinMode(MOTORA_2, OUTPUT);
 pinMode(ENB, OUTPUT);
 digitalWrite(ENB,0);
 pinMode(MOTORB_1, OUTPUT);
 pinMode(MOTORB_2, OUTPUT);

 // Disable both motors
 //digitalWrite(ENA,0);
 //digitalWrite(ENB,0);

 

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

не помогло,

также хаотичные дёргания (почти всегда назад одновременно оба)

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

понимаю, что нужно выставить начальное положение, но не знаю как

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Мы тоже не знаем, т.к. неведомо кто дёргает - наводка или пакет с пульта.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

поставьте защитку не 50 а 100 к примеру, а вообще скетч надо переписать полностью, так как он явно не для avr
 

 Это что?
       analogWrite(ENA, 1023);

Вот как я делал для внучки

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

это я заменил  меня интересует что выполняет (abs(nJoyR)<50)

analogWrite(ENA, 255)

меня интересует что выполняет

(abs(nJoyR)<50)   ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Wolff_2020 пишет:

это я заменил  меня интересует что выполняет (abs(nJoyR)<50)

analogWrite(ENA, 255)

меня интересует что выполняет

(abs(nJoyR)<50)   ?

вы тему то почитайте, про тележку, там основные вопросы и заданы и решены )))

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

спасибо, попробую осилить

 

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

спасибо, попробую осилить

 

Посмотрите по ссылке. Если интересно - то там будет ссылка на два скейча под разные повороты. Бонусом в прошивках идёт подключение двух серв и "прожектора" или лазера. Но лишнее можно вырезать(я думаю справитесь?).https://www.youtube.com/watch?v=ACtKMtq1-Zg&list=WL&index=8&t=426s

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

oboltus-РУ, это ваш проект?

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

Подогнал под себя совершенно другой скетч, предложенный 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
Offline
Зарегистрирован: 04.02.2021

подскажите, что здесь не так?

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

oboltus-РУ, это ваш проект?

Нет , но я заливал неделю буквально назад прошивку. Работала! В ней есть баги("разработчик" Немного ошибся) - я исправил что смог! Попробуйте !

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

ситуация с самопроизвольным дёрганием осталась Значит джойстик глючит! Я пробовал этот скейч и баг был во вращении гусиниц при повороте. При повороте в право или лево - они крутились назад - а не вперёд! Хотя шасси поворачивало в заданном направлении!

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

ещё раз повторюсь: если не использовать аналоговый джойстик, а пользоваться кнопками, то дёрганий нет

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

ещё раз повторюсь: если не использовать аналоговый джойстик, а пользоваться кнопками, то дёрганий нет

Перекиньте местами джостики в прошивке! Что б проверить исправность левого!

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

так моторы дёргаются одновременно

пины на ардуино - джойстик менял,

13-й пин не использую

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

так моторы дёргаются одновременно

пины на ардуино - джойстик менял,

13-й пин не использую

Нет надо менять в самом скейче!

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

Подогнал под себя совершенно другой скетч, предложенный 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);

}    

 

Везде где указанно _LX и _LY (левый джостик)надо указать правый джостик!

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

не помогло

 

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

и ещё моторы дёргаются только в одном направлении - вперёд

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

не помогло

 

Последнее что можно - проверить джойстик через монитор порта. Посмотреть какие значения он гонит!

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

не помогло

 

Я тупо собрал по прилагаемой схеме( провод в провод пин к пину-как у него) и всё сразу же пошло! Вы точно всё правильно(по схеме)собрали?

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

дело в том, что и при отключенном джойстике дёргается

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

когда заливаю скетч с управлением стрелками то всё нормально

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

дело в том, что и при отключенном джойстике дёргается

Тады моторшилд! Глючный! Другой есть?

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

когда заливаю скетч с управлением стрелками то всё нормально

Угу! Там тупо в перёд-назад-право-в лево! А здесь пропорциАНАЛЬНОЕ управление(с изменением скорости)! Вот!

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

другого нет

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 - Вы где живёте? Может проще завтра новый моторшилд купить?

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

у нас в городе цена 350, у китайцев 100, жаба давит))))

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

попробую светодиод подключить минуя шилд

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

у нас в городе цена 350, у китайцев 100, жаба давит))))

Ох .....Ё! У Вас всё поедет за 350 завтра или за 100рэ через месяц ....но у КИТАЙЦЕВ(к стате пьют они ща сильно ....до 25 февраля_ новый год (или опять какую то очередную грань стакана обмывают!)! Просто слов на Вас нет....350рэ!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

подтяни A0 пин сопротивлением килоом 47 к земле, ты же его используешь для джойстика?

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

у меня беспроводной джойстик, А0 не используется

я цифру в аналог преобразовываю

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

Wolff_2020 пишет:

у меня беспроводной джойстик, А0 не используется

я цифру в аналог преобразовываю

И у меня беспроводной и всё работает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

схема подключения соответствует?

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

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

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

ua6em пишет:

схема подключения соответствует?

Зачем резисторы? У меня без них!

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

У меня нет резисторов.

Для чего они?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Wolff_2020 пишет:

У меня нет резисторов.

Для чего они?

согласование уровней

oboltus-РУ
Offline
Зарегистрирован: 04.02.2021

ua6em пишет:

Wolff_2020 пишет:

У меня нет резисторов.

Для чего они?

согласование уровней

Так и без них нормально!