Танк управляемый джойстиком PS-2

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

новый проект

SLOM
Offline
Зарегистрирован: 06.11.2014

чертеж сам делал? в какой программе? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да сам. solidworks. буду дорабатывать. увеличу толщину для жесткости, уберу отверстия

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

доработал модель

SLOM
Offline
Зарегистрирован: 06.11.2014

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

вот такой 

 

кстати поидее, можно с пластиковой формы снять глиненую форму и залить например алюминием.

 

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да не такая уж маленькая. насчет хвата как соберу видео выложу

а вообще это игрушка. какое практическое применение? химикаты смешивать?))

SLOM
Offline
Зарегистрирован: 06.11.2014

[quote=jeka_tm] какое практическое применение? химикаты смешивать?))[/quote]

 

я бы стержни плутонивые в гараже передвигал бы :))))))

а где там крепление для сервы? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

никаких серв))) только хардкод. ролики видишь? это для капроновой нитки

SLOM
Offline
Зарегистрирован: 06.11.2014

хм, ну это круто, если будет работать.... клешня получиться легкая, и мощьная если поставить мощьную серву. когда сервы на самой клешне она выходит тяжелой. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сервы вообще не будет. будут рычаги как на экскаваторе)))

вот что уже есть. только 3 плечо покороче (которое возле клешни). еще основание и рычаги надо сделать. хз когда. блок питания 3д принтера сгорел. попробую запустить от компьютерного блока питания

кстати трубки к пластику закрепляю актоматическим керном. получается быстро и удобно, правда неразборная конструкция отдельного плеча

 

SLOM
Offline
Зарегистрирован: 06.11.2014

а чем это все будет приводиться в движение?

не думал насчет гидравлики на шприцах, с трубками а обратные рычаги - шприцы на сервах. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

руками)) можно и на моторах. но не хочу. не так интересно, да и ребенку может понравится

думал, уже планировал следующую версию сделать на шприцах, но без электроники

LinxX
Offline
Зарегистрирован: 08.02.2017

Жека можешь помочь со скетчем? Есть ардуино нано+ драйвер L298n+ мотор-редуктор + серва sg90 + китайский джойстик от PS2 бес проводной  и цель сделать переключение скоростей. Я у виталика смотрел видосы https://www.youtube.com/watch?v=ACtKMtq1-Zg&t=8s выкинул ненужное из скетча с этого видео , оставил мотор редуктор один и серву собрал всё работает. Но потом увидел вот это видео https://www.youtube.com/watch?v=wIpaHNpcjmI а здесь с переключением скоростей. Короче у обоих авторов по разному написаны скетчи у виталия написан по понятнее ,но я не знаю как прописать работу кнопок ,джойстик не видит кнопки только два стика а использовать из за двух стиков как то не целесообразно . Я только начинающий чел в этой среде а с джойстиком вот поторопился купил, надо было на NRFL24L01, но это я уже потом изучил .Вот оригинальный скетч с танка https://drive.google.com/file/d/0B8pAOi0jFtLIM3FGaTBlQndOams/view  я с него брал только серву на поворот и мотор редуктор .А ардуино НАНО потому что машинка не большая , а схемы только в основном на UNO идут . За ранее спасибо.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

уно нано неважно. микроконтроллер один и тот же

NRFL24L01 подразумевает что ты либо пульт самодельный, либо определенный который работает с NRFL24L01

в коде вижу используются 2 кнопки которые на торце вроде

если тебе нужны остальные кнопки делай по правильному: открой пример к библиотеке там все пины использованы, узнай какая функция за какую кнопку отвечает и используй хоть все

я кстати тоже кое что делаю. и думаю подьем дула не стоит того чтобы увеличивать высоту танка

а башня такая странная потому что внутри уже стоит вот это и это шасси

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

тоже приобрел 3д принтер, тоже хочу сделать мини танчик, правда пульта нету от пс((( надо искать инфу о самодельном

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016


спасибо почитаю

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да там нечего вроде читать. не помню код выкладывал или нет, да даже есть да то только для примера он тебе. все равно корпус пульта нужен будет какой то. проще купить готовый и использовать где нужно. у меня один и тот же пульт для разных игрушек сделан

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

jeka_tm пишет:

да там нечего вроде читать. не помню код выкладывал или нет, да даже есть да то только для примера он тебе. все равно корпус пульта нужен будет какой то. проще купить готовый и использовать где нужно. у меня один и тот же пульт для разных игрушек сделан


корпус я планировал распечатать, и сделать под два джостика и пару кнопок, ну или для серв еще потерциометр линейный прицепить, видел в инете корпус с дисплеем 0,96 олед, может такой повторю

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну тогда можно. хотя если планируешь не одну игрушку делать проще купить магазинный. и потратить время на изготовление игрушки. хотя если сам процесс создания пульта привлекает это другой момент

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

jeka_tm пишет:

ну тогда можно. хотя если планируешь не одну игрушку делать проще купить магазинный. и потратить время на изготовление игрушки. хотя если сам процесс создания пульта привлекает это другой момент


готовые пульты достаточно дороги, либо очень примитивны

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

полторы тысячи тот которым я пользуюсь с nrf24l01 внутри. но покупал я его дешевле. а приемник делаешь из nrf24l01 и ардуины

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

jeka_tm пишет:

полторы тысячи тот которым я пользуюсь с nrf24l01 внутри. но покупал я его дешевле. а приемник делаешь из nrf24l01 и ардуины


а то что там квадрик нарисован никак не мешает управлению машинкой?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да ничем. экран по сути нужен только для отображения текущих настроек диапазона регулировок. это те что с процентами. для триммирования и то что передатчик включился. ну может проценты газа, но они особо не важны

возле цены включи отображение в рублях

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

jeka_tm пишет:

да ничем. экран по сути нужен только для отображения текущих настроек диапазона регулировок. это те что с процентами. для триммирования и то что передатчик включился. ну может проценты газа, но они особо не важны

возле цены включи отображение в рублях


у меня на работе комп заблокированый нельзя выбрать там=))) перепутал немного=))) я на бангуде ниразу не заказывал, интересно на алике есть такой, надо посмотреть, спасибо за наводку

LinxX
Offline
Зарегистрирован: 08.02.2017

Жека проблема в том что я не программист код к библиотеке для PS2 я смотрел и честно ни чего не понял а потом как к этой библиотеке в с кетче привязать серву и завести управление на джойстик я не знаю

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

берешь примеры джереми блюма и вперед учится. до 7 урока дойди. а так кто за тебя будет писать. да за кем то повторять один в один не скучно?

LinxX
Offline
Зарегистрирован: 08.02.2017

 спасибо я видел эти уроки

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

видел и сделал все это разные вещи. тебе нужно привыкнуть к языку. мк/ардуина не может сама принять решение или додумать за тебя. нужно прописывать четко каждое действие и т.д. но если ты не знаешь как с ней разговаривать то ты ничего не сможешь сделать

KaraNiero
Offline
Зарегистрирован: 21.02.2019

Ребят, помогите пожалуйста, делаю шасси для 6wd, шасси хорошее, для него есть даже платка, на подобие ардуинки, называеться T-Rex, хочу подключить к джойстику PS, но не могу понять, как это сделать. Поможете?

KaraNiero
Offline
Зарегистрирован: 21.02.2019

Если нужны фото, ссылки, могу скинуть

SLOM
Offline
Зарегистрирован: 06.11.2014

KaraNiero пишет:

Ребят, помогите пожалуйста, делаю шасси для 6wd, шасси хорошее, для него есть даже платка, на подобие ардуинки, называеться T-Rex, хочу подключить к джойстику PS, но не могу понять, как это сделать. Поможете?

 

я такое делал, там все просто, ну почти :) 

вот код прошивки, у меня там не только движение но и рука манипулятор. старт стоп реализованы плавно, чтобы неубивать редуктор. 

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


#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0; 
Servo LXservo;
Servo LYservo;


// задаем пины для левого мотора
#define Dir_L 2
#define Pwm_L 3
#define Brake_L 4
// задаем пины для правого мотора
#define Dir_R 10
#define Pwm_R 11
#define Brake_R 9

// Задаем скорости для движения
byte MaxSpeed = 200; // Максимальная скорость
byte MinSpeed = 90;  // Минимальная скорость

int forw_back = 0;
int righ_left = 0;

byte step_fb = 50;     // Шаг изменения скорости движения вперед - назад
byte step_stop = 50;  // Шаг изменения скорости остановки
byte step_rl =  50;    // Шаг изменения скорости движения вправо - влево
byte step_dir = 50;   // Шаг изменения скорости выравнивания

byte xL;
byte yL;
byte xR;
byte yR;

float deltaAnglLR = 0.0002;  // настройка - от времени лупа и сервы
float startAnglLR = 50.0;
float deltaAnglUD = 0.0002;  // настройка - от времени лупа и сервы
float startAnglUD = 90.0;
Servo servoLR;
Servo servoUD;


enum States
{
    WAITING,
    READING,
    RUNNING,
    ERROR,
    TIMEOUT
};

States state;
States onWait();
States onRead();
States onRun();
States onError();

States onTimeout();

int mass[4];      //здесь будем хранить значения для скоростей и направлений
                  //mass[0]   лев.напр.
                  //mass[1]   лев.скор.
                  //mass[2]   прав.напр.
                  //mass[3]   прав.скор.
                 
void setup(){
  // LXservo.attach(12);
  // LYservo.attach(13);
  
  servoLR.attach( 12 );
  servoUD.attach( 13 );
  
  PS2 = ps2x.config_gamepad(8,6,7,5, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)

  //Моторы
    pinMode (Pwm_L, OUTPUT);
    pinMode (Dir_L, OUTPUT);
    pinMode (Brake_L, OUTPUT);
    
    pinMode (Pwm_R, OUTPUT);
    pinMode (Dir_R, OUTPUT);
    pinMode (Brake_R, OUTPUT);
    
    digitalWrite (Pwm_L, LOW);
    digitalWrite (Pwm_R, LOW);
    
    digitalWrite (Brake_L, LOW);
    digitalWrite (Brake_R, LOW);

}

void loop(){
  
  
 
  
  
    int x;
        int y;
  
   
    
    
// управление башней вправо-влево
    xL = ps2x.Analog( PSS_RX );                             Serial.println( xL, DEC );
    if( xL < 127 )
      {
        x = xL - 127;
        startAnglLR = startAnglLR - x * x * deltaAnglLR;    Serial.println( startAnglLR );
        if( startAnglLR < 0 ) startAnglLR = 0;
      }
    if( xL > 127 )
      {
        x = xL - 128;
        startAnglLR = startAnglLR + x * x * deltaAnglLR;    Serial.println( startAnglLR );   Serial.println( ' ' );
        if( startAnglLR > 110 ) startAnglLR = 110;
         if( startAnglLR < 55 ) startAnglLR = 55;
      }
    if( ps2x.Button( PSB_R3 ) )    // по кнопке джойстика - в исходное
      {
        startAnglLR = 50.0;
      }
    servoLR.write( startAnglLR );
// управление стволом пушки вверх-вниз
    yL = ps2x.Analog( PSS_RY );                             Serial.println( yL, DEC );
    if( xL < 127 )
      {
        y = yL - 127;
        startAnglUD = startAnglUD - y * y * deltaAnglUD;    Serial.println( startAnglUD );
        if( startAnglUD < 0 ) startAnglUD = 0;
      }
    if( yL > 127 )
      {
        y = yL - 128;
        startAnglUD = startAnglUD + y * y * deltaAnglUD;    Serial.println( startAnglUD );   Serial.println( ' ' );
        if( startAnglUD > 170 ) startAnglUD = 170;
          if( startAnglUD < 90 ) startAnglUD = 90;
      }
    if( ps2x.Button( PSB_R3 ) )    // по кнопке джойстика - в исходное
      {
        startAnglUD = 120.0;
      }
    servoUD.write( startAnglUD );
  
  
   if( ps2x.Button( PSB_TRIANGLE ) )    // по кнопке джойстика - рука опустить
      {
        startAnglUD = 70.0;
      }
  
   if( ps2x.Button( PSB_CROSS ) )    // по кнопке джойстика - рука поднять
      {
        startAnglUD = 170.0;
      }
  
  
    if( ps2x.Button( PSB_SQUARE ) )    // по кнопке джойстика - клешня разжать
      {
         startAnglLR = 55;
      }
  
   if( ps2x.Button( PSB_CIRCLE ) )    // по кнопке джойстика - клешня сжать
      {
         startAnglLR = 110.0;
      }
  
  
  //этот код для меня темный лес, мне его дали для плавного старта и торможения моторов. если ехать вперед и резко нажать кнопку назад, машина продолжит ехать вперед, плавно остановиться и только потом поедет назад, это спасает редуктора от разрушения. 
 //если ктото знает что тут к чему, прокоментируйте пожалуйста, чтоб я тоже понимал :)
  static unsigned long pre_millis = 0;
  if(millis()-pre_millis > 50)
  {
    pre_millis = millis();
    
     if(ps2x.Button(PSB_PAD_UP))
    {
      forw_back += step_fb;
      if(forw_back > 0 && forw_back < MinSpeed) forw_back = MinSpeed;
    }
    else  if(ps2x.Button(PSB_PAD_DOWN))
    {
      forw_back -= step_fb;
      if(forw_back < 0 && forw_back > MinSpeed*-1) forw_back = MinSpeed*-1;
    }
    else 
    {
      if(forw_back < 0) forw_back += step_stop;
      else if(forw_back > 0) forw_back -= step_stop;
      if(abs(forw_back) < MinSpeed) forw_back = 0;
    }
    forw_back = constrain(forw_back, MaxSpeed*-1, MaxSpeed);


    if(ps2x.Button(PSB_PAD_RIGHT))
    {
      righ_left += step_rl;
      if(righ_left > 0 && righ_left < MinSpeed) righ_left = MinSpeed;
    }
    else if(ps2x.Button(PSB_PAD_LEFT))
    {
      righ_left -= step_rl;
      if(righ_left < 0 && righ_left > MinSpeed*-1) righ_left = MinSpeed*-1;
    }
    else 
    {
      if(righ_left < 0) righ_left += step_dir;
      else if(righ_left > 0) righ_left -= step_dir;
      if(abs(righ_left) < MinSpeed) righ_left = 0;
    }
    righ_left = constrain(righ_left, MaxSpeed*-1, MaxSpeed);


    int pwm_l = forw_back + righ_left;
    int pwm_r = forw_back - righ_left;
    pwm_l = constrain(pwm_l, MaxSpeed*-1, MaxSpeed);
    pwm_r = constrain(pwm_r, MaxSpeed*-1, MaxSpeed);

    digitalWrite(Dir_L, (pwm_l<0)?0:1);
    digitalWrite(Dir_R, (pwm_r<0)?0:1);
    analogWrite(Pwm_L, abs(pwm_l));
    analogWrite(Pwm_R, abs(pwm_r));
  }
  
  
  
  
  
  LXservo.write(map(ps2x.Analog(PSS_LX), 255, 0, 0, 180)); ; 
 delay(50); 
  ps2x.read_gamepad(false, 0);
  
  LYservo.write(map(ps2x.Analog(PSS_LY), 0, 255, 0, 90)); ; 
 delay(50); 
  ps2x.read_gamepad(false, 0);
  
  
   // dir_pwm(ps2x.Analog(PSS_RY),2);   //обрабатываем правый джойстик
  //digitalWrite(R_dir, mass[2]);
  //analogWrite(R_pwm, mass[3]);
}    

схема подключения примерно такая, я брал статью в инете 

http://robocontroller.ru/news/besprovodnoj_dzhojstik_ot_playstation_arduino/2013-10-19-32

 

п.с. для 6 колесной машины нужен мощьный акум! 

вот моя версия:

https://www.youtube.com/watch?v=mBMEWrdachI

KaraNiero
Offline
Зарегистрирован: 21.02.2019

Да, да у меня тоже с манипулятором будет, на соревнования

KaraNiero
Offline
Зарегистрирован: 21.02.2019

И при чём на таком же шасси

KaraNiero
Offline
Зарегистрирован: 21.02.2019

С этим всё понятно, но будет ли T-Rex вести себя как ардуинка?

 

SLOM
Offline
Зарегистрирован: 06.11.2014

KaraNiero пишет:

С этим всё понятно, но будет ли T-Rex вести себя как ардуинка?

это и есть ардуино... просто подругому распаяная на своей плате сразу с мотор драйвером и датчиками, которые по факту непригодились... 

SLOM
Offline
Зарегистрирован: 06.11.2014

Почитайте тут описание проекта... поэтапное... 

http://roboforum.ru/forum10/topic14711.html

 

 

на выходе у меня была 6 колесная машина управляемая 2мя пультами пс2 

один пульт управлял движением и манипулятором, второй пульт управлял водометом (стрелял до 2го этажа) и пушкой с 6мм шариками, пробивала несколько листов бумаги... 

KaraNiero
Offline
Зарегистрирован: 21.02.2019

Ну вот, у Вас два пульта, но вот второй мне не нужен, у меня будет просто машинка с манипулятором, у вас есть готовый скечт и схема? Просто нужно уложиться в сроки, а вот практики в таких работах мне не хватает...

SLOM
Offline
Зарегистрирован: 06.11.2014

у меня много версий скетю, один из них я скинул... 

схемы у меня нет, не делал, но ее можно понять почитав скетч, там написано какие контакты на какие выводы тирекса подключать. 

подключите моторы. батарею. посмотрев скетч подсоедените нужные выводы к приемникам СП2 

вот две сервы манипулятора:

066 void setup(){
067   // LXservo.attach(12);
068   // LYservo.attach(13);

а вот подключение приемника от пульта:

073

  PS2 = ps2x.config_gamepad(8,6,7,5, truetrue);   //Настройка выводов: (clock, command, attention, data, true, true)

заливайте скетч и пробуйте.... 

 

п.с. дам совет будьте осторожны с серво приводами на клешне манипуляторе, я пока настраивал правильные углы, незаметил, что серва на сжатие была минуты 3 в постоянном напряге, она уперлась в крайнее положение и продолжала пытаться двигаться дальше, и сгорела... 

 

 

KaraNiero
Offline
Зарегистрирован: 21.02.2019

Сожалею о спалённой серве, и спасибо за скечи, просто реально трудно было найти всё самому

 

SLOM
Offline
Зарегистрирован: 06.11.2014

KaraNiero пишет:

спасибо за скечи, просто реально трудно было найти всё самому

на здоровье! я пол года потратил на все это дело.... :)

Женя7777777
Offline
Зарегистрирован: 22.01.2017
Доброго времени суток!
В этой ветки нашёл почти весь код который мне нужен.
Вот он:
#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0; 
Servo Zservo;

#define  in1  2   // direction pin 1
#define  in2  4    // direction pin 2
#define  ena  3    // PWM pin to change speed
#define  in3  7    // direction pin 1
#define  in4  1    // direction pin 2
#define  enb  5    // PWM pin to change speed

byte L_speed;      // forward speed 
byte R_speed;      // forward speed 
 
void setup(){
  PS2 = ps2x.config_gamepad(13,11,8,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

  Zservo.attach(6);
}
void loop(){
  ps2x.read_gamepad(false, false);
     

  if (ps2x.Analog(PSS_LX) == 128) analogWrite(ena, 0);
  if (ps2x.Analog(PSS_LY) == 128) analogWrite(enb, 0);
  
 //==========================================================мотор1
  if (ps2x.Analog(PSS_LX) > 128){
    L_speed = ps2x.Analog(PSS_LX)*2-255;
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    analogWrite(ena, L_speed);
  }
  if (ps2x.Analog(PSS_LX) < 128){
    L_speed = 255-ps2x.Analog(PSS_LX)*2;
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    analogWrite(ena, L_speed);
  }
  
  //==========================================================мотор2
  if (ps2x.Analog(PSS_LY) > 128){
    R_speed = ps2x.Analog(PSS_LY)*2-255;
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    analogWrite(enb, R_speed);
  }
  if (ps2x.Analog(PSS_LY) < 128){
    R_speed = 255-ps2x.Analog(PSS_LY)*2;
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    analogWrite(enb, R_speed);

    Zservo.write(map(ps2x.Analog(PSS_RY), 0, 255, 180, 0));
  }
   delay(50);
}

Этот код рабочий, но нужно к нему ещё добавить возможность управления мотором с кнопок джойстика PS2. Пример того, как должен выглядеть такой код я нигде не нашёл.
Нужно что бы при однократном нажатии на кнопку с квадратом, мотор1 постоянно бы крутился влево ,а при однократном нажатии на кнопку с кругом мотор1 постоянно бы крутился вправо. И при однократном нажатии на кнопку с крестом мотор1 остонавливался бы.
Я пробовал написать код сам, но ничего не получается.
Примерно так он должен выглядеть:
if(ps2x.ButtonPressed(PSB_SQUARE)) 
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, 255);
 

  if(ps2x.ButtonPressed(PSB_CROSS)) 
  digitalWrite(in1 LOW);
  digitalWrite(in2, LOW);
  analogWrite(ena, 0);
    
  if(ps2x.ButtonPressed(PSB_CIRCLE)) 
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, 255);

Помогите пожалуйста правильно написать.

 

SLOM
Offline
Зарегистрирован: 06.11.2014

Женя7777777 пишет:

Помогите пожалуйста правильно написать.

 

пару постов в верх я выкладывал готовый скетч, там есть управление на кнопки с плавным старт - стопом. 

конкрктно кусок кода выглядит так 


 static unsigned long pre_millis = 0;
  if(millis()-pre_millis > 50)
  {
    pre_millis = millis();
    
     if(ps2x.Button(PSB_PAD_UP))
    {
      forw_back += step_fb;
      if(forw_back > 0 && forw_back < MinSpeed) forw_back = MinSpeed;
    }
    else  if(ps2x.Button(PSB_PAD_DOWN))
    {
      forw_back -= step_fb;
      if(forw_back < 0 && forw_back > MinSpeed*-1) forw_back = MinSpeed*-1;
    }
    else 
    {
      if(forw_back < 0) forw_back += step_stop;
      else if(forw_back > 0) forw_back -= step_stop;
      if(abs(forw_back) < MinSpeed) forw_back = 0;
    }
    forw_back = constrain(forw_back, MaxSpeed*-1, MaxSpeed);


    if(ps2x.Button(PSB_PAD_RIGHT))
    {
      righ_left += step_rl;
      if(righ_left > 0 && righ_left < MinSpeed) righ_left = MinSpeed;
    }
    else if(ps2x.Button(PSB_PAD_LEFT))
    {
      righ_left -= step_rl;
      if(righ_left < 0 && righ_left > MinSpeed*-1) righ_left = MinSpeed*-1;
    }
    else 
    {
      if(righ_left < 0) righ_left += step_dir;
      else if(righ_left > 0) righ_left -= step_dir;
      if(abs(righ_left) < MinSpeed) righ_left = 0;
    }
    righ_left = constrain(righ_left, MaxSpeed*-1, MaxSpeed);


    int pwm_l = forw_back + righ_left;
    int pwm_r = forw_back - righ_left;
    pwm_l = constrain(pwm_l, MaxSpeed*-1, MaxSpeed);
    pwm_r = constrain(pwm_r, MaxSpeed*-1, MaxSpeed);

    digitalWrite(Dir_L, (pwm_l<0)?0:1);
    digitalWrite(Dir_R, (pwm_r<0)?0:1);
    analogWrite(Pwm_L, abs(pwm_l));
    analogWrite(Pwm_R, abs(pwm_r));
  }
Женя7777777
Offline
Зарегистрирован: 22.01.2017

Спасибо, попробую разобратся.

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

Всем привет! Нужна помощь.

Собрал шасси на гусеницах с двумя движками. Электроника Arduino Mega, L298N и беспроводной геймпад PS2. Нашёл скетч, подредактировал под себя контакты. ЗАРАБОТАЛО. Кнопками вперёд назад влево вправо.

Нашёл скетч для джойстиков PS2. Одним одна гусеница вперёд-назад, другим другая. ЗАРАБОТАЛО. НО появилась проблема с этим скетчем: при вкл. и выкл. PS2 дёргается сам, чаще назад, реже вперёд.

ПОМОГИТЕ найти ошибку или дополнить!!!!

// 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, 1023);
     }
     if(nJoyL)<-50) {
        digitalWrite(MOTORA_2,LOW);
        digitalWrite(MOTORA_1,HIGH);
        analogWrite(ENA, 1023);
     }
     if (abs(nJoyL)<50) {
        analogWrite(ENA, 0);
     }
     
     if(nJoyR>50) {
        digitalWrite(MOTORB_2,HIGH);
        digitalWrite(MOTORB_1,LOW);
        analogWrite(ENB, 1023);
     }
     if(nJoyR<-50) {
        digitalWrite(MOTORB_2,LOW);
        digitalWrite(MOTORB_1,HIGH);
        analogWrite(ENB, 1023);
     }
     if (abs(nJoyR)<50) {
        analogWrite(ENB, 0);
        
     }     


 delay(50);
 }    
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Привет. Если только при включении выключении проблема в питании. Например от батареек/аккумуляторов питается драйвер, а на нем или отдельно сидит линейный стабилизатор, просадка напряжения и микроконтроллер перезагружается. Проще сделать так: повышающий преобразователь для питания микроконтроллера к батарейке/аккумулятору который сидит на минусе. И даже если питание сильно (в пределах разумного конечно) просядет, микроконтроллер не перезагрузится.

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

 

Приветствую! Есть вопрос - собираю шасси роботизированного гусеничного транспортёра, нашел подходящий для моих целей скейтч - поправил косячок. Но вот не пойму - как прописать торможение моторов? Дело в том, что шасси имеет приличную инерцию в движении после перевода стиков в 0. Проще говоря после перевода стиков из положения движенья в нейтральное положение - шасси движется по инерции ещё где то 20-30см.(именно по инерции).Не прописано в прошивке торможение! И как его добавить в поворотах? Противоположная гусеница при повороте не подтормаживается!

На борту ARDUINO MEGA 2560, беспроводной пульт L298n, Sony Playstation 2.

Скейтч :

#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0; 
Servo VVservo;
Servo VNservo;
Servo Shoot;
 
 
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 3;    // PWM pin to change speed
 
 
const int in3 = 7;    // direction pin 1
const int in4 = 1;    // direction pin 2
const int enb = 5;    // PWM pin to change speed
 
int fspeed;           // forward speed 
 
void setup(){
  
 
  
  VVservo.attach(9);
  VNservo.attach(6);
 Shoot.attach(10);
  PS2 = ps2x.config_gamepad(13,11,8,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
  pinMode(0, OUTPUT);   // Лазер
 
}
 
 
 
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(in3, HIGH);
    digitalWrite(in4, LOW);
    analogWrite(enb, fspeed);
       
  }
  
    
  if (ps2x.Analog(PSS_LX) < 128){
    fspeed = map(ps2x.Analog(PSS_LX), 0, 127, 255, 0);
 
    
    digitalWrite(in1,HIGH );
    digitalWrite(in2, LOW);
    analogWrite(ena, fspeed);
   
  }
  
    
  delay(10);

 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Для торможения одной стороны (вторая аналогично):

digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(ena, HIGH);

 

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

jeka_tm пишет:

Для торможения одной стороны (вторая аналогично):

digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(ena, HIGH);

 

Просто вставить в скейчь?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Нет конечно, прописать условие когда нужно тормозить, и в условие добавить код торможения.