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);
}
看的好酷的样子~~标准版nano是这样的,3.3V输出功率最大100ma,稍微需求功率大一些,供电就根不上了。 :lol:lol:lol:lol:lol:lol:lol 我也占个座:lol 帅气,我也占个座~ 霸气霸气霸气霸气霸气霸气 学习啦!给力的说。 那红色的线是红外线吗?? 学慧放弃 发表于 2013-6-12 10:11 static/image/common/back.gif
那红色的线是红外线吗??
红外线怎么能看得到呢,
红色激光,我用了点技术手段让它更明显点了。不过绝对没ps 我以为是红外线呢 用了加湿器而已,还技术手段{:soso_e120:} 很不错,怒顶一个! 技术手段很强大 ! 酷毙了。顶一个!!!! 我也有这样的想法 加入大功率激光和传感器类就真的。。。。。。
页:
[1]
2