Arduinoで秋月電子32x16LEDドットマトリックスを動かす
E-0020

更新日
2012/11/08 公開開始


○はじめに
Arudinoで秋月電子で販売しているLEDドットマトリックスを16x16フォントで動作させるためにarm22さん提供のAkiMatrixライブラリを拡張しました。

○特徴
bitBlt16関数にて16x16ドットサイズの文字を表示することができます。

○接続図
arm22さんのページを参考に接続します。
http://arms22.blog91.fc2.com/blog-entry-206.html

○ハードウェア構成
機器 個数
Arduino 1
32×16ドットLED電光掲示板用拡張表示ユニット 1-4


○プログラム
AkiMatrixライブラリに以下の関数を組み込みました。
ベースにしたライブラリは、AkiMatrix002.zipです。

1)AkiMatrix.cppにbitBlt16関数を新しく定義しました。

   1 void AkiMatrix::bitBlt16(uint8_t pos, const uint16_t *src)
   2 {
   3 
   4    uint8_t vx, vy, i, j;
   5    uint8_t tmp;
   6    
   7    vx = 2 * pos;
   8 
   9    for(i=0; i<16; i++){        //row
  10       tmp = (*src & 0xff00) >> 8;
  11        _vramBuffer[i][vx] = (tmp & 0x1) << 7 | \
  12                                (tmp & 0x2) << 5 | \
  13                                (tmp & 0x4) << 3 | \
  14                                (tmp & 0x8) << 1 | \
  15                                (tmp & 0x10) >> 1 | \
  16                                (tmp & 0x20) >> 3 | \
  17                                (tmp & 0x40) >> 5 | \
  18                                (tmp & 0x80) >> 7;
  19        
  20       tmp = *src & 0xff;
  21        _vramBuffer[i][vx+1] = (tmp & 0x1) << 7 | \
  22                                (tmp & 0x2) << 5 | \
  23                                (tmp & 0x4) << 3 | \
  24                                (tmp & 0x8) << 1 | \
  25                                (tmp & 0x10) >> 1 | \
  26                                (tmp & 0x20) >> 3 | \
  27                                (tmp & 0x40) >> 5 | \
  28                                (tmp & 0x80) >> 7;
  29        src++;
  30    }
  31 }


AkiMatrix.hにbitBl16関数をdefineしました。

   1    void bitBlt16(uint8_t pos, const uint16_t *src);

○使い方

サンプルプログラムを以下に表示します。
これは、2010/05/22-23に東工大で行われたMTM05に出展したときのデモプログラムです。

   1 #include <AkiMatrix.h>
   2 
   3 // 2010年
   4 uint16_t data1[8][16] = {
   5   {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
   6   {0x0000, 0x03e0, 0x0410, 0x0808, 0x0808, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0400, 0x0ff8, 0x0000},
   7   {0x0000, 0x03c0, 0x0420, 0x0810, 0x0810, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x0810, 0x0810, 0x0420, 0x03c0, 0x0000},
   8   {0x0000, 0x0080, 0x0080, 0x0180, 0x0280, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x01c0, 0x0000},
   9   {0x0000, 0x03c0, 0x0420, 0x0810, 0x0810, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x0810, 0x0810, 0x0420, 0x03c0, 0x0000},
  10   {0x0400, 0x0400, 0x0ffe, 0x0840, 0x1040, 0x2040, 0x4ffc, 0x0840, 0x0840, 0x0840, 0x0840, 0x7fff, 0x0040, 0x0040, 0x0040, 0x0040},
  11   {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  12   {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}};
  13 //5月22−23日
  14 uint16_t data2[8][16] = {
  15    {0x0000, 0x0ff8, 0x0800, 0x0800, 0x0800, 0x0800, 0x0be0, 0x0c10, 0x0808, 0x0008, 0x0008, 0x0008, 0x0010, 0x0c60, 0x0380, 0x0000},
  16    {0x0000, 0x0ff8, 0x0808, 0x0808, 0x0808, 0x0ff8, 0x0808, 0x0808, 0x0808, 0x0ff8, 0x0808, 0x0808, 0x1008, 0x1008, 0x2008, 0x4038},
  17     {0x0000, 0x03e0, 0x0410, 0x0808, 0x0808, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0400, 0x0ff8, 0x0000},
  18     {0x0000, 0x03e0, 0x0410, 0x0808, 0x0808, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0400, 0x0ff8, 0x0000},
  19    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  20     {0x0000, 0x03e0, 0x0410, 0x0808, 0x0808, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0400, 0x0ff8, 0x0000},
  21     {0x0000, 0x03c0, 0x0c20, 0x1010, 0x0010, 0x0020, 0x0040, 0x03e0, 0x0010, 0x0008, 0x0008, 0x0008, 0x1010, 0x0c60, 0x0380, 0x0000},
  22     {0x0000, 0x0ff8, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0ff8, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0ff8, 0x0000}};
  23 
  24 // MTM05
  25 uint16_t data3[8][16] = {
  26    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  27    {0x0000, 0x600c, 0x2008, 0x3018, 0x3018, 0x2828, 0x2828, 0x2448, 0x2448, 0x2448, 0x2288, 0x2288, 0x2108, 0x711c, 0x0000, 0x0000},
  28    {0x0000, 0x3ff8, 0x2108, 0x4104, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0380, 0x0000, 0x0000},
  29    {0x0000, 0x600c, 0x2008, 0x3018, 0x3018, 0x2828, 0x2828, 0x2448, 0x2448, 0x2448, 0x2288, 0x2288, 0x2108, 0x711c, 0x0000, 0x0000},
  30     {0x0000, 0x03c0, 0x0420, 0x0810, 0x0810, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x0810, 0x0810, 0x0420, 0x03c0, 0x0000},
  31    {0x0000, 0x0ff8, 0x0800, 0x0800, 0x0800, 0x0800, 0x0be0, 0x0c10, 0x0808, 0x0008, 0x0008, 0x0008, 0x0010, 0x0c60, 0x0380, 0x0000},
  32    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  33    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}};
  34 //  いま研
  35 uint16_t data4[8][16] = {
  36    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  37    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  38     {0x0000, 0x0000, 0x0000, 0x1000, 0x1010, 0x1008, 0x2004, 0x2004, 0x2002, 0x2002, 0x2002, 0x1202, 0x1200, 0x0c00, 0x0000, 0x0000},
  39     {0x0040, 0x0040, 0x1ffc, 0x0040, 0x0040, 0x0078, 0x1fc0, 0x0040, 0x0040, 0x0040, 0x07c0, 0x0870, 0x104c, 0x1840, 0x0780, 0x0000},
  40    {0x0000, 0x7ffe, 0x0844, 0x0844, 0x0844, 0x0844, 0x1044, 0x1fff, 0x1244, 0x3244, 0x5244, 0x1244, 0x1244, 0x1e84, 0x0084, 0x0104},
  41    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  42    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  43    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}};
  44 // こんにちは、
  45 uint16_t data5[8][16] = {
  46    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  47    {0x0000, 0x0000, 0x0700, 0x00f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x0804, 0x07f8, 0x0000, 0x0000},
  48    {0x0080, 0x0080, 0x0100, 0x0100, 0x0200, 0x0200, 0x0200, 0x0580, 0x0640, 0x0c40, 0x0840, 0x1041, 0x1042, 0x2024, 0x2018, 0x0000},
  49    {0x0000, 0x1000, 0x1000, 0x1038, 0x11c0, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2200, 0x2200, 0x2180, 0x287c, 0x1000, 0x0000},
  50    {0x0200, 0x0200, 0x0200, 0x3ff0, 0x0200, 0x0400, 0x0400, 0x04f0, 0x0b08, 0x0c04, 0x0804, 0x0004, 0x0008, 0x0030, 0x03c0, 0x0000},
  51    {0x0010, 0x1010, 0x1010, 0x1010, 0x101e, 0x23f0, 0x2010, 0x2010, 0x2010, 0x2010, 0x2010, 0x21f0, 0x2a1c, 0x1212, 0x11e0, 0x0000},
  52    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x1000, 0x0800, 0x0800},
  53    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}};
  54 
  55 //LEGOがオセロ
  56 uint16_t data6[8][16] = {
  57     {0x0000, 0x0e00, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0404, 0x0404, 0x0ffc, 0x0000, 0x0000},
  58     {0x0000, 0x3ff8, 0x0808, 0x0804, 0x0800, 0x0800, 0x0840, 0x0fc0, 0x0840, 0x0800, 0x0800, 0x0804, 0x0808, 0x3ff8, 0x0000, 0x0000},
  59     {0x0000, 0x03c8, 0x0c38, 0x1808, 0x1008, 0x2000, 0x2000, 0x2000, 0x203e, 0x2008, 0x1008, 0x1818, 0x0c68, 0x0388, 0x0000, 0x0000},
  60     {0x0000, 0x03c0, 0x0c30, 0x1818, 0x1008, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x1008, 0x1818, 0x0c30, 0x03c0, 0x0000, 0x0000},
  61     {0x0400, 0x040a, 0x040a, 0x0412, 0x0408, 0x3f84, 0x0444, 0x0842, 0x0842, 0x0842, 0x1040, 0x1040, 0x2080, 0x2480, 0x0300, 0x0000},
  62     {0x0000, 0x0020, 0x0020, 0x0020, 0x1ffe, 0x0020, 0x0060, 0x00a0, 0x00a0, 0x0120, 0x0220, 0x0420, 0x1820, 0x0020, 0x00e0, 0x0000},
  63     {0x0000, 0x0200, 0x0200, 0x0200, 0x021e, 0x03e2, 0x3e04, 0x0208, 0x0210, 0x0220, 0x0200, 0x0200, 0x0100, 0x00fc, 0x0000, 0x0000},
  64     {0x0000, 0x0000, 0x0000, 0x1ffc, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1ffc, 0x1004, 0x0000, 0x0000}};
  65 //をします。
  66 uint16_t data7[8][16] = {
  67    {0x0100, 0x0100, 0x01e0, 0x1f00, 0x0200, 0x0206, 0x0798, 0x0860, 0x10c0, 0x2140, 0x0240, 0x0440, 0x0400, 0x0200, 0x01f8, 0x0000},
  68    {0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0808, 0x0810, 0x0460, 0x0380, 0x0000},
  69    {0x0040, 0x0040, 0x1ffc, 0x0040, 0x0040, 0x0078, 0x1fc0, 0x0040, 0x0040, 0x0040, 0x07c0, 0x0870, 0x104c, 0x1840, 0x0780, 0x0000},
  70    {0x0040, 0x0040, 0x007e, 0x3fc0, 0x0040, 0x0040, 0x0340, 0x04c0, 0x0440, 0x0440, 0x04c0, 0x0340, 0x0040, 0x0040, 0x0080, 0x0300},
  71    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x4800, 0x4800, 0x3000, 0x0000},
  72    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  73    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
  74    {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}};
  75 
  76 uint16_t dbuffer[17];
  77 
  78 int pos = 0;
  79 int cycle = 0;
  80 
  81 /*-----------------------------------------
  82   pin 1: Power
  83   pin 2: sin1 (row)
  84   pin 3: sin2 (led1)
  85   pin 4: sin3 (led2)
  86   pin 5: clk
  87   pin 6: latch (inverted)
  88   pin 7: strob
  89   pin 8: Power
  90   pin 9, 10: GND
  91 ------------------------------------------*/
  92 AkiMatrix myMatrix = AkiMatrix(2,3,4,5,6,7);
  93 uint16_t tmp1, tmp2, ledpos=0;
  94 
  95 int pcycle = 0;
  96 int ppattern = 0;
  97 
  98 /*----------------------------------------
  99 ----------------------------------------*/
 100 void setup()
 101 {
 102  uint8_t i;
 103   
 104  for(i=0; i<8; i++){
 105    myMatrix.bitBlt16(i, data1[i]);
 106  }
 107   
 108   myMatrix.setOutputEnable(true);
 109   
 110 }
 111 
 112 /*----------------------------------------
 113 ----------------------------------------*/
 114 void loop()
 115 {
 116   int i;
 117   
 118   myMatrix.hsync();            //600us 
 119   delayMicroseconds(200);    //800us
 120   cycle++;
 121   
 122   if(cycle == 200*1000){
 123     cycle=1;
 124     ledpos++;
 125     if(ledpos==2){
 126       ledpos=0;
 127     }
 128   }
 129 
 130    
 131    if(cycle == 1){ 
 132      for(i=0; i<8; i++){
 133         switch(ledpos){
 134           case  0:
 135              myMatrix.bitBlt16(i, data1[i]);
 136           break;
 137           case  1:
 138              myMatrix.bitBlt16(i, data2[i]);
 139           break;
 140           case  2:
 141              myMatrix.bitBlt16(i, data3[i]);
 142           break;
 143           case  3:
 144              myMatrix.bitBlt16(i, data4[i]);
 145           break;
 146           case  4:
 147              myMatrix.bitBlt16(i, data5[i]);
 148           break;
 149           case  5:
 150              myMatrix.bitBlt16(i, data6[i]);
 151           break;
 152           case  6:
 153              myMatrix.bitBlt16(i, data7[i]);
 154           break;
 155         }
 156       }
 157    }
 158 }
 159 


動作ムービー


参考URL
1)http://arms22.blog91.fc2.com/blog-entry-206.html
2)http://arms22.blog91.fc2.com/blog-entry-210.html
3)http://arms22.blog91.fc2.com/blog-entry-220.html


免責事項
1)サイトの内容について
ご自身の責任でご利用いただくようお願いします。この内容に直接間接により生じたいかなる損害にも一切保証しませんのでご了承ください。