2014年4月9日 星期三

【S4A韌體】修改S4A控制矩陣LED做法說明

【緣起】

之前在電子材料行買東西時,不經意看到店家有進貨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的架構才行。

【延伸閱讀】

Controlling a Led matrix or 7-segment displays with the MAX7219 or the MAX7221

LedControl

變更 S4A 的 PIN 腳定義以符合不同的硬體需求

S4A控制二個以上RC伺服機






2 則留言:

  1. 不好意思想請問:還有就是將analog積木改名稱為ledMatrix,如下(的那張圖)
    程式碼怎麼修改

    回覆刪除
  2. 你點入那張圖,看到紅色圈起來的部分,從blockSpecs開始算,第四行的第二個#號處,那裡原本的字串我已改成ledMatrix,那個字串,打什麼英文,應該積木就會出現什麼。我只是取巧讓積木顯示改名字而已,你試試看吧。

    回覆刪除