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

VFDモジュール

2018年2月15日 (木)

アクティブマトリクス蛍光表示管の実験用表示モジュールの試用 (2)

間が空きましたが、
アクティブマトリクス蛍光表示管(CL-VFD) MW25616L 実験用表示モジュールの試用の続きです。

VFD

前回の続きからは方向を変え、
「豊四季タイニーBASICを乗せて制御すれば面白いのでは?」と思い、やってみました。

モジュール的にはArduino互換なので、先日メモリー節約したバージョンに
micro:bit版の機能を一部を結合して実装しました。
micro:bit版の流用で2、3日くらいで実装できました。

下記のサイトにてとりあえず公開いたします。
興味のある方は参照願います。
・豊四季タイニーBASIC for MW25616L実験用表示モジュール
   https://github.com/Tamakichi/ttbasic_MW25616L

リファレンス・マニュアルも付けました。
文法やコマンド等の詳細については、リファレンス・マニュアルを参照して下さい。
 
作成には、豊四季タイニーBASICのオリジナル版を利用しています。
また、VFDの制御には、「VFDふぁん」さんが公開している参考プログラムを利用しています。

さて、このバージョンで、どんなことが出来るかというと、

シリアル接続して、直接コマンドを打って、
VFDにメッセージ文の表示が可能です。全角文字もそのまま入力出来ます。

02

コマンドで簡単に表示できるのは、やはり良いです!
従来(micro:bit版)のコマンドにVDF制御のために、以下の専用コマンドを用意しました。

専用コマンド一覧

VBRIGHT :輝度を0(0%)~255(100%)の範囲で設定します。
  例:VBRIGHT 100

VDISPLAY :表示のオン・オフを設定します。
  例:VDISPLAY OFF

VMSG :指定したメッセージ文を指定速度でスクロール表示します。 
   例:VMSG 10,"日本語のメッセージ表示テスト"

VSCROLL :指定長の空白を指定速度でスクロール表示します。
   例:VSCROLL 256,10

VPUT :表示バイトデータを指定速度で直接指定します。
  例:VPUT MEM,16,10

逆に、メモリ的制約からいくつかのコマンドを削除しています。

プログラム例

コマンドを使ったプログラム作成して、ちょっとした動きのある表示も出来ます。
プログラム作成はシリアル接続のスクリーンエディタにて入力出来ます。

10 'VDF表示サンプル
20 TONE 440,100:TONE 880,100
30 @(0)="熱いぞ!埼玉!"
40 @(1)="豊四季タイニーBASIC"
50 @(2)="VFD対応バージョン"
60 @(3)="只今開発中!"
70 @(4)="ちょっとメモリー的に厳しい.."
80 VBRIGHT 255
90 FOR S=0 TO 4
100 VCLS:VMSG 10,STR$(@(S))
110 FOR I=0 TO 255 STEP 15
120 VBRIGHT 255-I:WAIT 40
130 NEXT I
140 WAIT 500
150 VBRIGHT 255:WAIT 500
160 VSCROLL 256,3
170 WAIT 500
180 NEXT S
190 GOTO 80
I2C接続のRTCモジュールを使って時刻をリアルタイム更新表示するプログラム

03

10 VCLS:VBRIGHT 100
20 @(0)="時","分","秒"
30 M=ARRAY+6:POKE M,0
40 R=I2CR($68,M,1,M+1,7)
50 VMSG -1,"現在の時刻は"
60 FOR I=0 TO 2
70 VMSG -1,HEX$(PEEK(M+3-I),2);STR$(@(I))
80 NEXT I
90 VMSG 0,"です"
100 WAIT 1000
110 VSCROLL 256,-1
120 GOTO 40

スライド抵抗器でVFD上に表示しているバーをドット単位で左右に動かすプログラム

05

10 @(0)=$FFFF
20 A=ANA(20)>>2:IF A=0 A=1
30 VPUT ARRAY,2,-1
40 VSCROLL A,0
50 VSCROLL 256,-1
60 WAIT 20
70 GOTO 20

色々と機能てんこ盛りの結果、フラッシュメモリの利用率は99%!
メモリ容量的に、micro:bit版と比べると色々と制約が発生しました。
  ・プログラムサイズは 512バイトまで
  ・内部EEPROMに保存できるプログラムは2本まで

  ・変数はA~Z、配列変数 @(0)@(15)まで
  ・スクリーンエディタの画面サイズは 横48文字x縦8行 固定

他に色々と制約があります。

暫く、動作確認をして修正を行っていきます。
スケッチは一部を修正すれば、Arduino UNOでも利用出ます。

参考サイト
・VFDふぁん - MW25616L 実験用表示モジュールを使ってみる(2)


追記 2017/02/15(夜)

メモリーの制約からフルスクリーンエディタの画面サイズが横48文字x縦8行はとなり、
長い行のプログラムの作成においては、視野の狭い範囲でのスクロール編集となり、
ちょっと使いづらいです。

そこで、フルスクリーンエディタを有効・無効設定するコマンドを追加しました。

Photo

スクリーンエディタ機能を無効にすると、行単位での編集しか出来ないですが、
これはこれで良いかも。

無効にすると、逆スクロール編集、任意の位置にカーソルを移動しての編集、
画面制御を行うコマンド(LOCATE等)が機能しなくなりますが、
スクリーンエディタ機能を臨機応変に切り替えて利用することで、
とりあえずは実用としてしのげそうです。

2016年7月23日 (土)

アクティブマトリクス蛍光表示管の実験用表示モジュールの試用

Facebookのお友達からお借りしました、「アクティブマトリクス蛍光表示管(CL-VFD)
MW25616L 実験用表示モジュール」を調査中です。

16x256ドットのグラフィック表示が可能なモジュールです。

Dscn5467

制御用にAtmega328pが使われており、Arduino IDE環境にてプログラム開発が出来ます。
いくつか、自由に使えるGPIOピンが開放されており、I2Cやシリアル通信も使えそうです。

日本語フォントROM GT20L16J1Y16を搭載していており、日本語表示も可能です。

Dscn5465

背面にICSP端子があり、この端子経由でSPI接続でSDカードなんかが使えそうですね。

Arduinoと同じようにUSB経由での書込みと電源供給が出来ます。
非常にお手軽に使えるモジュールです。

Dscn5453

プログラムを書きこんで表示で表示してみた様子
公開かさているサンプルスケッチを書きこんで動かしてみました。

Dscn5456_2

輝度が強く、私のデジカメでは綺麗に映すことがが出来ません。光が広がってフォントが
つぶれた映像となってしまいます。動画も撮影したのですが、ダメダメでした。
(何枚も撮って一番よさそうなのを掲載しました)
実際には表示は非常にきれいです。文字が左にスクロール表示します。
日本語のメッセージが表示出来ます。

ただし、日本語フォントROM GT20L16J1Yは私も使ったことがあるのですが、
ひらがな、カタカナ、漢字、全角英数、半角英数そのれぞれのバランスが微妙です。

制御方法について

表示のための制御は比較的簡単のようです。
表示パターンは2バイト16ビットが縦1列に対応しています。そのデータが
横256ドット分、合計512バイト分シーケンシャルに並んでいる構造です。

シフトレジスタを使う要領で4つのSI、CLK、LAT、ENを使ってデータを転送します。
16x256ドット分の4096ビット分のレジスタがあり、4096ビット単位でラッチして
表示データを確定出来ます。

表示機器にはこの形式多く、過去に手掛けて蓄積したノウハウが役立てそうです。

02

03

この構造の場合、表示中の画像に線を書いたり、追記描画するのは苦手です。
追記しようにも、データを送るとシフトされて左に画像全体が移動します。

通常、このような構造で自由に描画するにはフレームバッファ(ワークメモリ)を用います。
一旦、フレームバッファに描画してそのデータを一括送信して表示更新する方法です。

次のような感じです。

04

この方式では一括転送に要する時間が早いほど映像が素早く更新出来ます。
動きのある表示や、リアルタイム更新表示を行う場合は早い方が良いです。

(ちょっと前にやった「4連8x8ドットLEDマトリックス」なんかも同じ方式でやっています)

実際に、フレームバッファを使って1点描画するごとに表示更新を行う処理を
ArduinoのShiftOut()関数を使って行ったところ、目視で5画面/秒程度がやっとな感じでした。

ShiftOut()は無駄に遅いことで有名で、同じ処理を直接I/Oレジスタを操作して
転送を行うとかなり改善します。ShiftOut()とdigitalWrite()と次のような感じで
実装して置き換えるだけで、転送速度は8倍ぐらいに改善しました。

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;
  }
}

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;  
}

ShiftOut()なら本来、SPIを使った高速通信に置き換えるのが容易なのですが、
SPIピンとは別ピンに接続されているのがちょっと残念です。
それでも、上記修正で秒20画面位は更新できそうです。

現状、表示する文字列はシフトJIS指定でプログラムに埋め込み、表示画像も
プログラムに埋め込みでちょっと使い勝手が良くないです。

05

この当たり、自作のマルチフォントライブラリ、ビットマップ画像ローダを使って
自由度のあるコンテンツ表示をやりたいなぁと思います。

2016/12/20~  随時追記中

裏の端子にアクセスしやすいように専用の脱着式の基板を作成しました。

Dscn6226

SPI接続にてSDカードを接続。自作のマルチサイズフォントライブラリが動くようになりました(ただし、調整中)。

Dscn6268

SDカードが3.3V駆動にため、電圧レベルの調整をしています。

Photo

動作の様子


8ドット漢字も意外と読めますね。

表示は前述のフレームバッファに一旦書きこんでから、VDFに一括転送しています。
表示するメッセージの指定はUTF-8文字列です。

void demo02() {

  uint8_t font[MAXFONTLEN];   uint16_t x = 0;   uint8_t sz[] = {16,14,12,10,8};   mw_claerbuf();   SDfonts.open(); // フォントのオープン   for (uint8_t i = 0; i < 5; i++) {     char* pUTF8 = "SDカード漢字フォント利用テスト";     SDfonts.setFontSize(sz[i]); // フォントサイズの設定     x = 0;     while ( pUTF8 = SDfonts.getFontData(font, pUTF8) ) { // フォントの取得       mw_drawFont(x, font);       x+=SDfonts.getWidth();     }     mw_update();     delay(1500);     mw_claerbuf();      }   SDfonts.close();  // フォントのクローズ   delay(2000); }

次はメッセージの縦スクロール、SDカードに青空文庫の小説(テキストファイル)入れて
表示出来るようにしてみます。

(つづく)