Excel VBAを使ってアイコン用のカラーデータを作成しました。
出来上がったアイコンデータをP4LED MATRIX PANEL 64×32 に表示させてみました。
クリスマス用にアイコンを作成し、それをLEDパネルに表示させた動画です。
明るすぎてカメラが反応できなく見にくい画像になっています。
最初に「Merry Christmats」と、作成したアイコンを表示した後、「Merry Christmas to you!」とスクロールしています。
Excel VBAを使用するにあたって、VBAのカラー設定を確認しました。
1.Excel VBAで使用するカラーは、Color-Index が 1~56 まであります。
そのカラーについて、RGB、16進数コード、10進数コードを表示し、そのデータをArduino用の
16bitカラーデータに変換しました。
(1) Excelの16進数カラーコードは、その仕様のため RGBの順序でなく、BGRの順になっています。
例えば、赤色はRGB(255,0,0) ですが、Excelでは、16進数カラーコードは &H0000FF となっています。
通常の場合と区別するため先頭に"&H"を付けています。
したがって、10進数コード表示は、
RED + GREEN*256 + BLUE*256*256 = 255 + 0*256 + 0*256*256 = 255
となっています。
(2)通常の場合、RGB(255,0,0)は、16進数表示で0xFF0000 と表され、10進数コード表示は、
RED*256*256 + GREEN*256 + BLUE = 255*256*256 + 0*255 + 0 = 16711680
となります。
(3)以下の図が、Excel VBAで使用するカラーとそのカラーコードの出来上がった表です。
最初にIndexの列に1~56を入力して、「カラー表示」ボタンをクリックすると列Aにカラーが表示されます。
次に「code変換」ボタンをクリックすると Excel VBA 用のカラーコードが表示され、最後に、「bit変換」ボタンを
クリックすると、通常の場合の10進数、24bit、16bitのコードが表示されます。
(4)Excel VBAのプログラムを次に表記しておきますが、急ごしらえで参考にならないと思います。
Option Base 1 Dim i As Integer Dim CNo, Red, Green, Blue As Long Private Sub code変換_Click() Dim Exhex As String Dim Exlen24 As Integer Workbooks("color_bit変換.xlsm").Activate Worksheets("color_sheet").Activate For i = 1 To 56 CNo = Range("A" & i + 3).Interior.color Range("E" & i + 3) = CNo Red = CNo Mod 256 Green = Int(CNo / 256) Mod 256 Blue = Int(CNo / 256 / 256) Range("C" & i + 3) = "RGB(" & Red & "," & Green & "," & Blue & ")" Exhex = Hex(Range("E" & i + 3)) Exlen24 = 6 - Len(Exhex) Range("D" & i + 3) = "&H" + Left("000000", Exlen24) + Exhex Range("F" & i + 3) = Red * 256 * 256 + Green * 256 + Blue Next End Sub ------------------------------------------------------------------------------------------------------ Private Sub bit変換_Click() Dim hexd24 As String Dim hexd16 As String Dim dlen24 As Integer Dim dlen16 As Integer Dim shift8 As Long Dim shift5 As Long Dim shift3 As Long Workbooks("color_bit変換.xlsm").Activate Worksheets("color_sheet").Activate Range("G4:H59").NumberFormatLocal = "@" For i = 1 To 56 hexd24 = Hex(Range("F" & i + 3)) dlen24 = 6 - Len(hexd24) Range("G" & i + 3) = "0x" + Left("000000", dlen24) + hexd24 shift8 = (Range("F" & i + 3) \ (2 ^ 8)) And 63488 shift5 = (Range("F" & i + 3) \ (2 ^ 5)) And 2016 shift3 = (Range("F" & i + 3) \ (2 ^ 3)) And 31 hexd16 = Hex(shift8 Or shift5 Or shift3) dlen16 = 4 - Len(hexd16) Range("H" & i + 3) = "0x" + Left("0000", dlen16) + hexd16 Next End Sub ------------------------------------------------------------------------------------------------------ Private Sub Color表示_Click() Workbooks("color_bit変換.xlsm").Activate Worksheets("color_sheet").Activate For i = 1 To 56 If Range("B" & i + 3) = "" Or Range("B" & i + 3) = Null Then MsgBox "Color Index が空欄になっています。入力して下さい。" Exit For End If Range("A" & i + 3).Interior.ColorIndex = Range("B" & i + 3) Next End Sub
Excel VBAを使って、LEDパネルの縦16×横16の範囲内でアイコンを作成するようにしました。
LEDパネルなので多くのカラーは必要ないと思い、9色のカラーを使ってアイコンを作るようにしました。
別のカラーが必要なときは、上図のカラーコード表から16bitデータを探してアイコンのデータを後で修正します。
1.Excel VBAのアイコンデータ作成画面
下図が、Excel VBAで作成した画面です。
2.操作方法
(1)アイコンの大きさとして、画面左上の行と列の黄色枠に2~16の数値を入力し中央に格子枠を作ります。
(2)次に「格子作成」ボタンをクリックします。
図の場合は、行に16列に16を入力した場合の格子枠が太枠の中に表示されます。
(3)この格子枠に左のカラーをコピーして貼り付けて、アイコンを作成します。
雪だるまを作成するつもりでカラーを貼り付けたものが下図になります。
(4)次に、画面右上の「color_bit」ボタンをクリックすると、ボタンの右下に各格子の色の16bitカラーコードが
表示されます。
(5)最後に、画面下の「データ作成」ボタンをクリックすると、上記データのデータ間にコンマ","が入った
アイコンデータが作成されます。これをArduino IDEのプログラムに使用します。
(6)雪だるまのアイコンを行=16,列=16で作成してみました。
3.他の例
雪のアイコンを行=10,列=10で作成してみました。
(1)「格子作成」ボタンをクリックすると下図のようになります。
(2)カラーをコピーして格子に貼り付けたのが次の図(雪の結晶?)になります。
右下にデータが作成されています。
4.参考になりませんが、Excel VBAのプログラムを次に表記しておきます。
Option Base 1 Dim i As Integer Dim j As Integer Dim ind As Integer Dim gyou As Integer Dim retu As Integer Private Sub 格子作成_Click() Workbooks("icon_data.xlsm").Activate Worksheets("icon").Activate gyou = Range("B2") retu = Range("D2") Range("F6:V22").Clear Range("F6:V22").ClearFormats If gyou < 2 Or gyou > 16 Then MsgBox "行・列の値は、2~16の数値を入力して下さい。" Exit Sub End If If retu < 2 Or retu > 16 Then MsgBox "行・列の値は、2~16の数値を入力して下さい。" Exit Sub End If For i = 1 To retu Cells(i + 6, 6) = i Next For i = 1 To gyou Cells(6, i + 6) = i Next Range(Cells(7, 7), Cells(gyou + 6, retu + 6)).Borders.LineStyle = True Range("Y7:AN22").Clear Range("Y25:Y40").Clear End Sub --------------------------------------------------------------------------------- Private Sub color_bit_Click() Dim ind As Integer Workbooks("icon_data.xlsm").Activate Worksheets("icon").Activate For j = 1 To gyou For i = 1 To retu ind = Cells(j + 6, i + 6).Interior.ColorIndex Select Case ind Case 1 Cells(j + 6, i + 24) = Range("C7") Case 2 Cells(j + 6, i + 24) = Range("C8") Case 3 Cells(j + 6, i + 24) = Range("C9") Case 4 Cells(j + 6, i + 24) = Range("C10") Case 5 Cells(j + 6, i + 24) = Range("C11") Case 6 Cells(j + 6, i + 24) = Range("C12") Case 7 Cells(j + 6, i + 24) = Range("C13") Case 8 Cells(j + 6, i + 24) = Range("C14") Case 46 Cells(j + 6, i + 24) = Range("C15") End Select Next Next End Sub --------------------------------------------------------------------------------- Private Sub データ作成_Click() Dim arrange As String Dim arrset As String Workbooks("icon_data.xlsm").Activate Worksheets("icon").Activate For j = 1 To gyou arrset = "" For i = 1 To retu arrange = Cells(j + 6, i + 24) + "," arrset = arrset + arrange Next Range("Y" & j + 24) = arrset Next End Sub
1.上記作成したアイコンを使って、クリスマス用にP4LED MATRIX PANEL 64×32に表示しました。
前作のページ「LED-Matrix-Panelの駆動(1)」と同様にプログラムを作成しました。
その起動が冒頭の動画です。
2.下記がそのプログラムです。
#include <PxMatrix.h> // Pins for LED MATRIX #define P_LAT 22 #define P_A 19 #define P_B 23 #define P_C 18 #define P_D 5 #define P_OE 2 hw_timer_t * timer = NULL; portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; #define matrix_width 64 #define matrix_height 32 uint8_t display_draw_time=70; //30-70 is usually fine //PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); //PxMATRIX display(64,64,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E); // Some standard colors uint16_t myRED = display.color565(255, 0, 0); uint16_t myGREEN = display.color565(0, 255, 0); uint16_t myBLUE = display.color565(0, 0, 255); uint16_t myWHITE = display.color565(255, 255, 255); uint16_t myYELLOW = display.color565(255, 255, 0); uint16_t myCYAN = display.color565(0, 255, 255); uint16_t myMAGENTA = display.color565(255, 0, 255); uint16_t myBLACK = display.color565(0, 0, 0); uint16_t myCOLORS[8]={myRED,myGREEN,myBLUE,myWHITE,myYELLOW,myCYAN,myMAGENTA,myBLACK}; uint16_t static snow_icons[10][10]={ {0x0020,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0020,0x0020,0x07FF,0x07FF,0x07FF,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x07FD,0x0000,0x07FF,0x07FF,0x07FF,0x0000,0x07FF,0x0000,0x0000}, {0x07FF,0x07FF,0x07FF,0x07FF,0xFFFF,0x07FF,0x07FF,0x07DF,0x07FF,0x0000}, {0x0000,0x07DF,0x0000,0x07FF,0x07FF,0x07DF,0x0000,0x07FF,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0020,0x0000,0x07FF,0x07FF,0x07FF,0x0020,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000} }; uint16_t static snowman_icons[16][16]={ {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0x0000,0xffff,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xf800,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0xfc00,0x0000,0x0000}, {0x0000,0xfc00,0x0000,0x0000,0x0000,0xf800,0xf800,0xf800,0xf800,0xf800,0x0000,0x0000,0x0000,0xfc00,0xfc00,0x0000}, {0xfc00,0xfc00,0x0000,0x0000,0xffff,0xf800,0xf800,0xf800,0xf800,0xf800,0xffff,0x0000,0xfc00,0x0000,0x0000,0x0000}, {0x0000,0x0000,0xfc00,0xffff,0xffff,0xffff,0xffff,0xffff,0xf800,0xf800,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xf800,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000}, {0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0x001f,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000}, {0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0x001f,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000}, {0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000} }; void IRAM_ATTR display_updater(){ portENTER_CRITICAL_ISR(&timerMux); display.display(display_draw_time); portEXIT_CRITICAL_ISR(&timerMux); } void display_update_enable(bool is_enable) { if (is_enable) { timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &display_updater, true); timerAlarmWrite(timer, 4000, true); timerAlarmEnable(timer); } else { timerDetachInterrupt(timer); timerAlarmDisable(timer); } } void setup() { Serial.begin(9600); display.begin(16); display.clearDisplay(); display_update_enable(true); delay(100); } void draw_snow_icon (uint8_t xxpos,uint8_t yypos){ for (int yy=0; yy<10;yy++){ for (int xx=0; xx<10;xx++){ uint16_t snow_pos_color = snow_icons[yy][xx]; display.drawPixel(xxpos+xx,yypos+yy,snow_pos_color); } } } void draw_snowman_icon (uint8_t xxpos,uint8_t yypos){ for (int yy=0; yy<17;yy++){ for (int xx=0; xx<17;xx++){ uint16_t snow_pos_color = snowman_icons[yy][xx]; display.drawPixel(xxpos+xx,yypos+yy,snow_pos_color); } } } void scroll_text(uint8_t ypos, unsigned long scroll_delay, String text, uint8_t colorR, uint8_t colorG, uint8_t colorB) { uint16_t text_length = text.length(); display.setTextWrap(false); // we don't wrap text so it scrolls nicely display.setTextSize(1); display.setRotation(0); display.setTextColor(display.color565(colorR,colorG,colorB)); for (int xpos=matrix_width; xpos>-(matrix_width+text_length*5); xpos--) { display.setTextColor(display.color565(colorR,colorG,colorB)); display.clearDisplay(); display.setCursor(xpos,ypos); display.println(text); delay(scroll_delay); yield(); } } void loop() { display.clearDisplay(); display.setTextColor(myCYAN); display.setCursor(2,0); display.print("Merry"); display.setTextColor(myMAGENTA); display.setCursor(8,8); display.print("Christmas"); draw_snow_icon (8,20); draw_snow_icon (50,16); draw_snowman_icon(26,16); delay(6000); display.clearDisplay(); scroll_text(1,50,"A Merry Christmas to you!",0,255,0); }