{%hackmd @ZZRT/CSS %}
# <span class="block"> Lesson 2 </span>
---
### 馬達控制流程
----

----
~~極~~簡易流程圖

----
而要用甚麼程式讓馬達運作呢?
---
### 馬達程式
----
舉個例子
```java=1
private final MotorController motor; //宣告一個馬達
private static final int kMotorPort = 0; //馬達的腳位
motor = new SparkMax(kMotorPort); //設定馬達的控制器
motor.set(0.5) // 設定馬達的速度
```
----
單純讓馬達轉好像太無趣了...如果搭配搖桿呢?
----
```java
public static final int kXboxControllerPort = 0;//搖桿的腳位
private final XboxController xboxController
= new XboxController(kXboxControllerPort);//設定搖桿
motor.set(xboxController.getRightY());//將速度設為搖桿的數值
```
----
而實際上在撰寫時有分布不同的風格...
---
## Timed Robot
----
The ```TimedRobot``` class is the the base class recommended for most users. It provides control of the robot program through a collection of ```init()```, ```periodic()```, and ```exit()``` methods, which are called by WPILib during specific robot states (e.g. autonomous or teleoperated).
~~阿是英文好煩...~~
----
簡單來說:
```TimedRobot```中有提供```init()```初始化、```periodic()```重複循環的方法,我們可以在autonomous自動模式或teleoperated手動模式時使用。
----
所以用TimedRobot來寫的話...
----
```java=
package frc.robot;
import edu.wpi.first.wpilibj.SparkMax;
import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.XboxController;
public class Robot extends TimedRobot {
private static final int MotorPort = 0;
private final SpeedController motor;
private final double speed = 0.5;
private static final int xboxControllerPort = 1;
private final XboxController xboxController;
@Override
public void robotInit() {
motor = new PWMSparkMax(MotorPort);
xboxCotroller = new XboxController(xboxControllerPort);
}
@Override
public void teleopPeriodic() {
motor.set(xboxController.getRightY());
}
}
```
----

@Override是甚麼...?
----
以後再說(ˊ ˇ ˋ)
---
## Command Base
----
The ```Command Robot``` framework adds to the basic functionality of a ```Timed Robot``` by automatically polling inputs and converting the raw input data into events. These events are tied to user code, which is executed when the event is triggered.The Command Robot framework makes it easier to write compact easy-to-read code with complex behavior, but requires an additional up-front time investment from a programmer in order to understand how the Command Robot framework works.
----
簡單來說:
```Command Base```是用事件觸發來驅動資料,當中有分```subsystem```、```command```、```componments```,雖然比```TimedRobot```難寫,但比較容易閱讀,也較適合開發複雜的系統
----
所以用Command Base來寫的話...
----
MotorSubsystem
```java=
package frc.robot.subsystems;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import edu.wpi.first.wpilibj.motorcontrol.MotorController;
public class MotorSubsystem extends SubsystemBase {
private final MotorController motor;
private static final int kmotor = 0;
public MotorSubsystem() {
motor = new SparkMax(kmotor);
}
public void move(double speed) {
motor.set(speed);
}
}
```
----
robot container
```java=
package frc.robot;
import frc.robot.subsystems.*;
import frc.robot.XboxController.Button;
public class RobotContainer {
private final MotorSubsystem motor = new MotorSubsystem();
private final XboxController xboxController = new XboxController(0);
public RobotContainer() {
motor.setDefaultCommand(
new RunCommand(() ->
motor.move(xboxController.getRightY())
, motor
));
}
}
```
----
在我們學校是用command Base來撰寫
---
## 底盤程式
----
如果一次多控制一點馬達...?
----
就可以開車啦~
----
而操作的方法可以分為兩種
arcade drive、tank drive
----
就等下禮拜介紹摟~
{"metaMigratedAt":"2023-06-16T22:23:49.392Z","metaMigratedFrom":"YAML","title":"Lesson 2","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"parallaxBackgroundSize\":\"2100px 1000px\",\"defaultTiming\":120}","contributors":"[{\"id\":\"a41c05df-55bf-44dc-9b5f-6e53858b0a77\",\"add\":4275,\"del\":190}]"}