フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« aitendo 16x16LEDマトリックスの制御 (2) | トップページ | 書籍 「絶対現場主義 C#入門」、ウエット(泥臭い)で面白い »

2016年6月 7日 (火)

aitendo 16x16LEDマトリックスの制御 (3)

前回の続きです。

日本語表示をしたいと思い、自作の漢字フォントライブラリ(SDカード版)を使ってみました。
機能は以前作成したものと同じですが、かなり簡略化出来ました。表示も明るいです。

01


SDカードを利用するにあたり、3.3Vで動かす必要がありますが
レベルシフト等が面倒(パーツも増える)なので、aitendoのあちゃんでいいの(Arduino)に
変更しました。

LEDドライバ TB62706の推奨利用条件は4.5V~5.5Vなのですが、3.3Vでも問題なく
利用出来ています。

回路図(結線)的には「aitendo 16x16LEDマトリックスの制御 (1)」に掲載の回路図に
microSDカードモジュール(SPI接続)を追加しただけです。

04

aitendoに私が使っているものと同じっぽいのがありますね。
マイクロSDモジュール [MSD-M6P]

02

動作の様子


「いろは歌」をスクロール表示しています。表示するフォントデータはSDカードから
逐次読みだしています。乱数でフォントサイズを変えてスクロール表示しています。
(20x20、24x24ドットのフォントは当然はみ出して表示となります)

ダイナミック駆動による表示のために1msecのタイマー割り込みを行いつつ、
SPI接続のSDカードにアクセスしています。
ちょっと心配でしたが、問題なくデータ取得出来ています。

スケッチ  ダウンロード sample3.zip (3.9K) 

※ライブラリは含まれていません。別途ダウンロードして下さい。
   ・MsTimer2
     http://playground.arduino.cc/Main/MsTimer2

  ・漢字フォントライブラリSDカード版
    https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD

メインのスケッチのみ掲載します。

// sample3.ino
// aitendo 16x16LEDドットマトリックスの制御サンプル 漢字フォントライブラリ利用バージョン
// 2016/06/07 たま吉さん
//

#include <arduino.h>
#include <MsTimer2.h>
#include <sdfonts.h>
#include <string.h>

void scrollBitmap(uint8_t *bmp, uint16_t w, uint16_t h, uint8_t mode);
void clearBitmapAt(uint8_t* bmp, uint16_t w, uint16_t h, int16_t x, int16_t y, uint8_t cw, uint8_t ch);
void setBitmapAt(
 uint8_t *dstbmp, uint16_t dstw, uint16_t dsth, int16_t dstx, int16_t dsty,
 uint8_t *srcbmp, uint16_t srcw, uint16_t srch);
 
#define DATAPIN		(7)	// TB62706のSERIAL-INへ
#define LATCHPIN 	(9)	// TB62706のLATCHへ
#define CLOCKPIN 	(8)	// TB62706のCLOCKへ
#define ENABLEPIN    (6)     // TB62706のENABLEへ
#define CS_SD        (10)    // SDカードモジュールCSへ

// 表示用バッファ
uint8_t fbuf[32];        // 表示パターンバッファデータ
uint8_t buf[MAXFONTLEN]; // フォントデータ格納アドレス(最大24x24/8 = 72バイト)

//
// shiftOut高速化版
//
void new_shiftOut(uint8_t dataPin,uint8_t clockPin,uint8_t bitOrder,byte val) {
  uint8_t i;
  uint8_t bit_data = digitalPinToBitMask(dataPin);
  uint8_t bit_clock = digitalPinToBitMask(clockPin);
  volatile uint8_t *out_data = portOutputRegister(digitalPinToPort(dataPin));
  volatile uint8_t *out_clock = portOutputRegister(digitalPinToPort(clockPin));

  for (i = 0; i < 8; i++)  {
    if (bitOrder == LSBFIRST) {
      if(val & (1 << i)) {
        *out_data |= bit_data;
      } else {
        *out_data &= ~bit_data;
      }
    } else {
      if(val & (1 << (7 - i))) {
        *out_data |= bit_data;
      } else {
        *out_data &= ~bit_data;
      }
    }
    *out_clock |= bit_clock;
    *out_clock &= ~bit_clock;
  }
}

//
// digitalWrite高速化版
//
inline void new_digitalWrite(uint8_t pin, uint8_t val) {
  uint8_t bit = digitalPinToBitMask(pin);
  volatile uint8_t *out = portOutputRegister(digitalPinToPort(pin));
  if (val == LOW)
    *out &= ~bit;
  else
    *out |= bit;  
}

//
// バッファ内データを表示する(1ライン分割表示)
//
void fontout() {
  static uint8_t _line = 0;  
  // 点灯LEDが移動するパターン
  new_digitalWrite(ENABLEPIN,LOW);   // OUTを有効にする
  new_digitalWrite(LATCHPIN, LOW);   //送信開始        
 
  // 行選択
  uint16_t val = _BV(15-_line);
  new_shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, val);
  new_shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, val>>8);       
     
  // 行フォントパターンの送信
  new_shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, fbuf[(_line<<1)+1]);
  new_shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, fbuf[_line<<1]);

  new_digitalWrite(LATCHPIN, HIGH);  //送信終了
  _line++;
  if (_line == 16)
    _line = 0;
}

//
// バッファクリア
//
void clearBuf() {
   memset(fbuf,0,32);
}

//
// いろは歌デモ
//
void test_iroha() {
  char* str="色はにほへど散りぬるを我が世たれぞ常ならむ有為の奥山今日越えて浅き夢見じ酔ひもせず";
  uint8_t fn;

  // 表示文字数分ループ処理
  while(1) {
    fn = rand() % (EXFONT24+1);            // 表示フォントサイズランダム決定
    SDfonts.setFontSizeAsIndex(fn);       // フォントサイズの指定
    str = SDfonts.getFontData(buf, str);  // フォントデータの取得
    if (!str)
      break;                               // 文末なら抜ける

    // 1文字分スクロール表示
    for (int8_t t = 0; t < SDfonts.getWidth(); t++) {
      scrollBitmap(fbuf, 16, 16, B0001);
      clearBitmapAt(fbuf, 16, 16, 15-t, 15-t, SDfonts.getWidth(), SDfonts.getHeight());
      setBitmapAt(fbuf, 16,16,15-t,15-t, buf, SDfonts.getWidth(), SDfonts.getHeight());
      delay(40);
    }
  }
}

void setup() {
  // LEDマトリックス用制御ピンのモード設定
  pinMode(ENABLEPIN,OUTPUT);
  pinMode(DATAPIN, OUTPUT);
  pinMode(LATCHPIN, OUTPUT);
  pinMode(CLOCKPIN, OUTPUT);

  // 制御ピンの初期化
  digitalWrite(ENABLEPIN,HIGH);
  digitalWrite(CLOCKPIN, LOW);
  digitalWrite(LATCHPIN, HIGH);

  // SDカード利用フォントライブラリの初期化
  SDfonts.init(CS_SD);                // フォント管理の初期化
  SDfonts.open();                     // フォントのオープン
  
  // 割り込み開始
  MsTimer2::set(1, fontout); //  1ライン描画/1回 版
  MsTimer2::start();
}

// デモループ
void loop(){
  clearBuf();     // 表示用バッファ初期化
  test_iroha();   // いろは歌デモ表示
  delay(1000);
}


スケッチの簡単な説明

デモ表示の大半の処理はtest_iroha()関数が行っています。
この関数内では、文字列strから逐次文字を取り出して該当するフォントデータを
SDカードから取得しています。そのデータをscrollBitmap(),clearBitmapAt(),setBitmapAt()
にてビットマップデータ加工をして表示用バッファfbufに書き込んでいます。

scrollBitmap(),clearBitmapAt(),setBitmapAt()は、sample3.zipのlibmatrix.cpp内に
定義しています。これらは作成中の汎用ビットマップ加工関数群の一部です。

汎用的なビットマップデータ加工ライブラリをちびちびと作っているのですが
中々完成しません(今回を機に機能拡張していきたい)^^。

このシリーズもうちょっと続きます。

windowsのbitmap画像フォーマット(モノクロ2値)の画像ファイルをSDカードに入れて
読みだしてマトリックス表示する機能を試作中です^^
その4に続きます。

« aitendo 16x16LEDマトリックスの制御 (2) | トップページ | 書籍 「絶対現場主義 C#入門」、ウエット(泥臭い)で面白い »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: aitendo 16x16LEDマトリックスの制御 (3):

« aitendo 16x16LEDマトリックスの制御 (2) | トップページ | 書籍 「絶対現場主義 C#入門」、ウエット(泥臭い)で面白い »