MBC 測距者 2 路 × Arduino

三個步驟用 Arduino 讀測距者

寫 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. 感應器裝在車頭、雷射朝前。「左、右」是你站在車子後面往前看的左右。
  5. 打開 Arduino IDE:檔案 → 新增,把原本的內容刪掉。
  6. 最上面寫第 1、2 行;最下面貼「小幫手」(右邊程式標 ① 的地方,按「複製程式」會一起拿到)。
2

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

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

感應器的 I2C 位址:

找不到感應器的時候:

3

使用功能

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

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

模擬畫面是示意:距離直接用畫面上障礙物的位置換算,實際雷射會有 1~2 公分的誤差,大約每 0.1 秒才更新一次。120 = 前面沒東西(或超過 120 公分)。拔掉感應器時,Arduino 讀到的每個值都是 -32768。

每個功能的範例

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

完整範例

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

用 mm 精準停車(L298N 馬達驅動板)

        

!只改最上面「可以改的參數」就好。車子會往前開,離牆 SLOW_MM 以內開始減速,到 STOP_MM(預設 200 mm = 20 公分)停下。哪個輪子轉反了,就把那一顆的 REVERSE 改成 true。L298N 的 GND 要跟 Arduino 的 GND 接在一起。

左邊近還是右邊近?(畫長條)

        

!0x01~0x03 是連號,用 mbcReadMany() 一次讀。拿手從左邊移到右邊,看兩條長條怎麼變:長條越長 = 越遠,每一格 10 公分。

雷射健康檢查

        

!壞掉的那顆距離會一直是 120/1200,看起來像「前面沒東西」,所以要靠 0x06 初始化位元圖和 0x07 故障位元圖分辨。這個範例故意不等就緒,開機失敗時也看得到是哪一顆沒起來。比賽前跑一下。

使用注意

  1. 拔線不會讓程式停。讀不到時 mbcRead() 回傳 -32768(MBC_NONE),mbcReadMany() 回傳 false;插回去就恢復。要知道有沒有接好,就看讀到的是不是 MBC_NONE。在右邊勾「拔掉感應器」可以看到這個情形。小車讀不到感應器時要先停車(完整範例的停車小車就是這樣做)。
  2. 讀到 120(或 1200 mm)有 3 種可能:前面真的沒東西、東西超過 120 公分、那顆雷射壞了。要分清楚就讀 0x07 故障位元圖。黑色、亮面、透明的東西比較難量,黑色物體大概 30~50 公分外就量不到。
  3. 兩顆雷射開機要 1~3 秒。所以第 2 步的 mbcWaitReady() 最多等 4 秒。小幫手裡的 delay(2) 不要刪。序列埠監控視窗的速度要選 115200,不然會看到亂碼。
  4. 連號一次讀:0x01~0x08 是連號,用 mbcReadMany() 一次讀,保證是同一瞬間的資料。雷射大約每 0.1 秒才量好一次,loop() 不用讀太快。
  5. 方向與單位:站在車後面往前看(左右以感應器朝前、從背後看為準:左=J5、右=J3),左邊那顆是 0x01(cm)、0x04(mm),右邊那顆是 0x02、0x05。mm 比 cm 精細 10 倍,要精準停車就用 mm。測距者 2 路和 8 路出廠都是 0x29,要一起用就先用 F8 把其中一顆換位址。