mBlock 5 讀值教學

警告

v1 尚未上機驗證:數值排法已定案並通過電腦端測試,實機數值(fps、循線門檻)上機後可能調整;mBlock 版只在電腦上測過傳輸(每個值編號的回應、E0/E1、逾時),還沒接 mBot 實測。

神攝手的 mBlock 版韌體讓 mBot、mBot Ranger、Orion、MegaPi 用 mBlock 5 的積木讀相機:MBC 感應器擴展 v2.2.0 有一個「神攝手」分類(37 顆積木:v2.1.0 的 22 顆+相機模式 5 物體偵測 15 顆;舊的學校版/WRO 版分類改叫「神攝手舊版」)。值表跟 Arduino I2C 版 完全相同,只是改走 RJ25 串口;積木會自己先問相機目前的模式,再讀對的值。

接線

相機要燒 mBlock 版韌體(跟 SPIKE/EV3/MATRIX/I2C 版是不同的 .bin,請跟我們索取已燒好的相機)。

主機 怎麼接 能用的連接埠
mBot(mCore) 相機 → mBot 插座片 → RJ25 連接埠 1~4
mBot Ranger(Auriga) 同上 6~10(1~4 是紅色馬達埠、5 是硬體序列埠)
Orion 同上 3、4、6(1、2 約 12 V 馬達埠;7、8 送腳只能類比輸入)
Ultimate 2.0(MegaPi) RJ25 擴充板 6~8
MegaPi Pro RJ25 擴充板 7~10
一般 Arduino 板(UNO、Mega…) 相機 TX(IO1)→ 板子 RX、相機 RX(IO3)← 板子 TX、5V、GND(見下面「不用 mBlock」) UNO 用軟體串口、Mega 用 Serial1
  • 串口 38400 bps、8N1,相機 RX=IO3、TX=IO1,跟主機交叉接(插座片已經接好,S1=主機送、S2=主機收)。
  • mBot2(CyberPi)沒有 RJ25 埠,不支援。

危險

不經插座片、直接接 5 V 的 Arduino 板時:UNO/Mega 的 TX 是 5 V,ESP32 的腳位只耐 3.3 V,板子 TX → 相機 RX 中間要串分壓(例 1 kΩ+2 kΩ);相機 TX → 板子 RX 可以直接接。

安裝擴展

  1. 擴展新版開發中:MBC 感應器擴展 v2.2.0 還在開發,正式上架前可先下載匯入檔試用(尚未上機驗證);上架後會在 mBlock 5「擴展中心」搜尋「MBC」就能加入,到時這一頁會更新。
  2. 用匯入檔試用:下載 MBC_Pro_Sensors_mBlock5_v2.2.0_import.mext → 到 ext.mblock.cc 登入自己的 Makeblock 帳號 → 我的擴展 → 匯入資料 → 上傳(約 2 分鐘,等到出現匯入成功再離開頁面)→ 按「下載」取得可以拖進 mBlock 的 .mext。
  3. 打開 mBlock 5 電腦版,左下「設備」加入你的主板(例如 mBot),把 .mext 拖進 mBlock 視窗,積木區會多出「神攝手」分類(還有循行者、測距者等其他 MBC 分類)。
  4. 右下「模式開關」切到 上傳:這個擴展只支援上傳模式(程式燒進主板執行)。

擴展 v2.2.0 的其他分類(循行者、測距者、掌控者、IMU、神攝手舊版=學校版/WRO 版)積木跟 v2.0.0 一樣(舊版分類只改了顯示名稱),見 MakeBlock 積木擴展。

先切相機模式

同一個值編號在不同相機模式代表不同東西(0x10 在顏色追蹤是第 1 色 x、在循線是近處偏移),所以程式一開始先放「設定模式」,或在相機選單(MODE)切好。讀值積木每次會先讀 模式編號(值 0x01)(100 ms 內用上次讀到的),模式不對就傳回 −32768。

「設定模式」選項 模式編號(0x01) 送出的命令
顏色追蹤 ① 最多色 11 E0 [1, 1]
顏色追蹤 ② 多色 12 E0 [1, 2]
顏色追蹤 ③ 標準 13 E0 [1, 3]
顏色追蹤 ④ 精細 14 E0 [1, 4]
座標取色 ① 色相 21 E0 [2, 1]
座標取色 ② 色相+飽和 22 E0 [2, 2]
座標取色 ③ 色相+飽和+明度 23 E0 [2, 3]
照順序給色號 30 E0 [3, 0]
循線 ① 黑線 41 E0 [4, 1]
循線 ② 白線 42 E0 [4, 2]
循線 ③ 色線 43 E0 [4, 3]
物體偵測 ① 物體清單 51 E0 [5, 1]
物體偵測 ② 物體詳細 52 E0 [5, 2]

目標顏色只能在相機上教(停在目標 1~16 按 OK);程式改不了顏色。座標取色的取樣點位置可以用「設定取樣點」積木改(存進相機)。

積木一覽

連接埠選感應器實際插的孔。第 c 色=相機上的目標 c(1 起算,跟相機螢幕上的編號一樣);k=這個子選項每色(每點)佔幾個值:顏色追蹤 ① 2、② 3、③ 4、④ 6;座標取色 ① 1、② 2、③ 3;物體偵測 ① 4、② 10(第 n 個物體=面積第 n 大的物體)。

積木 傳回 哪個模式有值 值編號 意思
神攝手 連接埠[1] 設定模式 [模式 ▾] — 全部 0xE0 切相機模式與子選項(E0 [相機模式, 子選項],會存進相機);切完等 50 ms
神攝手 連接埠[1] 設定取樣點 第 (數字) 點 x (數字) y (數字) — 全部 0xE1 改座標取色的取樣點位置(E1 [第幾點, X, Y],像素,會存進相機)
神攝手 連接埠[1] 目前模式編號 11~52 全部 0x01 相機模式 × 10 + 子選項(例 13 = 顏色追蹤 ③ 標準、30 = 照順序給色號、41 = 循線黑線、51 = 物體偵測 ① 物體清單)
神攝手 連接埠[1] 已教幾色 0~16 全部 0x03 相機裡教過幾個目標色
神攝手 連接埠[1] 第 [1~16] 色 x 0~159 顏色追蹤(11~14) 0x10+(c−1)×k+位置 色塊中心 X 像素(左 → 右);0 = 沒找到
神攝手 連接埠[1] 第 [1~16] 色 y 0~119 顏色追蹤(11~14) 0x10+(c−1)×k+位置 色塊中心 Y 像素(上 → 下);0 = 沒找到
神攝手 連接埠[1] 第 [1~16] 色 寬 0~160 顏色追蹤 ④(14) 0x10+(c−1)×k+位置 色塊寬(像素),只有 ④ 精細有
神攝手 連接埠[1] 第 [1~16] 色 高 0~120 顏色追蹤 ④(14) 0x10+(c−1)×k+位置 色塊高(像素),只有 ④ 精細有
神攝手 連接埠[1] 第 [1~16] 色 數量 0~15 顏色追蹤 ②③④(12~14) 0x10+(c−1)×k+位置 這個顏色有幾塊(大於最小面積的);② ③ ④ 有
神攝手 連接埠[1] 第 [1~16] 色 面積 % 0~100 顏色追蹤 ③④(13~14) 0x10+(c−1)×k+位置 色塊佔畫面的 %(有找到但不到 1% = 1);③ ④ 有
神攝手 連接埠[1] 找到幾色 0~16 顏色追蹤(11~14) 0x10+(c−1)×k+位置 16 個目標色裡有幾色在畫面中
神攝手 連接埠[1] 第 [1~16] 色有找到? 是/否 顏色追蹤(11~14) 0x10+(c−1)×k+位置 第 n 色的 X 大於 0
神攝手 連接埠[1] 取樣點 [1~16] 色相 0~255 座標取色(21~23) 0x10+(i−1)×k+位置 色相碼:0240 色相(紅 0、黃 40、綠 80、青 120、藍 160、紫 200)、241248 白→灰、249~255 黑
神攝手 連接埠[1] 取樣點 [1~16] 飽和度 0~100 座標取色 ②③(22~23) 0x10+(i−1)×k+位置 飽和度(3×3 平均);② ③ 有
神攝手 連接埠[1] 取樣點 [1~16] 明度 0~100 座標取色 ③(23) 0x10+(i−1)×k+位置 明度(3×3 平均);只有 ③ 有
神攝手 連接埠[1] 照順序 第 [1~16] 塊色相 0~255 照順序給色號(30) 0x10~0x1F 由左到右第 n 塊的色相碼(教色時那個顏色的色相)
神攝手 連接埠[1] 照順序 總塊數 0~18 照順序給色號(30) 0x20 畫面裡的色塊總數
神攝手 連接埠[1] 循線 [循線值 ▾] 數字 循線(41~43) 0x10~0x1D 下拉選 14 個循線值之一(值 114 = 編號 0x100x1D);近處/中段/遠處偏移 −100100(線在左=負、右=正)、線角度 −9090
神攝手 連接埠[1] 看到線? 是/否 循線(41~43) 0x15 有線旗標(近 1+中 2+遠 4)不是 0
神攝手 連接埠[1] 第 (數字) 個值 數字 全部 0x10~0x7F 規格值表的「值 N」=編號 0x10+N−1(N 1~112),可以放變數
神攝手 連接埠[1] 讀值編號 (數字) 數字 全部 0x00~0xFF 直接讀一個值編號(十進位,例 16 = 0x10、240 = 0xF0)
神攝手 連接埠[1] 感應器正常? 是/否 全部 0xF0 有回應而且裝置 ID 是目前的神攝手(F0 = 0x034C)
神攝手 連接埠[1] 物體數 0~8 物體偵測(51~52) 0x30(①)/0x60(②) 畫面裡有幾個物體(只看目標色 1~8,最多 8 個);① 編號 0x30、② 0x60
神攝手 連接埠[1] 第 [1~8] 個物體 代碼 0~89 物體偵測(51~52) 0x10+(n−1)×k+0、+1 色號×10+形狀(例 31 = 顏色 3 的圓);0 = 沒有這個物體
神攝手 連接埠[1] 第 [1~8] 個物體 色號 0~8 物體偵測(51~52) 0x10+(n−1)×k+0 這個物體是第幾個目標色;0 = 沒有這個物體
神攝手 連接埠[1] 第 [1~8] 個物體 形狀 0~9 物體偵測(51~52) 0x10+(n−1)×k+1 0 其他/判不出、1 圓、2 橢圓、3 三角形、4 正方形、5 長方形、6 五邊形、7 六邊形、8 星形、9 梯形
神攝手 連接埠[1] 第 [1~8] 個物體 x 0~159 物體偵測(51~52) 0x10+(n−1)×k+2 質心 X 像素(左 → 右);0 = 沒有這個物體
神攝手 連接埠[1] 第 [1~8] 個物體 y 0~119 物體偵測(51~52) 0x10+(n−1)×k+3 質心 Y 像素(上 → 下);0 = 沒有這個物體
神攝手 連接埠[1] 第 [1~8] 個物體 寬 0~160 物體偵測 ②(52) 0x10+(n−1)×k+4 外框寬(像素,右−左+1);只有 ② 物體詳細有
神攝手 連接埠[1] 第 [1~8] 個物體 高 0~120 物體偵測 ②(52) 0x10+(n−1)×k+5 外框高(像素,下−上+1);只有 ② 有
神攝手 連接埠[1] 第 [1~8] 個物體 面積 % 0~100 物體偵測 ②(52) 0x10+(n−1)×k+6 物體佔畫面的 %(有物體但不到 1% = 1);只有 ② 有
神攝手 連接埠[1] 第 [1~8] 個物體 角度 0~179 物體偵測 ②(52) 0x10+(n−1)×k+7 最小外接矩形長邊的角度(往右 = 0,往畫面下方轉為正);只有 ② 有
神攝手 連接埠[1] 第 [1~8] 個物體 頂點數 0~10 物體偵測 ②(52) 0x10+(n−1)×k+8 三角 3、四邊形 4、五邊 5、六邊 6、星 10、圓/橢圓 0;只有 ② 有
神攝手 連接埠[1] 第 [1~8] 個物體 追蹤編號 0~255 物體偵測 ②(52) 0x10+(n−1)×k+9 同一個物體跨幀不變的編號 1~255(0 = 沒有這個物體);只有 ② 有
神攝手 連接埠[1] 第 [1~8] 個物體是 [形狀 ▾]? 是/否 物體偵測(51~52) 物體數+0x10+(n−1)×k+0、+1 第 n 個物體存在而且是這個形狀(選「任何形狀」= 只看有沒有第 n 個物體)
神攝手 連接埠[1] 有 [顏色 1~8/任何顏色] 的 [形狀 ▾] 物體? 是/否 物體偵測(51~52) 物體數+每個物體的色號、形狀 畫面裡有沒有這個顏色+形狀的物體(可選「任何顏色」「任何形狀」)
神攝手 連接埠[1] [顏色 1~8/任何顏色] 的 [形狀 ▾] 物體是第幾個 0~8 物體偵測(51~52) 物體數+每個物體的色號、形狀 第一個(面積最大的)符合的物體是第幾個,可以接到「第 (n) 個物體 x」;0 = 沒有
  • 傳回 −32768:讀不到(逾時、檢查碼錯、沒接)或這個模式/子選項沒有這個值(例:① 最多色沒有寬、高)。布林積木這時是「否」。
  • 每色裡的位置:① X Y;② X Y 數量;③ X Y 面積 數量;④ X Y 寬 高 數量 面積(跟 讀值參考:I2C 的順序一樣)。
  • 參數超出範圍會夾到上下限(第 0 色當第 1 色、第 99 色當第 16 色;第 0 個物體當第 1 個、第 99 個當第 8 個)。

「循線[循線值 ▾]」的 14 個選項

選項 值編號 範圍 說明
近處偏移 0x10 −100~100 線在左=負、右=正
中段偏移 0x11 −100~100
遠處偏移 0x12 −100~100
線角度 0x13 −90~90
近處線寬 % 0x14 0~100
有線旗標 0x15 0~7 近 1+中 2+遠 4
路口類型 0x16 0~5 0 無 1 十字 2 T 3 左 4 右 5 盡頭
路口距離 % 0x17 0~100
近處線左緣 0x18 −100~100
近處線右緣 0x19 −100~100
遠處線寬 % 0x1A 0~100
標記線色號 0x1B 0~8 穿過的彩色標記線色號
標記線條數 0x1C 0~99 標記線累計條數
最後離線方向 0x1D 0~2 0 有線 1 左 2 右

物體偵測(相機模式 5,v2.2.0)

相機把目標色 1~8 的色塊各當成一個「物體」,再從輪廓判斷形狀。每幀最多 8 個,面積大的排前面(物體 1=最大);沒有那一個物體的格子都是 0。9~16 色照樣能做顏色追蹤,只是不當物體。

  • ① 物體清單(51):每個物體 4 個值(k=4):色號、形狀、X、Y;物體數在 0x30。
  • ② 物體詳細(52):每個物體 10 個值(k=10):色號、形狀、X、Y、寬、高、面積 %、角度、頂點數、追蹤編號;物體數在 0x60。
  • ① 沒有的欄位(寬、高、面積、角度、頂點數、追蹤編號)在 51 讀到 −32768,要用就切 52。
  • 代碼=色號 × 10 + 形狀(例 31=顏色 3 的圓、13=顏色 1 的三角形;0=沒有這個物體)。
  • X、Y 是質心(顏色追蹤的 X、Y 是外框中心,兩者不同);寬高=外框(右−左+1、下−上+1)。角度 0~179:最小外接矩形長邊,往右=0,往畫面下方轉為正。追蹤編號 1~255:同一個物體跨幀不變。
  • 「第 (n) 個物體」的 n 是輸入下拉:可以選 1~8,也可以放變數,例如「[顏色 1] 的 [三角形] 物體是第幾個」的結果。
  • 顏色、形狀選單都有「任何」:「有 [任何顏色] 的 [三角形] 物體?」=有沒有任何三角形;「第 (n) 個物體是 [任何形狀]?」=有沒有第 n 個物體。
形狀號 形狀 頂點數
0 其他/判不出 0~10
1 圓 0
2 橢圓 0
3 三角形 3
4 正方形 4
5 長方形 4
6 五邊形 5
7 六邊形 6
8 星形 10
9 梯形 4

通訊方式

  • 讀值:主機送 1 byte[編號] → 相機回 [值低][值高][編號 ^ 值低 ^ 值高](int16 小端);沒有的編號回 [00][80][編號^80](−32768)。函式庫等 10 ms。
  • 寫入:E0[相機模式, 子選項]、E1[第幾點, X, Y];參數收齊才回 ACK [00][00][編號] 再執行,20 ms 沒收齊就丟棄。EF 回 ACK 後重開機;沒有 F8(換位址只對 I2C 有意義)。
  • 整包 FD 會回 235 byte(116 個值),超過 Arduino UNO 串口緩衝 64 byte,所以擴展不提供「更新全部數值」,每顆積木只問自己要的那一個值(一個值約 1 ms)。
  • 共用值:F0 裝置 ID=0x034C(「感應器正常?」就是看這個)、F1 協議版 2、F2 韌體版 100、F3 狀態旗標(bit0 就緒=開機完成且鏡頭正常、bit1 目前模式有找到東西)。

最小程式

切到顏色追蹤 ③ 標準,目標 1 在畫面裡就亮綠燈(越右邊越亮),沒有就亮暗紅燈:

當 mBot 啟動時 :: events hat
wait (2) seconds
神攝手 連接埠 [1 v] 設定模式 [顏色追蹤 ③ 標準 v] :: #E8590C
forever
  if <神攝手 連接埠 [1 v] 第 [1 v] 色有找到? :: #E8590C> then
    LED 燈位置 [全部 v] 的三原色數值為 紅 (0) 綠 (神攝手 連接埠 [1 v] 第 [1 v] 色 x :: #E8590C) 藍 (0) :: looks
  else
    LED 燈位置 [全部 v] 的三原色數值為 紅 (40) 綠 (0) 藍 (0) :: looks
  end
end
🔧 等價 Arduino 程式(mBot)
// 神攝手 × mBot:最小讀值程式(跟上面的積木做一樣的事,Arduino IDE 版)
// 需要 Makeblock 函式庫+MBC_Sensors v2.2.0(擴展 .mext 解壓後 src/ 的四個檔放進 文件/Arduino/libraries/MBC_Sensors/)
#include <MeMCore.h>
#include <SoftwareSerial.h>
#include <MBC_Sensors.h>

MBCPort cam(1);                 // 相機接 mBot 連接埠 1
MeRGBLed rgbled(7, 2);

void setup() {
  cam.begin();
  delay(2000);                  // 等相機開機
  ucSetMode(cam, 13);           // 顏色追蹤 ③ 標準(E0 [1, 3])
  while (1) {
    if (ucFound(cam, 1)) {      // 第 1 色有找到?
      int x = ucBlob(cam, 1, 0);          // 第 1 色 x(0~159)
      rgbled.setColor(0, 0, x, 0);        // 越右邊越亮的綠燈
    } else {
      rgbled.setColor(0, 40, 0, 0);       // 沒找到:暗紅燈
    }
    rgbled.show();
  }
}

void loop() {}

物體偵測的最小程式:切到物體偵測 ① 物體清單,看到顏色 1 的三角形就亮綠燈,沒有就亮紅燈(完整的「追紅色三角形」在 mBlock 新手範例 6):

當 mBot 啟動時 :: events hat
wait (2) seconds
神攝手 連接埠 [1 v] 設定模式 [物體偵測 ① 物體清單 v] :: #E8590C
forever
  if <神攝手 連接埠 [1 v] 有 [顏色 1 v] 的 [三角形 v] 物體? :: #E8590C> then
    LED 燈位置 [全部 v] 的三原色數值為 紅 (0) 綠 (255) 藍 (0) :: looks
  else
    LED 燈位置 [全部 v] 的三原色數值為 紅 (255) 綠 (0) 藍 (0) :: looks
  end
end
🔧 等價 Arduino 程式(mBot)
// 神攝手 × mBot:看到顏色 1 的三角形亮綠燈(物體偵測 ① 物體清單)
#include <MeMCore.h>
#include <SoftwareSerial.h>
#include <MBC_Sensors.h>

MBCPort cam(1);                 // 相機接 mBot 連接埠 1
MeRGBLed rgbled(7, 2);

void setup() {
  cam.begin();
  delay(2000);                  // 等相機開機
  ucSetMode(cam, 51);           // 物體偵測 ① 物體清單(E0 [5, 1])
  while (1) {
    if (ucHasObj(cam, 1, 3)) {  // 有顏色 1 的三角形(形狀 3)?
      rgbled.setColor(0, 0, 255, 0);
    } else {
      rgbled.setColor(0, 255, 0, 0);
    }
    rgbled.show();
  }
}

void loop() {}

更多範例(聽見顏色、追色塊、靠近就停、看著黑線走、追紅色三角形):mBlock 新手範例。

不用 mBlock:一般 Arduino 板

擴展裡的 MBC_Sensors 函式庫也能直接在 Arduino IDE 用:把 .mext 解壓後 src/ 的四個檔(MBC_Sensors.h/.cpp、mbc_proto.h、mbc_ids.h)放進 文件/Arduino/libraries/MBC_Sensors/,MBCPort 用 begin(串口) 接任何串口。函式名稱跟積木一一對應(ucSetMode、ucBlob、ucFound、ucSpot、ucOrderHue、ucLine、ucObj、ucObjFind、ucHasObj、ucValue、ucOk…)。要接 Arduino 又不需要 mBlock 的話,I2C 版 一次可以連續讀 16 個值,比較快。

// 神攝手(mBlock 版韌體)接一般 Arduino 板的串口(不經 mBot):印出循線的近處偏移與角度
// 需要 MBC_Sensors v2.2.0(同上,不需要 Makeblock 函式庫)。UNO 用軟體串口 D10/D11;Mega 用 Serial1(D19 RX、D18 TX)
#include <SoftwareSerial.h>
#include <MBC_Sensors.h>

MBCPort cam;                    // 不指定連接埠,下面用 begin(串口)
#if defined(__AVR_ATmega2560__)
#define CAM_SERIAL Serial1
#else
SoftwareSerial camSerial(10, 11);   // RX = D10(接相機 TX=IO1)、TX = D11(接相機 RX=IO3,要分壓)
#define CAM_SERIAL camSerial
#endif

void setup() {
  Serial.begin(115200);
  CAM_SERIAL.begin(38400);
  cam.begin(CAM_SERIAL);
  delay(2000);
  Serial.println(ucOk(cam) ? "神攝手 OK" : "沒有回應:檢查接線、韌體是不是 mBlock 版");
  ucSetMode(cam, 41);           // 循線 ① 黑線
}

void loop() {
  Serial.print("近處偏移 ");
  Serial.print(ucLine(cam, 0));
  Serial.print("  角度 ");
  Serial.print(ucLine(cam, 3));
  Serial.print("  路口 ");
  Serial.println(ucLine(cam, 6));
  delay(100);
}

常見問題

  • 讀值一直是 −32768? → 先用「感應器正常?」:否=連接埠選錯、插座片沒插緊、相機燒的不是 mBlock 版韌體;是=模式不對,用「目前模式編號」看相機在哪個模式(顏色追蹤 ③=13、循線黑線=41、物體清單=51)。
  • 積木區沒有「神攝手」分類、或沒有物體積木? → 拖進去的是舊版擴展(v2.1.0 的分類叫「神攝手通用版」、沒有物體偵測;v2.0.0 以前沒有這個分類);照上面「安裝擴展」換 v2.2.0。
  • 物體的寬、高、角度讀到 −32768? → 相機在 ① 物體清單(51);這些欄位只有 ② 物體詳細(52)有。
  • 在相機選單換了模式,積木多久跟著換? → 最慢 0.1 秒(模式編號的快取時間)。
  • 一直「沒找到」? → 相機上還沒教目標顏色,或燈光差太多;看相機螢幕有沒有框住色塊。
  • 能不能用即時模式(不上傳)? → 不行,這個擴展只支援上傳模式。

其他資料

LINE 詢價選購指南