# **FIRA 2024 HuroCup 超級攻略**
動作排班:江舉重、睿投籃、紀章折返跑
| | 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| -------- | --- | --- | --- | --- | --- | --- | --- |
| 早上9~12 | | 江 | 江 | 紀 | 江 | 江 | |
| 下午2~5 | 紀 | 睿 | 紀 | 紀 | 睿 | 睿 | 睿 |
| 晚上7~9 | 睿 | | 紀 | | | 紀 | 紀 |
### 工人智慧 Arduino nano

* 輸出腳位 -> Buttom
D4 -> Buttom 1
D5 -> Buttom 2
D6 -> Buttom 3
D7 -> Buttom 4
D8 -> Buttom 5
D9 -> Buttom 6
* 輸入腳位 >
### 新手教學
::: spoiler 流程
接電開機 > Google遠端連小電腦 > 按Dip000010 button2接收電腦命令 > 遠端執行比賽策略
:::
::: spoiler 機器人供電
STM+小電腦: 12V (3pin電池)
右腿、左腿、上半身: 4pin電池


:::
::: spoiler 機器人按鈕整理
* 1是開 0是關
* Dip的1,2,3,4,5,6依序是二進位的32,16,8,4,2,1,所以有0~63可以切換。
* 因為供電是STM給小電腦,直接關STM電腦會斷電。所以關機時電腦要比STM先關。
* 機器人暴走時要直接關馬達電源,關STM只會取消當前控制的動作,並不會Torque Off。

:::
::: spoiler 機器人開機後 遠端連線小電腦
在自己的電腦安裝 Google遠端

自己的電腦登入aiRobots的gmail
> [name=帳號: airobotslab@gmail.com][name=密碼: ic2sic2sic2s]
選取David (如果David有正常開機且連到一樣的網路就會顯示線上。)
PIN碼為:123456
成功連線就可以取用小電腦的畫面了
:::
:::spoiler 遠端執行比賽策略
遠端成功後開起桌面 FIRA_Computer_VS2010 裡的 Fira2018.sln 專案檔

按偵錯來執行專案檔 (當前在哪個程式無所謂,偵錯是針對Fira2018.sln這個專案)

沒意外就會進來這個比賽用的主要畫面


(1) 按下 **Cam** 打開視覺。
(2) 按下 **Set Cam** 開啟攝影機調整畫面
(3) 按進階設定,將白平衡的自動方框勾選後再取消勾選,按儲存
Run Stratagy 前要記得 **先調dip000010按button2** (前人的預設),目的是要開啟 **接收電腦指令(ReceiceFromComp=True)**,否則機器人不會聽話。
> 
> button2其他dip有些會對應到其他動作,如果是要執行比賽策略的話記得切換成不是這些dip的狀態再按下button2(其實也不一定要000010)
選擇比賽項目,就可以Run Stratagy了

:::
### 舉重
:::spoiler 舉重策略內容
詳細策略流程如下

設定舉重前的步數




2022版本
motor34 lean angle角度大馬達數字調大 / motor44 lean angle角度大馬達數字調小
step40 雙手舉起來
step55 剛蹲下來
step118 撿起棍子
step146 棍子靠在大腿
step159 檢棍後仰完wait
step169 往前傾 > 169~179晃太快會前倒
step179 前傾wait
steo184 準備要站
step196 站起來
舉高後走路動作




:::
### 籃球
::: spoiler 籃球策略
先檢查基本動作
- [ ] WALK_F
- [x] WALK_FF
- [x] WALK_B
- [ ] SHIFT_L
- [ ] SHIFT_LL
- [ ] SHIFT_R
- [ ] SHIFT_RR
- [ ] TURN_L
- [ ] TURN_R
在 Code4_MOTION.c 裡面可以看到
```c
#ifdef SHIFT_R
case SHIFT_R:
Add_motor_job( 255, 2, 0, 0, 0 );
Mtn_curveknee();
Mtn_Shift_R();
Add_motor_job( 30, 255, 7, 5, 0 );
Add_motor_job( 31, 255, 7, 59, 0 );
Add_motor_job( 32, 189, 6, 26, 0 );
Add_motor_job( 33, 160, 3, 54, 0 );
Add_motor_job( 34, 29, 9, 28, 0 );
Add_motor_job( 35, 255, 7, 72, 0 );
Add_motor_job( 40, 255, 7, 72, 0 );
Add_motor_job( 41, 255, 7, 72, 0 );
Add_motor_job( 42, 67, 9, 31, 0 );
Add_motor_job( 43, 96, 12, 64, 0 );
Add_motor_job( 44, 227, 6, 33, 0 );
Add_motor_job( 45, 255, 7, 72, 0 );
Add_motor_job( 255, 1, 0, 0, 0 );
Add_motor_job( 255, 2, 0, 0, 0 );
//Mtn_POSE_Standing_NoUpperbody(100,0,5);
break;
#endif
```
這段程式碼的用意是小電腦會傳送動作指令編號給 STM32 ,所以當 STM32 接收到指令編號的時候就會根據指定編號做動作,裡面的 Mtn_curveknee() 和 Add_motor_job() 的用途就是要讓機器人做完動作之後會回到 initial 的初始動作,希望可以讓動作做起來比較一致(我覺得這邊還可以改,因為機器人踩在地上對它做 initial 其實不會真的回到初始動作)。
如果不想要開小電腦調動作就只需要在 main.c 裡面針對想要點擊的按鈕加入動作就好,下面是例子:
```c
/ BTN2 Trigger
else if (EXTI_GetITStatus(EXTI_Line11) != RESET)
{
int i;
EXTI_ClearITPendingBit(EXTI_Line11);
LedSwitch(!GetLedStatus(2), 2);
// BTN2 -> Strategy
DipMode = ReadDip();
ReceiceFromComp = TRUE;
#ifdef COMP
USART_ITConfig(COMP_PORT, USART_IT_RXNE, ENABLE);
#endif
// Read_IMU = TRUE;
// LedSwitch(Read_IMU, 7);
printf("BTN 2 Triggered\r\n");
if(ReadDip() == 3){
Mtn_curveknee();
Mtn_Walk_FF();
Add_motor_job( 255, 5, 0, 0, 0 );
Add_motor_job( 30, 255, 7, 5, 0 );
Add_motor_job( 31, 255, 7, 59, 0 );
Add_motor_job( 32, 189, 6, 26, 0 );
Add_motor_job( 33, 160, 3, 54, 0 );
Add_motor_job( 34, 29, 9, 28, 0 );
Add_motor_job( 35, 255, 7, 72, 0 );
Add_motor_job( 40, 255, 7, 72, 0 );
Add_motor_job( 41, 255, 7, 72, 0 );
Add_motor_job( 42, 67, 9, 31, 0 );
Add_motor_job( 43, 96, 12, 64, 0 );
Add_motor_job( 44, 227, 6, 33, 0 );
Add_motor_job( 45, 255, 7, 72, 0 );
Add_motor_job( 255, 1, 0, 0, 0 );
Add_motor_job( 255, 2, 0, 0, 0 );
}
```
這樣的話在 dip 為 3 時,按下按鈕 2 就會執行下面的動作。
所以接下來就要調整動作,上面的基本動作要用檔去調動作。
```
"FIRA_2024_Motion\STM32_TeenSizeDJ1\ParameterizedLIPM_Dj1Fira_2018\Mtn_.._...m"
```
調投球距離可以去人機介面改 13 號馬達的速度
方法一:
給定寫死的 dip 給定後退步數,或者是時間不夠了,就進入下一個狀態
方法二:
針對當前和籃框的距離往後退,直到距離超過 1500 ,或者是時間不夠了,就進入下一個狀態
然後再根據當前和籃框的距離給不同的動作參數,目前有調好三種投籃動作,所以只需要
distance >= 1500 -> THROW_180 -> motion 4.c 呼叫 Mtn_Throw_180
1500 > distance >= 1400 -> THROW_140 -> motion 4.c 呼叫 Mtn_Throw_140
distance < 1400 -> THROW_120 -> motion 4.c 呼叫 Mtn_Throw_120
:::
流程:
會一直在 main.c 檔的 while 做 led 的操作,直到中斷發生。
中斷分為硬體中斷跟軟體中斷:
1. 硬體中斷(按下按鈕,讓中斷觸發高/低電位的方法):
可以當作突然發生的事件。
2. 軟體中斷(時間中斷,每當 counter 發生 overflow 會觸發):
可以當作是背景的程式每隔一段時間會被執行(會呼叫 Renewmotion()更新動作)。
在 main.c 檔中的硬體中斷又可分為要執行單一動作或者是連續動作。
1. 單一動作:
可以直接呼叫動作的 `.h` 檔進行執行,在動作的 `.h` 檔中會執行很多的 `Add_motor` 函式,將馬達的資訊輸入到 `MotorScheduleStruct.List` 的 List 中作保存,然後在`Update_MotorSchedule_to_MotorData()` 會實際把這個 List 中的 data 輸入給馬達。
2. 連續動作:
可以直接給定 Motion.Mode_RX = 動作編號(WALK_FF),進行連續動作,連續動作的編號會大於 100 ,之後就會用軟體中斷去執行連續動作。