MBC 循行者 8 路 × 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. 感應器裝在車上時,底部離地面約 0.5~1 公分最準。
  5. 打開 Arduino IDE:檔案 → 新增,把原本的內容刪掉。
  6. 最上面寫第 1、2 行;最下面貼「小幫手」(右邊程式標 ① 的地方,按「複製程式」會一起拿到)。
2

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

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

感應器的 I2C 位址:

找不到感應器的時候:

3

使用功能

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

模擬感應器(從車子後面往前看):拖動黑線,看右邊序列埠監控視窗怎麼變

模擬畫面是示意:數值算法簡化過,實際感應器可能差一兩格。光值 0 = 黑、100 = 白;紅框 = 那一路判斷在線上(光值低於門檻 50)。拔掉感應器時,Arduino 讀到的每個值都是 -32768。

每個功能的範例

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

完整範例

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

循線小車(L298N 馬達驅動板)

        

!只改最上面「可以改的參數」就好。車子左右搖擺:把 KP 調小;轉不過彎:調大。哪個輪子轉反了,就把那一顆的 REVERSE 改成 true。L298N 的 GND 要跟 Arduino 的 GND 接在一起。

一次讀很多格(mbcReadMany)

        

!0x01~0x08 是連號,一次讀回來保證是同一瞬間的資料,也比讀 8 次快。陣列 v[0] 是 0x01、v[7] 是 0x08。

跟其他 MBC 感應器一起用

        

!同一條 I2C 線(SDA、SCL)可以接好幾顆,只要位址不一樣:循行者 0x16、測距者 0x29。小幫手只要貼一次。

使用注意

  1. 拔線不會讓程式停。讀不到時 mbcRead() 回傳 -32768(MBC_NONE),mbcReadMany() 回傳 false;插回去就恢復。要知道有沒有接好,就看讀到的是不是 MBC_NONE。在右邊勾「拔掉感應器」可以看到這個情形。循線小車讀不到時要先停車。
  2. 感應器每 10 ms 更新一次。連號的值(例如 0x01~0x08、0x10~0x17)用 mbcReadMany() 一次讀,保證是同一瞬間的資料。
  3. 小幫手裡的 delay(2) 不要刪。寫完編號要等 2 ms 再讀。序列埠監控視窗的速度要選 115200,不然會看到亂碼。
  4. 方向:站在車後面往前看,線在左邊是負數、右邊是正數;第 1 路在最左邊(編號 0x10)。
  5. 丟線:要判斷「真的看不到線」用 0x03 線寬 == 0(或 0x04 線段數 == 0);0x06 最後離線方向告訴你線最後在哪一側,往那邊轉就能找回線(完整範例的循線小車就是這樣做)。