Errock 发表于 2015-10-28 19:43:19

【求教】Arduino ps2手柄 控制云台 程序

求教,才接触Arduino 买的是unor3 想做一个用ps2手柄控制云台。目前按下手柄在串口显示器上显示按下的键会用库实现了,单独输入角度控制舵机也找到程序了 但是无奈不会把两个程序合在一起。求大神帮忙。
IDE是1.6.5
ps2是 Arduino-PS2X-master\PS2X_lib\Examples\PS2X_Example
舵机是 arduino学习笔记23 - 任意输出舵机角度实验

希望能做到简单点的按下手柄比如:SELECT 输入0 舵机转到0度 START 输入15 舵机转到15度 这样就好


当然很希望能够做到摇杆控制但是目前不敢奢求太多.....


因为目前只需要这部分 所以没打算系统学习 哪位大大能告诉我 去学哪部分能解决这个问题也好QAQ


zoologist 发表于 2015-10-28 20:49:59

你的问题还是太笼统了。最好问你遇到的具体问题

Errock 发表于 2015-10-28 22:09:07

本帖最后由 Errock 于 2015-10-28 22:13 编辑

zoologist 发表于 2015-10-28 20:49 static/image/common/back.gif
你的问题还是太笼统了。最好问你遇到的具体问题

大大泥豪~就是 想把两个程序合起来...int i,val;
char a;
boolean display;
#include <Servo.h>
Servo servo1;

void setup()
{
Serial.begin(9600);
servo1.attach(4);//舵機一接pin4
}

void loop()
{
if (Serial.available()){      //如果有数据输入.....
    delay(30);                  //等待30毫秒让所有输入数据从串口传输完毕.....
    if (Serial.available() <= 3){ //如果输入数据位数'<=3'.....
      while (Serial.available()){ //开始读取数据直到[串口输入缓存被清空]
      a = Serial.read();   //读取数据到[数组"a"]
      }
      display = 1;                  //数据读取完毕以后'打开'显示输出开关
    }
    else {                        //如果输入数据位数'>3'.....
      Serial.flush();             //刷新串口输入缓存
    }
}
/*======================直接通过串口返回输入数值模块======================
if (display)                  //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
{
    for (i = 0; i <= sizeof(a); i++)
    {
   Serial.print("a[");
   Serial.print(i);
   Serial.print("]= ");
      Serial.print(a);
      Serial.print(" | ");
    }
    Serial.println();
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}
//=======================通过加减符号控制舵机增减一度转动=================*/
if (a == 43 && display){
val++;
servo1.write(val);
Serial.println(val);
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}
if (a == 45 && display){
val--;
servo1.write(val);
Serial.println(val);
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}

//========================判断及修正输入数据位数模块======================
if (display)                  //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
{
   if (!a){ //如果输入数据为两位数(最后一位空)
   if (!a){ //如果输入数据为一位数(最后两位空)
   a = a;
   a = 48;
   a = 48;
   }
   else {
   a = a;
   a = a;
   a = 48;
   }
   }
//==============转换变量类型后输出给舵机且通过串口返回结果值==============
for (i=0;i<=3;i++){ //变量类型:char to int (48为0的ASCII)
a -= 48;
}
val = 100*a + 10*a + a;
// Serial.print("val: ");
servo1.write(val);
Serial.println(val);

/* int val2 = random(50); //int型变量加法测试
val += val2;
Serial.print("+");
Serial.print(val2);
Serial.print("=");
Serial.println(val);
*/
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
//    val = 0;
}
}



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

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you conect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;

void setup(){
Serial.begin(57600);

//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
   
else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
   
else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
   
else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
   
   //Serial.print(ps2x.Analog(1), HEX);
   
   type = ps2x.readType();
   switch(type) {
       case 0:
      Serial.println("Unknown Controller type");
       break;
       case 1:
      Serial.println("DualShock Controller Found");
       break;
       case 2:
         Serial.println("GuitarHero Controller Found");
       break;
   }

}

void loop(){
   /* You must Read Gamepad to get new values
   Read GamePad 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");
   if(ps2x.ButtonPressed(RED_FRET))
   Serial.println("Red Fret Pressed");
   if(ps2x.ButtonPressed(YELLOW_FRET))
   Serial.println("Yellow Fret Pressed");
   if(ps2x.ButtonPressed(BLUE_FRET))
   Serial.println("Blue Fret Pressed");
   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);
      }
      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_BLUE);      //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_L3))
         Serial.println("L3 pressed");
      if(ps2x.Button(PSB_R3))
         Serial.println("R3 pressed");
      if(ps2x.Button(PSB_L2))
         Serial.println("L2 pressed");
      if(ps2x.Button(PSB_R2))
         Serial.println("R2 pressed");
      if(ps2x.Button(PSB_GREEN))
         Serial.println("Triangle pressed");
         
    }   
         
   
    if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
         Serial.println("Circle just pressed");
         
    if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
         Serial.println("Square just released");   
   
    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
         Serial.println("X just changed");   
   
   
    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
    {
      Serial.print("Stick Values:");
      Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
      Serial.print(",");
      Serial.print(ps2x.Analog(PSS_LX), DEC);
      Serial.print(",");
      Serial.print(ps2x.Analog(PSS_RY), DEC);
      Serial.print(",");
      Serial.println(ps2x.Analog(PSS_RX), DEC);
    }
   
   
}


delay(50);
   
}



打算把L2 R2 按下后变成30 60 Select 和Start 变成0 和15   虽然不能用摇杆或者按住控制角度但是可以依靠预设定的角度进行调整也好QAQ....然后直接把舵机控制加进ps2手柄中去发现不能用...555555

大大要是有好的ps2手柄控制 舵机 连接arduino unor3的程序就更好了QAQ

gthrtg 发表于 2015-10-29 09:15:38

可以去http://www.geek-workshop.com/forum.php?mod=viewthread&tid=172&highlight=%CA%D6%B1%FA这里学习下弘大的 或许能帮到

Errock 发表于 2015-10-29 12:28:16

gthrtg 发表于 2015-10-29 09:15 static/image/common/back.gif
可以去http://www.geek-workshop.com/forum.php?mod=viewthread&tid=172&highlight=%CA%D6%B1%FA这里学 ...

看的就是弘大大的俩学习笔记 ....单独使用都可以 但是不会把俩程序连在一起使用QWQ....

鲨鱼蜡椒 发表于 2016-1-12 10:18:35

Errock 发表于 2015-10-28 22:09 static/image/common/back.gif
大大泥豪~就是 想把两个程序合起来...int i,val;
char a;
boolean display;


楼主,你的这个ps2的程序在1.6.5上面不抱错吗?
页: [1]
查看完整版本: 【求教】Arduino ps2手柄 控制云台 程序