陀螺儀 IMU 九軸 × EV3 × clev3r
這一頁只講 clev3r(EV3 BASIC):在 MINDSTORMS EV3 上用它讀陀螺儀 IMU 九軸的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。
安裝與設定
你需要
- 感應器:陀螺儀 IMU 九軸(EV3 版,RJ12 接頭)。
- 主機:LEGO MINDSTORMS EV3。
- 軟體:clev3r(EV3 的 BASIC 語言開發環境,也叫 EV3 Basic)。本站測試的版本是 v1.7.1.0。已經在用 clev3r 的人選這個。
安裝軟體
- 安裝 clev3r(建議 v1.7.1.0)。
- 打開範例:在 clev3r 開啟
.bp檔 → 按「編譯並下載」→ 在 EV3 的檔案選單找到MBC_開頭的資料夾執行。
讓軟體認得感應器
不用裝擴充。感應器在 EV3 上會模擬成樂高原廠感應器(多數產品是「紅外線感應器」),讀取模式跟 EV3 官方軟體完全一樣:Proximity/Beacon/Remote 三種,數值範圍也相同。
- 用 BASIC 的
IR_PROXIMITY/IR_BEACON/IR_REMOTE等指令讀取,看下面的讀值。 - clev3r 也讀得到 EV3-G、Classroom 讀不到的模式,標「僅 Pybricks/EV3 MicroPython/clev3r」的範例也能跑。
- 有些產品附 MBC 專屬副程式(Subroutines),已經放在範例檔裡。
重要
不要在程式中途切換模式。 EV3 主機每次切換感應器模式都會卡住一下(約 1 秒)。程式一開始選定一種模式,整趟任務都用它。
接線
- 用連接線把感應器插在 EV3 的 1 號孔(1~4 任一孔都可以,程式裡用同一個孔)。
- EV3 先開機,再插感應器。
- 接頭卡榫朝上,輕輕推進去。
注意
陀螺儀 IMU 在 EV3 上會顯示成「陀螺儀」(不是紅外線感應器),直接用原廠陀螺儀的積木讀。
第一次測試
- 開啟本頁範例 1 的
.bp,按「編譯並下載」。 - 在 EV3 檔案選單找到
MBC_開頭的資料夾執行。 - EV3 螢幕上的數字跟著感應器前方的東西變化,就是接好了。
常見問題
- 在 EV3 上找不到程式? 到 EV3 的檔案選單,找
MBC_開頭的資料夾。 - 數字一直不變? 拔掉感應器重插一次(EV3 要先開機再插)。
- 程式跑一跑會頓一下? 程式裡切換了感應器模式,改成只用一種模式。
讀值
程式假設感應器插 1 號孔:Sensor.SetMode 選模式、Sensor.ReadRawValue 讀第幾個值。
陀螺 3D 航向 headingGyro3D
| 範圍 | 意思 |
|---|---|
-32768~32767 ° |
四元數算出的航向,度,開機/歸零 = 0,連續累積可超過 360(int16 到 ±32767 繞回,約 91 圈) |
' clev3r (BASIC)
Sensor.SetMode(1, 0)
headingGyro3D = Sensor.ReadRawValue(1, 0)模式 0 · int16 · GYRO-ANG 1×int16(盤點:mode0 = 陀螺 3D,INO:232-234)(已鎖住的模式,韌體與主機端都不再改)
融合航向 headingFused
| 範圍 | 意思 |
|---|---|
-32768~32767 ° |
陀螺 3D 加磁力計慢修正的航向,度,減去相對零點;可超過 360 |
' clev3r (BASIC)
Sensor.SetMode(1, 1)
headingFused = Sensor.ReadRawValue(1, 0)模式 1 · int16 · GYRO-RATE 1×int16 = 融合航向(EV3 定案:不改)(已鎖住的模式,韌體與主機端都不再改)
陀螺 1D 航向 headingGyro1D
| 範圍 | 意思 |
|---|---|
-32768~32767 ° |
只繞轉向軸積分的航向,度,開機/歸零 = 0;可超過 360 |
' clev3r (BASIC)
Sensor.SetMode(1, 3)
headingGyro1D = Sensor.ReadRawValue(1, 0)模式 3 · int16 · GYRO-G&A 2×int16 [陀螺 1D, 磁力航向](已鎖住的模式,韌體與主機端都不再改)
磁力航向 headingMag
| 範圍 | 意思 |
|---|---|
-32768~32767 ° |
磁力計傾斜補償航向,度,減去相對零點 |
' clev3r (BASIC)
Sensor.SetMode(1, 3)
headingMag = Sensor.ReadRawValue(1, 1)模式 3 · int16(已鎖住的模式,韌體與主機端都不再改)
轉向軸角速度 yawRate
| 範圍 | 意思 |
|---|---|
-32768~32767 0.1 dps |
繞轉向軸(getYawAxis())的角速度,0.1 度/秒,正負跟航向同向 |
' clev3r (BASIC)
Sensor.SetMode(1, 2)
yawRate = Sensor.ReadRawValue(1, 0)模式 2 · int16 · GYRO-FAS 1×int16(#67 新增,原本 0)
俯仰角 pitch
| 範圍 | 意思 |
|---|---|
-90~+90 ° |
板子絲印 X 軸相對水平面的仰角:X 軸朝上 +90、朝下 −90、水平 0(用重力向量 atan2 算) |
' clev3r (BASIC)
Sensor.SetMode(1, 6)
pitch = Sensor.ReadRawValue(1, 0)模式 6 · int16 · TILT-ANG 1×int16(#67 新增,原本 0)
俯仰角速度 pitchRate
| 範圍 | 意思 |
|---|---|
-32768~32767 0.1 dps |
繞板子絲印 X 軸的角速度,0.1 度/秒(右手定則,從 +X 端看逆時針為正);注意這是 gyro X,不是 06 的微分 |
' clev3r (BASIC)
Sensor.SetMode(1, 5)
pitchRate = Sensor.ReadRawValue(1, 0)模式 5 · int16 · TILT-RATE 1×int16(#67:取代 #65 統一時放的 ID,ID 移到模式 4)
這個軟體讀不到:磁力信任度、磁場干擾度、朝上的面、角速度 1~3 軸、加速度 1~3 軸、磁力 1~3 軸、命令狀態。要用這些值請改用 Arduino/mBlock/micro:bit。
命令
EV3 接頭是唯讀的,這個軟體不能送命令:校準用感應器上的按鈕,切黑白線、門檻等設定改用 Arduino I2C、mBlock 或 micro:bit。
範例
範例 1:看看機器人轉了幾度
這個範例會做什麼: 程式開始時角度歸零,然後用手轉動機器人,螢幕會顯示轉了幾度。
要準備什麼:
- IMU 陀螺儀(EV3 版)
- EV3 主機
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 01:看看機器人轉了幾度
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:程式開始時角度歸零,然後用手轉動機器人,螢幕會顯示轉了幾度。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex01"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 先把角度歸零(這時候不要動機器人)
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 清除螢幕
LCD.Clear()
' 一直重複
While "True"
' 螢幕第 1 行顯示目前角度
LCD.Text(1, 0, 0, 1, "ANGLE " + Sensor.ReadRawValue(1, 0) + " ")
' 等 0.1 秒
Program.Delay(100)
EndWhile一步一步看懂程式:
- 先把角度歸零(這時候不要動機器人)
- 清除螢幕
- 一直重複
- 螢幕第 1 行顯示目前角度
- 等 0.1 秒
跑起來應該看到: 轉一圈約 360;往反方向轉會變成負數。轉回原來的方向,數字會回到 0 附近。
常見問題:
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。
範例 2:原地右轉 90 度
這個範例會做什麼: 靠陀螺儀轉彎,比「轉幾秒」準很多:一直轉,直到角度到 90 度才停。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 02:原地右轉 90 度
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:靠陀螺儀轉彎,比「轉幾秒」準很多:一直轉,直到角度到 90 度才停。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex02"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 角度歸零
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 左輪往前、右輪往後:原地向右轉(慢一點比較準)
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度的絕對值大於等於 90
While Math.Abs(Sensor.ReadRawValue(1, 0)) < 90
Program.Delay(10)
EndWhile
' 轉到 90 度:停車
Motor.Stop("BC", "True")
' 嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()一步一步看懂程式:
- 角度歸零
- 左輪往前、右輪往後:原地向右轉(慢一點比較準)
- 等到角度的絕對值大於等於 90
- 轉到 90 度:停車
- 嗶一聲
跑起來應該看到: 車子原地右轉約 90 度後停下來並嗶一聲。
常見問題:
- 每次都轉過頭幾度? 車子停下來需要一點時間。把 90 改成 85 試試看,或把轉速 20 再調慢。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。
範例 3:走正方形
這個範例會做什麼: 把「直走 2 秒+右轉 90 度」重複 4 次,就是一個正方形。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 03:走正方形
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:把「直走 2 秒+右轉 90 度」重複 4 次,就是一個正方形。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex03"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 下面的動作重複 4 次
For i = 1 To 4
' 直走
Motor.StartPower("B", 30)
Motor.StartPower("C", 30)
' 走 2 秒
Program.Delay(2000)
' 停一下
Motor.Stop("BC", "True")
' 角度歸零
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 左輪往前、右輪往後:原地向右轉(慢一點比較準)
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度的絕對值大於等於 90
While Math.Abs(Sensor.ReadRawValue(1, 0)) < 90
Program.Delay(10)
EndWhile
' 轉到 90 度:停車
Motor.Stop("BC", "True")
EndFor
' 走完嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()一步一步看懂程式:
- 下面的動作重複 4 次
- 直走
- 走 2 秒
- 停一下
- 角度歸零
- 左輪往前、右輪往後:原地向右轉(慢一點比較準)
- 等到角度的絕對值大於等於 90
- 轉到 90 度:停車
- 走完嗶一聲
跑起來應該看到: 車子走出一個正方形,最後回到出發點附近。
常見問題:
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。
範例 4:走直線自動修正
這個範例會做什麼: 兩個輪子不可能完全一樣快,車子直走久了會歪。用陀螺儀看歪了幾度,就往反方向補回來,車子就能走得很直。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 04:走直線自動修正
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:兩個輪子不可能完全一樣快,車子直走久了會歪。用陀螺儀看歪了幾度,就往反方向補回來,車子就能走得很直。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex04"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 角度歸零:現在的方向就是「正前方」
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 一直重複
While "True"
' 修正力量 fix = 角度 × 2
fix = Sensor.ReadRawValue(1, 0) * 2
' 往右歪(角度變大):左輪減速、右輪加速,把車頭拉回來
Motor.StartPower("B", 30 - fix)
Motor.StartPower("C", 30 + fix)
EndWhile一步一步看懂程式:
- 角度歸零:現在的方向就是「正前方」
- 一直重複
- 修正力量 fix = 角度 × 2
- 往右歪(角度變大):左輪減速、右輪加速,把車頭拉回來
跑起來應該看到: 車子會走直線;用手把車頭推歪,它會自己轉回原來的方向繼續直走。
常見問題:
- 越走越歪、甚至原地打轉? 修正方向相反了:把「30-fix」和「30+fix」對調。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。
範例 5:不倒的指南針:自己轉回原來的方向
這個範例會做什麼: 車子停在原地。你用手把它轉走,它會自己原地轉回原來的方向。這就是比賽中「轉回正前方」的基本做法。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 05:不倒的指南針:自己轉回原來的方向
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:車子停在原地。你用手把它轉走,它會自己原地轉回原來的方向。這就是比賽中「轉回正前方」的基本做法。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex05"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 角度歸零:記住現在的方向
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 一直重複
While "True"
' 修正力量 fix = 角度 × 1:轉走越多,轉回來越用力
fix = Sensor.ReadRawValue(1, 0) * 1
' 左輪=-fix、右輪=+fix:原地往反方向轉回去
Motor.StartPower("B", 0 - fix)
Motor.StartPower("C", fix)
EndWhile一步一步看懂程式:
- 角度歸零:記住現在的方向
- 一直重複
- 修正力量 fix = 角度 × 1:轉走越多,轉回來越用力
- 左輪=-fix、右輪=+fix:原地往反方向轉回去
跑起來應該看到: 用手把車頭轉走,放手後它會自己轉回原來的方向並停住。
常見問題:
- 一直打轉停不下來? 方向相反了:把「-fix」和「+fix」對調。
- 在原位附近抖動? 把 × 1 改小(例如 × 0.6)。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。
範例 6:俯仰角:上坡就減速
僅 Pybricks v4/EV3 MicroPython v2.0/clev3r(EV3-G、Classroom 的積木讀不到這個模式)
這個範例會做什麼: 模式 6 是「俯仰角」:車頭上抬或下壓幾度,平放是 0。車子在平地用 50 的速度跑,一上坡(或下坡)俯仰角超過 8 度就放慢到 20,比較不會翻車或衝太快。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版,韌體 v4.0 以上)
- 一塊斜板或書本堆成的小坡
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上,板子絲印的 X 軸要跟車子前後方向平行。
下載程式(選你用的軟體):
(程式碼即範例,不需截圖。)
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 06:俯仰角:上坡就減速
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:模式 6 是「俯仰角」:車頭上抬或下壓幾度,平放是 0。車子在平地用 50 的速度跑,一上坡(或下坡)俯仰角超過 8 度就放慢到 20,比較不會翻車或衝太快。
' 讀值:tilt=俯仰角(車頭上抬或下壓幾度)(-90 ~ +90 度,平放=0(板子絲印 X 軸))
' ============================================================
folder "prjs" "MBC_imu_ex06"
' IMU 陀螺儀插 1 號孔,使用模式 6
Sensor.SetMode(1, 6)
LCD.Clear()
' 清除螢幕
LCD.Clear()
' 一直重複
While "True"
' 第 1 行顯示俯仰角(度)
LCD.Text(1, 0, 0, 1, "TILT " + Sensor.ReadRawValue(1, 0) + " ")
' 如果俯仰角的絕對值大於 8 度
If Math.Abs(Sensor.ReadRawValue(1, 0)) > 8 Then
' 在坡上(俯仰角超過 8 度):放慢到 20
Motor.StartPower("B", 20)
Motor.StartPower("C", 20)
' 第 2 行顯示 SLOPE
LCD.Text(1, 0, 16, 1, "SLOPE ")
Else
' 平地:用 50 往前開
Motor.StartPower("B", 50)
Motor.StartPower("C", 50)
' 第 2 行顯示 FLAT
LCD.Text(1, 0, 16, 1, "FLAT ")
EndIf
EndWhile一步一步看懂程式:
- 清除螢幕
- 一直重複
- 第 1 行顯示俯仰角(度)
- 如果俯仰角的絕對值大於 8 度
- 在坡上(俯仰角超過 8 度):放慢到 20
- 第 2 行顯示 SLOPE
- 否則:
- 平地:用 50 往前開
- 第 2 行顯示 FLAT
跑起來應該看到: 平地上車子快跑、螢幕顯示 FLAT 和 0 附近的角度;開上斜板時角度變大、顯示 SLOPE 並明顯變慢;回到平地又加速。
常見問題:
- 平地上角度就不是 0? 感應器沒有平放,或裝的方向轉了 90 度(俯仰角看的是板子絲印的 X 軸)。
- 上坡角度是負的? 正常,正負跟安裝方向有關;這個範例用絕對值,所以上坡下坡都會減速。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
- 數字一直是 0 或不會動? 感應器韌體要 v4.0(2026-10)以上才有這個模式,舊韌體請先更新。
- EV3-G/Classroom 怎麼沒有這個範例? 這個範例用的是新模式(2026-10 韌體 v4 起),EV3-G 和 Classroom 的陀螺儀積木讀不到,只有 Pybricks、EV3 MicroPython、clev3r 能用。
範例 7:轉太快就警告
僅 Pybricks v4/EV3 MicroPython v2.0/clev3r(EV3-G、Classroom 的積木讀不到這個模式)
這個範例會做什麼: 模式 2 是「轉向角速度」:現在每秒轉幾度(×10)。角度告訴你轉了多少,角速度告訴你轉得多快。這個範例把角速度顯示出來,轉太快(超過每秒 90 度,也就是 900)就嗶一聲,可以拿來檢查機器人轉彎會不會甩尾。
要準備什麼:
- IMU 陀螺儀(EV3 版,韌體 v4.0 以上)
- EV3 主機
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上。
下載程式(選你用的軟體):
(程式碼即範例,不需截圖。)
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 07:轉太快就警告
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:模式 2 是「轉向角速度」:現在每秒轉幾度(×10)。角度告訴你轉了多少,角速度告訴你轉得多快。這個範例把角速度顯示出來,轉太快(超過每秒 90 度,也就是 900)就嗶一聲,可以拿來檢查機器人轉彎會不會甩尾。
' 讀值:rate=轉向的角速度(每秒幾度 × 10)(±3000 左右,正負跟角度同方向;100=每秒 10 度)
' ============================================================
folder "prjs" "MBC_imu_ex07"
' IMU 陀螺儀插 1 號孔,使用模式 2
Sensor.SetMode(1, 2)
LCD.Clear()
' 清除螢幕
LCD.Clear()
' 一直重複
While "True"
' 第 1 行顯示角速度(每秒幾度 × 10)
LCD.Text(1, 0, 0, 1, "RATE " + Sensor.ReadRawValue(1, 0) + " ")
' 如果角速度的絕對值大於 900(每秒 90 度)
If Math.Abs(Sensor.ReadRawValue(1, 0)) > 900 Then
' 轉太快(超過每秒 90 度):嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()
EndIf
' 等 0.1 秒
Program.Delay(100)
EndWhile一步一步看懂程式:
- 清除螢幕
- 一直重複
- 第 1 行顯示角速度(每秒幾度 × 10)
- 如果角速度的絕對值大於 900(每秒 90 度)
- 轉太快(超過每秒 90 度):嗶一聲
- 等 0.1 秒
跑起來應該看到: 機器人不動時數字在 0 附近;用手慢慢轉它,數字幾百;快速一甩,數字超過 900 並嗶一聲。往另一邊轉數字是負的。
常見問題:
- 不動也一直嗶? 把 900 改大,或確認感應器有固定好、沒有在晃。
- 數字一直是 0 或不會動? 感應器韌體要 v4.0(2026-10)以上才有這個模式,舊韌體請先更新。
- EV3-G/Classroom 怎麼沒有這個範例? 這個範例用的是新模式(2026-10 韌體 v4 起),EV3-G 和 Classroom 的陀螺儀積木讀不到,只有 Pybricks、EV3 MicroPython、clev3r 能用。
範例 8:轉到指定方向(絕對角度)
這個範例會做什麼: 程式開始時歸零一次,記住「正前方」是 0 度,之後中間都不再歸零,依序轉到 90 度、180 度、再轉回 0 度。所有方向都以「開始時的正前方」為準,每次轉過頭的一點點誤差不會一次一次累加,比賽最常用這種寫法。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 08:轉到指定方向(絕對角度)
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:程式開始時歸零一次,記住「正前方」是 0 度,之後中間都不再歸零,依序轉到 90 度、180 度、再轉回 0 度。所有方向都以「開始時的正前方」為準,每次轉過頭的一點點誤差不會一次一次累加,比賽最常用這種寫法。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex08"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 角度歸零:記住現在的方向是「正前方」0 度(只歸零這一次)
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 如果現在的角度小於 90
If Sensor.ReadRawValue(1, 0) < 90 Then
' 還沒到 90 度:原地向右轉(左輪往前、右輪往後)
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度大於等於 90
While Sensor.ReadRawValue(1, 0) < 90
Program.Delay(10)
EndWhile
Else
' 超過 90 度:原地向左轉(左輪往後、右輪往前)
Motor.StartPower("B", -20)
Motor.StartPower("C", 20)
' 等到角度小於等於 90
While Sensor.ReadRawValue(1, 0) > 90
Program.Delay(10)
EndWhile
EndIf
' 到 90 度:停車
Motor.Stop("BC", "True")
' 停 1 秒
Program.Delay(1000)
' 如果現在的角度小於 180
If Sensor.ReadRawValue(1, 0) < 180 Then
' 還沒到 180 度:原地向右轉(左輪往前、右輪往後)
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度大於等於 180
While Sensor.ReadRawValue(1, 0) < 180
Program.Delay(10)
EndWhile
Else
' 超過 180 度:原地向左轉(左輪往後、右輪往前)
Motor.StartPower("B", -20)
Motor.StartPower("C", 20)
' 等到角度小於等於 180
While Sensor.ReadRawValue(1, 0) > 180
Program.Delay(10)
EndWhile
EndIf
' 到 180 度:停車
Motor.Stop("BC", "True")
' 停 1 秒
Program.Delay(1000)
' 如果現在的角度小於 0
If Sensor.ReadRawValue(1, 0) < 0 Then
' 還沒到 0 度:原地向右轉(左輪往前、右輪往後)
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度大於等於 0
While Sensor.ReadRawValue(1, 0) < 0
Program.Delay(10)
EndWhile
Else
' 超過 0 度:原地向左轉(左輪往後、右輪往前)
Motor.StartPower("B", -20)
Motor.StartPower("C", 20)
' 等到角度小於等於 0
While Sensor.ReadRawValue(1, 0) > 0
Program.Delay(10)
EndWhile
EndIf
' 到 0 度:停車
Motor.Stop("BC", "True")
' 停 1 秒
Program.Delay(1000)
' 轉完嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()一步一步看懂程式:
- 角度歸零:記住現在的方向是「正前方」0 度(只歸零這一次)
- 如果現在的角度小於 90
- 還沒到 90 度:原地向右轉(左輪往前、右輪往後)
- 等到角度大於等於 90
- 否則:
- 超過 90 度:原地向左轉(左輪往後、右輪往前)
- 等到角度小於等於 90
- 到 90 度:停車
- 停 1 秒
- 如果現在的角度小於 180
- 還沒到 180 度:原地向右轉(左輪往前、右輪往後)
- 等到角度大於等於 180
- 否則:
- 超過 180 度:原地向左轉(左輪往後、右輪往前)
- 等到角度小於等於 180
- 到 180 度:停車
- 停 1 秒
- 如果現在的角度小於 0
- 還沒到 0 度:原地向右轉(左輪往前、右輪往後)
- 等到角度大於等於 0
- 否則:
- 超過 0 度:原地向左轉(左輪往後、右輪往前)
- 等到角度小於等於 0
- 到 0 度:停車
- 停 1 秒
- 轉完嗶一聲
跑起來應該看到: 車子先右轉到 90 度(面向右邊)停 1 秒,再右轉到 180 度(面向後面)停 1 秒,最後左轉回 0 度,回到一開始的方向並嗶一聲。實測轉回原位的誤差大約 ±3 度。
常見問題:
- 每次都轉過頭幾度? 車子停下來需要一點時間。把轉速 20 調慢(例如 15),或把右轉的目標減幾度(例如 90 改 87、180 改 177)。
- 一直轉停不下來,或轉的方向相反? 感應器可能上下裝反了。IMU 要正面朝上平放,這樣從上往下看順時針轉(右轉)角度才會變大。
- 為什麼不是每轉一次就歸零一次? 每次歸零,上一次轉過頭的幾度就會被當成新的「正前方」,誤差一次一次累加。只在開始時歸零一次,每個方向都以開始時的正前方為準,誤差不會累積。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
範例 9:從現在的方向再轉 90 度(相對角度)
這個範例會做什麼: 程式開始時歸零一次,然後重複 4 次:先看「現在」的角度,目標就是現在再加 90 度,右轉到目標就停。每次都以「現在的方向」為準,寫法很直覺;但每次轉過頭的幾度會留到下一次,跟範例 8 的「絕對角度」比一比就知道差在哪。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- IMU 陀螺儀(EV3 版)
怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。
下載程式(選你用的軟體):
clev3r 程式碼
' ============================================================
' IMU 陀螺儀感應器 EV3 新手範例 09:從現在的方向再轉 90 度(相對角度)
' 軟體:clev3r
' 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:程式開始時歸零一次,然後重複 4 次:先看「現在」的角度,目標就是現在再加 90 度,右轉到目標就停。每次都以「現在的方向」為準,寫法很直覺;但每次轉過頭的幾度會留到下一次,跟範例 8 的「絕對角度」比一比就知道差在哪。
' 讀值:angle=機器人轉了幾度(連續累加(轉一圈=360,可超過 360))
' ============================================================
folder "prjs" "MBC_imu_ex09"
' IMU 陀螺儀插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
' 陀螺儀歸零的指令(送 0x11 給感應器)
gyroReset[0] = 17
LCD.Clear()
' 角度歸零(這時候不要動機器人)
Sensor.SendUARTData(1, 1, gyroReset)
Program.Delay(100)
' 下面的動作重複 4 次
For i = 1 To 4
' 目標 target = 現在的角度 + 90:以「現在」為準再轉 90 度
target = Sensor.ReadRawValue(1, 0) + 90
' 左輪往前、右輪往後:原地向右轉
Motor.StartPower("B", 20)
Motor.StartPower("C", -20)
' 等到角度大於等於 target
While Sensor.ReadRawValue(1, 0) < target
Program.Delay(10)
EndWhile
' 轉到了:停車
Motor.Stop("BC", "True")
' 停 0.5 秒
Program.Delay(500)
EndFor
' 轉完 4 次嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()一步一步看懂程式:
- 角度歸零(這時候不要動機器人)
- 下面的動作重複 4 次
- 目標 target = 現在的角度 + 90:以「現在」為準再轉 90 度
- 左輪往前、右輪往後:原地向右轉
- 等到角度大於等於 target
- 轉到了:停車
- 停 0.5 秒
- 轉完 4 次嗶一聲
跑起來應該看到: 車子原地右轉 4 次、每次約 90 度,轉滿一圈後嗶一聲。仔細看最後的方向,可能跟一開始差幾度。
常見問題:
- 轉完 4 次,沒有剛好回到原來的方向? 正常。每次轉過頭的幾度會留到下一次(下一次是從轉過頭的方向再加 90),4 次後可能偏離原方向幾度。要不累積,就用範例 8「絕對角度」的做法:只在開始時歸零,目標固定用 90、180、270、360。
- 每次都轉過頭幾度? 車子停下來需要一點時間。把轉速 20 調慢,或把 + 90 改成 + 87 試試看。
- 一直轉停不下來? 感應器可能上下裝反了(右轉時角度變小)。IMU 要正面朝上平放。
- 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
還有問題?歡迎到 聯絡我們 留言,附上你用的軟體和程式截圖,我們會幫你看。
其他問題
- EV3 顯示成紅外線感應器? 正常:感應器模擬成樂高原廠感應器,用原廠積木就能讀。
- 切換模式時卡一下? EV3 每次換模式要等約 1 秒。整趟任務盡量只用同一個模式的積木。
還有問題?到 聯絡我們 附上你用的軟體和程式截圖。
下載
本頁依據
- 主機與軟體清單:
_build/guides.json - 值與命令:
_build/protocol/imu.json(單一真相來源) - 安裝與設定:
_build/guides/software/ev3-clev3r.zh.md、_build/guides/product/imu/ev3-clev3r.zh.md - 範例:
sensors/imu/ev3-examples.md