陀螺儀 IMU 九軸 × EV3 × Pybricks

互動教學EV3

第一次用?先跟著互動教學在網頁上做一遍,再照下面的步驟接主機。

這一頁只講 Pybricks v4/EV3 MicroPython v2:在 MINDSTORMS EV3 上用它讀陀螺儀 IMU 九軸的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。

安裝與設定

你需要

  • 感應器:陀螺儀 IMU 九軸(EV3 版,RJ12 接頭)。
  • 主機:LEGO MINDSTORMS EV3。
  • 軟體(二選一):
    • Pybricks v4:用 Chrome 打開 code.pybricks.com,EV3 要先裝 Pybricks 韌體(正式版已內建 EV3 韌體,2026-10 是 v4.1.1)。
    • EV3 MicroPython v2.0:樂高官方「EV3 MicroPython」microSD 開機卡+VS Code 的「LEGO MINDSTORMS EV3 MicroPython」擴充套件。已經在用的人選這個。

安裝軟體

Pybricks v4

  1. 用 Chrome 打開 code.pybricks.com。
  2. 照網站說明把 EV3 換成 Pybricks 韌體。code.pybricks.com 正式版已內建 EV3 韌體(2026-10 是 v4.1.1)。本站範例最早在 v4.0.0b10 上機測過,v4.1.1 寫法相同。
  3. 打開範例:把 .py 檔拖進編輯區,按執行。

EV3 MicroPython v2.0

  1. 用樂高官方 EV3 MicroPython 的 microSD 開機卡開機。
  2. 在 VS Code 裝好「LEGO MINDSTORMS EV3 MicroPython」擴充套件。
  3. 打開範例:把程式內容貼到 main.py,按 F5 下載執行。

讓軟體認得感應器

新手範例不用裝函式庫,直接讀感應器的資料:

  • Pybricks v4 用 LUMPDevice(Port.S1),sensor.read(模式) 拿到該模式的數值。
  • EV3 MicroPython v2.0 一律用 Ev3devSensor 讀。EV3 顯示成紅外線感應器的產品不要用 InfraredSensor:換模式固定等約 1.1 秒,buttons()/beacon()/keypad() 會丟錯或改掉數值。
  • 可以直接讀 EV3-G、Classroom 讀不到的模式,所以標「僅 Pybricks/EV3 MicroPython/clev3r」的範例也能跑。

重要

不要在主迴圈裡頻繁切換模式。 EV3 硬體每次切換感應器模式都會有通訊等待延遲。依任務選定一種模式,整趟都用它。

接線

  1. 用連接線把感應器插在 EV3 的 1 號孔(1~4 任一孔都可以;程式裡 Port.S1~Port.S4 選同一個孔)。
  2. EV3 先開機,再插感應器。
  3. 接頭卡榫朝上,輕輕推進去。

注意

陀螺儀 IMU 在 EV3 上會被當成原廠陀螺儀,範例程式用 GyroSensor 讀。

Pybricks v4 實測通過(2026-11-02,11/11 項):angle()、reset_angle(0) 正常。speed() 讀到的是磁力計航向(不是每秒幾度);要角速度請用 LUMPDevice 讀模式 2(見 EV3 新手範例 範例 7)。calibrate() 之後約 3.5 秒才讀得到值(原廠陀螺儀也一樣)。

第一次測試

  1. 打開本頁範例 1,按執行(MicroPython 版按 F5)。
  2. EV3 螢幕上的數字跟著感應器前方的東西變化,就是接好了。

常見問題

  • 找不到 EV3 的 Pybricks 韌體? 確認用的是 code.pybricks.com 正式版(2026-10 起內建 EV3 v4.1.1);舊的 ev3dev 版 Pybricks(microSD 卡)是另一套,本頁不適用。
  • 數字一直不變? 拔掉感應器重插一次(EV3 要先開機再插)。
  • 程式反應忽快忽慢? 主迴圈裡交叉讀了不同模式,每次切換都要等,改成只用一種模式。
  • 匯入函式庫時出錯? 函式庫檔要匯入到同一個 Pybricks 專案,檔名必須跟 import 的名字完全一致。

讀值

程式假設感應器插 1 號孔,用 LUMPDevice 讀原始模式;EV3 MicroPython v2 寫法相同。

陀螺 3D 航向 headingGyro3D

範圍 意思
-32768~32767 ° 四元數算出的航向,度,開機/歸零 = 0,連續累積可超過 360(int16 到 ±32767 繞回,約 91 圈)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingGyro3D = sensor.read(0)[0]   # 陀螺 3D 航向:-32768~32767 °

模式 0 · int16 · GYRO-ANG 1×int16(盤點:mode0 = 陀螺 3D,INO:232-234)(已鎖住的模式,韌體與主機端都不再改)

融合航向 headingFused

範圍 意思
-32768~32767 ° 陀螺 3D 加磁力計慢修正的航向,度,減去相對零點;可超過 360
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingFused = sensor.read(1)[0]   # 融合航向:-32768~32767 °

模式 1 · int16 · GYRO-RATE 1×int16 = 融合航向(EV3 定案:不改)(已鎖住的模式,韌體與主機端都不再改)

陀螺 1D 航向 headingGyro1D

範圍 意思
-32768~32767 ° 只繞轉向軸積分的航向,度,開機/歸零 = 0;可超過 360
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingGyro1D = sensor.read(3)[0]   # 陀螺 1D 航向:-32768~32767 °

模式 3 · int16 · GYRO-G&A 2×int16 [陀螺 1D, 磁力航向](已鎖住的模式,韌體與主機端都不再改)

磁力航向 headingMag

範圍 意思
-32768~32767 ° 磁力計傾斜補償航向,度,減去相對零點
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

headingMag = sensor.read(3)[1]   # 磁力航向:-32768~32767 °

模式 3 · int16(已鎖住的模式,韌體與主機端都不再改)

轉向軸角速度 yawRate

轉向軸角速度
範圍 意思
-32768~32767 0.1 dps 繞轉向軸(getYawAxis())的角速度,0.1 度/秒,正負跟航向同向
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

yawRate = sensor.read(2)[0]   # 轉向軸角速度:-32768~32767 0.1 dps

模式 2 · int16 · GYRO-FAS 1×int16(#67 新增,原本 0)

俯仰角 pitch

俯仰角
範圍 意思
-90~+90 ° 板子絲印 X 軸相對水平面的仰角:X 軸朝上 +90、朝下 −90、水平 0(用重力向量 atan2 算)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

pitch = sensor.read(6)[0]   # 俯仰角:-90~+90 °

模式 6 · int16 · TILT-ANG 1×int16(#67 新增,原本 0)

俯仰角速度 pitchRate

俯仰角速度
範圍 意思
-32768~32767 0.1 dps 繞板子絲印 X 軸的角速度,0.1 度/秒(右手定則,從 +X 端看逆時針為正);注意這是 gyro X,不是 06 的微分
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

pitchRate = sensor.read(5)[0]   # 俯仰角速度:-32768~32767 0.1 dps

模式 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 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 01:看看機器人轉了幾度
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔
# 這個範例會做什麼:程式開始時角度歸零,然後用手轉動機器人,螢幕會顯示轉了幾度。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import GyroSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 先把角度歸零(這時候不要動機器人)
gyro.reset_angle(0)
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 螢幕第 1 行顯示目前角度
    ev3.screen.draw_text(0, 0, "ANGLE " + str(read_angle()) + "      ", Color.BLACK, Color.WHITE)
    # 等 0.1 秒
    wait(100)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 01:看看機器人轉了幾度
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔
# 這個範例會做什麼:程式開始時角度歸零,然後用手轉動機器人,螢幕會顯示轉了幾度。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import GyroSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 先把角度歸零(這時候不要動機器人)
gyro.reset_angle(0)
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 螢幕第 1 行顯示目前角度
    ev3.screen.draw_text(0, 0, "ANGLE " + str(read_angle()) + "      ", Color.BLACK, Color.WHITE)
    # 等 0.1 秒
    wait(100)

一步一步看懂程式:

  1. 先把角度歸零(這時候不要動機器人)
  2. 清除螢幕
  3. 一直重複
    • 螢幕第 1 行顯示目前角度
    • 等 0.1 秒

跑起來應該看到: 轉一圈約 360;往反方向轉會變成負數。轉回原來的方向,數字會回到 0 附近。

常見問題:

  • 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
  • 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。

範例 2:原地右轉 90 度

這個範例會做什麼: 靠陀螺儀轉彎,比「轉幾秒」準很多:一直轉,直到角度到 90 度才停。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • IMU 陀螺儀(EV3 版)

怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 02:原地右轉 90 度
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:靠陀螺儀轉彎,比「轉幾秒」準很多:一直轉,直到角度到 90 度才停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零
gyro.reset_angle(0)
# 左輪往前、右輪往後:原地向右轉(慢一點比較準)
left_motor.dc(20)
right_motor.dc(-20)
# 等到角度的絕對值大於等於 90
while not (abs(read_angle()) >= 90):
    wait(10)
# 轉到 90 度:停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 02:原地右轉 90 度
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:靠陀螺儀轉彎,比「轉幾秒」準很多:一直轉,直到角度到 90 度才停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零
gyro.reset_angle(0)
# 左輪往前、右輪往後:原地向右轉(慢一點比較準)
left_motor.dc(20)
right_motor.dc(-20)
# 等到角度的絕對值大於等於 90
while not (abs(read_angle()) >= 90):
    wait(10)
# 轉到 90 度:停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()

一步一步看懂程式:

  1. 角度歸零
  2. 左輪往前、右輪往後:原地向右轉(慢一點比較準)
  3. 等到角度的絕對值大於等於 90
  4. 轉到 90 度:停車
  5. 嗶一聲

跑起來應該看到: 車子原地右轉約 90 度後停下來並嗶一聲。

常見問題:

  • 每次都轉過頭幾度? 車子停下來需要一點時間。把 90 改成 85 試試看,或把轉速 20 再調慢。
  • 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
  • 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。

範例 3:走正方形

這個範例會做什麼: 把「直走 2 秒+右轉 90 度」重複 4 次,就是一個正方形。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • IMU 陀螺儀(EV3 版)

怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 03:走正方形
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:把「直走 2 秒+右轉 90 度」重複 4 次,就是一個正方形。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 下面的動作重複 4 次
for i in range(4):
    # 直走
    left_motor.dc(30)
    right_motor.dc(30)
    # 走 2 秒
    wait(2000)
    # 停一下
    left_motor.brake()
    right_motor.brake()
    # 角度歸零
    gyro.reset_angle(0)
    # 左輪往前、右輪往後:原地向右轉(慢一點比較準)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度的絕對值大於等於 90
    while not (abs(read_angle()) >= 90):
        wait(10)
    # 轉到 90 度:停車
    left_motor.brake()
    right_motor.brake()
# 走完嗶一聲
ev3.speaker.beep()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 03:走正方形
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:把「直走 2 秒+右轉 90 度」重複 4 次,就是一個正方形。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 下面的動作重複 4 次
for i in range(4):
    # 直走
    left_motor.dc(30)
    right_motor.dc(30)
    # 走 2 秒
    wait(2000)
    # 停一下
    left_motor.brake()
    right_motor.brake()
    # 角度歸零
    gyro.reset_angle(0)
    # 左輪往前、右輪往後:原地向右轉(慢一點比較準)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度的絕對值大於等於 90
    while not (abs(read_angle()) >= 90):
        wait(10)
    # 轉到 90 度:停車
    left_motor.brake()
    right_motor.brake()
# 走完嗶一聲
ev3.speaker.beep()

一步一步看懂程式:

  1. 下面的動作重複 4 次
    • 直走
    • 走 2 秒
    • 停一下
    • 角度歸零
    • 左輪往前、右輪往後:原地向右轉(慢一點比較準)
    • 等到角度的絕對值大於等於 90
    • 轉到 90 度:停車
  2. 走完嗶一聲

跑起來應該看到: 車子走出一個正方形,最後回到出發點附近。

常見問題:

  • 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
  • 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。

範例 4:走直線自動修正

這個範例會做什麼: 兩個輪子不可能完全一樣快,車子直走久了會歪。用陀螺儀看歪了幾度,就往反方向補回來,車子就能走得很直。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • IMU 陀螺儀(EV3 版)

怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 04:走直線自動修正
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:兩個輪子不可能完全一樣快,車子直走久了會歪。用陀螺儀看歪了幾度,就往反方向補回來,車子就能走得很直。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:現在的方向就是「正前方」
gyro.reset_angle(0)
# 一直重複
while True:
    # 修正力量 fix = 角度 × 2
    fix = read_angle() * 2
    # 往右歪(角度變大):左輪減速、右輪加速,把車頭拉回來
    left_motor.dc(30 - fix)
    right_motor.dc(30 + fix)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 04:走直線自動修正
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:兩個輪子不可能完全一樣快,車子直走久了會歪。用陀螺儀看歪了幾度,就往反方向補回來,車子就能走得很直。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:現在的方向就是「正前方」
gyro.reset_angle(0)
# 一直重複
while True:
    # 修正力量 fix = 角度 × 2
    fix = read_angle() * 2
    # 往右歪(角度變大):左輪減速、右輪加速,把車頭拉回來
    left_motor.dc(30 - fix)
    right_motor.dc(30 + fix)

一步一步看懂程式:

  1. 角度歸零:現在的方向就是「正前方」
  2. 一直重複
    • 修正力量 fix = 角度 × 2
    • 往右歪(角度變大):左輪減速、右輪加速,把車頭拉回來

跑起來應該看到: 車子會走直線;用手把車頭推歪,它會自己轉回原來的方向繼續直走。

常見問題:

  • 越走越歪、甚至原地打轉? 修正方向相反了:把「30-fix」和「30+fix」對調。
  • 車子沒動,角度卻一直慢慢變? 開機或歸零的那一下車子要完全靜止。把車子放好,拔掉感應器重插一次再試。
  • 角度變化方向跟範例說的相反? 感應器可能裝反了(上下顛倒)。範例 2、3 用「絕對值」所以不受影響;範例 4、5 請把程式裡的「+」「-」對調。

範例 5:不倒的指南針:自己轉回原來的方向

這個範例會做什麼: 車子停在原地。你用手把它轉走,它會自己原地轉回原來的方向。這就是比賽中「轉回正前方」的基本做法。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • IMU 陀螺儀(EV3 版)

怎麼接: IMU 陀螺儀插 1 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 05:不倒的指南針:自己轉回原來的方向
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:車子停在原地。你用手把它轉走,它會自己原地轉回原來的方向。這就是比賽中「轉回正前方」的基本做法。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:記住現在的方向
gyro.reset_angle(0)
# 一直重複
while True:
    # 修正力量 fix = 角度 × 1:轉走越多,轉回來越用力
    fix = read_angle() * 1
    # 左輪=-fix、右輪=+fix:原地往反方向轉回去
    left_motor.dc(0 - fix)
    right_motor.dc(fix)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 05:不倒的指南針:自己轉回原來的方向
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:車子停在原地。你用手把它轉走,它會自己原地轉回原來的方向。這就是比賽中「轉回正前方」的基本做法。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:記住現在的方向
gyro.reset_angle(0)
# 一直重複
while True:
    # 修正力量 fix = 角度 × 1:轉走越多,轉回來越用力
    fix = read_angle() * 1
    # 左輪=-fix、右輪=+fix:原地往反方向轉回去
    left_motor.dc(0 - fix)
    right_motor.dc(fix)

一步一步看懂程式:

  1. 角度歸零:記住現在的方向
  2. 一直重複
    • 修正力量 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 軸要跟車子前後方向平行。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

(程式碼即範例,不需截圖。)

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 06:俯仰角:上坡就減速
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:模式 6 是「俯仰角」:車頭上抬或下壓幾度,平放是 0。車子在平地用 50 的速度跑,一上坡(或下坡)俯仰角超過 8 度就放慢到 20,比較不會翻車或衝太快。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # IMU 陀螺儀插 1 號孔(當一般 UART 裝置讀原始值)
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_tilt():
    # 俯仰角(車頭上抬或下壓幾度):-90 ~ +90 度,平放=0(板子絲印 X 軸)
    return sensor.read(6)[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 第 1 行顯示俯仰角(度)
    ev3.screen.draw_text(0, 0, "TILT " + str(read_tilt()) + "      ", Color.BLACK, Color.WHITE)
    # 如果俯仰角的絕對值大於 8 度
    if abs(read_tilt()) > 8:
        # 在坡上(俯仰角超過 8 度):放慢到 20
        left_motor.dc(20)
        right_motor.dc(20)
        # 第 2 行顯示 SLOPE
        ev3.screen.draw_text(0, 16, "SLOPE      ", Color.BLACK, Color.WHITE)
    else:
        # 平地:用 50 往前開
        left_motor.dc(50)
        right_motor.dc(50)
        # 第 2 行顯示 FLAT
        ev3.screen.draw_text(0, 16, "FLAT      ", Color.BLACK, Color.WHITE)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 06:俯仰角:上坡就減速
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:模式 6 是「俯仰角」:車頭上抬或下壓幾度,平放是 0。車子在平地用 50 的速度跑,一上坡(或下坡)俯仰角超過 8 度就放慢到 20,比較不會翻車或衝太快。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # IMU 陀螺儀插 1 號孔(當一般 UART 裝置讀原始值)
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_tilt():
    # 俯仰角(車頭上抬或下壓幾度):-90 ~ +90 度,平放=0(板子絲印 X 軸)
    return sensor.read('TILT-ANG')[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 第 1 行顯示俯仰角(度)
    ev3.screen.draw_text(0, 0, "TILT " + str(read_tilt()) + "      ", Color.BLACK, Color.WHITE)
    # 如果俯仰角的絕對值大於 8 度
    if abs(read_tilt()) > 8:
        # 在坡上(俯仰角超過 8 度):放慢到 20
        left_motor.dc(20)
        right_motor.dc(20)
        # 第 2 行顯示 SLOPE
        ev3.screen.draw_text(0, 16, "SLOPE      ", Color.BLACK, Color.WHITE)
    else:
        # 平地:用 50 往前開
        left_motor.dc(50)
        right_motor.dc(50)
        # 第 2 行顯示 FLAT
        ev3.screen.draw_text(0, 16, "FLAT      ", Color.BLACK, Color.WHITE)

一步一步看懂程式:

  1. 清除螢幕
  2. 一直重複
    • 第 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 號孔,平放固定在車身上。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

(程式碼即範例,不需截圖。)

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 07:轉太快就警告
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔
# 這個範例會做什麼:模式 2 是「轉向角速度」:現在每秒轉幾度(×10)。角度告訴你轉了多少,角速度告訴你轉得多快。這個範例把角速度顯示出來,轉太快(超過每秒 90 度,也就是 900)就嗶一聲,可以拿來檢查機器人轉彎會不會甩尾。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # IMU 陀螺儀插 1 號孔(當一般 UART 裝置讀原始值)


def read_rate():
    # 轉向的角速度(每秒幾度 × 10):±3000 左右,正負跟角度同方向;100=每秒 10 度
    return sensor.read(2)[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 第 1 行顯示角速度(每秒幾度 × 10)
    ev3.screen.draw_text(0, 0, "RATE " + str(read_rate()) + "      ", Color.BLACK, Color.WHITE)
    # 如果角速度的絕對值大於 900(每秒 90 度)
    if abs(read_rate()) > 900:
        # 轉太快(超過每秒 90 度):嗶一聲
        ev3.speaker.beep()
    # 等 0.1 秒
    wait(100)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 07:轉太快就警告
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔
# 這個範例會做什麼:模式 2 是「轉向角速度」:現在每秒轉幾度(×10)。角度告訴你轉了多少,角速度告訴你轉得多快。這個範例把角速度顯示出來,轉太快(超過每秒 90 度,也就是 900)就嗶一聲,可以拿來檢查機器人轉彎會不會甩尾。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # IMU 陀螺儀插 1 號孔(當一般 UART 裝置讀原始值)


def read_rate():
    # 轉向的角速度(每秒幾度 × 10):±3000 左右,正負跟角度同方向;100=每秒 10 度
    return sensor.read('GYRO-FAS')[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 第 1 行顯示角速度(每秒幾度 × 10)
    ev3.screen.draw_text(0, 0, "RATE " + str(read_rate()) + "      ", Color.BLACK, Color.WHITE)
    # 如果角速度的絕對值大於 900(每秒 90 度)
    if abs(read_rate()) > 900:
        # 轉太快(超過每秒 90 度):嗶一聲
        ev3.speaker.beep()
    # 等 0.1 秒
    wait(100)

一步一步看懂程式:

  1. 清除螢幕
  2. 一直重複
    • 第 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 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 08:轉到指定方向(絕對角度)
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:程式開始時歸零一次,記住「正前方」是 0 度,之後中間都不再歸零,依序轉到 90 度、180 度、再轉回 0 度。所有方向都以「開始時的正前方」為準,每次轉過頭的一點點誤差不會一次一次累加,比賽最常用這種寫法。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:記住現在的方向是「正前方」0 度(只歸零這一次)
gyro.reset_angle(0)
# 如果現在的角度小於 90
if read_angle() < 90:
    # 還沒到 90 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 90
    while not (read_angle() >= 90):
        wait(10)
else:
    # 超過 90 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 90
    while not (read_angle() <= 90):
        wait(10)
# 到 90 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 如果現在的角度小於 180
if read_angle() < 180:
    # 還沒到 180 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 180
    while not (read_angle() >= 180):
        wait(10)
else:
    # 超過 180 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 180
    while not (read_angle() <= 180):
        wait(10)
# 到 180 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 如果現在的角度小於 0
if read_angle() < 0:
    # 還沒到 0 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 0
    while not (read_angle() >= 0):
        wait(10)
else:
    # 超過 0 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 0
    while not (read_angle() <= 0):
        wait(10)
# 到 0 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 轉完嗶一聲
ev3.speaker.beep()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 08:轉到指定方向(絕對角度)
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:程式開始時歸零一次,記住「正前方」是 0 度,之後中間都不再歸零,依序轉到 90 度、180 度、再轉回 0 度。所有方向都以「開始時的正前方」為準,每次轉過頭的一點點誤差不會一次一次累加,比賽最常用這種寫法。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零:記住現在的方向是「正前方」0 度(只歸零這一次)
gyro.reset_angle(0)
# 如果現在的角度小於 90
if read_angle() < 90:
    # 還沒到 90 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 90
    while not (read_angle() >= 90):
        wait(10)
else:
    # 超過 90 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 90
    while not (read_angle() <= 90):
        wait(10)
# 到 90 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 如果現在的角度小於 180
if read_angle() < 180:
    # 還沒到 180 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 180
    while not (read_angle() >= 180):
        wait(10)
else:
    # 超過 180 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 180
    while not (read_angle() <= 180):
        wait(10)
# 到 180 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 如果現在的角度小於 0
if read_angle() < 0:
    # 還沒到 0 度:原地向右轉(左輪往前、右輪往後)
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 0
    while not (read_angle() >= 0):
        wait(10)
else:
    # 超過 0 度:原地向左轉(左輪往後、右輪往前)
    left_motor.dc(-20)
    right_motor.dc(20)
    # 等到角度小於等於 0
    while not (read_angle() <= 0):
        wait(10)
# 到 0 度:停車
left_motor.brake()
right_motor.brake()
# 停 1 秒
wait(1000)
# 轉完嗶一聲
ev3.speaker.beep()

一步一步看懂程式:

  1. 角度歸零:記住現在的方向是「正前方」0 度(只歸零這一次)
  2. 如果現在的角度小於 90
    • 還沒到 90 度:原地向右轉(左輪往前、右輪往後)
    • 等到角度大於等於 90
    • 否則:
      • 超過 90 度:原地向左轉(左輪往後、右輪往前)
      • 等到角度小於等於 90
  3. 到 90 度:停車
  4. 停 1 秒
  5. 如果現在的角度小於 180
    • 還沒到 180 度:原地向右轉(左輪往前、右輪往後)
    • 等到角度大於等於 180
    • 否則:
      • 超過 180 度:原地向左轉(左輪往後、右輪往前)
      • 等到角度小於等於 180
  6. 到 180 度:停車
  7. 停 1 秒
  8. 如果現在的角度小於 0
    • 還沒到 0 度:原地向右轉(左輪往前、右輪往後)
    • 等到角度大於等於 0
    • 否則:
      • 超過 0 度:原地向左轉(左輪往後、右輪往前)
      • 等到角度小於等於 0
  9. 到 0 度:停車
  10. 停 1 秒
  11. 轉完嗶一聲

跑起來應該看到: 車子先右轉到 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 號孔,平放固定在車身上(不要晃動)。程式開始時車子要靜止不動。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 09:從現在的方向再轉 90 度(相對角度)
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:程式開始時歸零一次,然後重複 4 次:先看「現在」的角度,目標就是現在再加 90 度,右轉到目標就停。每次都以「現在的方向」為準,寫法很直覺;但每次轉過頭的幾度會留到下一次,跟範例 8 的「絕對角度」比一比就知道差在哪。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零(這時候不要動機器人)
gyro.reset_angle(0)
# 下面的動作重複 4 次
for i in range(4):
    # 目標 target = 現在的角度 + 90:以「現在」為準再轉 90 度
    target = read_angle() + 90
    # 左輪往前、右輪往後:原地向右轉
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 target
    while not (read_angle() >= target):
        wait(10)
    # 轉到了:停車
    left_motor.brake()
    right_motor.brake()
    # 停 0.5 秒
    wait(500)
# 轉完 4 次嗶一聲
ev3.speaker.beep()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# IMU 陀螺儀感應器 EV3 新手範例 09:從現在的方向再轉 90 度(相對角度)
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:IMU 陀螺儀插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:程式開始時歸零一次,然後重複 4 次:先看「現在」的角度,目標就是現在再加 90 度,右轉到目標就停。每次都以「現在的方向」為準,寫法很直覺;但每次轉過頭的幾度會留到下一次,跟範例 8 的「絕對角度」比一比就知道差在哪。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
gyro = GyroSensor(Port.S1)        # IMU 陀螺儀插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_angle():
    # 機器人轉了幾度:連續累加(轉一圈=360,可超過 360)
    return gyro.angle()


# ---------- 程式從這裡開始 ----------
# 角度歸零(這時候不要動機器人)
gyro.reset_angle(0)
# 下面的動作重複 4 次
for i in range(4):
    # 目標 target = 現在的角度 + 90:以「現在」為準再轉 90 度
    target = read_angle() + 90
    # 左輪往前、右輪往後:原地向右轉
    left_motor.dc(20)
    right_motor.dc(-20)
    # 等到角度大於等於 target
    while not (read_angle() >= target):
        wait(10)
    # 轉到了:停車
    left_motor.brake()
    right_motor.brake()
    # 停 0.5 秒
    wait(500)
# 轉完 4 次嗶一聲
ev3.speaker.beep()

一步一步看懂程式:

  1. 角度歸零(這時候不要動機器人)
  2. 下面的動作重複 4 次
    • 目標 target = 現在的角度 + 90:以「現在」為準再轉 90 度
    • 左輪往前、右輪往後:原地向右轉
    • 等到角度大於等於 target
    • 轉到了:停車
    • 停 0.5 秒
  3. 轉完 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-pybricks.zh.md、_build/guides/product/imu/ev3-pybricks.zh.md
  • 範例:sensors/imu/ev3-examples.md
LINE 詢價選購指南