极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 41946|回复: 17

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

[复制链接]
发表于 2013-6-11 21:00:42 | 显示全部楼层 |阅读模式
本帖最后由 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
回复

使用道具 举报

发表于 2013-6-11 21:02:11 | 显示全部楼层
看的好酷的样子~~标准版nano是这样的,3.3V输出功率最大100ma,稍微需求功率大一些,供电就根不上了。
回复 支持 反对

使用道具 举报

发表于 2013-6-11 21:06:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-6-11 21:08:09 | 显示全部楼层
我也占个座
回复 支持 反对

使用道具 举报

发表于 2013-6-11 22:06:42 | 显示全部楼层
帅气,我也占个座~
回复 支持 反对

使用道具 举报

发表于 2013-6-11 22:51:29 | 显示全部楼层
霸气霸气霸气霸气霸气霸气
回复 支持 反对

使用道具 举报

发表于 2013-6-11 22:56:15 | 显示全部楼层
学习啦!给力的说。
回复 支持 反对

使用道具 举报

发表于 2013-6-12 10:11:54 | 显示全部楼层
那红色的线是红外线吗??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-12 10:18:55 | 显示全部楼层
学慧放弃 发表于 2013-6-12 10:11
那红色的线是红外线吗??

红外线怎么能看得到呢,

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

使用道具 举报

发表于 2013-6-12 13:15:03 | 显示全部楼层
我以为是红外线呢
回复 支持 反对

使用道具 举报

发表于 2013-6-12 16:17:23 | 显示全部楼层
用了加湿器而已,还技术手段{:soso_e120:}
回复 支持 反对

使用道具 举报

发表于 2013-6-12 20:12:08 | 显示全部楼层
很不错,怒顶一个!
回复 支持 反对

使用道具 举报

发表于 2013-6-12 23:03:56 | 显示全部楼层
技术手段很强大 !
回复 支持 反对

使用道具 举报

发表于 2013-6-13 22:35:27 | 显示全部楼层
酷毙了。顶一个!!!!
回复 支持 反对

使用道具 举报

发表于 2013-8-22 20:08:13 | 显示全部楼层
我也有这样的想法 加入大功率激光和传感器类  就真的。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 14:11 , Processed in 0.066830 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表