MATRIX mVision 讀值教學
警告
v1 尚未上機驗證:數值排法已定案並通過電腦端測試,實機數值(fps、循線門檻、I2C 腳位)上機後可能調整。
神攝手(MATRIX 版)對 MATRIX Mini R4 來說就是一台 mVision 攝影機:用 MATRIXblock 內建的 mVision 積木讀,不用裝函式庫,也不走 I2C。每一格的完整對照在 讀值參考:MATRIX,整支範例在 MATRIX 範例。
接線
- 相機接 Mini R4 給 mVision 攝影機用的串口(Serial1,115200)。
- 相機螢幕左上角顯示主機名稱:綠色=連線中、紅色=斷線。
- 在相機的 MODE 選單選相機模式和子選項(見 產品首頁 的「相機上的操作」)。MATRIX 讀不到相機現在的模式,程式要照你選的模式解讀。
10 格資料
- 積木「mVision 資料 0~9」每格一個 0~65535 的數。讀值參考的「格 1」=積木的資料 0、「格 10」=資料 9。
- 資料 10 不要用:MATRIX 程式只宣告 10 格,第 10 格讀到的是別的記憶體。
- 一格常常放兩個值:A+B×256,A=讀到的數除以 256 的餘數、B=讀到的數 ÷ 256(取整數)。
- 座標用 160×120 像素(X 0~159 左→右、Y 0~119 上→下),0=沒看到。
- 會有負數的值(循線偏移、角度、左右緣)是 +100 送,讀到後減 100。
以顏色追蹤 ③ 標準(5 色 XY+面積)為例:
| 積木 | 內容 | 換算 |
|---|---|---|
| mVision 資料 0 | 色 1 X + 色 1 Y × 256 | X=餘數(÷256)、Y=÷256 取整數 |
| mVision 資料 1 | 色 1 面積 % + 色 1 數量 × 256 | 面積=餘數、數量=÷256 取整數 |
| mVision 資料 2、3 | 色 2 位置、面積與數量 | 同上 |
| mVision 資料 4~9 | 色 3~色 5 | 同上 |
在 MATRIXblock 用「數學」的除法、取餘數積木換算;先判斷 X 不是 0 再用座標。
其他相機模式
| 相機模式 | MATRIX 給多少 |
|---|---|
| 顏色追蹤 ① 最多色/② 多色/④ 精細 | 16 色/10 色/3 色 XYWH |
| 座標取色 ①/②/③ | 20 點色相/10 點色相+飽和/6 點色相+飽和+明度 |
| 照順序給色號 | 18 塊色相碼+總塊數 |
| 循線 | 14 個值(偏移、角度、線寬、路口…) |
| 物體偵測 ① 物體清單/② 物體詳細 | 4 個物體代碼+面積、XY+物體數/3 個物體再加寬高(下面一節) |
每一格放什麼看 讀值參考:MATRIX。
相機模式 5 物體偵測
相機把畫面裡的物體由大到小排好(物體 1 最大),每個物體給物體代碼=色號 × 10 + 形狀(例 13=目標 1 的三角形,0=沒有)。形狀:0 其他、1 圓、2 橢圓、3 三角、4 正方、5 長方、6 五邊、7 六邊、8 星、9 梯形。X、Y 是物體的質心;只看目標色 1~8。模式編號 51=① 物體清單、52=② 物體詳細。代碼再拆:色號=代碼 ÷ 10(取整數)、形狀=代碼除以 10 的餘數。
| 積木 | 51 物體清單(4 個) | 52 物體詳細(3 個) |
|---|---|---|
| mVision 資料 0 | 物體數(不用拆) | 物體數(不用拆) |
| 物體 i 第 1 格 | 資料 2i−1:代碼=餘數(÷256)、面積 %=÷256 取整數 | 資料 3i−2:代碼、面積 % |
| 物體 i 第 2 格 | 資料 2i:X=餘數、Y=÷256 | 資料 3i−1:X、Y |
| 物體 i 第 3 格 | — | 資料 3i:寬=餘數、高=÷256(像素) |
51 的資料 9 不用。MATRIX 不給角度、頂點數、追蹤編號(要這些用 I2C 版)。在 MATRIXblock 用「數學」的除法、取餘數積木拆;C++ 這樣讀物體 1:
#include <MatrixMiniR4.h>
unsigned int CamData[10]; // mVision 的 10 格(資料 0~9)
void setup() {
MiniR4.begin();
MiniR4.Vision.Begin(); // 開始收 mVision(Serial1 115200)
Serial.begin(115200);
}
void loop() {
if (MiniR4.Vision.SmartCamReader(CamData) > 0) { // 相機切在 物體偵測 ① 物體清單(51)
int n = CamData[0]; // 資料 0:物體數
int code = CamData[1] % 256; // 資料 1 餘數:物體 1 代碼(色號 × 10 + 形狀)
int area = CamData[1] / 256; // 資料 1 ÷256:物體 1 面積 %
int x = CamData[2] % 256; // 資料 2 餘數:物體 1 X
int y = CamData[2] / 256; // 資料 2 ÷256:物體 1 Y
Serial.print("物體數 "); Serial.print(n);
Serial.print(" 物體 1 代碼 "); Serial.print(code);
Serial.print(" 色號 "); Serial.print(code / 10);
Serial.print(" 形狀 "); Serial.print(code % 10);
Serial.print(" X "); Serial.print(x);
Serial.print(" Y "); Serial.print(y);
Serial.print(" 面積 "); Serial.println(area);
}
delay(50);
}範例裡的小幫手 ucObject(mode, i, o)、ucObjectCount(mode)、ucShapeName(s) 已經包好這些,看 MATRIX 範例 3。
逐格對照與範例
- 讀值參考:MATRIX
- MATRIX 範例程式
- 色相碼、格子換算:產品首頁
常見問題
- 讀到怪數字? 確認沒有用到「資料 10」;只有資料 0~9 有意義。也確認相機右上角的「模式-子選項」跟你程式解讀的一樣。
- 用顏色感應器積木讀不到? 這個產品在 MATRIX 走串口,只能用 mVision 積木。