MBC 測距者 8 路 × Arduino

三個步驟用 Arduino 讀測距者 8 路

寫 Arduino 程式照這個順序:先接好線、貼上小幫手,再在 setup() 開始通訊、等感應器準備好,最後在 loop() 用 mbcRead() 讀值。左邊一步一步做,右邊的程式會跟著長出來;拖動模擬感應器下面的障礙物方向和距離,就能看到序列埠監控視窗會印出什麼。

1

接線,貼上小幫手

Arduino 用 I2C(4 條線)跟感應器講話,不用安裝函式庫。程式最上面寫 2 行、最下面貼一段「小幫手」,之後就能用 mbcRead() 讀值、mbcWrite() 送命令。

你用哪一塊板子?(只差 SDA/SCL 接哪兩腳,程式完全一樣)

  1. 接線前先拔掉 USB 線。要用 通用 I2C 版(SPIKE 版、EV3 版的韌體不同,不能接 Arduino)。
  2. 感應器 VCC → 5V、GND → GND
  3. 感應器 SDA → A4、SCL → A5
  4. 感應器裝在車頭。站在車後往前看:第 1 顆朝正左、第 4、5 顆朝正前方、第 8 顆朝正右,每顆隔 30°。
  5. 打開 Arduino IDE:檔案 → 新增,把原本的內容刪掉。
  6. 最上面寫第 1、2 行;最下面貼「小幫手」(右邊程式標 ① 的地方,按「複製程式」會一起拿到)。
2

開始通訊,等感應器準備好

setup() 是開機時只跑一次的地方:打開序列埠、開始 I2C、等感應器說「準備好了」。ADDR 是感應器的「門牌號碼」(I2C 位址),之後每次讀值都寫它。

感應器的 I2C 位址:

找不到感應器的時候:

3

使用功能

讀值寫「mbcRead(ADDR, 編號)」,送命令寫「mbcWrite(ADDR, 命令)」。點一個功能,程式和序列埠監控視窗會換成它的範例。

模擬感應器(從上面看,車頭朝上):拖動障礙物,看右邊序列埠監控視窗怎麼變

模擬畫面是示意:方向和距離用畫面上的位置簡單換算,實際感應器可能差一兩格。紅色扇形 = 那一路量到東西;灰色扇形 = 讀到 120(那個方向沒有東西)。第 4、5 路都朝正前方。拔掉感應器時,Arduino 讀到的每個值都是 -32768。

每個功能的範例

21 個功能(讀值、每款 MBC 感應器都有的共用編號和命令),每個都有一段範例。按「試試看」會切到第 3 步,右邊的程式和序列埠監控視窗會換成這個範例。

完整範例

按「複製」拿到的是完整程式(最下面已經接好小幫手),貼進 Arduino IDE 就能上傳。

避障小車(L298N 馬達驅動板)

        

!只改最上面「可以改的參數」就好。前面空的就直走;正前方 TURN_CM 以內有東西,就往東西的反方向轉;快撞到(BACK_MM 以內)先倒退。哪個輪子轉反了,就把那一顆的 REVERSE 改成 true。L298N 的 GND 要跟 Arduino 的 GND 接在一起。

雷達長條圖

        

!一次讀 0x10~0x17 八顆 cm,畫成 8 條長條:長條越長 = 那個方向越空曠,很短 = 有東西擋著。順便讀 0x08 故障位元圖,壞掉那顆標 XX。

最近的東西在哪個方向?

        

!感應器自己比較 8 顆雷射:0x01 最近距離、0x02 最近方向。畫一把小尺,用 * 標出方向(+ = 正前方)。相撲機器人「找對手」用的就是這個。一定先看距離:120 公分內沒東西時,方向是 ±8,不能信。

使用注意

  1. 拔線不會讓程式停。讀不到時 mbcRead() 回傳 -32768(MBC_NONE),mbcReadMany() 回傳 false;插回去就恢復。要知道有沒有接好,就看讀到的是不是 MBC_NONE。在右邊勾「拔掉感應器」可以看到這個情形。避障小車讀不到感應器時要先停車(完整範例就是這樣做)。
  2. 開機要等 2~4 秒。感應器一通電要把 8 顆雷射一顆一顆叫醒;還沒就緒前距離都是 0,看起來像貼著障礙物。所以第 2 步的 mbcWaitReady() 最多等 6 秒(跟網站範例一樣)。選「繼續跑」的話,前幾秒讀到的 0 不能信。
  3. 方向:站在車後面往前看,左邊是負數、右邊是正數。有東西時方向是 −7 ~ +7(−7 正左、0 正前方、+7 正右);±8 = 四周沒有東西(停在上次看到的那一側)。所以先看距離再看方向:距離小於 120 才去看方向。
  4. 讀到 120(或 1200 mm):那個方向真的沒東西、超過 120 公分,或那顆雷射壞了。壞掉那顆一直是 120,會被當成「最空曠」,要分辨就讀 0x08 故障位元圖。黑色、亮面、透明的東西比較難量,判斷距離建議設在 60 公分以內。
  5. 連號一次讀:0x01~0x09、0x10~0x17(8 顆 cm)、0x18~0x1F(8 顆 mm)各是一段連號,用 mbcReadMany() 一次讀(一次最多 16 格),保證是同一瞬間的資料。小幫手裡的 delay(2) 不要刪;序列埠監控視窗選 115200。測距者 2 路和 8 路出廠都是 0x29,要一起用就先用 F8 把其中一顆換位址。