NTP 時鐘 – Colorduino & 貪吃蛇

退伍後終於又可以回到熟悉的地方,經過一些該過的程序後繼續在 AppWorks 的實習。時至今日,退伍到現在也已經過了一個月,就用這篇 Colorduino 作為回歸的起頭,而接下來應該每個星期都會發佈新的分享。

回來後第一件事當然是延續我原本的 project – NTP 時鐘,當時還活在粉紅泡泡的我,以為這個 project 已經快到盡頭 (在上一篇還提到這個系列文章只剩兩到三篇分享),在回來開工前跟 Bird 老爸吃飯的時候還天真地問說 NTP 時鐘做完我們下一個要做什麼?殊不知根本還早。

開工後,馬上 Bird 就給了我一個新玩具 – Colorduino。Colorduino 這個東西其實是由 Arduino 的 board 和一個 8×8 RGB LED matrix 組成。

colorduino-v2-chiosz-robots-8

而我用的就是這片 Funduino Colorduino 為基底,上面插上 RGB LED matrix (我一開始測試是用圓點陣,之後用方點陣),而這片 board 上面的重要的東西:

  • ATMega328
  • DM163

ATMega328 是整片 Funduino 的核心,控制 DM163 的運作,也是控制 RGB LED 的陽極 (anode),擁有 8 個 pin 腳,分別掌管 RGB LED 的 col;而 DM163 則是控制 RGB LED 的陰極 (cathode),擁有 24 個 pin 腳,每一個 pin 腳相當於一個 register,每個 register 裡面有存在一組 RGB 的 PWM,即紅綠藍三色個別的亮度。

至於實際運作的方式是,ATMega328 和 DM163 搭配,利用 LED 成像的方式 (即掃描),DM163 寫一次 (24 個 registers),陽極第一個 col 開關一次,DM163 再寫一次,陽極第二個 col 再開關一次⋯⋯以此類推。

有了這些基本的認知後,接下來 Bird 就出了個小考題給我:

請問 Colorduino 沒有 USB interface 可以從我的 Mac 燒錄 program 進我 Colorduino 的晶片,要怎麼做才能和電腦連結做溝通? hint : 使用 UART 作為媒介。

UART 是一種通訊的 protocol,Colorduino 上面有兩個 pin 腳分別是 TXD (transmit) 和 RXD (receive),這兩隻腳就是用來做 UART 通訊的 pin 腳,不過即使知道了這個 hint,我用跳線接了兩隻腳出去也不知道要接哪裡,這就是 FTDI-FT232 登場的時機了。

螢幕快照 2017-04-29 下午8.26.28

FTDI-FT232 是一個 USB 轉 TTL 元件

這個元件上面的六隻腳分別為 VCC,GND,TXD,RXD,RTS,CTS 由此可見,可以用它當作與我的 Mac 和 Colorduino 中間傳輸的橋樑,跳線連接的方式為:

      • FTDI RXD (接收) -> Colorduino TXD (傳送)
      • FTDI TXD (傳送) -> Colorduino RXD (接收)
      • FTDI 5V -> Colorduino VDD
      • FTDI GND -> Colorduino GND

所以說,這是一個 USB 轉 TTL (就是透過 FTDI-FT232 上面中間的那個小 IC 做到的),再透過 UART 通訊 protocol 將訊號傳給 Colorduino 的故事。

提個外話:當時有個小疑問,那我之前在做瓦利號用單一個 Arduino board (直接 USB 連接電腦) 的時候為什麼都不用接 GND 和 VCC?因為 USB 其實裡面有四條線,其中兩條就是 VCC 和 GND (另外兩條 RTS 和 DTR 目前我無法理解,太複雜)。

完成與電腦連接的任務後,下一個任務當然就是燒個什麼東西進去讓他跑跑看,看 work 不 work。因此 Bird 要我先去了解別人在網路上寫的 Colorduino library 裡的 sample code,先去了解程式碼是怎麼運作的。

當然我這個 trouble maker,馬上又出事,程式碼燒錄不進去。各種嘗試後決定求救 Bird 的幫助,最後經過幾回合的試驗,Bird 決定換掉 FTDI-FT232 這個元件,把電腦和 Colorduino 中間的橋樑換成了 Arduino UNO (記得把 MCU 拆掉不然鐵定干擾),原因待查。

P.S 後來有發現了一些蛛絲馬跡,原因 “可能是” FTDI-FT232 有 DTR (reset) 的訊號,但他沒有 DTR 的 pin 腳,所以訊號給不出來,也就給不了 Colorduino,(雖然後來又發現 Colorduino board 上本身有設計一個 reset 的 button,所以也不知道到底是不是因為這個問題導致),另一方面可以確認的是,Arduino UNO 上有 reset pin 可以輸出,剛好可以接到 Colorduino 的 DTR pin 腳,最後終於燒錄成功。

螢幕快照 2017-04-29 下午9.18.04

        • Arduino RX to Colorduino RXD
        • Arduino TX to Colorduino TXD
        • Arduino Reset to Colorduino DTR
        • Arduino +5v and GND to Colorduino +5v and GND.

*眼睛利的人可能有發現,為何在 FTDI-FT232 時是 TX->RX,RX->TX,而到了 Arduino UNO 的時候變成了 TX->TX,RX->RX,原因其實只是當初設計這些 IC 就是這樣設計的,而這些資訊也只能從 schematics 中得知。

燒錄成功後,發現顏色完全不對勁,經過了一番折騰後才將顏色調好 (表示我當時根本沒有完全了解程式碼的意義,而沒有了解程式碼的意義其實是因為我沒有完全懂 DM163 的運作)

Bird 在這裡提醒了我一次 : 你根本沒有完全懂他在幹麻。

簡單來說:DM163 有兩個 shift registers,一個 8 bits 用來控制 LED 的亮度 (0~255),另一個 6 bits 用來做補償。參考資料:DM163 datasheet

搞定這些東西後,我開始餵一些 pattern 讓 pattern 順利的顯示在 LED board 上面,以為如此就想著要往下一步走,但 Bird 要我有個觀念:

要瞭解一個東西的最好方式就是不斷的“玩”它,當你可以隨心所欲地玩它才表示你夠了解他,比如說這個 RGB LED 可以做的事情太多了,你卻只餵他 pattern?現在你缺乏的是強烈的好奇心和觀察力。

剛好 Bird 老爸要出差一星期,我決定在 LED board 上面做個貪吃蛇的小遊戲,只是是一個沒有 input 的貪吃蛇。

原本以為貪吃蛇不難,的確在 software 的 IDE 上面,我用 C++ 寫 LOC 不過也才 100 到 150 行之間,但在這個上面完全不是一件容易的事,只要碰到硬體,一切都沒有想像中容易……(但我愛)

我想像中在 LED board 上的貪吃蛇,他碰到牆就會轉彎,吃到水果會長大,水果被吃掉後會有新的水果在一個新的隨機位置,長大後的身軀還是要照找遊戲邏輯碰到牆就轉彎,而我在實踐我的想法的過程中,在 “轉彎” 的部分遇到最多的麻煩,因為要界定蛇的每一節在每個時刻的某個位置,而且長大後的蛇還要照原先設定的規則,跟著路線神龍擺尾才行,以下是覺得比較關鍵的程式碼供大家參考:

for (col = 0; col < 8; col++)
{
switch (col % 2)
{
case 0:// "even" col
for (int row = 0 + repeat; row < 8 + repeat; row++)
{
switch (repeat)
{
.....//something doing here
}
}
case 1:// "odd number" col
for (int row = 7; row >= 0; row--)
{
switch (repeat)
{
.....//something doing here
}
}
}
}

以下的影片是 simple snake game 小小的 demo:

做完 Bird 也剛好回來了,迎接下一個挑戰!

2 thoughts on “NTP 時鐘 – Colorduino & 貪吃蛇

  1. 引用通告: NTP 時鐘 – 淺談 I2C protocol – 自造者萊恩

  2. 引用通告: LED 點陣 NTP 時鐘 (一) – 笨鳥慢飛

發表留言