找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6775|回复: 2
打印 上一主题 下一主题
收起左侧

arduino控制PS2 2路红外自动循迹3路红外光电避障小车源码与资料

[复制链接]
跳转到指定楼层
楼主
小白入门,arduino控制PS2,淘宝商家给的码,貌似不行

实物连接说明:


小车源程序和PS2库
【PS手柄控制自动循迹红外避障小车使用说明】

1、准备好PS2手柄及arduino UNO R3控制板

2、安装好arduino IDE 后,将PS2X_lib.zip解压到 Arduino\libraries 文件夹中!

3、按照连接图连接好接收器与控制板(关键一步,基本上都是在这里出错导致无法通信)

4、用USB方口线接到电脑,用IDE打开程序“Car_PS2_2TK_3POA.ino”,设置好端口号,将程序上传到开发板;

5、使用说明:

1)打开Doit驱动板的电源开关,可观察到驱动板连接的手柄接收器上的指示灯正处于闪烁状态,将手柄的开

关拨到“on”档,稍等片刻待手柄的控制器与接收器配对完成后便可观察到接收器上的指示灯常亮;

2)分别按下手柄左边的4个方向按钮,可以控制小车的前进后退和左右转,按下“SELECT”键小车停止运动;

3)右手按住右摇杆不放,左手分别摇动左摇杆也可以控制小车往不同方向行驶;

4)按下“□”,小车将进入“自动循迹模式”,按任一方向键或者“SELECT”小车停止循迹;

5)按下“○”,小车将进入“自动避障模式”,按任一方向键或者“SELECT”小车停止避障;

6)分别按下手柄右边的“△”和“×”键可以手动控制小车的车灯亮灭和蜂鸣器鸣叫(注意:有些款式的坦

克车默认没有装LED灯故此功能没有,之前版本里默认没有蜂鸣器所以该功能也就没有,但程序默认是有的,

若是非要该功能可自行外接实现);


单片机源程序如下:
  1. //材料:UNO开发板*1+2路电机&16路舵机驱动板*1+PS2游戏手柄套件*1+红外循迹模块*2+光电红外避障传感器*3+蜂鸣器*1
  2. //功能:手柄控制+2路红外循迹+3路光电红外避障
  3. //IIC与A4、A5复用了,所以不能用到!!!
  4. //避障参数   1--无障碍  0--障碍
  5. #include <PS2X_lib.h>  //for v1.6
  6. /****************************IO引脚定义*****************************/
  7. //电机引脚
  8. #define PWMA 9 //左电机转速
  9. #define DIRA 8 //左电机转向
  10. #define PWMB 6 //右电机转速
  11. #define DIRB 7 //右电机转向
  12. //蜂鸣器引脚
  13. #define BEEP_PIN 3
  14. //车头两LED灯
  15. #define TLED_PIN 2
  16. //左右红外循迹
  17. #define TRAKLEF A0 //红外循迹左
  18. #define TRAKRIT A1 //红外循迹右
  19. //3路光电红外避障
  20. #define IRavoiFL  A2 //红外避障_前左
  21. #define IRavoiFM  A3 //红外避障_前中
  22. #define IRavoiFR  A4 //红外避障_前右
  23. /*******************************************************************/
  24. //设置引脚连接到PS2控制器:
  25. #define PS2_DAT  13   
  26. #define PS2_CMD  11
  27. #define PS2_SEL  10
  28. #define PS2_CLK  12
  29. /******************************************************************
  30. *选择PS2控制器的模式:
  31. * - 压力=推杆的模拟读数
  32. * - 震动?
  33. *取消注释每个模式选择的行1
  34. ******************************************************************/
  35. #define pressures   true
  36. // #define pressures   false
  37. #define rumble      true
  38. // #define rumble      false
  39. PS2X ps2x; //创建PS2控制器类
  40. //现在,库不支持热插拔控制器,即连接控制器后,你必须重启Arduino
  41. //蜂鸣器响/熄
  42. #define BEEP_ON    digitalWrite(BEEP_PIN, LOW)//蜂鸣器响
  43. #define BEEP_OFF   digitalWrite(BEEP_PIN, HIGH)//蜂鸣器熄
  44. //车头两LED灯
  45. #define TLED_ON digitalWrite(TLED_PIN, LOW);//亮灯
  46. #define TLED_OFF digitalWrite(TLED_PIN, HIGH);//灭灯
  47. //定义小车速度
  48. uint8_t speedd=255;//小车正常速度
  49. uint8_t speeddAG=250;//小车循迹速度
  50. //小车控制标志量
  51. enum DS
  52. {
  53.         MANUAL_DRIVE,//手动控制
  54.           AutoTracking, //循迹模式
  55.         AutoObstruct, //避障模式
  56. }Drive_Status=MANUAL_DRIVE;
  57. //电机控制标志量
  58. enum DN
  59. {
  60.         GO_ADVANCE,
  61.         GO_LEFT,
  62.         GO_RIGHT,
  63.         GO_BACK,
  64.         STOP_STOP,
  65.         DEF
  66. }Drive_Num=DEF;
  67. //电机控制相关
  68. bool flag1=false;
  69. bool stopFlag = true;
  70. bool JogFlag = false;
  71. uint16_t JogTimeCnt = 0;
  72. uint32_t JogTime=0;
  73. //PS2手柄
  74. int error = 0;
  75. byte type = 0;
  76. byte vibrate = 0;
  77. /**********************************************************************************************/
  78. /******************************功能函数**********************************/
  79. //电机控制
  80. void Car_GO_FORWARD(uint8_t spel, uint8_t sper, int tim=0)//小车前进
  81. {
  82.         uint8_t speeddl=spel;
  83.         uint8_t speeddr=sper;
  84.         digitalWrite(DIRA,HIGH);
  85.         analogWrite(PWMA,speeddl);
  86.         digitalWrite(DIRB,HIGH);
  87.         analogWrite(PWMB,speeddr);
  88.         delay(tim);
  89. }
  90. void Car_GO_LEFT(uint8_t spel,uint8_t sper, int tim=0)//车体左转         
  91. {
  92.         uint8_t speeddl=spel;
  93.         uint8_t speeddr=sper;
  94.         digitalWrite(DIRA,LOW);
  95.         analogWrite(PWMA,speeddl);
  96.         digitalWrite(DIRB,HIGH);
  97.         analogWrite(PWMB,speeddr);
  98.         delay(tim);
  99. }  
  100. void Car_GO_RIGHT(uint8_t spel,uint8_t sper, int tim=0)//车体右转
  101. {
  102.         uint8_t speeddl=spel;
  103.         uint8_t speeddr=sper;
  104.         digitalWrite(DIRA,HIGH);
  105.         analogWrite(PWMA,speeddl);
  106.         digitalWrite(DIRB,LOW);
  107.         analogWrite(PWMB,speeddr);
  108.         delay(tim);
  109. }
  110. void Car_GO_STOP(uint8_t spel,uint8_t sper, int tim=0)//车体停止
  111. {
  112.         uint8_t speeddl=spel;
  113.         uint8_t speeddr=sper;
  114.         digitalWrite(DIRA,LOW);
  115.         analogWrite(PWMA,speeddl);
  116.         digitalWrite(DIRB,LOW);
  117.         analogWrite(PWMB,speeddr);
  118.         delay(tim);
  119. }
  120. void Car_GO_BACK(uint8_t spel,uint8_t sper, int tim=0)//车体后退
  121. {        
  122.         uint8_t speeddl=spel;
  123.         uint8_t speeddr=sper;
  124.         digitalWrite(DIRA,LOW);
  125.         analogWrite(PWMA,speeddl);
  126.         digitalWrite(DIRB,LOW);
  127.         analogWrite(PWMB,speeddr);
  128.         delay(tim);
  129. }
  130. //读2路循迹传感器值
  131. uint8_t readIRM_ab()
  132. {
  133.   uint8_t temp1=0, tem=0;
  134.   uint8_t IRt_L = analogRead(TRAKLEF)>500?1:0;  //循迹左
  135.   uint8_t IRt_R = analogRead(TRAKRIT)>500?1:0;  //循迹右
  136.   temp1 |= IRt_L;
  137.   tem  = (temp1<<1)|IRt_R; //循迹状态值
  138.   return 0x03&tem;
  139.   // Serial.println(String("temp=")+temp);
  140. }
  141. uint8_t readIRM_av()
  142. {
  143.         uint8_t IRa_FL  = analogRead(IRavoiFL)>500?1:0; //避障前左
  144.         uint8_t IRa_FM  = analogRead(IRavoiFM)>500?1:0;//避障前中左
  145.         uint8_t IRa_FR  = analogRead(IRavoiFR)>500?1:0; //避障前右
  146.     uint8_t temp1=0, tem=0;
  147.         temp1 |= IRa_FL;
  148.         temp1 = (temp1 <<1)|IRa_FM;
  149.         tem = (temp1 <<1)|IRa_FR;//避障状态值
  150.         return 0x07&tem;
  151. }

  152. //循迹模式
  153. void TrakCar()//2路循迹函数
  154. {
  155.   uint8_t temabir=readIRM_ab();
  156.   switch(temabir)
  157.   {
  158.     case 0://左白右白
  159.       Car_GO_BACK(speeddAG,speeddAG);// 后退
  160.       break;
  161.     case 1://左白右黑
  162.       Car_GO_RIGHT(speeddAG,speeddAG);// 右拐
  163.       break;
  164.     case 2://左黑右白
  165.       Car_GO_LEFT(speeddAG,speeddAG);// 左拐
  166.       break;
  167.     case 3://左黑右黑
  168.       Car_GO_FORWARD(speeddAG,speeddAG);// 前进
  169.       break;
  170.     default://皆不是
  171.       Car_GO_STOP(0,0);//静止
  172.   }
  173. }

  174. void ObstruCar()//3路避障函数
  175. {
  176.         uint8_t temavoi = readIRM_av();
  177.         if((temavoi&0x02)==0)//中有障碍
  178.         {
  179.                 if((temavoi&0x04)==0)//左有障碍
  180.                 {
  181.                         if((temavoi&0x01)==0)//右有障碍
  182.                         {
  183.                                 Car_GO_STOP(0,0);
  184.                         //左中右都有障碍  后退,检测3次左右还是有障碍的话就停在原地不动
  185.                                 uint8_t cnt =0;
  186.                                 for(cnt=0; cnt<3; cnt++)
  187.                                 {
  188.                                         BEEP_ON;
  189.                                         Car_GO_BACK(speedd,speedd, 300);
  190.                                         temavoi = readIRM_av();
  191.                                         if((temavoi&0x05)!=0)
  192.                                                 break;
  193.                                 }
  194.                                 if(cnt<3)
  195.                                 {
  196.                                         if((temavoi&0x04)==0x04)
  197.                                          {
  198.                                                  BEEP_OFF;
  199.                                                  Car_GO_LEFT(speedd,speedd);
  200.                                                  JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  201.                                          }
  202.                                         else if((temavoi&0x01)==0x01)
  203.                                         {
  204.                                                 BEEP_OFF;
  205.                                                 Car_GO_RIGHT(speedd,speedd);
  206.                                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  207.                                         }
  208.                                 }
  209.                                 else
  210.                                 {
  211.                                         Drive_Status=MANUAL_DRIVE;
  212.                                         Drive_Num=STOP_STOP;         
  213.                                 }
  214.                         }
  215.                         else//右无障碍
  216.                         {
  217.                                 //左中   有障碍-----双轮向右
  218.                                 BEEP_OFF;
  219.                                 Car_GO_RIGHT(speedd,speedd);//MOTOR_GO_RIGHT2;
  220.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  221.                         }
  222.                 }
  223.                 else//左无障碍
  224.                 {
  225.                         if((temavoi&0x01)==0)//右有障碍
  226.                         {
  227.                                 // 中右  有障碍-----双轮向左
  228.                                 BEEP_OFF;
  229.                                 Car_GO_LEFT(speedd,speedd);//MOTOR_GO_LEFT2;
  230.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  231.                         }
  232.                         else//右无障碍
  233.                         {
  234.                                 // 中    有障碍------后退
  235.                                 BEEP_ON;
  236.                                 Car_GO_BACK(speedd,speedd, 300);//MOTOR_GO_BACK;
  237.                                 Car_GO_LEFT(speedd,speedd);
  238.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  239.                                 BEEP_OFF;
  240.                         }
  241.                 }
  242.         }
  243.         else//中无障碍
  244.         {
  245.                 if((temavoi&0x04)==0)//左有障碍
  246.                 {
  247.                         if((temavoi&0x01)==0)//右有障碍
  248.                         {
  249.                                 //左 右 有障碍-------后退
  250.                                 uint8_t cne =0;
  251.                                 for(cne=0; cne<3; cne++)
  252.                                 {
  253.                                         BEEP_ON;
  254.                                         Car_GO_BACK(speedd,speedd, 300);
  255.                                         temavoi = readIRM_av();
  256.                                         if((temavoi&0x05)!=0)
  257.                                                 break;
  258.                                 }
  259.                                 if(cne<3)
  260.                                 {
  261.                                         if((temavoi&0x04)==0x04)
  262.                                          {
  263.                                                  BEEP_OFF;
  264.                                                  Car_GO_LEFT(speedd,speedd);
  265.                                                  JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  266.                                          }
  267.                                         else if((temavoi&0x01)==0x01)
  268.                                         {
  269.                                                 BEEP_OFF;
  270.                                                 Car_GO_RIGHT(speedd,speedd);
  271.                                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  272.                                         }
  273.                                 }
  274.                                 else
  275.                                 {
  276.                                         Drive_Status=MANUAL_DRIVE;
  277.                                         Drive_Num=STOP_STOP;         
  278.                                 }
  279.                         }
  280.                         else//右无障碍
  281.                         {
  282.                                 //左   有障碍-------双轮向右
  283.                                 BEEP_ON;
  284.                                 Car_GO_RIGHT(speedd,speedd);//MOTOR_GO_RIGHT2;
  285.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  286.                         }
  287.                 }
  288.                 else//左无障碍
  289.                 {
  290.                         if((temavoi&0x01)==0)//右有障碍
  291.                         {
  292.                                 //  右 有障碍--------双轮向左
  293.                                 BEEP_ON;
  294.                                 Car_GO_LEFT(speedd,speedd);//MOTOR_GO_LEFT2;
  295.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();
  296.                         }
  297.                         else//右无障碍
  298.                         {
  299.                                 //    无障碍-------前进
  300.                                 BEEP_OFF;
  301.                                 Car_GO_FORWARD(speedd,speedd);//MOTOR_GO_FORWARD;
  302.                                 JogFlag = true;JogTimeCnt = 1;JogTime=millis();   
  303.                         }
  304.                 }
  305.         }
  306.         if(millis()-JogTime>=700)
  307.         {
  308.                 JogTime=millis();
  309.                 if(JogFlag == true)
  310.                 {
  311.                   stopFlag = false;
  312.                   if(JogTimeCnt <= 0)
  313.                   {
  314.                     JogFlag = false; stopFlag = true;
  315.                   }
  316.                   JogTimeCnt--;
  317.                 }
  318.                 if(stopFlag == true)
  319.                 {
  320.                   JogTimeCnt=0;
  321.                   Car_GO_STOP(0,0);
  322.                 }
  323.         }
  324. }
  325. //小车电机控制
  326. void CAR_Control()
  327. {
  328.   if(Drive_Status == MANUAL_DRIVE)
  329.   {
  330.     switch (Drive_Num)
  331.     {
  332.       case GO_ADVANCE:Car_GO_FORWARD(speedd,speedd);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
  333.       case GO_LEFT: Car_GO_LEFT(speedd,speedd);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
  334.       case GO_RIGHT:Car_GO_RIGHT(speedd,speedd);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
  335.       case GO_BACK:Car_GO_BACK(speedd,speedd);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
  336.       case STOP_STOP:Car_GO_STOP(0,0);JogTime = 0;JogFlag=false;stopFlag=true;break;
  337.       default:break;
  338.     }
  339.     Drive_Num=DEF;
  340.     //小车保持姿态210ms
  341.     if(millis()-JogTime>=210)
  342.     {
  343.       JogTime=millis();
  344.       if(JogFlag == true)
  345.       {
  346.         stopFlag = false;
  347.         if(JogTimeCnt <= 0)
  348.         {
  349.           JogFlag = false; stopFlag = true;
  350.         }
  351.         JogTimeCnt--;
  352.       }
  353.       if(stopFlag == true)
  354.       {
  355.         JogTimeCnt=0;
  356.         Car_GO_STOP(0,0);
  357.       }
  358.     }
  359.   }
  360.   else if(Drive_Status==AutoObstruct)
  361.   {
  362.     ObstruCar();//避障
  363.   }
  364. }
  365. ////////////////////////////////////////////////////////////////////////////////////
  366. // 重置功能
  367. void (* resetFunc) (void) = 0;

  368. void check_PS2()
  369. {
  370.   error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
  371.   if(error == 0)
  372.   {
  373.     Serial.print(F("Found Controller, configured successful "));//Found Controller,配置成功
  374.   }  
  375.   else if(error == 1)//没有控制器,检查接线,使调试方法见。访问故障提示www.billporter.info
  376.     Serial.println(F("No controller found!"));
  377.   else if(error == 2)//发现控制器但不接受命令。方法见启用调试。访问故障提示www.billporter.info
  378.     Serial.println(F("Controller found but not accepting commands. "));
  379.   else if(error == 3)//控制器拒绝进入压力模式,可能不支持。
  380.     Serial.println(F("Controller not support  Pressures mode."));
  381.   type = ps2x.readType();
  382.   switch(type)
  383.   {
  384.     case 0:
  385.       Serial.println(F("Unknown Controller type found "));//发现未知控制器类型
  386.       break;
  387.     case 1:
  388.       Serial.println(F("DualShock Controller found "));//发现DualShock控制器////////////////////////////
  389.       break;
  390.     case 2:
  391.       Serial.println(F("GuitarHero Controller found "));//guitarhero控制器发现
  392.       break;
  393.     case 3:
  394.       Serial.println(F("Wireless Sony DualShock Controller found "));//无线索尼DualShock控制器发现
  395.       break;
  396.    }
  397. }

  398. void PS2_Control()
  399. {
  400.   /* 您必须读取Gamepad才能获取新值并设置振动值
  401. ?????ps2x.read_gamepad(小电机开/关,较大电机强度从0-255)
  402. ?????如果不开启震动功能,请使用ps2x.read_gamepad();
  403.      没有值你应该至少称之为一秒钟
  404.   */  
  405.   if(error == 1)
  406.   { //如果没有控制器发现,跳过循环
  407.     resetFunc();
  408.   }
  409.   if(type == 2)
  410.   { //guitarhero控制器
  411.     ps2x.read_gamepad();//读控制器
  412.     return;
  413.   }
  414.   else
  415.   { //DualShock控制器
  416.     ps2x.read_gamepad(false, vibrate); //读取控制器并设置大电机以“振动”速度旋转  
  417.     if(ps2x.Button(PSB_START)) //按下START启动遥控        只要按下按钮,它将为TRUE
  418.       Serial.println(F("Start !"));
  419.     if(ps2x.Button(PSB_SELECT))//按下SELECT(选择)   停止
  420.     {
  421.       Drive_Status=MANUAL_DRIVE;
  422.       Drive_Num=STOP_STOP;     
  423.     }
  424.     if(ps2x.Button(PSB_PAD_UP))//按下 UP上 前进
  425.     {
  426.       speedd = map(ps2x.Analog(PSAB_PAD_UP),0,255,100,255);//方向按键压力转化为小车的速度--越用力按压速度越快,下同
  427.       Drive_Status=MANUAL_DRIVE;
  428.       Drive_Num=GO_ADVANCE;
  429.     }
  430.     if(ps2x.Button(PSB_PAD_RIGHT))//按下 RIGHT右  右转
  431.     {
  432.       speedd = map(ps2x.Analog(PSAB_PAD_RIGHT),0,255,100,255);
  433.       Drive_Status=MANUAL_DRIVE;
  434.       Drive_Num=GO_RIGHT;
  435.     }
  436.     if(ps2x.Button(PSB_PAD_LEFT))//按下 LEFT左  左转
  437.     {
  438.       speedd = map(ps2x.Analog(PSAB_PAD_LEFT),0,255,100,255);
  439.       Drive_Status=MANUAL_DRIVE;
  440.       Drive_Num=GO_LEFT;
  441.     }
  442.     if(ps2x.Button(PSB_PAD_DOWN))//按下 DOWN下  后退
  443.     {
  444.       speedd = map(ps2x.Analog(PSAB_PAD_DOWN),0,255,100,255);
  445.       Drive_Status=MANUAL_DRIVE;
  446.       Drive_Num=GO_BACK;
  447.     }   
  448.     vibrate = ps2x.Analog(PSAB_CROSS);  //这将根据您按下蓝色(X)按钮的难度设置大型电机振动速度
  449.     if (ps2x.NewButtonState())
  450.     { //如果任何按钮改变状态(关闭或关闭至开启)将为TRUE
  451.       if(ps2x.Button(PSB_L3))//按下左摇杆
  452.       {
  453.         Serial.println(F("L3 pressed"));
  454.       }
  455.       if(ps2x.Button(PSB_TRIANGLE))//按下 △
  456.       {
  457.         BEEP_ON;//蜂鸣器响
  458.         TLED_ON;//亮灯
  459.       }  
  460.     }
  461.     if(ps2x.NewButtonState(PSB_CROSS)) //按下按下 X            
  462.     {
  463.       BEEP_OFF;//蜂鸣器灭
  464.       TLED_OFF;//灭灯
  465.     }
  466.     if(ps2x.ButtonReleased(PSB_SQUARE)) //按下 □    循迹         
  467.     {
  468.       Drive_Status=AutoTracking;//循迹
  469.     }
  470.     if(ps2x.ButtonPressed(PSB_CIRCLE)) //按下 ○  避障            
  471.     {
  472.       Drive_Status=AutoObstruct;//避障
  473.     }
  474.         if(ps2x.Button(PSB_R3))//按下右摇杆 摇动左摇杆控制小车前进后退左右转
  475.     {
  476.       if(ps2x.Analog(PSS_LX)>127)
  477.       {
  478.         speedd = map(ps2x.Analog(PSS_LX),127,255,0,255);
  479.         Drive_Status=MANUAL_DRIVE;
  480.         Drive_Num=GO_RIGHT;
  481.       }
  482.       if(ps2x.Analog(PSS_LX)<127)
  483.       {
  484.         speedd = map(ps2x.Analog(PSS_LX),127,0,0,255);
  485.         Drive_Status=MANUAL_DRIVE;
  486.         Drive_Num=GO_LEFT;
  487.       }
  488. ……………………

  489. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
  1. #include <PS2X_lib.h>  //for v1.6

  2. PS2X ps2x; // create PS2 Controller Class

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

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

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

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

  13. if(error == 0){
  14.    Serial.println("Found Controller, configured successful");
  15.    Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  16.   Serial.println("holding L1 or R1 will print out the analog stick values.");
  17.   Serial.println("Go to www*billporter*info for updates and to report bugs.");
  18. }

  19.   else if(error == 1)
  20.    Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www*billporter*info for troubleshooting tips");

  21.   else if(error == 2)
  22.    Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www*billporter*info for troubleshooting tips");

  23.   else if(error == 3)
  24.    Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

  25.    //Serial.print(ps2x.Analog(1), HEX);

  26.    type = ps2x.readType();
  27.      switch(type) {
  28.        case 0:
  29.         Serial.println("Unknown Controller type");
  30.        break;
  31.        case 1:
  32.         Serial.println("DualShock Controller Found");
  33.        break;
  34.        case 2:
  35.          Serial.println("GuitarHero Controller Found");
  36.        break;
  37.      }

  38. }

  39. void loop(){
  40.    /* You must Read Gamepad to get new values
  41.    Read GamePad and set vibration values
  42.    ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
  43.    if you don't enable the rumble, use ps2x.read_gamepad(); with no values

  44.    you should call this at least once a second
  45.    */



  46. if(error == 1) //skip loop if no controller found
  47.   return;

  48. if(type == 2){ //Guitar Hero Controller

  49.    ps2x.read_gamepad();          //read controller

  50.    if(ps2x.ButtonPressed(GREEN_FRET))
  51.      Serial.println("Green Fret Pressed");
  52.    if(ps2x.ButtonPressed(RED_FRET))
  53.      Serial.println("Red Fret Pressed");
  54.    if(ps2x.ButtonPressed(YELLOW_FRET))
  55.      Serial.println("Yellow Fret Pressed");
  56.    if(ps2x.ButtonPressed(BLUE_FRET))
  57.      Serial.println("Blue Fret Pressed");
  58.    if(ps2x.ButtonPressed(ORANGE_FRET))
  59.      Serial.println("Orange Fret Pressed");


  60.     if(ps2x.ButtonPressed(STAR_POWER))
  61.      Serial.println("Star Power Command");

  62.     if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
  63.      Serial.println("Up Strum");
  64.     if(ps2x.Button(DOWN_STRUM))
  65.      Serial.println("DOWN Strum");


  66.     if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
  67.          Serial.println("Start is being held");
  68.     if(ps2x.Button(PSB_SELECT))
  69.          Serial.println("Select is being held");


  70.     if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
  71.     {
  72.         Serial.print("Wammy Bar Position:");
  73.         Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
  74.     }
  75. }

  76. else { //DualShock Controller

  77.     ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

  78.     if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
  79.          Serial.println("Start is being held");
  80.     if(ps2x.Button(PSB_SELECT))
  81.          Serial.println("Select is being held");


  82.      if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
  83.        Serial.print("Up held this hard: ");
  84.        Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
  85.       }
  86.       if(ps2x.Button(PSB_PAD_RIGHT)){
  87.        Serial.print("Right held this hard: ");
  88.         Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
  89.       }
  90.       if(ps2x.Button(PSB_PAD_LEFT)){
  91.        Serial.print("LEFT held this hard: ");
  92.         Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
  93.       }
  94.       if(ps2x.Button(PSB_PAD_DOWN)){
  95.        Serial.print("DOWN held this hard: ");
  96.      Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
  97.       }   


  98.       vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on
  99.                                               //how hard you press the blue (X) button   

  100.     if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)
  101.     {



  102.         if(ps2x.Button(PSB_L3))
  103.          Serial.println("L3 pressed");
  104.         if(ps2x.Button(PSB_R3))
  105.          Serial.println("R3 pressed");
  106.         if(ps2x.Button(PSB_L2))
  107.          Serial.println("L2 pressed");
  108.         if(ps2x.Button(PSB_R2))
  109.          Serial.println("R2 pressed");
  110.         if(ps2x.Button(PSB_GREEN))
  111.          Serial.println("Triangle pressed");

  112.     }   


  113.     if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
  114.          Serial.println("Circle just pressed");

  115.     if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
  116.          Serial.println("Square just released");     

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


  119.     if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
  120.     {
  121.         Serial.print("Stick Values:");
  122.         Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
  123.         Serial.print(",");
  124.         Serial.print(ps2x.Analog(PSS_LX), DEC);
  125.         Serial.print(",");
  126.         Serial.print(ps2x.Analog(PSS_RY), DEC);
  127.         Serial.print(",");
  128.         Serial.println(ps2x.Analog(PSS_RX), DEC);
  129.     }


  130. }


  131. delay(50);

  132. }
复制代码



所有资料51hei提供下载:
手柄控制2路红外自动循迹3路红外光电避障小车使用说明.rar (463.7 KB, 下载次数: 28)


评分

参与人数 1黑币 +5 收起 理由
946632791 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82749 发表于 2019-4-2 14:55 | 只看该作者
强大
回复

使用道具 举报

板凳
ID:568562 发表于 2019-6-28 16:25 | 只看该作者
学习,学习,虽然不是很能看懂
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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