冬營營招生中

2019年7月21日 星期日

[micro:bit Maker] 使用PixyCam模組打造色彩辨識自走車




PixyCam是2013年集資推出的一款色彩辨識相機模組,又稱CMUcam5。簡單來說,這個模組能夠辨識使用者指定的特定顏色,並能將鏡頭前出現的該顏色物體的位置、大小資料傳給它連接的開發板。







PixyCam支援多種通訊方式能和開發板溝通,如SPI、I2C、UART(序列埠)甚至最單純的類比信號。我們將透過I2C方式讓micro:bit接收PixyCam的物體辨識結果。

首先,你必須下載PixyCam的專用軟體PixyMon。(如果您使用的是第二代PixyCam,那麼得使用這個版本。)用mini USB線連接PixyCam背面左側的接頭並連到電腦,然後打開PixyMon。若程式有正確抓到攝影機,就會看到即時畫面。

按主畫面上方大按鈕最右邊的設定鈕,接著在設定畫面下面找Interface(介面),並選擇資料輸出方式為I2C。







你也能看到預設I2C位址是0x54(= 84)。

這時你可以回到主畫面,把要辨識的物體舉在攝影機前,然後選Action → Set signature x... 接著畫面會靜止,讓你用滑鼠把要辨識的顏色圈選起來。圈選好後,就能看到攝影機開始能辨識到該顏色的物體了。






另一個方式是壓住PixyCam上的白色按鈕不放,直到亮起白燈、然後依序亮起紅、橘、黃...燈。這些燈的顏色與辨識物體無關,而是代表第幾個辨識代碼:

  • 紅 = 1
  • 橘 = 2
  • 黃 = 3
  • 綠 = 4
  • 青 = 5
  • 藍 = 6
  • 紫 = 7

在你要的號碼放開手,這時相機會進入辨識學習模式。把你要辨識的物體舉到相機前,相機底下的RGB LED會亮起差不多的顏色,畫面上也會出現如下的格網。物體舉好位置後,再按一下白鈕,這顏色就會記錄在該號碼底下(如紅燈 = 辨識代碼1)。






這個按白鈕設定辨識顏色的方式,不需要接PixyMon也可以進行。等我們把相機接在小車上後,就可以用這個方式快速設定辨識顏色。

現在,我們要把PixyCam連到micro:bit與Nexus:bit擴充板。模組背面有兩排針腳(一代和二代相同):






故我們以杜邦線連接以下腳位:


  • 5V(pin 2)→ Nexus:bit後方的5V針腳
  • GND(pin 6)→ Nexus:bit後方的GND針腳
  • I2C SCL(pin 5)→ Nexus:bit前方側面的SCL針腳
  • I2C SDA(pin 9)→ Nexus:bit前方側面的SCL針腳


這裡我們把NexusBot小車上的超音波模組抽掉,好讓電線能穿過外殼。PixyCam則以橡皮擦和泡棉膠黏貼於車子正面。







PixyCam的資料輸出格式如下



Bytes    16-bit word    Description
----------------------------------------------------------------
0, 1     y              sync: 0xaa55=normal object, 0xaa56=color code object
2, 3     y              checksum (sum of all 16-bit words 2-6, that is, bytes 4-13)
4, 5     y              signature number
6, 7     y              x center of object
8, 9     y              y center of object
10, 11   y              width of object
12, 13   y              height of object


每次會傳一個16-bit的資料。首先是sync(同步碼),作用是分隔每一筆資料並代表資料從何處開始。在顏色辨識模式中,這個值是0xaa55(在micro:bit會讀到-21931)。不過,每筆資料之間也會多插入一筆0xaa55,所以只要連續讀到兩次-21931,就代表有資料可接收了。

程式撰寫如下:



點圖可放大






這樣只要能辨識的物體出現在相機前時,就能讀到該物體的中心點座標與長寬。PixyCam的解析度是320x200,故座標值會落在這個區間。

checksum可用來核對資料是否無誤。不過,不檢查也是無妨啦。





既然能知道物體的中間點及大小,我們就能判斷它是否偏移、以及是否靠近或拉遠。我們給NexusBot小車撰寫程式如下:



點圖可放大






由於車子只能在平面上移動,所以我們只需判斷物體的X座標及寬度。車子會依據物體的位置前進或後退、直走或轉彎。當然,根據你實際使用的物體大小,有可能要修改程式內的數據,才能讓車子在合理的距離靠近或避開物體。

另一個要注意的是,如果操作的環境改變(光源改變),有可能導致物體顏色產生變化、進而令PixyCam無法辨識。因此,最好確定你有在同一個環境下給PixyCam設定好要辨識的顏色(而且是與環境差異夠大、夠鮮明的顏色)。



沒有留言:

張貼留言