---
# System prepended metadata

title: FIRA 2024 HuroCup 超級攻略

---

# **FIRA 2024 HuroCup 超級攻略**

動作排班：江舉重、睿投籃、紀章折返跑
|          | 日  | 一  | 二  | 三  | 四  | 五  | 六  |
| -------- | --- | --- | --- | --- | --- | --- | --- |
| 早上9~12 |     | 江  | 江  |  紀   | 江  | 江  |     |
| 下午2~5  |   紀  | 睿  |  紀   | 紀    | 睿  |  睿   |  睿  |
| 晚上7~9  |   睿  |     |  紀   |   |     |  紀 |  紀 |
### 工人智慧 Arduino nano
![image](https://hackmd.io/_uploads/HJa74iqxA.png =30%x)
* 輸出腳位 -> 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電池
![IMG_1112](https://hackmd.io/_uploads/S1-zuu50p.jpg)

![IMG_1058](https://hackmd.io/_uploads/Skx-Yq8R6.jpg)
:::

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

::: spoiler 機器人開機後 遠端連線小電腦

在自己的電腦安裝 Google遠端
![image](https://hackmd.io/_uploads/HyOviGKC6.png)


自己的電腦登入aiRobots的gmail
> [name=帳號: airobotslab@gmail.com][name=密碼: ic2sic2sic2s]

選取David (如果David有正常開機且連到一樣的網路就會顯示線上。)
PIN碼為:123456

成功連線就可以取用小電腦的畫面了
:::

:::spoiler 遠端執行比賽策略 
遠端成功後開起桌面 FIRA_Computer_VS2010 裡的 Fira2018.sln 專案檔
![image](https://hackmd.io/_uploads/rks24_I0T.png)

按偵錯來執行專案檔 (當前在哪個程式無所謂，偵錯是針對Fira2018.sln這個專案)
![IMG_1061](https://hackmd.io/_uploads/B1nC5c806.jpg)

沒意外就會進來這個比賽用的主要畫面
![螢幕擷取畫面 2024-03-19 024434](https://hackmd.io/_uploads/rkL42OL0a.jpg)

![](https://i.imgur.com/Ebteg1N.png)
(1) 按下 **Cam** 打開視覺。
(2) 按下 **Set Cam** 開啟攝影機調整畫面
(3) 按進階設定，將白平衡的自動方框勾選後再取消勾選，按儲存

Run Stratagy 前要記得 **先調dip000010按button2** (前人的預設)，目的是要開啟 **接收電腦指令（ReceiceFromComp=True）**，否則機器人不會聽話。
> ![image](https://hackmd.io/_uploads/HJslvYUAp.png)
> button2其他dip有些會對應到其他動作，如果是要執行比賽策略的話記得切換成不是這些dip的狀態再按下button2(其實也不一定要000010)

選擇比賽項目，就可以Run Stratagy了
![IMG_1062](https://hackmd.io/_uploads/SktWp58A6.jpg)
:::

### 舉重
:::spoiler 舉重策略內容
詳細策略流程如下
![image](https://hackmd.io/_uploads/r1oewuI0p.png)

設定舉重前的步數
![image](https://hackmd.io/_uploads/Sk420_LRT.png)

![image](https://hackmd.io/_uploads/SkbmdmFAT.png)

![image](https://hackmd.io/_uploads/S1Eh27FA6.png)
![image](https://hackmd.io/_uploads/SJORh7tCa.png)

2022版本

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

舉高後走路動作
![image](https://hackmd.io/_uploads/BJJIzDMyC.png)
![image](https://hackmd.io/_uploads/Sk2ufDfkR.png)
![image](https://hackmd.io/_uploads/B1wnGPG1C.png)

![image](https://hackmd.io/_uploads/rkJP_0lxR.png)


:::

### 籃球

::: 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 ，之後就會用軟體中斷去執行連續動作。

