用Arduino做機械人或其他實作,常會用到輸入和輸出的模組,文字輸出可以用LCD顯示器輕鬆實現,而輸入方面,如果是少許按鍵,可以用普通按鍵實現,但如果需要一個遊戲的介面,如果自製就但十分麻煩,這時候就需要用到PS2遙控器。
打開Arduino序列埠監測器,按下PS2的按鍵,會列印出相應的語句。
注意,PS2接收器的電壓是3.3V,如果接5V接收器會即時報銷。如果使用Sensor Shield V5.0的話,3V3在Bluetooth Interface的第一隻引腳,板的表面並沒有標示的。
x1#include <PS2X_lib.h>
2#include <Wire.h>
3#include <EEPROM.h>
4
5PS2X ps2x1;
6
7// PIN OF PS2 CONTROLLER
8#define DATA 11
9#define COMMAND 10
10#define ATTENTION 9
11#define CLOCK 12
12// 也可以是任意的引腳,線路接對就可以
13
14int error = 0;
15byte type = 0;
16byte vibrate = 0;
17
18unsigned long timer;
19
20void setup() {
21 Serial.begin(115200);
22 error = ps2x1.config_gamepad(CLOCK, COMMAND, ATTENTION, DATA, true, true);
23 type = ps2x1.readType();
24}
25
26void loop() {
27 if (millis() - timer >= 30) {
28 timer = millis();
29
30 if (error != 0) {
31 //如果error不是0,可能是無線斷了,自動重新連接
32 error = ps2x1.config_gamepad(CLOCK, COMMAND, ATTENTION, DATA, true, true);
33 type = ps2x1.readType();
34 }
35 else {
36 if (type == 1) { //type是1即平時所用的PS2遙控
37 ps2x1.read_gamepad(false, vibrate);
38
39 if (ps2x1.Button(PSB_PAD_UP)) Serial.println("UP");
40 else if (ps2x1.Button(PSB_PAD_DOWN)) Serial.println("DOWN");
41 else if (ps2x1.Button(PSB_PAD_LEFT)) Serial.println("LEFT");
42 else if (ps2x1.Button(PSB_PAD_RIGHT)) Serial.println("RIGHT");
43
44 else if (ps2x1.Button(PSB_START)) Serial.println("START");
45 else if (ps2x1.Button(PSB_SELECT)) Serial.println("SELECT");
46
47 else if (ps2x1.Button(PSAB_CROSS)) Serial.println("CROSS");
48 else if (ps2x1.Button(PSB_TRIANGLE)) Serial.println("TRIANGLE");
49 else if (ps2x1.Button(PSB_SQUARE)) Serial.println("SQUARE");
50 else if (ps2x1.Button(PSB_CIRCLE)) Serial.println("CIRCLE");
51
52 vibrate = ps2x1.Analog(PSAB_CROSS); // vibrate when press 'x' button
53 //ps2x1.Analog(PSS_LX), ps2x1.Analog(PSS_LY),
54 //ps2x1.Analog(PSS_RX), ps2x1.Analog(PSS_RY)
55 //則為JoyStrick的值,可以用Serial.println( ps2x1.Analog(PSS_LX) );
56 //試一下
57 }
58 }
59 }
60}