之前在電子材料行買東西時,不經意看到店家有進貨8X8矩陣LED的模組(含MAX7219驅動IC),順手就買了下來。
由於此模組採SPI介面傳輸,有找到LedControl Library可以使用,但是要用Arduino程式語言來寫,所以就與S4A無緣了。稍微測試了一下,發現還挺有趣的,與生活中的跑馬燈、電視牆及紅綠燈的小綠人都有相關,如果能讓中小學生用S4A來操作,在學習上的效果應該會很不錯。於是便有了以下的嘗試…
【修改構想】
首先要提到S4A的限制,其中之一是內定腳位,腳位的功能被定住,不像在Arduino程式語言中那麼自由;另一個是不支援library,不能用I2C、SPI或與時脈有關的控制,只能用標準的數位IO及類比IO,特殊的功能,S4A內定的就是支援伺服馬達與連續伺服馬達而已。
怎麼辦呢?先來思考一下Arduino的IO架構。
其架構有二層,上層是Arduino韌體(可支援library)
,下層是Arduino板子上的Atmega處理器。
那S4A的架構又是如何呢?
S4A有三層架構,上層是S4A軟體(PC端),中層是S4A韌體,下層是Atmega處理器。其實S4A韌體與Arduino韌體是屬於同一層次的東西,Arduino韌體可以支援library,難道S4A韌體就不行嗎?於是這樣的想法就產生了修改後S4A韌體的架構圖,如下圖:
在中層S4A韌體中加入library支援,並且將數位及類比的輸出做了攔截,讓輸出不直接控制針腳,改成是去控制library,如此就可增加S4A的功能。
還有一個問題,就是S4A內定接腳的問題,此問題已有范運平老師與江昭漢老師在實作中提供解決方法,讓S4A的積木能與修改後的韌體相配合。感謝老師們的努力與分享,讓我能在此基礎上,將這部分順利的解決。
那在S4A中要如何控制8X8矩陣LED,在LedControl的library中,有個method是setColumn,可以一次控制一排LED(8個),只要給它一個Byte的資料即可(相當於8個bit,用bit來代表LED的亮暗),所以打算用S4A的類比輸出來控制一排LED,只要8個類比輸出,就可以控制8X8矩陣LED。再此可能有人會有疑惑,Arduino UNO上的類比輸出不是最多只有6個嗎?別忘了,在修改的S4A韌體中,輸出會導向library,並不會真正去控制針腳,所以讓S4A以為有8個類比輸出是OK的。另外為了怕混淆,會將S4A中的analog積木改名為ledMatrix積木,以方便辦別。
接下來就是實際的修改部分了。
【S4A韌體修改】
以下S4A韌體為1.5版
在S4A韌體開頭有修改的部份如下:
-----------------------------------------------------
#include "LedControl.h" LedControl lc=LedControl(12,11,10,1);-----------------------------------------------------
一開始是引入library,並產生一個控制物件lc
再來是韌體中輸出腳位的類型變更:
--------------------------------------------
outputs[0] = 'a'; //pin 4 outputs[1] = 'a'; //pin 5 outputs[2] = 'a'; //pin 6 outputs[3] = 'a'; //pin 7 outputs[4] = 'a'; //pin 8 outputs[5] = 'a'; //pin 9 outputs[6] = 'a'; //pin 10 outputs[7] = 'a'; //pin 11 outputs[8] = 'd'; //pin 12 outputs[9] = 'd'; //pin 13--------------------------------------------
讓S4A中4~11都變成類比輸出。
最後是攔截輸出的部分:
----------------------------------------------------------------------------------------
void updateActuator(int pinNumber) { //add if (outputs[pinNumber] == 'a'){ switch( pinNumber + 4 ){ case 4 : lc.setColumn(0, 0, states[pinNumber]); break; case 5 : lc.setColumn(0, 1, states[pinNumber]); break; case 6 : lc.setColumn(0, 2, states[pinNumber]); break; case 7 : lc.setColumn(0, 3, states[pinNumber]); break; case 8 : lc.setColumn(0, 4, states[pinNumber]); break; case 9 : lc.setColumn(0, 5, states[pinNumber]); break; case 10 : lc.setColumn(0, 6, states[pinNumber]); break; case 11: lc.setColumn(0, 7, states[pinNumber]); break; } } }----------------------------------------------------------------------------------------
所有的4~11類比輸出都被導向library的控制。(當然,原本的輸出功能也消失了)
這樣S4A的韌體的修改算告一段落。
修改的S4A韌體可在此下載(已內含LedControl library)
【S4A介面修改】
S4A介面的修改可參考范運平老師的文件
大致上的步驟是將類比積木的pinNumber擴充為4~11,如下圖
伺服馬達與連續伺服馬達的積木拿掉
還有就是將analog積木改名稱為ledMatrix,如下
改好的S4A介面要另存成一個image,有2個image會讓S4A開啟時要選擇一下
,但是這樣就可以保留原本的S4A介面了。
到此S4A介面修改完成。
修改後的S4A介面image可於此下載(約7Mb)
【使用方式、接線與應用】
內容較多,請見另一篇文章 【S4A小專案】矩陣LED小動畫(需用修改後韌體)
【結語】
雖然針對Scratch2.0 for Arduino的解決方案慢慢的在開發中,但是原本的S4A還算穩定,且應該還會再存在一陣子,本文將原本S4A的功能嘗試加入library的支援,雖然在實際使用上會增加複雜度(韌體安裝與S4A介面image安裝),但是卻也增加了S4A的可能想像空間,試想一些原本只能用library才能控制或是取得偵測值的硬體,如I2C、超音波模組、溫溼度偵測…也許都有機會能以S4A控制。當然,還是得實際試做看看效果如何,並要相容於S4A的架構才行。
【延伸閱讀】
不好意思想請問:還有就是將analog積木改名稱為ledMatrix,如下(的那張圖)
回覆刪除程式碼怎麼修改
你點入那張圖,看到紅色圈起來的部分,從blockSpecs開始算,第四行的第二個#號處,那裡原本的字串我已改成ledMatrix,那個字串,打什麼英文,應該積木就會出現什麼。我只是取巧讓積木顯示改名字而已,你試試看吧。
回覆刪除