# 這是配好電後的工作順序
## 1. 先弄好底盤移動
| | 右前 | 右後 | 左前 | 左後 |
| ----- | ---- | ---- | ---- | ---- |
|talon| 2 |3| 1 | 4 |
|方向|?轉 | ?轉 | ?轉 | ?轉 |
### 用內建diffirentDrive 有三種
```java=
// ArcadeDrive (double xSpeed,double zRotation, boolean squaredInputs)
differentialDrive.arcadeDrive(leftStick_Y,-rightStick_X,true);
// TankDrive (double leftSpeed,double rightSpeed,boolean squaredInputs)
differentialDrive.arcadeDrive(leftStick_Y,rightStick_X,true);
// curvatureDrive (double xSpeed,double zRotation,boolean isQuickTurn)
differentialDrive.curvatureDrive(leftStick_Y,-rightStick_X,true);
```
## 2.收球
| 吸球 | 底轉盤 |
| ---- | ------ |
| 12 | 13 |
| ?轉 | |
### 程式碼 功能:按下按鈕,吸球跟底轉盤同時轉
```java=
if(js.getRawButton(Btn_B))
{
mCollector.set(ControlMode.PercentOutput,0.5);
mConveyer.set(ControlMode.PercentOutput, 0.5);
}
else{
mCollector.set(ControlMode.PercentOutput,0);
mConveyer.set(ControlMode.PercentOutput, 0);
}
```
## 3.射球
### 射球機構編號
| 砲台轉盤 | 仰角 | 射球(MAIN)|射球(副)|射球輸送|
| ---- | ---- | ---- | ---- |---- |
| 10 | 8 | 5 |6|7|
| ?轉 | ?轉 | ?轉 || |
### 用phoenix tuner 用 percentage 測試射球裝置能力
| | 距離 | Velocity | 敞篷encoder |
| --------- | ---- | -------- | ----------- |
| 調pid位置 | | | |
| 最遠 | | | |
| 最近 | | | |
### 調射球PID
| | 射球 | 轉盤 | 敞篷 |
| -------------- | ------ | ---- | ---- |
| I Zone | 300 | | |
| kD | 55 | | |
| kF | 0 | | |
| kI | 0.0023 | | |
| kP | 1.7 | | |
| Loop Period Ms | 1 | | |
| Max Integral | 0 | | |
| Peak Output | 1 | | |
## 4.設定LimeLight
### 調顏色
LimeLight調完色下載連結:https://drive.google.com/file/d/1ub2880tftVQc2Q4Ws7WhXRsd29OvKfuE/view?usp=sharing
### 程式碼
```java=
//Initialize
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry tx = table.getEntry("tx");
NetworkTableEntry ty = table.getEntry("ty");
NetworkTableEntry ta = table.getEntry("ta");
//Period
double x = tx.getDouble(0.0);
double y = ty.getDouble(0.0);
double area = ta.getDouble(0.0);
SmartDashboard.putNumber("LimelightX", x);
SmartDashboard.putNumber("LimelightY", y); SmartDashboard.putNumber("LimelightArea", area);
```
## 5.轉盤自動對正程式
必須先設定好LimeLight跟轉盤PID
```java=
int turret =30; //砲台旋轉對影像的轉換
int nw_pos=aimHori.getSelectedSensorPosition();
aimHori.set(ControlMode.Position,nw_pos+x*turret);
```
## 6.測距囉
1.f(x)=-0.01x^7 -0.11x^6 -0.55x^5 -1.76x^4 -3.04x^3 -1.17x^2 -4.09x+184.96
2.f(x)=-0.02x^3 -0.25x^2-9.39x+181.87

```javascript=
double forDis=-0.01*Math.pow(y,7)-0.11*Math.pow(y,6)-0.55*Math.pow(y,5)-1.76*Math.pow(y,4)-3.04*Math.pow(y,3)-1.17*Math.pow(y,2)-4.09*y+184.96;
```
## 7.氣壓
資源:https://github.com/wpilibsuite/frc-docs/blob/master/source/docs/software/actuators/pneumatics.rst
### 電磁閥編號
| 底盤 | 收球 | 抬升 |
| ---- | ---- | ---- |
| 0&1 | 2&3 | 4&5 |
### 程式碼
``` java=
//intialize
Compressor compressor = new Compressor(0);
Solenoid gearbox = new Solenoid(-1);
Solenoid sCollector = new Solenoid(-1);
Solenoid sLift = new Solenoid(-1);
//period
if(js2.getRawButton(Btn_A))
gearbox.set(true);
if(js2.getRawButton(Btn_B))
gearbox.set(false);
if(js2.getRawButton(Btn_X))
sCollector.set(true);
if(js2.getRawButton(Btn_Y))
sCollector.set(false);
```
## 8.抬升
### 抬升馬達編號
| 抬升(with encoder) | 抬升(no encoder) |
|:------------------:|:----------------:|
| 11 | 9 |
## Encoder 程式碼
```java=
//encoder 反轉
motor.setSensorPhase(true)
```



## 9.搖桿

## 10.Limit Switch
| Column 1 | Column 2 | Column 3 | | |
| -------- | -------- | -------- | --- | --- |
| Text | Text | Text | | |
## 搖桿功能
Js1:
arcadeDrive
X:抬升左移
Y:抬升上拉
A:抬升下移
B:抬升右移
LS_Btn:氣壓變速
LB:抬升氣壓
RB:按:底盤功率1 不按:底盤功率0.5
Js2:
X:氣壓收球 收球合一
Trigger_L:吸球+旋轉
B:射球+旋轉
LB:射球轉換 自動/手動 模式
LS_Y:敞篷調整
RS_X:砲台調整