MBC 神攝手 × micro:bit(MakeCode JavaScript)

三個步驟用 MakeCode 讀神攝手

micro:bit 用內建的 I2C 指令讀相機,不用加擴充(MBC 擴充還沒有這一代神攝手的積木,這一頁用 JavaScript 文字程式)。照順序做:先接線、貼小幫手、選相機模式,再在當啟動時等相機準備好並切模式,最後在重複無限次裡讀值。左邊一步一步做,右邊的程式會跟著長出來;拖模擬相機畫面看會印出什麼。

v1 尚未上機驗證數值排法已定案並通過電腦端測試,實機數值(fps、循線門檻、I2C 腳位)上機後可能調整。

1

接線、貼小幫手、選相機模式

micro:bit 沒有神攝手的積木,所以先把「小幫手」(讀寫 I2C 的幾個函式)貼在程式最下面,後面的程式就能用 ucReadBlob() 這些函式。

  1. 接線:相機 SDA → P20、SCL → P19、GND → GND;相機一定要外接 5 V(不能吃 micro:bit 的 3V 腳),外接電源的 GND 要跟 micro:bit 接在一起。
  2. I2C 腳位暫定,待上機:相機端目前是 SDA=IO3、SCL=IO1;相機要燒「I2C 版」韌體(跟樂高串口版共用 IO1/IO3,二選一)。
  3. MakeCode 開新專案,切到 JavaScript 分頁,把右邊標 ① 的程式貼上(小幫手在最下面,按「顯示小幫手」看全部;「複製程式」一定是完整的)。小幫手原文也在 MBC_UniCam_v1_Host_Libraries.zip(microbit 資料夾)。
  4. 選相機模式:下面點一個模式編號(模式編號=相機模式 ×10+子選項)。I2C 可以用命令切模式,第 2 步的程式開機時會幫相機切過去。
2

重複無限次的第一圈:等相機、切模式

相機(ESP32)開機要幾秒。「重複無限次」的前幾圈先等相機回應(F3 狀態的「準備好」),再用 E0 命令把相機切到第 1 步選的模式。(小幫手貼在程式最下面,所以跟網站範例一樣在重複無限次裡面才呼叫它。)

開機時要不要用程式切模式?

3

在重複無限次裡讀值

功能依相機模式分組,虛線框的功能是別的模式用的,要換模式才能用(點下去會幫你換,程式的 MODE 跟著改)。點一個功能,右邊的程式和輸出會換成它的範例。

模擬相機畫面:拖動畫面裡的東西,看右邊的輸出怎麼變

模擬畫面是示意:數值直接用畫面上的位置換算(X 0~159 左→右、Y 0~119 上→下、面積 %=寬×高÷整個畫面),色相碼是那張色紙/積木本來的顏色(紅 0、黃 40、綠 80、藍 160、紫 200、白桌面 244、黑膠帶 252),不是相機裡面的算法;實際數值會因光線差一些。顏色追蹤假設相機上已經教了 4 色:色 1 紅、色 2 綠、色 3 藍、色 4 黃。物體偵測的形狀是你直接選的(不是相機判斷的),物體 1、2…照面積由大到小排,X、Y 是形狀的質心(白點)、虛線框是外框,角度就是你轉的角度。

每個功能的範例

每個功能都有一段可以直接放進 basic.forever 的範例,右上角標它能用的模式。按「試試看」會切到第 3 步。

完整範例

更多範例(追色塊、取樣點顏色、照順序、循線小車)在 micro:bit 範例頁。

色 1~4 在哪裡(模式 13)

        

!先在相機上教目標 1~4 的顏色。按「複製」拿到的是完整程式(小幫手已經接好)。

循線讀值(模式 41 黑線)

        

!偏移線在左=負。看不到線時印最後離線方向,往那邊轉就能找回線。

使用注意

  1. 讀不到時每個值是 −32768(UC_NONE)。拔線不會讓程式停,範例都先判斷 == UC_NONE。開機時相機沒回應,程式會一直等在「當啟動時」(LED 顯示小菱形)。在右邊勾「拔掉感應器」看看。
  2. I2C 版每個模式都給 16 色/16 點,數值是像素原值(模式 11 也是),不用拆格子。這個模式沒給的欄位是 −1(例如模式 13 沒有寬高)。
  3. 先判斷有沒有看到。X=0=沒看到。紅色的色相碼是 0,所以照順序給色號要看總塊數才知道前幾個有效。
  4. 座標方向:X 0~159 左→右、Y 0~119 上→下(上=小),中間 X=80。循線偏移:線在左=負、在右=正(站在車後面往前看)。
  5. 命令會存進相機:E0 切模式、E1 改取樣點位置,下次開機還是這個設定。目標顏色只能在相機上教,v1 沒有寫入顏色的命令。
  6. MakeCode 擴充(pxt-mbc-sensors)還沒有這一代神攝手的積木:這一頁用 JavaScript。貼上後切回積木分頁會看到灰色的 JavaScript 積木,照樣能用。