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

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

на джойстик не реагирует но в порте пишет 

 

val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
val=10
   angle=90
 
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;
  Serial.print("val=");
  Serial.println(val);
  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("   angle=");
  Serial.println(angle);
  if(start==1 && old_angle!=angle){
    myservo.write(angle);
    old_angle=angle;
    start=0;
  }
  delay(val);
  val=0;
} 

 

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

теперь такое 

на команды не реагирует

а[00]аа[00][00]а[00][00][02][02]
№ќ±•х90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90
val=256
   angle=90

 

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(){ 
   PS2=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);
  Serial.print("val=");
  Serial.println(val);
  /*
  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("   angle=");
  Serial.println(angle);
  if(start==1 && old_angle!=angle){
    myservo.write(angle);
    old_angle=angle;
    start=0;
  }
  delay(val);
  val=0;
  */
} 

 

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

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(){
  //вот эти прины не выводит, а почему? 
    if(ps2x.Button(PSB_L3))
        Serial.println("L3 pressed"); // L3 нажата
      if(ps2x.Button(PSB_R3))
        Serial.println("R3 pressed"); // R3 нажата
      if(ps2x.Button(PSB_L2))
        Serial.println("L2 pressed"); // L2 нажата
      if(ps2x.Button(PSB_R2))
        Serial.println("R2 pressed"); // R2 нажата
  
  
  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;
  }
}

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

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

код не нашёл, пришлось восстанавливать....

 X * X - чтобы чем больше отклонение джойстика, тем больше скорость перемещения сервы
в моём трустмастере ооооооочень нелинейные джойстики :( , отклонение на четверть - уже дают 255
я делал пульт сам на линейных потенциометрах

только что проверял - работает код

#include <PS2X_lib.h> // for v1.6
#include <Servo.h>
PS2X ps2x;
int error = 0; 
byte type = 0;
byte vibrate = 0;
byte xL;
byte yL;
byte xR;
byte yR;
float deltaAnglLR = 0.0001;  // настройка - от времени лупа и сервы
float startAnglLR = 90.0;
float deltaAnglUD = 0.0001;  // настройка - от времени лупа и сервы
float startAnglUD = 30.0;
Servo servoLR;
Servo servoUD;
//==================================================================================
void setup()
{
  Serial.begin( 57600 );
  servoLR.attach( 8 );
  servoUD.attach( 9 );
  error = ps2x.config_gamepad( 4, 5, 6, 7, true, true );
}
//==================================================================================
void loop()
{
  if(error == 1) return;
  {
    int x;
    ps2x.read_gamepad( false, vibrate );
// управление башней вправо-влево
    xL = ps2x.Analog( PSS_LX );                             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 > 180 ) startAnglLR = 180;
      }
    if( ps2x.Button( PSB_L3 ) )    // по кнопке джойстика - в исходное
      {
        startAnglLR = 90.0;
      }
    servoLR.write( startAnglLR );
// управление стволом пушки вверх-вниз
// аналогичное
    delay( 50 );
  }
}
//==================================================================================

 

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

без строки 31 ps2x.read_gamepad( false, vibrate ); ничё не работает.....
в вышепредложенных кодах я не заметил такого оператора, гугл
 перевёл первоисточник так :

/*
  Вы должны прочитать геймпад, чтобы получить новые значения
  Читайте геймпадом и установить значения вибрации
  ps2x.read_gamepad (маленький двигатель вкл / выкл, более мощный двигатель прочность 0-255)
  Если вы не включите гул, используйте ps2x.read_gamepad (); без каких-либо ценностей
  Вы должны назвать это по крайней мере один раз в секунду
*/

и ps2x.read_gamepad(false, ps2x_vibrate);          

      //read controller and set large motor to spin at 'vibrate' speed

прочитать контроллер и установить большой двигатель вращаться в «вибрировать» скорости

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

поменял дельты с 0.0001 на 0.0005 - пульт стал работать помягче.... короче, настраивать надо
угол сделал +/- 80 градусов - в крайних положениях серва подклинивает :(

#include <PS2X_lib.h> // for v1.6
#include <Servo.h>
PS2X ps2x;
int error = 0; 
byte type = 0;
byte vibrate = 0;
byte xL;
byte yL;
byte xR;
byte yR;
float deltaAnglLR = 0.0005;  // настройка
float startAnglLR = 90.0;
float deltaAnglUD = 0.0005;  // настройка
float startAnglUD = 30.0;
Servo servoLR;
Servo servoUD;
//==================================================================================
void setup()
{
  Serial.begin( 57600 );
  servoLR.attach( 8 );
  servoUD.attach( 9 );
  error = ps2x.config_gamepad( 4, 5, 6, 7, true, true );
}
//==================================================================================
void loop()
{
  if(error == 1) return;
  {
    int x;
    ps2x.read_gamepad( false, vibrate );
// управление башней вправо-влево
    xL = ps2x.Analog( PSS_LX );                             Serial.println( xL, DEC );
    if( xL < 127 )
      {
        x = xL - 127;
        startAnglLR = startAnglLR - x * x * deltaAnglLR;    Serial.println( startAnglLR );
        if( startAnglLR < 10 ) startAnglLR = 10;
      }
    if( xL > 127 )
      {
        x = xL - 128;
        startAnglLR = startAnglLR + x * x * deltaAnglLR;    Serial.println( startAnglLR );   Serial.println( ' ' );
        if( startAnglLR > 170 ) startAnglLR = 170;
      }
    if( ps2x.Button( PSB_L3 ) )    // по кнопке джойстика - в исходное
      {
        startAnglLR = 90.0;
      }
    servoLR.write( startAnglLR );
// управление стволом пушки вверх-вниз
// аналогичное
    delay( 50 );
  }
}
//==================================================================================

 

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(){ 
  ps2x.read_gamepad();
  val = ps2x.Analog(PSS_LX)+128;
  Serial.print("val=");
  Serial.println(val);
  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("   angle=");
  Serial.println(angle);
  if(start==1 && old_angle!=angle){
    myservo.write(angle);
    old_angle=angle;
    start=0;
  }
  delay(val);
  val=0;
} 

 

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

SU-27-16

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

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

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

 

это у вас код от какогото танка? 

jeka_tm

 

почемуто точе ничего не реагирует на джой :(

 

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

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

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

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

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

ну и еще добавлю форы, подсветку, может какието спец эффекты и тд... 

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

 

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

))) да. времени нужно свободного больше, тогда можно быстрее сделать

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

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

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

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

коэфф - float deltaAnglLR = 0.0005;  // настройка 
и формула - 
startAnglLR = startAnglLR + x * x * deltaAnglLR; 
вернее брать надо не квадратическую зависимость , а экспоненциальную - потенциометры в джойстике применённые - для других целей,
поэтому и делал пульт самопальный....

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

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

2х мм алюминий его гаус не пробьет :)

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

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

ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле 

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

вот я ляпнул-то..... :(
и начался баттл.....

SLOM !   у jeka_tm  и авиация, и флотилия катеров уже есть !
BREAK !!!!!!

завтра #409 пробовать хочу - самому интерессно стало...

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

кстати да. не стоит забывать про самолеты и катер. да и машинку-самоубийцу можно сделать. без вариантов))

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

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

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

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

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

jeka_tm пишет:

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

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

V=S/T.... я - через S , а это градусы.... ты через T - да, точнее и плавнее будет - согласен....
...пусть ТС ( второстепенный думает ) ( тема-то - твоя )
скорее всего проблема в считывании данных с приемника - согласен :)

не в тему ( но к тому же автору ) - калининградский катер L=1500 из оцинковки был арестован при первом же спуске на воду береговой охраной ФСБ ( погранцы ) :(
промежуточных снимков не делали ( дятлы ) , съёмка спуска, камера, катер - конфискованы на месте.....

:(

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

охренеть. сурово

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

jeka_tm пишет:

ну раздавит врядли)) да и струйка воды ему нипочем. а при "правильной" экранировке гаусса электроника на машинке сойдет в ума или просто перестанет реагировать. шутка ли 350В 400А за 1-2 миллисекунды. больше и не понадобится. входные цепи хотя бы радиоприемного тракта не выдержат. наводки и мк могут попалить при удачном выстреле 

эпицентр, и вся мощь импульса будет у вас на танке.... а экранировка это не так просто... это только в фильмах фольгой голову обвернул и порядок :)

да и сомниваюсь я что получиться сделать направленный "луч" а иначе все это пшик... 

 

насчет катера 1,5 м длинной, а по какой причине его конфисковали, и видео камеры тоже? похоже на какойто беспредел?! даже если спуск на воду беспелотных средств запрещен какимито там нелепыми законами? , то на каком основании забирать видео камеры? 

есть подробности инцедента? 

hubll
Offline
Зарегистрирован: 08.03.2015

jeka_tm, Ваша ссылка на скетч и библиотеку для джойстика ps2 не работает (в начале темы есть), видимо Вы удалили его с яндексдиска прошу дать ссылку на скетч.

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

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

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

jeka_tm пишет:

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

C некоторых пор начал проекты еще и на облако дублировать.Мало ли что

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

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

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

а на домашнем пк что нет ничего? 

что в том управлении было реализовано?

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

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

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

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

в том управлении просто езда. пушка же не поворачивалась. это же модель ПТСАУ была. а поворот на 5-10 градусов делать не стал. так что ничего особенного

хорошо что хоть камеру вернули. значит катер не вернут?

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

SU-27-16 пишет:

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

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

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

 

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

Жека, подскажи, а управление мотоами с кнопко геймпада делал? 

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

 

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

в управляющую нану залит свой код. 

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

 lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
    int tmp = -(ps2x.Analog(PSS_LX)-128); //
    rmspeed = lmspeed;
    lmspeed -= tmp; lmspeed *=2;
    rmspeed += tmp; rmspeed *=2;
    if (lmspeed>255) lmspeed =255;        //ограничить макс. значения моторов
    if (rmspeed>255) rmspeed =255;        //
    if (lmspeed<-255) lmspeed =-255;      //
    if (rmspeed<-255) rmspeed =-255;      //

    lmbrake =0;				 //выкл. стоп
    rmbrake =0;				 //

теперь хочу сделать чтобы кнопками (вперед, назад, лево, право) ....

попробовал сделать так: 

  if(ps2x.Button(PSB_PAD_UP)) {      //will be TRUE as long as button is pressed
      Serial.print("Up held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
         lmspeed =80;

просто добавил в код строчку lmspeed =80;

поидее это должно закрутить левый мотор на 80 шим. но чтото некрутит, что я не так делаю? :)

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

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

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

а можно пример управления с крестиком? 

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

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

void MasterSend(byte sbyte, byte pfreq, int lspeed, byte lbrake, int rspeed, byte rbrake, int sv0, int sv1, int sv2, int sv3, int sv4, int sv5, byte dev,int sens,int lowbat, byte i2caddr,byte i2cfreq)
{
  Wire.beginTransmission(I2Caddress); // transmit data to 7
  Wire.write(startbyte);              // start byte
  Wire.write(pfreq);                  // pwm frequency
  
  Wire.write(highByte(lspeed));       // MSB left  motor speed
  Wire.write( lowByte(lspeed));       // LSB left  motor speed
  Wire.write(lbrake);                 // left  motor brake
  
  Wire.write(highByte(rspeed));       // MSB right motor speed
  Wire.write( lowByte(rspeed));       // LSB right motor speed
  Wire.write(rbrake);                 // right motor brake
  
  Wire.write(highByte(sv0));          // MSB servo 0
  Wire.write( lowByte(sv0));          // LSB servo 0
  
  Wire.write(highByte(sv1));          // MSB servo 1
  Wire.write( lowByte(sv1));          // LSB servo 1
  
  Wire.write(highByte(sv2));          // MSB servo 2
  Wire.write( lowByte(sv2));          // LSB servo 2
  
  Wire.write(highByte(sv3));          // MSB servo 3
  Wire.write( lowByte(sv3));          // LSB servo 3
  
  Wire.write(highByte(sv4));          // MSB servo 4
  Wire.write( lowByte(sv4));          // LSB servo 4
  
  Wire.write(highByte(sv5));          // MSB servo 5
  Wire.write( lowByte(sv5));          // LSB servo 5
  
  Wire.write(dev);                    // devibrate
  Wire.write(highByte(sens));         // MSB impact sensitivity
  Wire.write( lowByte(sens));         // LSB impact sensitivity
  
  Wire.write(highByte(lowbat));       // MSB low battery voltage  550 to 30000 = 5.5V to 30V
  Wire.write( lowByte(lowbat));       // LSB low battery voltage
  
  Wire.write(i2caddr);                // I2C slave address for T'REX controller
  Wire.write(i2cfreq);                // I2C clock frequency:   0=100kHz   1=400kHz
  Wire.endTransmission();             // stop transmitting

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


 //управление движением с левого джойстика 

lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
    int tmp = -(ps2x.Analog(PSS_LX)-128); //
    rmspeed = lmspeed;
    lmspeed -= tmp; lmspeed *=2;
    rmspeed += tmp; rmspeed *=2;
    if (lmspeed>255) lmspeed =255;        //ограничить макс. значения моторов
    if (rmspeed>255) rmspeed =255;        //
    if (lmspeed<-255) lmspeed =-255;      //
    if (rmspeed<-255) rmspeed =-255;      //

    lmbrake =0;				 //выкл. стоп
    rmbrake =0;				 //


     // управление сервами манипулятора с правого джойстика

 sv[0] = (map(ps2x.Analog(PSS_RY), 0, 255, 700, 2300)); ; 
  sv[1] = (map(ps2x.Analog(PSS_RX), 0, 255, 950, 1750)); ; 

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

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

вот полный код мастера: 

но там есть много мусора, который тоже почемуто неработает(4сервы) но это пока не суть важно :)

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


#include <Servo.h>

Servo RXservo;
Servo RYservo;


Servo myservoH; // Горизонтальная серва углы от 0 до 180 (центровка 89)
Servo myservoV; // Вертикальная серва углы от 1 до 45
Servo myservoZ; // серва Клешня
Servo myservoR; // серва рука клешни
const int Z_SERVO_PIN = 5; // добовляем пин захвата
const int R_SERVO_PIN = 6; // добовляем пин руки манипулятора
const int H_SERVO_PIN = 7; // Горизонтальная серва подключена к пину 7
const int V_SERVO_PIN = 8; //Пин вертикального сервопривода 8
const float Z_L_ANGLE = 116; // Максимальные угл поворота башни налево
const float Z_R_ANGLE = 45; // Максимальные угл поворота башни направо
const float Z_DEF_ANGLE = 150; // Дефолтный угол (центровка)
const float R_L_ANGLE = 178; // Максимальные угл поднятия руки
const float R_R_ANGLE = 3; // Максимальные угл наклона руки
const float R_DEF_ANGLE = 160; // Дефолтный угол руки
const float H_L_ANGLE = 180; // Максимальные угл поворота башни налево
const float H_R_ANGLE = 0; // Максимальные угл поворота башни направо
const float H_DEF_ANGLE = 120; // Дефолтный угол (центровка)
const float V_U_ANGLE = 140; // Максимальные угл поворота башни вверх
const float V_D_ANGLE = 45; // Максимальные угл поворота башни вниз
const float V_DEF_ANGLE = 60; // Дефолтный угол (центровка)
//Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
const float V_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по вертикали.
const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали
const float Z_STEP = 0.012; // шаг захвата
const float R_STEP = 0.012; // шаг руки
float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы
float curZAngle = Z_DEF_ANGLE; //
float curRAngle = R_DEF_ANGLE; //
bool moveServoVUp = false; //Флаг движения верт. сервы вверх
bool moveServoVDown = false; //Флаг движения верт. сервы вниз
bool moveServoHLeft = false; //Флаг движения гор. сервы влево
bool moveServoHRight = false; //Флаг движения гор. сервы вправо
bool moveServoZLeft = false; //Флаг движения гор. сервы влево
bool moveServoZRight = false; //Флаг движения гор. сервы вправо
bool moveServoRLeft = false; //Флаг движения гор. сервы влево
bool moveServoRRight = false; //Флаг движения гор. сервы вправо

#define SHOT  1 // пин для водомета
#define ledPin 13
#define startbyte 0x0F
#define I2Caddress 0x07
int sv[6]={1000,1400,1500,1500,0,0};                 // servo positions: 0 = Not Used
int sd[6]={5,10,-5,-15,20,-20};                      // servo sweep speed/direction
int lmspeed,rmspeed;                                 // left and right motor speed from -255 to +255 (negative value = reverse)
int ldir=5;                                          // how much to change left  motor speed each loop (use for motor testing)
int rdir=5;                                          // how much to change right motor speed each loop (use for motor testing)
byte lmbrake,rmbrake;                                // left and right motor brake (non zero value = brake)
byte devibrate=50;                                   // time delay after impact to prevent false re-triggering due to chassis vibration
int sensitivity=50;                                  // threshold of acceleration / deceleration required to register as an impact
int lowbat=550;                                      // adjust to suit your battery: 550 = 5.50V
byte i2caddr=7;                                      // default I2C address of T'REX is 7. If this is changed, the T'REX will automatically store new address in EEPROM
byte i2cfreq=0;                                      // I2C clock frequency. Default is 0=100kHz. Set to 1 for 400kHz

void performServo(); // добовляем сервы

   
    
/******************************************************************
 * set pins connected to PS2 controller:
 *   - 1e column: original 
 *   - 2e colmun: Stef?
 * replace pin numbers by the ones you use
 ******************************************************************/
#define PS2_DAT        12  //14    
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        9  //17

/******************************************************************
 * select modes of PS2 controller:
 *   - pressures = analog reading of push-butttons 
 *   - rumble    = motor rumbling
 * uncomment 1 of the lines for each mode selection
 ******************************************************************/
//#define pressures   true
#define pressures   false
//#define rumble      true
#define rumble      false

PS2X ps2x; // create PS2 Controller Class
int PS2 = 0; 
//right now, the library does NOT support hot pluggable controllers, meaning 
//you must always either restart your Arduino after you connect the controller, 
//or call config_gamepad(pins) again after connecting the controller.

int error = 0;
byte type = 0;
byte vibrate = 0;

void setup(){
 
   pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
  
  // устанавливаем пин как вывод управления сервой
    myservoH.attach(H_SERVO_PIN);
    myservoV.attach(V_SERVO_PIN);
    myservoZ.attach(Z_SERVO_PIN);
    myservoR.attach(R_SERVO_PIN);
    myservoH.write(curHAngle);
    myservoV.write(curVAngle);
    myservoZ.write(curZAngle);
    myservoR.write(curRAngle);
  
  
  RXservo.attach(3);
  RYservo.attach(4);
  
  Serial.begin(57600);
  pinMode(ledPin, OUTPUT);
  Wire.begin();                // no address - join the bus as master
    
  delay(300);  //added delay to give wireless ps2 module some time to startup, before configuring it
   
  //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  
  //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
  
  if(error == 0){
    Serial.print("Found Controller, configured successful ");
    Serial.print("pressures = ");
	if (pressures)
	  Serial.println("true ");
	else
	  Serial.println("false");
	Serial.print("rumble = ");
	if (rumble)
	  Serial.println("true)");
	else
	  Serial.println("false");
  }  
  else
    Serial.println("Большой еггог :)");
   
  
//  Serial.print(ps2x.Analog(1), HEX);
  
  type = ps2x.readType(); 
  switch(type) {
    case 0:
      Serial.print("Unknown Controller type found ");
      break;
    case 1:
      Serial.print("DualShock Controller found ");
      break;
    case 2:
      Serial.print("GuitarHero Controller found ");
      break;
	case 3:
      Serial.print("Wireless Sony DualShock Controller found ");
      break;
   }
}

void loop() {
  /* You must Read Gamepad to get new values and set vibration values
     ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
     if you don't enable the rumble, use ps2x.read_gamepad(); with no values
     You should call this at least once a second
   */  
  if(error == 1) //skip loop if no controller found
    return; 
  
  if(type == 2){ //Guitar Hero Controller
    ps2x.read_gamepad();          //read controller 
   
    if(ps2x.ButtonPressed(GREEN_FRET))
      Serial.println("Green Fret Pressed");
      moveServoVDown = true;
      
    if(ps2x.ButtonPressed(RED_FRET))
      Serial.println("Red Fret Pressed");
        moveServoHRight = true;
        
    if(ps2x.ButtonPressed(YELLOW_FRET))
      Serial.println("Yellow Fret Pressed");
       moveServoVUp = true;
       
    if(ps2x.ButtonPressed(BLUE_FRET))
      Serial.println("Blue Fret Pressed");
        moveServoHLeft = true;
        
    if(ps2x.ButtonPressed(ORANGE_FRET))
      Serial.println("Orange Fret Pressed"); 

    if(ps2x.ButtonPressed(STAR_POWER))
      Serial.println("Star Power Command");
    
    if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
      Serial.println("Up Strum");
    if(ps2x.Button(DOWN_STRUM))
      Serial.println("DOWN Strum");
 
    if(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressed
      Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
      Serial.println("Select is being held");
    
    if(ps2x.Button(ORANGE_FRET)) {     // print stick value IF TRUE
      Serial.print("Wammy Bar Position:");
      Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); 
    } 
  }
  else { //DualShock Controller
    ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
    
    if(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressed
      Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
      Serial.println("Select is being held");      

    if(ps2x.Button(PSB_PAD_UP)) {      //will be TRUE as long as button is pressed
      Serial.print("Up held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
         lmspeed =80;
         lmbrake =0;				 //выкл. стоп
 
     
    }
    if(ps2x.Button(PSB_PAD_RIGHT)){
      Serial.print("Right held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
    }
    if(ps2x.Button(PSB_PAD_LEFT)){
      Serial.print("LEFT held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
    }
    if(ps2x.Button(PSB_PAD_DOWN)){
      Serial.print("DOWN held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
    }   

    vibrate = ps2x.Analog(PSAB_CROSS);  //this will set the large motor vibrate speed based on how hard you press the blue (X) button
    if (ps2x.NewButtonState()) {        //will be TRUE if any button changes state (on to off, or off to on)
     
     
     if(ps2x.Button(PSB_L1))
        Serial.println("L1 pressed");
         moveServoRLeft = true;
         
      if(ps2x.Button(PSB_R1))
        Serial.println("R1 pressed");
        moveServoZLeft = true;
     
      if(ps2x.Button(PSB_L3))
        Serial.println("L3 pressed");
      if(ps2x.Button(PSB_R3))
        Serial.println("R3 pressed");
        
      if(ps2x.Button(PSB_L2))
        Serial.println("L2 pressed");
        moveServoRRight = true;
        
      if(ps2x.Button(PSB_R2))
        Serial.println("R2 pressed");
        moveServoZRight = true;
        
      if(ps2x.Button(PSB_TRIANGLE))
        Serial.println("Triangle pressed"); 
   moveServoHRight = true;
   
    }

    if(ps2x.ButtonPressed(PSB_CIRCLE))               //will be TRUE if button was JUST pressed
      Serial.println("Circle just pressed");
    if(ps2x.NewButtonState(PSB_CROSS))               //will be TRUE if button was JUST pressed OR released
      Serial.println("X just changed");
          moveServoHLeft = true;
      
    if(ps2x.ButtonReleased(PSB_SQUARE))              //will be TRUE if button was JUST released
      Serial.println("Square just released");     

    Serial.print("Stick:");
    
    
    //--------— чтобы сервы не продолжали движения при отжатых кнопках —-------------    
if(ps2x.ButtonPressed(GREEN_FRET))
{
moveServoVDown = false;
}
if(ps2x.ButtonPressed(RED_FRET))
{
moveServoVUp = false;
}

if(ps2x.ButtonPressed(YELLOW_FRET))
{
moveServoHRight = false;
}
if(ps2x.ButtonPressed(BLUE_FRET))
{
moveServoHLeft = false;
}
 
 if(ps2x.Button(PSB_R2))
{
moveServoZRight = false;
}
if(ps2x.Button(PSB_R1))
{
moveServoZLeft = false;
}   
    
 if(ps2x.Button(PSB_L2))
{
moveServoRRight = false;
}
if(ps2x.Button(PSB_L1))
{
moveServoRLeft = false;
}       


   lmspeed = -(ps2x.Analog(PSS_LY)-128); //скопировать данные джойстика в регистры правого и левого двигателя
    int tmp = -(ps2x.Analog(PSS_LX)-128); //
    rmspeed = lmspeed;
    lmspeed -= tmp; lmspeed *=2;
    rmspeed += tmp; rmspeed *=2;
    if (lmspeed>255) lmspeed =255;        //ограничить макс. значения моторов
    if (rmspeed>255) rmspeed =255;        //
    if (lmspeed<-255) lmspeed =-255;      //
    if (rmspeed<-255) rmspeed =-255;      //

    lmbrake =0;				 //выкл. стоп
    rmbrake =0;				 //
    
 sv[0] = (map(ps2x.Analog(PSS_RY), 0, 255, 700, 2300)); ; 
  sv[1] = (map(ps2x.Analog(PSS_RX), 0, 255, 950, 1750)); ; 
  //sv[1] = 1400 -(ps2x.Analog(PSS_RX)-128)*2,2;
    
    Serial.print(lmspeed, DEC); //Left stick, Y axis. Other options: LX, RY, RX  
    Serial.print(",");
    Serial.print(rmspeed, DEC); 
    Serial.print(",");
    
    RXservo.write(map(ps2x.Analog(PSS_RX), 255, 0, 0, 180)); ; 
 delay(50); 
  ps2x.read_gamepad(false, 0);
  
  RYservo.write(map(ps2x.Analog(PSS_RY), 0, 255, 0, 90)); ; 
 delay(50); 
  ps2x.read_gamepad(false, 0);

 //    Serial.print(ps2x.Analog(PSS_RY), DEC); 
  //   Serial.print(",");
   //  Serial.print(ps2x.Analog(PSS_RX), DEC); 
   //  Serial.println("\t");
  }
  digitalWrite(ledPin, HIGH);

 MasterSend(startbyte,2,lmspeed,lmbrake,rmspeed,rmbrake,sv[0],sv[1],sv[2],sv[3],sv[4],sv[5],devibrate,sensitivity,lowbat,i2caddr,i2cfreq);
  delay(20);
  MasterReceive();    // receive data packet from T'REX controller 
}


void MasterSend(byte sbyte, byte pfreq, int lspeed, byte lbrake, int rspeed, byte rbrake, int sv0, int sv1, int sv2, int sv3, int sv4, int sv5, byte dev,int sens,int lowbat, byte i2caddr,byte i2cfreq)
{
  Wire.beginTransmission(I2Caddress); // transmit data to 7
  Wire.write(startbyte);              // start byte
  Wire.write(pfreq);                  // pwm frequency
  
  Wire.write(highByte(lspeed));       // MSB left  motor speed
  Wire.write( lowByte(lspeed));       // LSB left  motor speed
  Wire.write(lbrake);                 // left  motor brake
  
  Wire.write(highByte(rspeed));       // MSB right motor speed
  Wire.write( lowByte(rspeed));       // LSB right motor speed
  Wire.write(rbrake);                 // right motor brake
  
  Wire.write(highByte(sv0));          // MSB servo 0
  Wire.write( lowByte(sv0));          // LSB servo 0
  
  Wire.write(highByte(sv1));          // MSB servo 1
  Wire.write( lowByte(sv1));          // LSB servo 1
  
  Wire.write(highByte(sv2));          // MSB servo 2
  Wire.write( lowByte(sv2));          // LSB servo 2
  
  Wire.write(highByte(sv3));          // MSB servo 3
  Wire.write( lowByte(sv3));          // LSB servo 3
  
  Wire.write(highByte(sv4));          // MSB servo 4
  Wire.write( lowByte(sv4));          // LSB servo 4
  
  Wire.write(highByte(sv5));          // MSB servo 5
  Wire.write( lowByte(sv5));          // LSB servo 5
  
  Wire.write(dev);                    // devibrate
  Wire.write(highByte(sens));         // MSB impact sensitivity
  Wire.write( lowByte(sens));         // LSB impact sensitivity
  
  Wire.write(highByte(lowbat));       // MSB low battery voltage  550 to 30000 = 5.5V to 30V
  Wire.write( lowByte(lowbat));       // LSB low battery voltage
  
  Wire.write(i2caddr);                // I2C slave address for T'REX controller
  Wire.write(i2cfreq);                // I2C clock frequency:   0=100kHz   1=400kHz
  Wire.endTransmission();             // stop transmitting
  
  //Serial.println("Master Command Data Packet Sent");
  
  
  
  
  
  
  
  //-------------------------------- Make sure Master and Slave I2C clock the same ------------------------------------------------
  
  if(i2cfreq==0)                                                               // thanks to Nick Gammon: http://gammon.com.au/i2c
  {
    TWBR=72;                                                                   // default I²C clock is 100kHz
  }
  else
  {
    TWBR=12;                                                                   // changes the I²C clock to 400kHz
  }
}


//Функция управления сервоприводами (вызывается в теле loop на каждой итерации)
//Выполняет изменения положения серв на подобранный шаг согласно установленным флагам движения
//Флаги устанавливаются согласно поступившим символам управления сервами
void performServo()
{
    //Установлен флаг движения вверх и текущий угол не максимальный
    if (moveServoVUp && curVAngle + V_STEP <= V_U_ANGLE)
    {
        //К текущему верт. углу прибавляем шаг
        curVAngle += V_STEP;
    }
    //Установлен флаг движения вниз и текущий угол не минимален
    else if (moveServoVDown && curVAngle - V_STEP >= V_D_ANGLE)
    {
        //От текущего верт. угла отнимаем шаг
        curVAngle -= V_STEP;
    }
    //Установлен флаг движения влево и текущий угол не максимален
    if (moveServoHLeft && curHAngle + H_STEP <= H_L_ANGLE)
    {
        //К текущему гор. углу прибавляем гор. шаг
        curHAngle += H_STEP;
    }
    //Установлен флаг движения вправо и текущий угол не минимален
    else if (moveServoHRight && curHAngle - H_STEP >= H_R_ANGLE)
    {
        //От текущего угла отнимаем гор. шаг
        curHAngle -= H_STEP;
    }
    
    //Установлен 
    if (moveServoZLeft && curZAngle + Z_STEP <= Z_L_ANGLE)
    {
        //К текущему гор. углу прибавляем гор. шаг
        curZAngle += Z_STEP;
    }
    //Установлен флаг движения вправо и текущий угол не минимален
    else if (moveServoZRight && curZAngle - Z_STEP >= Z_R_ANGLE)
    {
        //От текущего угла отнимаем гор. шаг
        curZAngle -= Z_STEP;
    }
    
    
        //Установлен 
    if (moveServoRLeft && curRAngle + R_STEP <= R_L_ANGLE)
    {
        //К текущему гор. углу прибавляем гор. шаг
        curRAngle += R_STEP;
    }
    //Установлен флаг движения вправо и текущий угол не минимален
    else if (moveServoRRight && curRAngle - R_STEP >= R_R_ANGLE)
    {
        //От текущего угла отнимаем гор. шаг
        curRAngle -= R_STEP;
    }
    
    //Если было движние по вертикали
    if (moveServoVUp || moveServoVDown)
    {
        myservoV.write(curVAngle);
    }
    //Если было движение по горизонтали
    if (moveServoHLeft || moveServoHRight)
    {
        myservoH.write(curHAngle);
    }
    
    if (moveServoZLeft || moveServoZRight)
    {
        myservoZ.write(curZAngle);
    }
    
        if (moveServoRLeft || moveServoRRight)
    {
        myservoR.write(curRAngle);
    }
}



void MasterReceive()
{//================================================================= Error Checking ==========================================================
  byte d;
  int i=0;
  Wire.requestFrom(I2Caddress,24);                                // request 24 bytes from device 007
  
  while(Wire.available()<24)                                      // wait for entire data packet to be received
  {
    if(i==0) Serial.print("Waiting for slave to send data.");     // Only print message once (i==0)
    if(i>0) Serial.print(".");                                    // print a dot for every loop where buffer<24 bytes
    i++;                                                          // increment i so that message only prints once.
    if(i>79)
    {
      Serial.println("");
      i=1;
    }
  }
  d=Wire.read();                                                  // read start byte from buffer
  if(d!=startbyte)                                                // if start byte not equal to 0x0F                                                    
  {
    Serial.print(d,DEC);
    while(Wire.available()>0)                                     // empty buffer of bad data
    {
      d=Wire.read();
    }
    Serial.println("  Wrong Start Byte");                         // error message
    return;                                                       // quit
  }
  
  //================================================================ Read Data ==============================================================

  //Serial.print(". Trex Err:");                           // slave error report
  Serial.print(Wire.read(),DEC);
  
  i=Wire.read()*256+Wire.read();                                  // T'REX battery voltage
  Serial.print(" Akk:");
  Serial.print(int(i/10));Serial.print(".");                      
  Serial.print(i-(int(i/10)*10));Serial.print("V");
  
  i=Wire.read()*256+Wire.read();
  Serial.print("\tL Curr:");
  Serial.print(i);Serial.print("mA");                           // T'REX left  motor current in mA
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Enc:");
  Serial.print(i);                                              // T'REX left  motor encoder count
  
  i=Wire.read()*256+Wire.read();
  Serial.print("\tR Curr:");
  Serial.print(i);Serial.print("mA");                           // T'REX right motor current in mA
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Enc:");
  Serial.print(i);                                              // T'REX right motor encoder count
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" X-axis:");
  Serial.print(i);                                              // T'REX X-axis
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Y:");
  Serial.print(i);                                              // T'REX Y-axis
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Z:");
  Serial.print(i);                                              // T'REX Z-axis
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" X-delta:");
  Serial.print(i);                                              // T'REX X-delta
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Y:");
  Serial.print(i);                                              // T'REX Y-delta
  
  i=Wire.read()*256+Wire.read();
  Serial.print(" Z:");
  Serial.println(i);                                              // T'REX Z-delta
}

 

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

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

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

hubll
Offline
Зарегистрирован: 08.03.2015

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

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


int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 3;    // PWM pin to change speed
   
                 
void setup(){
  LXservo.attach(6);
  PS2 = ps2x.config_gamepad(13,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
}




void loop(){
  LXservo.write(map(ps2x.Analog(PSS_LX), 0, 255, 70, 165)); ; 
 delay(50); 
 
  ps2x.read_gamepad();
  
  if (ps2x.Analog(PSS_LY) > 128) bspeed = map(ps2x.Analog(PSS_LY), 0, 255, 0, 69), backward(bspeed);
  if (ps2x.Analog(PSS_LY) < 128) fspeed = map(ps2x.Analog(PSS_LY), 0, 255, 69, 0), forward(fspeed);
 // if (ps2x.Analog(PSS_RY) >190 && msg[0] <200)data = msg[0], stop(); 
  
   // dir_pwm(ps2x.Analog(PSS_RY),2);   //
 
}    
void forward(int fspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
  }

 

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

вот нафига делать такие длинные записи. нифига же непонятно

if (ps2x.Analog(PSS_LY) > 128){
  bspeed = map(ps2x.Analog(PSS_LY), 0, 255, 0, 69);
  backward(bspeed);
}
if (ps2x.Analog(PSS_LY) < 128){
  fspeed = map(ps2x.Analog(PSS_LY), 0, 255, 69, 0);
  forward(fspeed);
}

вот теперь сам подумай какой шим будет на выходе))) от 0 до 69. шим всего 69 максимум. может и не тронуться. зачем ограничиваешь?

да и если PSS_LY меньше 128 почему в map диапазон исходных данных от 0 до 255. надо было от 0 до 127)))

аналогично если больше 128

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

две переменные совсем незачем bspeed и fspeed. достаточно одной

короче должно получится что то вроде этого

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

#define in1  2    // direction pin 1
#define in2  4    // direction pin 2
#define ena  3    // PWM pin to change speed

int fspeed;           // forward speed 

void setup(){
  LXservo.attach(6);
  PS2 = ps2x.config_gamepad(13,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
}



void loop(){
  ps2x.read_gamepad();
  
  if (ps2x.Analog(PSS_LY) == 128) analogWrite(ena, 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);
  }
  
  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);
  }
  LXservo.write(map(ps2x.Analog(PSS_LX), 0, 255, 70, 165)); 
  delay(50);

}    

 

 

hubll
Offline
Зарегистрирован: 08.03.2015

Спасибо, Жека. Работает, и мой код наверное тоже работает. Я на двигатель подключил через драйвер l298n аккумулятор 18650 он не работал по этому. А когда подал на двигатель без драйвера, то работало. Общим 2х18650 подключил и все нормально. Спасибо.

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

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

нет отработки значения если =128 то стоп

да и двигатели будут еле крутится

видео выкладывай как соберешь

hubll
Offline
Зарегистрирован: 08.03.2015

Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4

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

ну отлично)) с фарами реально прикольно

hubll
Offline
Зарегистрирован: 08.03.2015

да) из механики самое сложное это поворотная система.

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

изначально в машинке колеса не поворачивались?

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

hubll пишет:

Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4

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

можно у вас ваш скетч попросить? можно на почту slom1@list.ru 

заранее спасибо. 

hubll
Offline
Зарегистрирован: 08.03.2015

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

hubll
Offline
Зарегистрирован: 08.03.2015

SLOM пишет:

hubll пишет:

Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4

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

можно у вас ваш скетч попросить? можно на почту slom1@list.ru 

заранее спасибо. 

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

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

hubll пишет:

SLOM пишет:

hubll пишет:

Првет, вот тест драйв машинки. https://youtu.be/XXXJG5udBK4

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

можно у вас ваш скетч попросить? можно на почту slom1@list.ru 

заранее спасибо. 

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

Видел Ваш канал на ютюбе.Большая работа проведена и прекрасные технические решения.