|
|
本帖最后由 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键就可以开关摇杆,不过只是左摇杆,和上下左右键能一起用。
补个操作视频
补上代码:
[pre lang="arduino" line="1" file="ps2laser"]#include < S2X_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);
}
[/code]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|