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

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

так на драйвер нельзя подавать больше 5 вольт. вы 5 вольт берете с ардуины?

сегодня или завтра напишу тестовый скетч для проверки

p.s. к библиотеке есть пример. проверье им. проверьте подключение. пины. напряжение на приемник джойстика только 3.3 в можно

gvs6357
Offline
Зарегистрирован: 12.12.2013

L293D подается два напряжения одно для питания самой микросхемы 5в, пробовал подключать от блока питания, а второе для питания моторов от 4.5 до 36 вольт. Минусы все в одной куче. джойстик от ардуины 3.3 вольта. Плохо нет playstation проверить джойстик.

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Не знаю я просто подавал питание на микруху и двигуны нормально работали по команде с ардуино

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

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

на сайте обновилась версия библиотеки. теперь 1.8. была 1.6. попробуйте может поможет

вот ссылка

https://github.com/madsci1016/Arduino-PS2X/zipball/5d2be701af64d826d2683...

 

gvs6357
Offline
Зарегистрирован: 12.12.2013

Всем привет. Танцы с бубном дали свой результат. Удалил программу Arduino, скачал по новой установил. Загрузил в ардуину и вот оно ЧУДО заработало, но с крестом все ОК а вот с аналогом: загружаю скетч и моторы начинают сразу крутиться нажимаю в перед один останавливается второй крутиться, назат тоже самое, а вот в  влево или в право они останавливаются.

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

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

а так рад за вас. ждем танчик или машинку

gvs6357
Offline
Зарегистрирован: 12.12.2013

Моторы заказал, как придут что-нибудь соберу.

LoneDog
Offline
Зарегистрирован: 22.10.2013

Проектировал плату под гусеничное шасси, но шасси так и не нашол по этому получилось вот что...

пока умеет ездить вперед, назад и поворачивать, в планах прикрутить к пульту потенциометр и сделать пропорциональное управление поворотом передних колес и замутить освещение - фары и поворотники

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

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

gvs6357
Offline
Зарегистрирован: 12.12.2013

Всем привет. Нужна ваша помощь. В написании программ я не силен так что сильно неругайтесь. Решил попробовать разделить управление джойстика. Суть в следующем: левый аналог джой крутит левый мотор вперед назад, правый аналог джой крутит правый мотор вперет назад. Получилось у меня так: левый джой вперед крутит мотор в одну сторону, назад крутит в ту же сторону, с правым такая же фигня. 

Скетч в 162 посте.

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

посмотрите как вставлять код 

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

а дальше будем смотреть

gvs6357
Offline
Зарегистрирован: 12.12.2013

#include <PS2X_lib.h>  //for v1.6

PS2X ps2x; // create PS2 Controller Class

//13 Clock       зеленый
//12 Data        серый
//11 Command     синий
//10 Attention   коричневый
//   3.3V        белый
//   GND         черный

int error = 0; 
byte type = 0;
byte vibrate = 0;
boolean L_napr = 2;
byte L_drive = 3;
boolean R_napr = 4;
byte R_drive = 5;
byte X;
byte Y;
boolean XN;
boolean YN;

void setup(){
  error = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, Pressures?, Rumble?)
  pinMode(L_napr, OUTPUT);
  pinMode(L_drive, OUTPUT);
  pinMode(R_napr, OUTPUT);
  pinMode(R_drive, OUTPUT);
  
}


void loop(){

  ps2x.read_gamepad(false, vibrate);
  //===============================
  //   Граничные условия для X и Y
  //===============================
 if (ps2x.Analog(PSS_LY) == 128){
    Y = 0;
  } 
  if (ps2x.Analog(PSS_LY) < 128){
    Y = 255-ps2x.Analog(PSS_LY)*2;
    YN = 0;
  }
  if (ps2x.Analog(PSS_LY) > 128){
    Y = ps2x.Analog(PSS_LY)*2-255;
    YN = 1;
  }    
  if (ps2x.Analog(PSS_RY) == 128){
    X = 0;
  } 
  if (ps2x.Analog(PSS_RY) < 128){
    X = 255-ps2x.Analog(PSS_RY)*2;
    XN = 1;
  }
  if (ps2x.Analog(PSS_RY) > 128){
    X = ps2x.Analog(PSS_RY)*2-255;
    XN = 0;
  }    

  //===============================
  //               Остановка
  //===============================
  if (X == 0 && Y == 0){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, 0);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, 0);
  }
  //===============================
  //            Левый вперед
  //===============================
  if (Y > 0 && YN == 1){
    digitalWrite(L_napr, HIGH);
    analogWrite(L_drive, 255-Y);
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, Y);
  }
  //==============================
  //             Левый назад
  //==============================  
  if (Y > 0 && YN == 0 ){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, Y);
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, Y);
  }
  //=============================
  //            Правый вперед
  //=============================
  if (X > 0 && XN == 1){
    digitalWrite(R_napr, HIGH);
    analogWrite(R_drive, 255-X);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, X);
  }
  //=============================
  //          Правый назад
  //=============================
  if (X > 0 && XN == 0){
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, X);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, X);
  }
}

 

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

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

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

вот набросал. пробуйте

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

#define L_dir 2   //пины для драйвера мотора
#define L_pwm 3
#define R_dir 4
#define R_pwm 5

int mass[4];      //здесь будем хранить значения для скоростей и направлений
                  //mass[0]   лев.напр.
                  //mass[1]   лев.скор.
                  //mass[2]   прав.напр.
                  //mass[3]   прав.скор.
                 
void setup(){
  PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
  pinMode(L_dir, OUTPUT);
  pinMode(L_pwm, OUTPUT);
  pinMode(R_dir, OUTPUT);
  pinMode(R_pwm, OUTPUT);
}

void loop(){
  ps2x.read_gamepad(false, 0);
  dir_pwm(ps2x.Analog(PSS_LY),0);   //обрабатываем левый джойстик
  digitalWrite(L_dir, mass[0]);
  analogWrite(L_pwm, mass[1]);
  
  dir_pwm(ps2x.Analog(PSS_RY),2);   //обрабатываем правый джойстик
  digitalWrite(R_dir, mass[2]);
  analogWrite(R_pwm, mass[3]);
}    

void dir_pwm(int Y, int n){         //Подпрограмма для обработки значений джойстика
  if (Y == 128){
    mass[n+1] = 0;
  }
  if (Y >128){
    mass[n+1] = Y*2-255;
    mass[n] = 1;
  }
  if (Y <128){
    mass[n+1] = 255-Y*2;
    mass[n] = 0;
  }
}

 

gvs6357
Offline
Зарегистрирован: 12.12.2013

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

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

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

gvs6357
Offline
Зарегистрирован: 12.12.2013

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

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

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

драйвер подцепили правильно? приложите схему

конкретнее можете написать, при этом назовите одно направление вперед а другое назад на двигателе. например:

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

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

gvs6357
Offline
Зарегистрирован: 12.12.2013

Вот мой драйвер. 

gvs6357
Offline
Зарегистрирован: 12.12.2013

Как добавить видео?

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

просто ссылку

это твой драйвер. как ты его соеденяешь с ардуино?

gvs6357
Offline
Зарегистрирован: 12.12.2013

Как сделать рисунок крупнее? А так там на рисунке написано. Подключение не менял на кресте и на аналоговом джое работает.

gvs6357
Offline
Зарегистрирован: 12.12.2013
maksim
Offline
Зарегистрирован: 12.02.2012

Проверяете что у вас вообще идет с аналогов:

void setup()
{
  PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
  Serial.begin(9600);
}
void loop()
{
  ps2x.read_gamepad(false, 0);
  Serial.print("L: ");
  Serial.print(ps2x.Analog(PSS_LY));   //обрабатываем левый джойстик
  Serial.print("   R: ");
  Serial.println(ps2x.Analog(PSS_RY));   //обрабатываем правый джойстик
  delay(100);
} 

Если с аналогами все в порядке проверяете драйвер:

#define L_dir 2   //пины для драйвера мотора
#define L_pwm 3
#define R_dir 4
#define R_pwm 5

void setup()
{
  pinMode(L_dir, OUTPUT);
  pinMode(L_pwm, OUTPUT);
  pinMode(R_dir, OUTPUT);
  pinMode(R_pwm, OUTPUT);
}

void loop()
{
  digitalWrite(L_dir, 0);
  analogWrite(L_pwm, 200);
  delay(3000);
  analogWrite(L_pwm, 0);
  delay(2000);
  digitalWrite(L_dir, 1);
  analogWrite(L_pwm, 200);
  delay(3000);
  analogWrite(L_pwm, 0);
  delay(2000);
  
  digitalWrite(R_dir, 0);
  analogWrite(R_pwm, 200);
  delay(3000);
  analogWrite(R_pwm, 0);
  delay(2000);
  digitalWrite(R_dir, 1);
  analogWrite(R_pwm, 200);
  delay(3000);
  analogWrite(R_pwm, 0);
  delay(2000);
}    

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

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

проверьте драйвер. похоже вы что то напутали. если есть PWM и DIR должно вроде как работать. если напрямую к L298 цепляться то код конечно править придется

может завтра специально потестирую, может и я где ошибся

но у вас как будто упавление dir (управляет направлением вращения) не работает, не тот пин может подцепили

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

maksim пишет:

Проверяете что у вас вообще идет с аналогов:

void setup()
{
  PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
  Serial.begin(9600);
}
void loop()
{
  ps2x.read_gamepad(false, 0);
  Serial.print("L: ");
  Serial.print(ps2x.Analog(PSS_LY));   //обрабатываем левый джойстик
  Serial.print("   R: ");
  Serial.println(ps2x.Analog(PSS_RY));   //обрабатываем правый джойстик
  delay(100);
} 

Если с аналогами все в порядке проверяете драйвер:

#define L_dir 2   //пины для драйвера мотора
#define L_pwm 3
#define R_dir 4
#define R_pwm 5

void setup()
{
  pinMode(L_dir, OUTPUT);
  pinMode(L_pwm, OUTPUT);
  pinMode(R_dir, OUTPUT);
  pinMode(R_pwm, OUTPUT);
}

void loop()
{
  digitalWrite(L_dir, 0);
  analogWrite(L_pwm, 200);
  delay(3000);
  analogWrite(L_pwm, 0);
  delay(2000);
  digitalWrite(L_dir, 1);
  analogWrite(L_pwm, 200);
  delay(3000);
  analogWrite(L_pwm, 0);
  delay(2000);
  
  digitalWrite(R_dir, 0);
  analogWrite(R_pwm, 200);
  delay(3000);
  analogWrite(R_pwm, 0);
  delay(2000);
  digitalWrite(R_dir, 1);
  analogWrite(R_pwm, 200);
  delay(3000);
  analogWrite(R_pwm, 0);
  delay(2000);
}    

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

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

а потом уже и драйвер. спасибо максиму. пусть потестирует

gvs6357
Offline
Зарегистрирован: 12.12.2013

Ура заработало :). На плате драйвера накасячил по этому и втыкал  PWM 1 и PWM 2 не туда . ВСЕМ ОГРОМНОЕ СПАСИБО!!! 

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

пожалуйста

в следующий раз будьте внимательнее

gvs6357
Offline
Зарегистрирован: 12.12.2013

O.K.

 

gvs6357
Offline
Зарегистрирован: 12.12.2013

Всем привет. Зацените http://youtu.be/Dz3zZstYpKE. В место одного мотора подключил серву.


#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0; 
Servo LXservo;
#define L_dir 2   //пины для драйвера мотора
#define L_pwm 3
#define R_dir 4
#define R_pwm 5

int mass[4];      //здесь будем хранить значения для скоростей и направлений
                  //mass[0]   лев.напр.
                  //mass[1]   лев.скор.
                  //mass[2]   прав.напр.
                  //mass[3]   прав.скор.
                 
void setup(){
  LXservo.attach(6);
  PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
  pinMode(L_dir, OUTPUT);
  pinMode(L_pwm, OUTPUT);
  pinMode(R_dir, OUTPUT);
  pinMode(R_pwm, OUTPUT);
}

void loop(){
  LXservo.write(map(ps2x.Analog(PSS_LX), 0, 255, 70, 165)); ; 
 delay(50); 
  ps2x.read_gamepad(false, 0);
  
    dir_pwm(ps2x.Analog(PSS_RY),2);   //обрабатываем правый джойстик
  digitalWrite(R_dir, mass[2]);
  analogWrite(R_pwm, mass[3]);
}    

void dir_pwm(int Y, int n){         //Подпрограмма для обработки значений джойстика
  if (Y == 128){
    mass[n+1] = 0;
  }
  if (Y >128){
    mass[n+1] = Y*2-255;
    mass[n] = 1;
  }
  if (Y <128){
    mass[n+1] = 255-Y*2;
    mass[n] = 0;
  }
}
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

пульт для машинки, пока без программы

МК с одной стороны. дисплей с обратной. связь nRF24L01

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

разъем для зарядки аккумулятора от USB

плату для машинки тестировал. работает

 

 

a5021
Offline
Зарегистрирован: 07.07.2013

Красотень. Если и работать будет так же, как выглядит, то вообще зашибись.

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

a5021 пишет:
Красотень. Если и работать будет так же, как выглядит, то вообще зашибись.

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

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Вот посмотрите эту библиотечку http://github.com/maniacbug/RF24

и на хабрахабре есть несколько статей

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

эта библиотека под хардварный SPI, под софтварный дали в теме радиомодуля

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

позанимавшись с библитекой с софтварным SPI решил решил переделать плату. 

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

завтра буду изготавливать

a5021
Offline
Зарегистрирован: 07.07.2013

jeka_tm пишет:

эта библиотека под хардварный SPI,


А что мешает использовать хардверный SPI ?

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

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

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

написал программу

но возникла проблема. нужна помощь

проблема вот в чем: на плате изначально расчитывал на другие пины для радиомодуля, но вернул на хардварный SPI

хардваный ШИМ можно сделать только на 9 10 и 11 пинах. но используя библиотеку Servo шим нельзя использовать на 9 и 10 пинах. 11 пин используется для SPI.

итого ни одного свободного пина с аппаратным шимом

попробовал библиотеку softpwm. но не может откомпилироваться так как в меге8 нет 2 таймера

есть предложения?

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

+ вот видео

http://youtu.be/hOZznqyyhDo

LoneDog
Offline
Зарегистрирован: 22.10.2013

Пульт вышел просто супер!

Столкнулся с такой же проблемой только при использовании библиотеки VirtualWire, даже  тему тут создавал, у меня получилось только так зашимить как в последнем посте, но получилось всего четыре градации шима 25 -50 -75 и 100 % от времени цикла пин находится в high остальное время в low, в принципе мне этого хватило для управления двигателями через L293D.

Да, а что за платки в пульте, ну помимо самодельной с Atmega и nrf24l01? Аккумулятор на 3,7?

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

спасибо. 

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

http://www.ebay.com/itm/5V-MINI-USB-1A-1000mA-Lithium-Battery-Charging-B...

а над аккумулятором стоит преобразователь на 5 вольт

http://www.ebay.com/itm/0-9V-5V-to-5V-DC-DC-Booster-Module-USB-Mobile-St...

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

a5021
Offline
Зарегистрирован: 07.07.2013

jeka_tm пишет:

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

Проблема в том, что в меге8 банально не хватает таймеров и, похоже, ее не решить без смены чипа.

Кстати, BAM (Binary Angle Modulation) не подойдет?

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

a5021 пишет:

jeka_tm пишет:

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

Проблема в том, что в меге8 банально не хватает таймеров и, похоже, ее не решить без смены чипа.

Кстати, BAM (Binary Angle Modulation) не подойдет?

ага. так и есть.

но не думайте что я забил. нет. работа идет

под arduino pro mini сделана макетка

вот фотки

догадайтесь почему картинки зеркальные

а вот рельная макетка

флюс не отмывался еще. не все запаял

a5021
Offline
Зарегистрирован: 07.07.2013

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

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

да у меня такой метеринки нет, да и незачем

короче все собрал. работает. вот фото. завтра видео, уже темно на улице видео снимать

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

ну вот собственно и видео

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

apassirob
Offline
Зарегистрирован: 06.01.2014

Хочю обратиться к вам за помошью. Проблемма такая : Есть два безколекторных двигателя ну и платы регулировки скорости конечно. потключить к ардуине у меня получяеться. Но тут стал вопрос как их синхронезировать. Тоесть ( управление джойстиком на основе двух потенциометров, Скажем один потенциометр ось Y второй ось X при подаче рычага джойстика в перёд показатели меняються с потенциометра Y при этом мне нужно чтоб оба двигателя кторые потключены на разные пины синхронно раскручивались в (скажем перёд) когда Y находиться в своём верхнем положении  и оба двигателя работают на 100% Уважу рычаг джойстика в лево при этом показания Х будут расти а Y остаёться в том же диопозоне. В этом случае один двигатель должен плавно затухать а второй оставаться работать в соотвецтвии с положением джойстика. Дайте хоть какойто пример на основе которого я мог бы продолжить..

заранее блогодарен

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

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

и там драйвер стоял L298 поэтому например вперед на максимум DIR=1 (условно назовем, на самом деле его там нет, ) и шим =255 едет на полной скорости вперед, шим = 0 стоп. а если DIR=0 (назад) при шим = 255 стоп, а при шим = 0 полная скорость. учитывайте это

#include <PS2X_lib.h>  //for v1.6

PS2X ps2x; // create PS2 Controller Class

//13 Clock       зеленый
//12 Data        серый
//11 Command     синий
//10 Attention   коричневый
//   3.3V        белый
//   GND         черный

int error = 0; 
byte type = 0;
byte vibrate = 0;
boolean L_napr = 12;
byte L_drive = 11;
boolean R_napr = 10;
byte R_drive = 9;
byte UP;
byte DOWN;
byte LEFT;
byte RIGHT;


void setup(){
  error = ps2x.config_gamepad(8,6,5,7, true, true);   //Настройка выводов: (clock, command, attention, data, Pressures?, Rumble?)
  pinMode(L_napr, OUTPUT);
  pinMode(L_drive, OUTPUT);
  pinMode(R_napr, OUTPUT);
  pinMode(R_drive, OUTPUT);

}


void loop(){

  ps2x.read_gamepad(false, vibrate);
  //===========================================================================================
  //                                        Граничные условия для X и Y
  //===========================================================================================
  if(ps2x.Button(PSB_PAD_UP)) {         
    UP = ps2x.Analog(PSAB_PAD_UP);
  }  
  else {
    UP = 0;
  }
  if(ps2x.Button(PSB_PAD_DOWN)) {         
    DOWN = ps2x.Analog(PSAB_PAD_DOWN);
  }
  else {
    DOWN = 0;
  }
  if(ps2x.Button(PSB_PAD_LEFT)) {         
    LEFT = ps2x.Analog(PSAB_PAD_LEFT);
  }
  else {
    LEFT = 0;
  }
  if(ps2x.Button(PSB_PAD_RIGHT)) {         
    RIGHT = ps2x.Analog(PSAB_PAD_RIGHT);
  }
  else {
    RIGHT = 0;
  }



  //===========================================================================================
  //                                        Остановка
  //===========================================================================================
  if (UP == 0 && DOWN == 0 && LEFT == 0 && RIGHT == 0){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, 0);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, 0);
  }

  //===========================================================================================
  //                                        ВПЕРЕД
  //===========================================================================================
  if (UP > 0 && DOWN == 0 && LEFT == 0 && RIGHT == 0){
    digitalWrite(L_napr, HIGH);
    analogWrite(L_drive, 255-UP);
    digitalWrite(R_napr, HIGH);
    analogWrite(R_drive, 255-UP);
  } 
  //===========================================================================================
  //                                        НАЗАД
  //===========================================================================================
  if (UP == 0 && DOWN > 0 && LEFT == 0 && RIGHT == 0){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, DOWN);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, DOWN);
  }
  //===========================================================================================
  //                                        НАЛЕВО
  //===========================================================================================
  if (UP == 0 && DOWN == 0 && LEFT > 0 && RIGHT == 0){
   digitalWrite(L_napr, LOW);
  analogWrite(L_drive, LEFT);
  digitalWrite(R_napr, HIGH);
  analogWrite(R_drive, 255-LEFT);
  }
  //===========================================================================================
  //                                        НАПРАВО
  //===========================================================================================
  if (UP == 0 && DOWN == 0 && LEFT == 0 && RIGHT > 0){
   digitalWrite(L_napr, HIGH);
  analogWrite(L_drive, 255-RIGHT);
  digitalWrite(R_napr, LOW);
  analogWrite(R_drive, RIGHT);
  }
  //===========================================================================================
  //                                        ВПЕРЕД НАЛЕВО
  //===========================================================================================
  if (UP > 0 && DOWN == 0 && LEFT > 0 && RIGHT == 0){
    digitalWrite(L_napr, HIGH);
    analogWrite(L_drive, 255-UP+LEFT*2);
    digitalWrite(R_napr, HIGH);
    analogWrite(R_drive, 255-UP);
  }
  //===========================================================================================
  //                                        ВПЕРЕД НАПРАВО
  //===========================================================================================
  if (UP > 0 && DOWN == 0 && LEFT == 0 && RIGHT > 0){
    digitalWrite(L_napr, HIGH);
    analogWrite(L_drive, 255-UP);
    digitalWrite(R_napr, HIGH);
    analogWrite(R_drive, 255-UP+RIGHT*2);
  }
  //===========================================================================================
  //                                        НАЗАД НАЛЕВО
  //===========================================================================================
  if (UP == 0 && DOWN > 0 && LEFT > 0 && RIGHT == 0){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, DOWN-LEFT*2);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, DOWN);
  }
  //===========================================================================================
  //                                        НАЗАД НАПРАВО
  //===========================================================================================
  if (UP == 0 && DOWN > 0 && LEFT == 0 && RIGHT > 0){
    digitalWrite(L_napr, LOW);
    analogWrite(L_drive, DOWN);
    digitalWrite(R_napr, LOW);
    analogWrite(R_drive, DOWN-RIGHT*2);
  }

  delay(20);
}
fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

По экранчику и работе с ним где можно почитать?