###### tags: `教學` `FRC` # 科技月車車教學 ## 前言 ::: success 我不知道要說啥XDDD ::: ## 開發環境 1.安裝ch340驅動[windows](https://cdn.sparkfun.com/assets/learn_tutorials/8/4/4/CH341SER.EXE)、[Mac](https://cdn.sparkfun.com/assets/learn_tutorials/8/4/4/CH341SER_MAC.ZIP) 2.去[arduino官網](https://www.arduino.cc/en/software)下載arduino並安裝 ![](https://i.imgur.com/YXAc5B8.png) 3.函示庫請去[ps2](https://github.com/madsci1016/Arduino-PS2X)downlod zip ![](https://i.imgur.com/tddiRjc.png) 4.打開arduino並依序安裝函示庫 ![](https://i.imgur.com/fudwxWb.png) 恩你準備好了 ## 開始code吧! 這是ps2範例程式 ```cpp #include "PS2X_lib.h" PS2X ps2x; int error; void setup() { Serial.begin(9600); do { error = ps2x.config_gamepad(13, 11, 10, 12, true, true); //clk,command,attention,data if (error == 0) { Serial.print("Gamepad found!");break; } else { delay(100); } } while (1); } void loop(){ ps2x.read_gamepad(false, 0); //讀取手把狀態 //測試每一個按鈕和搖桿 if(ps2x.Button(PSB_START)) //Start鍵 Serial.println("Start is being held"); if(ps2x.Button(PSB_SELECT)) //Select鍵 Serial.println("Select is being held"); if(ps2x.Button(PSB_PAD_UP)) { //十字方向,上 Serial.print("Up held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC); } if(ps2x.Button(PSB_PAD_RIGHT)){ //十字方向,右 Serial.print("Right held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC); } if(ps2x.Button(PSB_PAD_LEFT)){ //十字方向,左 Serial.print("LEFT held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC); } if(ps2x.Button(PSB_PAD_DOWN)){ //十字方向,下 Serial.print("DOWN held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC); } if(ps2x.NewButtonState(PSB_L3)) //L3鍵,NewButtonState按下不管多久只會觸發兩次(按下和放開) Serial.println("L3 pressed"); if(ps2x.NewButtonState(PSB_R3)) //R3鍵 Serial.println("R3 pressed"); if(ps2x.NewButtonState(PSB_L2)) //L2鍵 Serial.println("L2 pressed"); if(ps2x.NewButtonState(PSB_R2)) //R2鍵 Serial.println("R2 pressed"); if(ps2x.NewButtonState(PSB_TRIANGLE)) //三角按鍵 Serial.println("Triangle pressed"); if(ps2x.NewButtonState(PSB_CIRCLE)) //圓型按鍵 Serial.println("Circle pressed"); if(ps2x.NewButtonState(PSB_CROSS)) //X按鍵 Serial.println("X pressed"); if(ps2x.NewButtonState(PSB_SQUARE)) //方型按鍵 Serial.println("Square pressed"); if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //按下L1或L2鍵,顯示兩個香菇頭的數值 Serial.print("Stick Values:"); Serial.print(ps2x.Analog(PSS_LY), DEC); //左,上下 Serial.print(","); Serial.print(ps2x.Analog(PSS_LX), DEC); //左,左右 Serial.print(","); Serial.print(ps2x.Analog(PSS_RY), DEC); //右,上下 Serial.print(","); Serial.println(ps2x.Analog(PSS_RX), DEC); //右,左右 } delay(10); } ``` 我相信你看的懂的 這是spark的範例程式 ```cpp #include <Servo.h> Servo sparkr; void setup() { sparkr.attach(9);//定義spark pwm接腳 } void loop() { sparkr.write(0);//正轉 delay(1000); sparkr.write(90);//停止 delay(1000); sparkr.write(180);//反轉 delay(1000); sparkr.write(90);//停止 delay(1000); } ``` 把他合併起來 ```cpp //ps2 #include "PS2X_lib.h" //spark #include "Servo.h" //ps2 PS2X ps2x; int error; int ps2max, ps2min; //spark int spark_l_pin = 9, spark_r_pin = 8; int mode = 1; Servo spark_l; Servo spark_r; void setup() { //spark spark_l.attach(spark_l_pin); spark_r.attach(spark_r_pin); spark_l.write(90); spark_r.write(90); //ps2 Serial.begin(9600); do { error = ps2x.config_gamepad(13, 11, 10, 12, true, true); //clk,command,attention,data if (error == 0) { Serial.print("Gamepad found!"); break; } else { delay(100); } } while (1); } void loop() { ps2x.read_gamepad(false, 0); //讀取手把狀態 if (mode = 0) { if (ps2x.Analog(PSS_LY) > ps2max) {//前 spark_l.write(180); spark_r.write(180); } else if (ps2x.Analog(PSS_LY) < ps2min) {//後 spark_l.write(0); spark_r.write(0); } else if (ps2x.Analog(PSS_LX) > ps2max) {//左 spark_l.write(0); spark_r.write(180); } else if (ps2x.Analog(PSS_LX) < ps2min) {//右 spark_l.write(180); spark_r.write(0); } else {//停 spark_l.write(90); spark_r.write(90); } } else { if (ps2x.Analog(PSS_LY) > ps2max) { spark_l.write(180); } else if (ps2x.Analog(PSS_LY) < ps2min) { spark_l.write(0); } else { spark_l.write(90); } if (ps2x.Analog(PSS_RY) > ps2max) { spark_r.write(180); } else if (ps2x.Analog(PSS_RY) < ps2min) { spark_r.write(0); } else { spark_r.write(90); } } delay(10); } ``` ```cpp //ps2 #include "PS2X_lib.h" //spark #include "Servo.h" //ps2 PS2X ps2x; int error; int ps2max=250, ps2min=10; //spark int spark_l_pin = 9, spark_r_pin = 22; int mode = 1; Servo spark_l; Servo spark_r; void setup() { //spark spark_l.attach(spark_l_pin); spark_r.attach(spark_r_pin); spark_l.write(90); spark_r.write(90); //ps2 Serial.begin(9600); do { error = ps2x.config_gamepad(13, 11, 10, 12, true, true); //clk,command,attention,data if (error == 0) { Serial.print("Gamepad found!"); break; } else { delay(100); } } while (1); } void loop() { ps2x.read_gamepad(false, 0); //讀取手把狀態 //Serial.println(ps2x.Analog(PSS_LY)); if (mode == 0) { if (ps2x.Analog(PSS_LY) < ps2min) {//前 spark_l.write(180); spark_r.write(180); Serial.println("前"); } else if (ps2x.Analog(PSS_LY) > ps2max) {//後 spark_l.write(0); spark_r.write(0); Serial.println("後"); } else if (ps2x.Analog(PSS_LX) < ps2min) {//左 spark_l.write(0); spark_r.write(180); Serial.println("左"); } else if (ps2x.Analog(PSS_LX) > ps2max) {//右 spark_l.write(180); spark_r.write(0); Serial.println("右"); } else {//停 spark_l.write(90); spark_r.write(90); Serial.println("停"); } } else { if (ps2x.Analog(PSS_LY) < ps2min) { spark_l.write(150); Serial.print("前"); } else if (ps2x.Analog(PSS_LY) > ps2max) { spark_l.write(30); Serial.print("後"); } else { spark_l.write(90); Serial.print("停"); } if (ps2x.Analog(PSS_RY) < ps2min) { spark_r.write(160); Serial.println("前"); } else if (ps2x.Analog(PSS_RY) > ps2max) { spark_r.write(30); Serial.println("後"); } else { spark_r.write(95); Serial.println("停"); } } delay(20); } ``` 好你會寫車車了WW ## 可愛的電路 ps2腳位定義 ![](https://i.imgur.com/pnejiPw.png) spark腳位定義 ![](https://i.imgur.com/9lUTKkf.png) 詳細請看=>[spark技術文件](https://www.revrobotics.com/content/docs/REV-11-1200-QS.pdf) arduino nano腳位定義 ![](https://i.imgur.com/qbCHjfl.png) ## 參考資料 ### 傑森創工 [Arduino結合PS2無線手把簡單上手](https://blog.jmaker.com.tw/ps2x/) [[Arduino範例] SG90 Servo伺服馬達](https://blog.jmaker.com.tw/arduino-servo-sg90/) ### revrobotics [SPARK Motor Controller](https://www.revrobotics.com/rev-11-1200/) ### shoppe只有拿圖 [【樂意創客官方店】《附發票》Arduino Nano V3.0 ATMEGA328P 改進版 已焊好](https://shopee.tw/%E3%80%90%E6%A8%82%E6%84%8F%E5%89%B5%E5%AE%A2%E5%AE%98%E6%96%B9%E5%BA%97%E3%80%91%E3%80%8A%E9%99%84%E7%99%BC%E7%A5%A8%E3%80%8BArduino-Nano-V3.0-ATMEGA328P-%E6%94%B9%E9%80%B2%E7%89%88-%E5%B7%B2%E7%84%8A%E5%A5%BD-i.139069730.2121232573)