###### 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並安裝

3.函示庫請去[ps2](https://github.com/madsci1016/Arduino-PS2X)downlod zip

4.打開arduino並依序安裝函示庫

恩你準備好了
## 開始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腳位定義

spark腳位定義

詳細請看=>[spark技術文件](https://www.revrobotics.com/content/docs/REV-11-1200-QS.pdf)
arduino nano腳位定義

## 參考資料
### 傑森創工
[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)