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

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

гаус это круто но кпд низкое... 

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

механизм стрельбы 6мм шариками от модельных танком Henlong, чтобы не покупать целый танк за 3000-5000 я купил запасть за 550руб. 

почему я не купил гирбокс от страйкбола? 
на то 2 причины:
1. сильно мощное, может кого то покалечить.. 
2. цена в 10 раз выше  :) 
 
правда есть недостаток у этого механизма - низкая скорострельность, на видео особенно низкая т.к питаю от 3х в, хотя можно 6 - 9 
 
 
 
ствол и уплотнительная резинка в комплект механизма не входят! 
поэтому чтобы стрелять пришлось купить детский пистолет и позаимствовать у него ствол и резинку. 
 
 
вот что получилось: 
 
 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

и когда из противника будут кусками разлетаться части это покруче чем просто "о я попал в него, 3 попадания значит победа"

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

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

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

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

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

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

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

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

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

так я и взял из ноутбучных)) imax зарядник еще прикупил

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

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

jeka_tm  

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

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

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

из найденых в этой теме и переделанных почемуто ниодин не заработал :(

 

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

поздравляю

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

не забудь про питание 3.3В

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

это я делал, и про 3.3 незабыл и про резисторы... 

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

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

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

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

а все заработало, я просто рассееный с улицы бассееной :)

в коде PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)

пины идут непопорядку, а я необратил на это внимание и втыкал думая что они идут 13,12,11,10 поменял местами и заработало :)

 

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

 

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

там все просто. используй функцию map для преобразования данных от джойстиков 0-255 в 0-180 для сервы

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

кому просто а кому темный лес :)  как я понял мап  преобразует значения положения стика (от0 до 255) в углу сервы от 0 до 180  причем можно  задать 0 - 255  и 0-90 или 45-180 если хочу ограничивать углы сервы.  а как задавать исходный угол? тобишь угол при положении стика в ноле...  хотя ..

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

середина диапазона и будет 0

посмотри пример к map и поймешь

HXT
Offline
Зарегистрирован: 20.12.2012

jeka_tm,если вас не затруднит

можно чтоб вы продемонстрировали ваш пример кода для передатчика и приемника основаном на  протоколе V202.Делаю р/у самолет на nrf24l01.Пока остановился на библиотеке RF24. Насколько я понял в протоколе V202 идет дублирование команд на разных частотах?

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

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

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

или ты самодельный пульт хочешь собрать? но тогда зачем тебе использовать проткол v202

и никаких разных частот))

 

HXT
Offline
Зарегистрирован: 20.12.2012

Собираю самодельный пульт из купленого старого модельного пульта на 40 МГц.Приемника 40 Мгц к нему нету. Код у меня простейший на библиотеке RF24 (очень похожий как в здесь- https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo )  и передача  только на одной частоте.Как я понимаю великая вероятность потерять самолет при передаче на одной частоте. Хочу позаимствовать алгоритм дублирования каналов (частоты) передачи команд. Самолет строю -Цессна 150 , плата - NRF24L01 c усилителем и антенной.

Что можете посоветовать?

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

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

HXT
Offline
Зарегистрирован: 20.12.2012

jeka_tm ,

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

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

надо использовать "правильную" библиотеку)))

поделюсь с тобой

https://yadi.sk/d/CXjuENmaEEwun

файл RF24.rar

смотри примеры

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

 

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

jeka_tm, чтото никак немогу придумать как соеденить 2 ардуины через уарт, может подскажешь? 

вот тестовый код

#include <PS2X_lib.h>  //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0; 
Servo LXservo;
Servo LYservo;
#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(8);
  LYservo.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), 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]);
}    

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

 

выдрал из твоей же темы, он был на 1 серву, я добавил еще одну. 

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

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

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

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

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

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

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

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

и используют для этого сириал http://arduino.ru/Reference/Serial 

или есть еще сторонние библиотеки. 

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

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

я тебе не подскажу. не делал такого

HXT
Offline
Зарегистрирован: 20.12.2012

jeka_tm, могут ли быть задержки сигнала если  передавать значение оси в значениях от 0 до 1023 на приемник , надо ли меппить значение оси к 0 до 255?

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

радиомодуль отправляет посылки из 32 байт максимум. 1 минимум. но это отдельные байты. это насколько я знаю

я отправлял размером в байт: например

1 байт ось х (значения от 0 до 255)

2 байт ось y (значения от 0 до 255)

и так далее

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

 

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

jeka_tm

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

серва не вращалась пропорционально данным стика. 

LXservo.write(map(ps2x.Analog(PSS_LX), 255, 0, 0, 180)); ;

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

если же джойстик нажали до упора, то серва крутит на макс оборотах. 

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

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

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

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

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

#include <Servo.h> 

#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
 
Servo myservo;  // create servo object to control a servo 
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 
bool flag=1;
bool start=0;
byte angle=90;
 
void setup(){ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop(){ 
  val = analogRead(potpin);
  if(val==512) start=0;
  if(val>512) {
    val = map(val, 513, 1023, min_speed, max_speed);
    flag=1;
    start=1;
  }
  if(val<512) {
    val = map(val, 0, 511, max_speed, min_speed);
    flag=0;
    start=1;
  }
  if(flag==1 && start==1 && angle < max_angle) angle++;
  if(flag==0 && start==1 && angle > max_angle) angle--;
  myservo.write(angle);
  delay(val);
  val=0;
} 

 

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

спасибо, буду пробовать. 

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

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

чтото я мудрил, мудрил и ниче так и не заработало )))

 

вот обьедененный код 

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



#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
 

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 
bool flag=1;
bool start=0;
byte angle=90;


int mass[4];      //здесь будем хранить значения для скоростей и направлений
                  //mass[0]   лев.напр.
                  //mass[1]   лев.скор.
                  //mass[2]   прав.напр.
                  //mass[3]   прав.скор.
                 
void setup(){
  LXservo.attach(7);
  LYservo.attach(6);
  
  PS2 = ps2x.config_gamepad(9,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), 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);
      
    val = analogRead(ps2x.Analog(PSS_RY));
  if(val==512) start=0;
  if(val>512) {
    val = map(val, 513, 1023, min_speed, max_speed);
    flag=1;
    start=1;
  }
  if(val<512) {
    val = map(val, 0, 511, max_speed, min_speed);
    flag=0;
    start=1;
  }
  if(flag==1 && start==1 && angle < max_angle) angle++;
  if(flag==0 && start==1 && angle > max_angle) angle--;
 LXservo.write(angle);
  delay(val);
  val=0;
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

SLOM - как можно сделать чтобы при управлении стиком джойстика на геймпаде серва не вращалась пропорционально данным стика. 

1 LXservo.write(map(ps2x.Analog(PSS_LX), 255, 0, 0, 180)); ;

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

А если использовать библиотеку VarSpeedServo и в качества параметра скорости поворота сервы использовать значение со стика, приведённого к +/- 512 / 2 ? Или эта библиотека тормозящая ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пардон, #378 / 35 и #380 / 72 - последствия копипаста :(
angle > max_angle   >>>>>    angle > MIN_angle

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

про VarSpeedServo  впервые слышу, спасибо буду гуглить :) 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

а как это связать с джойстиком? джойстик выдает значение 0 - 255 при этом 128 это его центральное положение. 

нужно чтобы при значении 125-133(запас на погрешность) серва стояла. при значениях от 133 до 255 двигалась в перед, чем больше значение тем быстрее.

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

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

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

jeka_tm пишет:

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

 

просто залить скетч? 

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

понятно. тогда так

#include <Servo.h> 

#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
 
Servo myservo;  // create servo object to control a servo 
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 
bool flag=1;
bool start=0;
byte angle=90;
 
void setup(){ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop(){ 
  val = analogRead(potpin);
  if(val==127) start=0;
  if(val>127) {
    val = map(val, 128, 255, min_speed, max_speed);
    flag=1;
    start=1;
  }
  if(val<127) {
    val = map(val, 0, 126, max_speed, min_speed);
    flag=0;
    start=1;
  }
  if(flag==1 && start==1 && angle < max_angle) angle++;
  if(flag==0 && start==1 && angle > max_angle) angle--;
  myservo.write(angle);
  delay(val);
  val=0;
} 

 

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

залил как есть только пин сервы перебил на 7   ничего не случилось.. 

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

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

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

SLOM ,  я делал управление лазерной указкой так ( но только работа в первом и втором квандранте ):
приводим Y джойстика - -127..0..+127 , приводим X джойстика - неИсп..0..+127
нужный угол - через син, кос, таг , скорость - S*S = Y*Y + X*X

работа - Дж влево до упора = 0 гр полная скорость
ДЖ вперёд до упора = 90 гр 
полная скорость
ДЖ вправо вперёд на половину = 135 гр половинная скорость
ДЖ вправо на четверть = 180 гр половинная/2 скорость

короче - мнемонический манипулятор

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

а можно пример скетча? указка плавно двигалась? можно было в мишень целиться? а то сейчас у меня даже при плавном движении дджоя лазер пролетает мимо листа а4(мишени) 

джой у вас какой? у меня от сони плей стейшин 2...

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

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

измени. вместо 

val = analogRead(potpin);

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

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

сделал вот так

 

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

#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
 
Servo myservo;  // create servo object to control a servo 
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 
bool flag=1;
bool start=0;
byte angle=90;
 
void setup(){ 
  
   PS2 = ps2x.config_gamepad(9,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
  myservo.attach(7);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop(){ 
  val = -(ps2x.Analog(PSS_LX)-128);
  if(val==127) start=0;
  if(val>127) {
    val = map(val, 128, 255, min_speed, max_speed);
    flag=1;
    start=1;
  }
  if(val<127) {
    val = map(val, 0, 126, max_speed, min_speed);
    flag=0;
    start=1;
  }
  if(flag==1 && start==1 && angle < max_angle) angle++;
  if(flag==0 && start==1 && angle > max_angle) angle--;
  myservo.write(angle);
  delay(val);
  val=0;
} 

 

нет реакции. наверно чтото нето я делаю :)

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

jeka_tm

 

ты же так делал, он же стрелял?!   как на цель наводил? 

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

val = -(ps2x.Analog(PSS_LX)-128);

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

и отправляй в uart значение val чтобы контролировать значения которые получаются

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

jeka_tm пишет:

val = -(ps2x.Analog(PSS_LX)-128);

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

и отправляй в uart значение val чтобы контролировать значения которые получаются

Жека а вас незатруднит в коде показать как надо. я не силен в этом, могу не то что надо не туда куда надо впихивть )

 

 

 

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

fly245 пишет:

Может это чем-то поможет https://sites.google.com/site/2007arduino/example-code/controller-tutorials/ps2-controller

 

спасибо. 

попробовал скетч

// include additional headers
#include <Servo.h>
#include <PS2X_lib.h>  //for v1.6

// create PS2 Controller Class
PS2X ps2x; 
int ps2x_error = 0; 
byte ps2x_type = 0;
byte ps2x_vibrate = 0;

// create servo class
Servo servoL;        // initialize left servo
Servo servoR;        // init right servo

#define SERVOR 6 
#define SERVOL 7 

//set up pins for playstation controller
#define DAT 12
#define CMD 11
#define ATT 10
#define CLK 9

const int neutral = 1512;
const int forward = 2000;
const int backward = 1000;

//--- Function: Setup ()
void setup()
{
  Serial.begin(57600);
  
  // setup servos
  pinMode (SERVOL, OUTPUT);
  pinMode (SERVOR, OUTPUT); 
  servoL.attach(SERVOL);    
  servoR.attach(SERVOR);
  servoL.writeMicroseconds(neutral);     // set servo to mid-point
  servoR.writeMicroseconds(neutral);    // set servo to mid-point

  // check for controller
  ps2x_error = ps2x.config_gamepad(CLK, CMD, ATT, DAT, false, false);

  if(ps2x_error == 0)
    Serial.println("Found Controller, configured successful");
  else if(ps2x_error == 1)
    Serial.println("No controller found, check wiring.");
  else if(ps2x_error == 2)
    Serial.println("Controller found but not accepting commands.");
  else if(ps2x_error == 3)
    Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

  // get which type 
  ps2x_type = ps2x.readType(); 
  switch(ps2x_type) 
  {
  case 0: Serial.println("Unknown Controller type");  break;
  case 1: Serial.println("DualShock Controller Found");  break;
  }

}

//--- Function: loop ()
void loop()
{
    
  if((ps2x_error == 1) || (ps2x_error == 2) || (ps2x_error == 3)) 
    {
    //skip loop if no controller found
    return; 
     }
  else if(ps2x_error == 0)
  {
    if(ps2x_type == 1)
    { 
      ps2x.read_gamepad(false, ps2x_vibrate);          
      //read controller and set large motor to spin at 'vibrate' speed

      if(ps2x.Button(PSB_PAD_UP)) 
      {     
        Serial.println("Up ");
        servoL.writeMicroseconds(backward);
        servoR.writeMicroseconds(forward);
      }
      else if(ps2x.Button(PSB_PAD_RIGHT))
      {
        Serial.println("Right");

        servoL.writeMicroseconds(neutral);
        servoR.writeMicroseconds(forward);
      }
      else if(ps2x.Button(PSB_PAD_LEFT))
      {
        Serial.println("LEFT");
        servoL.writeMicroseconds(backward);
        servoR.writeMicroseconds(neutral);
      }
      else if(ps2x.Button(PSB_PAD_DOWN))
      {
        Serial.println("DOWN ");
        servoL.writeMicroseconds(forward);
        servoR.writeMicroseconds(backward);
      } 
      else
      {
        servoL.writeMicroseconds(neutral);
        servoR.writeMicroseconds(neutral);
      }
    } // end error
  }// end DualShock Controller

  delay(50);

}  // end loop

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

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

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

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

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

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

#define min_speed 100
#define max_speed 10

#define min_angle 0
#define max_angle 180
 
Servo myservo;  // create servo object to control a servo 
 
int val;    // variable to read the value from the analog pin 
bool flag=1;
bool start=0;
byte angle=90;
byte old_angle=angle;
 
void setup(){ 
   ps2x.config_gamepad(9,11,10,12, true, true);   //Настройка выводов: (clock, command, attention, data, true, true)
   myservo.attach(7);
   Serial.begin(9600);
} 
 
void loop(){ 
  val = ps2x.Analog(PSS_LX+128);
  if(val==127){
    start=0;
    val=0;
  }
  if(val>127) {
    val = map(val, 128, 255, min_speed, max_speed);
    flag=1;
    start=1;
  }
  if(val<127) {
    val = map(val, 0, 126, max_speed, min_speed);
    flag=0;
    start=1;
  }
  if(start==1){
    if(flag==1  && angle < max_angle) angle++;
    if(flag==0  && angle > max_angle) angle--;
  }
  Serial.print("val=");
  Serial.println(val);
  Serial.print("   angle=");
  Serial.println(angle);
  if(start==1 && old_angle!=angle){
    myservo.write(angle);
    old_angle=angle;
    start=0;
  }
  delay(val);
  val=0;
} 

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