duocool 发表于 2013-6-11 21:00:42

PS2无线手柄控制的激光武器

本帖最后由 duocool 于 2013-6-12 18:30 编辑

呵呵,说武器夸张了,不过这玩意还是有武器的潜质的。

基于http://www.geek-workshop.com/thread-172-1-1.html,去掉了无关的按键响应,只保留4个方向键来和右扳机。

ps2无线手柄实验。

基本结构就是ps2无线手柄传信号给pro mini, pro mini再控制两舵机来控制激光头的方向。另用手柄的右扳机来控制激光的发射。

先上图:











无线手柄需要3.3V电压,因为pro mini没有3.3V电压用了个LM317T来获得3.3V电压。用了它后,发现最初用nano的3.3v驱动的无线手柄摇杆不能用的毛病也没了,通过mode键就可以开关摇杆,不过只是左摇杆,和上下左右键能一起用。

补个操作视频

http://player.youku.com/player.php/sid/XNTY5NTYwNTYw/v.swf

补上代码:
#include <;PS2X_lib.h>//for v1.6
#include <Servo.h>
Servo servo1,servo2;
PS2X ps2x; // create PS2 Controller Class

int error = 0;
byte type = 0;
byte vibrate = 0;
int laserPin = 2;//设置激光控制口
int hser=90 , vser=90;//水平,垂直舵机初始角度
void setup(){
Serial.begin(57600);
servo1.attach(5);//设置水平舵机控制口
servo2.attach(7);///设置垂直舵机控制口
pinMode(laserPin, OUTPUT);
//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");
}
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. ");
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(){
if(error == 1) //skip loop if no controller found
    return;
if(type == 2){ //Guitar Hero Controller
    ps2x.read_gamepad();          //read controller
    if(ps2x.ButtonPressed(STAR_POWER))
      Serial.println("Star Power Command");
    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");
}
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)) {         //UP键控制
       if (vser<170){
      vser++;
      }
      Serial.println("vser is "+String(vser));
      servo2.write(vser);            
      delay(20);
    }
    if(ps2x.Button(PSB_PAD_RIGHT)){//R键控制
      
      if (hser<170){
      hser++;
      }
      Serial.println("hser is "+String(hser));
      servo1.write(hser);            
      delay(20);
    }
    if(ps2x.Button(PSB_PAD_LEFT)){//L键控制
      if (hser>10){
      hser--;
      }
      Serial.println("hser is "+String(hser));
      servo1.write(hser);            
      delay(20);
    }
    if(ps2x.Button(PSB_PAD_DOWN)){//DOWN键控制      
      if (vser>20){
      vser--;
      }
      Serial.println("vser is "+String(vser));
      servo2.write(vser);            
      delay(20);
    }   
    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_R2)){
      //Serial.println("R2 pressed");
      Serial.println("LASER START!");
      digitalWrite(laserPin, HIGH);
      }
      else{
      digitalWrite(laserPin, LOW);
      }   
    }   

    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
      Serial.println("X just changed");   
}
delay(50);
}



弘毅 发表于 2013-6-11 21:02:11

看的好酷的样子~~标准版nano是这样的,3.3V输出功率最大100ma,稍微需求功率大一些,供电就根不上了。

小猪会轮滑 发表于 2013-6-11 21:06:13

:lol:lol:lol:lol:lol:lol:lol

怪怪金小鱼 发表于 2013-6-11 21:08:09

我也占个座:lol

yhy1993226 发表于 2013-6-11 22:06:42

帅气,我也占个座~

friskit 发表于 2013-6-11 22:51:29

霸气霸气霸气霸气霸气霸气

code-AR 发表于 2013-6-11 22:56:15

学习啦!给力的说。

学慧放弃 发表于 2013-6-12 10:11:54

那红色的线是红外线吗??

duocool 发表于 2013-6-12 10:18:55

学慧放弃 发表于 2013-6-12 10:11 static/image/common/back.gif
那红色的线是红外线吗??

红外线怎么能看得到呢,

红色激光,我用了点技术手段让它更明显点了。不过绝对没ps

学慧放弃 发表于 2013-6-12 13:15:03

我以为是红外线呢

nick_zm 发表于 2013-6-12 16:17:23

用了加湿器而已,还技术手段{:soso_e120:}

Hohai_Say 发表于 2013-6-12 20:12:08

很不错,怒顶一个!

幻生幻灭 发表于 2013-6-12 23:03:56

技术手段很强大 !

Randy 发表于 2013-6-13 22:35:27

酷毙了。顶一个!!!!

wei-geek 发表于 2013-8-22 20:08:13

我也有这样的想法 加入大功率激光和传感器类就真的。。。。。。
页: [1] 2
查看完整版本: PS2无线手柄控制的激光武器