フォト
2025年2月
            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  
無料ブログはココログ

« ESP-WROOM-02を始めました | トップページ | ESP-WROOM-02を始めました(3) SPIFFSの利用 »

2016年6月26日 (日)

ESP-WROOM-02を始めました(2)

前回からの続きです。
ESP8266搭載のESP-WROOM-02の調査中です。

Arduinoとしてどれくらい利用可能かを確認するため、
Arduino UNO(Atmega328)用のaitendo 16x16LEDマトリックス制御プログラムを移植
してみました。

Dscn5336

動作の様子



意外とライブラリの互換性レベルが高く、
I/Oピンの割り付け変更とタイマー割り込みの設定の変更程度で動きました。
(直接レジスタをいじっている高速版digitalWrite()、shiftOut()はさすがに動かないので、
正規版に戻しました)。

行儀のよいArduino UNO用スケッチなら少々の修正で利用出来ると思います。
実際に自作のビットマップファイルロードライブラリ、フォントライブラリが利用出来ました。
(この動作確認にて、自作のフォントライブラリの不具合を見つけました)

SPI、SDライブラリは割り付けピンを変えるだけで利用出来ました。

プログラム領域にデータを置いて参照利用するpgm_read_byte()利用出来ました。

タイマー割り込みに使っていたMsTimer2ライブラリは動かないので、ESP8266用に
用意されているTickerを利用しました。利用はとても簡単です。

ヘッダーファイル Ticker.hをインクルードして、グローバル変数を宣言して、
  #include <Ticker.h>
  Ticker ticker ;


タイマー割り込み設定の
  MsTimer2::set(1, fontout);
  MsTimer2::start();
  ticker.attach_ms(1, fontout);
と変更するだけです。

「いろは歌」はSDカード上のフォントを利用して表示しています。
「ねこにこんばんわ」はビットマップファイルを読み込んで表示していま。

タイマ割り込みTickerは、MsTimer2に比べると若干、精度が悪い感じです。
ダイナミック駆動のLED表示に若干ムラが生じます。

ピン割り付けがちょっと悩みましたが、下記のサイトの情報が大変参考になりました。

・Qiita - ESP-WROOM-02 Arduino互換ボードのGPIOはこうやって使う
   http://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd

スケッチ  ダウンロード sample5_esp.zip (4.6K)

  ※コンパイルには下記のライブラリが別途必要です。
   sdfonts   : Arduino用漢字フォントライブラリ SDカード版
   sdbitmap : Arduino用Bitmap画像ロードライブラリ

// sample5_esp.ino
// aitendo 16x16LEDドットマトリックスの制御サンプル 漢字フォントライブラリ利用バージョン
// 2016/06/16 ESP-WROOM-02(ESP8266)用に移植 by たま吉さん
// 2016/06/29 コメント追記、定数の定義追加 by たま吉さん
//

#include <sdfonts.h>
#include <string.h>
#include <sdbitmap.h>
#include <Ticker.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);

//ESP-WROOM-02 接続ピン設定
#define DATAPIN   (5)     // TB62706のSERIAL-INへ接続
#define LATCHPIN  (2)     // TB62706のLATCHへ接続
#define CLOCKPIN  (4)     // TB62706のCLOCKへ接続
#define ENABLEPIN (16)    // TB62706のENABLEへ接続

#define MOSI_SD   (13)    // SDカードのMOISへ接続
#define MISO_SD   (12)    // SDカードのMISOへ接続
#define CLK_SD    (14)    // SDカードのCLKへ接続
#define CS_SD     (15)    // SDカードモジュールCSへ接続

//LEDドットマトリックス用定義
#define FBUFSIZE     32   // ドットマトリックスフレームバッファサイズ
#define MWIDTH       16   // ドットマトリックス幅
#define MHIGTHT      16   // ドットマトリックス高さ

// タイマー割り込み
Ticker ticker;

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

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

  digitalWrite(LATCHPIN, HIGH);  //送信終了

  // 表示対象行を次行に設定
  _line++;
  if (_line == MHIGTHT )
    _line = 0;
}

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

// いろは歌デモ
void test_iroha() {
  char* str="色はにほへど散りぬるを我が世たれぞ常ならむ有為の奥山今日越えて浅き夢見じ酔ひもせず";
  uint8_t fn;
  uint8_t tmpbuf[FBUFSIZE];        // 表示パターン2次バッファデータ
  memset(tmpbuf,0,FBUFSIZE);       // 2次バッファクリア
  SDfonts.open();                 // フォントのオープン

  // 表示文字数分ループ処理
  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(tmpbuf, MWIDTH, MHIGTHT, B0001); // 左スクロール
      clearBitmapAt(tmpbuf, MWIDTH, MHIGTHT, MWIDTH-t-1, MHIGTHT-t-1, SDfonts.getWidth(), SDfonts.getHeight());
      setBitmapAt(tmpbuf, MWIDTH, MHIGTHT, MWIDTH-t-1, MHIGTHT-t-1, buf, SDfonts.getWidth(), SDfonts.getHeight());
      memcpy(fbuf,tmpbuf,FBUFSIZE);
      delay(30);
    }
  }
  SDfonts.close(); // フォントのクローズ
}

// ビットマップパターン表示
void test_bitmap() {
  uint8_t tmpbuf[FBUFSIZE]; // 表示パターンバッファデータ
  uint8_t rc;
  uint8_t w,h;

  memset(tmpbuf,0,FBUFSIZE);
  sdbitmap bitmap;
  bitmap.setFilename("IMG2.BMP");

  // ビットマップデータオープン
  rc = bitmap.open();
  w  = bitmap.getWidth();
  h  = bitmap.getHeight();
  
  for (uint8_t i=0; i <= w-MWIDTH; i++) {  
    // データの取得
    bitmap.getBitmapEx(tmpbuf, i, 0, MWIDTH, MHIGTHT, 1);
    memcpy(fbuf,tmpbuf,FBUFSIZE);
    delay(30);
  }
  delay(2000);
  bitmap.close();
}

// セットアップ
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);         // フォント管理の初期化

  // 1msec間隔タイマー割り込み設定
  ticker.attach_ms(1, fontout); 
}

// デモループ
void loop(){
  test_bitmap();  // ビットマップデータロードテスト
  test_iroha();   // いろは歌デモ表示
  //clearBuf();   // 表示用バッファ初期化
  delay(1000);
}

今回の動作確認でデジタル出力、SPI通信普通に使えることが分かりました。
次はI2Cを調べてみます。

« ESP-WROOM-02を始めました | トップページ | ESP-WROOM-02を始めました(3) SPIFFSの利用 »

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

ESP32・ESP8226」カテゴリの記事

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: ESP-WROOM-02を始めました(2):

« ESP-WROOM-02を始めました | トップページ | ESP-WROOM-02を始めました(3) SPIFFSの利用 »