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

« 2016年6月 | トップページ | 2016年8月 »

2016年7月の12件の記事

2016年7月28日 (木)

NAS 「DiskStation DS216j」を購入しました

Synology社製のNAS、DiskStation DS216j を購入しました。
早速設置しました。週末にでも既存のReadyNAS Duo v2からデータを以降する予定です。

写真はReadyNAS Duo v2(左)、DiskStation DS216j(右)です。

Dscn5489

ReadyNAS Duo v2も良い製品ですが、最近のクラウド環境には全く対応出来ず
インターネット上に分散所有しているデータのバックアップ等がちょっと面倒です。

そこでDiskStation DS216jを導入したわけですが、この製品、NASというよりは
サーバー機です。とにかく高機能です。色々なパッケージが用意されています。

しかも、ほとんどの作業をブラウザ上でWindowsみたいなデスクトップライクの環境で
操作出来ます。インターネット越しで自宅外からも利用出来ます。
自宅にパーソナルクラウド環境を構築出来ます。

こんなすごいNASがあるんですね。GoogleDriveなんかみたいに、ブラウザ上の
Fileマネージャー(File Station)にドラック&ドロップでNAS上のファイルをアップロード
なんかも出来ます。

01

余りにも機能が多くて、使い込むにはちょっと時間がかかりそうです。

NAS単体でウィルスチェック機能があり、セキュリティ対策機能もかなり期待できそうです。

02_2


メーカーがライブデモを公開しています。
Synology DSM 6.0 ライブデモ

デフォルトでは英語環境ですが、起動後画面右上の人型アイコンをクリックして
personalを選択して[accont]タブの[Display language]を設定を[日本語]に変更することで
日本語表示に変更できます。

03


2016年7月23日 (土)

IchigoJam Tが到着

7月20日に新しいIchigoJamが販売されました。早速入手しました。

本日到着したIchigoJam 、正式名称は「IchigoJam T」 です

Dscn5468

今回は先行販売されている完成品を購入しました。

中身はこんな感じです。

Dscn5469

前製品 IchigoJam Uからの変更点(改善点)をみてみましょう。

Dscn5475

LPC1114はDIP版のLPC1114FN28から、TSSOP版のLPC1114FDH28に変更となりました。
これは、供給上の問題による変更ですかね。DIP版は品不足で高騰しています。

PS/2コネクタはUSBコネクタに変更になりました。
ただし、利用できるキーボードはUSBコネクタ対応のPS/2インタフェースの
キーボードとなります。PS/2-USB変換アダプタが不要になったのはありがたいです。

電源供給用のマイクロUSBコネクタは電源専用のものに置き換わりました。
見た感じは、以前のものよりも頑丈になった感じです。

ピン名称がシルク印刷されており、シールを貼る必要がなくなりました。

早速動作確認しました。
手持ちのキーボードは問題なく利用できました。
また、以前作成したEEPROMエミュレーションシールドを装着してみました。
干渉することなく装着できました。動作も問題無です。
旧版のIchigoJam U用のシールドなら問題なく利用出来そうです。

Dscn5473

ファームウェアは現時点で最新版の1.2.1 が乗っています。

20160723184124

今回は先行販売された完成品を購入しましたが、組み立てキットの場合、
TSSOP版のLPC1114FDH28のはんだ付けはちょっと厳しい気がしますが
どうなるんでしょうね?

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

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カードに青空文庫の小説(テキストファイル)入れて
表示出来るようにしてみます。

(つづく)


2016年7月21日 (木)

LPC810を使ったUART-I2Cブリッジの改良版が出来ました

機能拡張を検討していたUART-I2Cブリッジ、取りあえず完成しました。
   プログラムソース ダウンロード UART2I2C_20160906.zip (613.2K) (2016/09/06 修正)
   コマンドマニュアル暫定版 ダウンロード UART-I2C_DOCV2L1PDF.zip (346.2K) (追加)
   
GitHubによる公開 LPC810 UART-I2Cブリッジモジュール  (追加)

 
  ※プログラムソースを解凍したファイル内の
     UART2I2C_20160906\UART2I2C\Release\UART2I2C.hex
     を使った場合のLCP810への書き込み方法は、下記が参考になります。    

     LPC810のフラッシュへの書き込みをシリアルインターフェースで行なう
       http://www.nxp-lpc.com/programming_note/note3.html

いくつかコマンドを追加、バグ修正、回路修正を行いました。

Dscn5462

回路図の修正

回路図というには、部品はタクトスイッチと配線のみです。
I2C用のピンSCL、SDAは内部プルアップ抵抗を利用することで外付け抵抗不要にしました。
また、前バージョンのSCL、SDAのオープンドレイン設定が間違っていることが判明し、
それを訂正しました。

02
(シリアル通信は115200bps、8bit パリティなし、ストップビット1)

機能修正・追加(コマンド追加)

・I2Cスレーブアドレスの指定を8ビットから7ビットに変更しました。
 
・改行コードの扱い方の修正
  - 受信時の改行はCR+LF、LFのみの両対応としました。
  - 送信時の改行コードはデフォルトをCR+LF(0x0D,0x0A)とし、コマンドにて
    CR+LF/LF を切り替えられるようにしました。
 
・ローカルエコーの有無(デフォルトはローカルエコーなし)を設定出来るようにしました。
 
・I2Cバスに接続しているI2Cデバイスを調べてそのデバイスのアドレスを表示する機能
を追加しました(ラズベリーパイのi2cdetectコマンドみたいなやつです)。

   01

   パラメタの指定により、形式を切り替えることが出来ます。

   04

・ダミーコマンドの追加
  処理自体は何もしません(常に正常の00を返す)。
  シリアル通信チェックや補助コマンドで正常終了の復帰値を取得したい場合に
  利用するコマンドです。

コマンド一覧

03

現在、コマンドマニュアルを作成しています。出来次第、公開します。
(2016/07/22 暫定版を公開済)

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21) [この記事です]
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

2016年7月16日 (土)

IchigoJamで有機ELキャラクタディスプレイモジュールを制御

IchigoJamで秋月電子で販売されている有機ELキャラクタディスプレイモジュール
制御してみました(型番はSO1602AWWB-UC-WB-Uという製品)。
IchigoJamのファームウェアは1.2.1を使っています。

IchigoJamからはI2C接続にて制御しています。

Dscn5417

さすが有機EL、表示が綺麗ですね。

この有機ELキャラクタディスプレイモジュール(以後長いのでOLEDと略)の使い方は
製品ページリンクのデータシートよりも、製品についてる説明書(日本語)の方が分かり
易いです。

結線
製品についてる説明書の「マイコンとの接続例」に従って結線するだけです。

プログラムソース

1 'OLED Character Display DEMO
10 CLV
20 GSB @ショキカ
30 [0]="IchigoJam World"
40 [1]="ネ・コ・ニ・コ・ン・バ・ン・ワ"
50 X=0:Y=0:S=[0]:GSB @ヒョウジ
60 X=0:Y=1:S=[1]:GSB @ヒョウジ
70 END
500 @ショキカ
510 POKE #700,0,1,2,#C,1,#40
520 FOR M=#701 TO #704
530 R=I2CW(#3C,#700,1,M,1)
540 NEXT
550 RTN
600 @ヒョウジ
610 L=LEN(S)
620 POKE#706,#80+Y*32+X
630 R=I2CW(#3C,#700,1,#706,1)
640 FOR I=0 TO L-1
650 R=I2CW(#3C,#705,1,S+I,1)
660 NEXT
670 RTN

プログラムはわりと短めですね。使いやすいモジュールです。
GSBGOSUBの省略形、RTNRETURNの省略形です)

簡単な解説

OLEDの利用のために2つのサブルーチン(GOSUBで呼び出し)を定義しています。
初期化処理(500行 @ショキカ)と、表示処理(600行 @ヒョウジ)です。

・初期化処理(500行 @ショキカ)
  OLED対する命令は2バイト構成(コマンドコード+データ)です。
  510行でそのコマンドとデータをメモリ上に定義しています。
  520行~540行でそのデータをI2Cアドレス#3CのOLEDに送っています。

  具体的には
    #00, #01 : Clear Display (表示部をクリア)
    #00, #02 : Return Home (カーソル位置を先頭に移動)
    #00, #0C : Send Display on command (表示ON、カーソル表示なし)
    #00, #01 : Clear Display (表示部をクリア、取りあえず説明書通りにもう一度クリア) 
  という4つの命令を送っています。

・表示処理(600行 @ヒョウジ)
  引数(値を渡す変数)としてSXYを使用しています。

     表示する文字列  S(文字列)
     表示位置横        X(0~15)
     表示位置縦        Y(0~1)
 
  610行が表示する文字列の長さを変数Lに設定、
  620行が表示位置アドレス (OLEDの内部アドレス)をメモリアドレス#706に設定
  しています。630行でその表示位置をOLEDに送信しています。
  具体的には次の2バイトを送信しています。
    #00, #80+表示位置アドレス(=#80+Y*32+X) : Set DDRAM Address
  表示アドレスは1行目が#00~#0F(左→右)、2行目が#20~#2F(左→右)となります。
  640行~660行が変数Sから1文字づつ文字を取り出して、OLEDに送信して
  表示を行っています。

これらのサブルーチンを10行から70行で利用しています。




2016年7月13日 (水)

LPC810を使ったUART-I2Cブリッジの機能拡張の検討中

以前作成しました「LPC810を使ったUART-I2Cブリッジ」の機能拡張を考えています。

現時点で追加・変更しようと思っているのは
1)i2cdetect
       接続しているI2Cデバイスをスキャンしその結果を表示する
       (ラズベリーパイのi2cdetectコマンドみたいなやつです)
2)I2Cバスのリセット
       I2Cスレーブがフリーズした感じの時、バスリセットして復活させるのが目的です。
3)HELPコマンド
       コマンドの簡単な説明を出力する。
4)LPC810ではなく、attiny85 digisparkでUSB接続で簡単利用する(出来るならば)。
5)ローカルエコーの有効/無効の切り替えコマンド
       対話テストにて使う際、ターミナルソフトの設定でエコーONにする必要があります。
       面倒なので、入力された文字列を行単位でそのまま出力する機能を追加します。
6)改行コードの変更
      現状、受信時の改行コードを現行のCR+LF(0x0D 0xA)から、
      LF(0x0A)に変更し+CRは無視するようにし、CR+LF、LFの両対応とする。
      出力の改行コードはデフォルトをCR+LF(0x0D 0xA)とし、コマンドにて
      LF(0x0A)とCR+LF(0x0D 0xA)を切り替えるようにする。
7)ウオッチドックタイマーによるフリーズからの復旧
     何らかの理由でフリーズした場合、リセットして自己復旧できるようにする。
8)I2Cアドレスを8ビット指定から7ビット指定に変更

です。

その前に現バージョンの仕様が自分でも忘れている感じなので、マニュアルを作成して
います。

取りあえず現段階のコマンドマニュアル(暫定版)を突貫工事で作成しました。
  ダウンロード UART-I2C_DOCPDF.zip (279.4K)
  ダウンロード UART-I2C_DOCV1L2PDF.zip (290.2K)  2016/07/14 修正版
  ダウンロード UART-I2C_DOCV1L3PDF.zip (300.6K) 
2016/07/16 修正版

以後、下記で修正版等を公開します。
https://github.com/Tamakichi/LPC810-UART-I2C-Bridge

自分では作成した覚えがない機能が結構ありました(夜中に小人さんが作ってくれた?)
補助コマンドの記載内容はかなり怪しいので見直し中です(特にエラーの戻り値の有無)。

話変わって、
最近、同モジュールの質問を受けまして、
以前から気になっていたOLEDキャラクターディスプレイを
ご利用とのことで私も衝動買いしました。

早速、LPC810を使ったUART-I2Cブリッジで動作確認しました。
表示が無茶苦茶綺麗です。だだし消費電力が大きいです。

Dscn5404

写真の"Thank you!"の表示は、
パソコンからTeraTermにて下記のコマンドをシリアル接続経由で送信しています。
    @c7800@h01020c0180 
(2016/07/16 微妙に間違っていたため修正しました)
    @c7840@sThank you!

比較的簡単な制御で表示出来ました。

2016/07/17 追記
まずは、I2Cアドレスを7ビット指定に変更し、ラズパイのi2cdetectっぽい機能を追加
しました。3つのI2Cスレーブを接続してちゃんと認識出来ました。

01

だだし、もうプログラム領域の余りが400バイトしかないです。
取りあえず、今回の改造はここまでかなぁ

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13) [この記事です]
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

秋月電子 「球根始めました」 ・・・ はぁ?

もしかして球根ってひそかに流行っているのだろうか...知らないのは私だけ?

球根(彼岸花・特大)
http://akizukidenshi.com/catalog/g/gK-10846/

01

さすが秋月、3つのバリエーションが用意されています。

02

2016/07/14 追記
ねとらばに球根販売の経緯の記事がりますね。

ねとらば  『電子部品の老舗「秋月電子通商」が球根を販売していて工作クラスタざわつく
              仕入れた理由を聞いてみた』
              http://nlab.itmedia.co.jp/nl/articles/1607/13/news156.html

もしかしたら、金属板を刺して発電するのかとも思ったのですが違いましたね。

2016年7月12日 (火)

IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する

IchigoJamMAX7219を使った8x8ドットLEDマトリックスの制御をやってみました。
(IchigoJamはファームウェアバージョン 1.2.1を利用しています)

02

利用したのは、下記の製品です。ちょっと前に入手した「4連8x8ドットLEDマトリックス」
1個バージョンです。

MAX7219 dot matrix module microcontroller module DIY KIT
01

やってはみたものの、遅くて実用的でないです。
I2C接続のHT16K33を使った方が断然いいですね。
HT16K33みたいなスクロール表示なんかはちょっと無理そうです。

動いている様子




遅いですねぇ。データラッチが行単位なのも遅い処理系には一層見苦しい表示に
なりますね。

接続
IchigoJam   LEDドットマトリックスモジュール  
VCC      <=      VCC
GND      <=      GND
OUT1    <=      CLK
OUT2    <=      CS
OUT3    <=      DIN

プログラム

1 'MAX7219(OUT1: CLOCK, OUT2: ~CS, OUT3: DAT)
10 M="ネコニコンバンワ!":L=LEN(M)
20 LET [0],#B,7,#A,0,#C,1,9,0,#F,0
30 FOR I=0 TO 8 STEP 2:R=[I]:V=[I+1]:GOSUB @WRITE:NEXT
40 FOR I=0 TO L-1
50 A=PEEK(M+I)*8
60 FOR J=0 TO 7:R=J+1:V=PEEK(A+J):GOSUB @WRITE:NEXT
70 NEXT
80 END
90 @WRITE:OUT2,0
100 FOR W=0TO7:OUT1,0:OUT3,R>>(7-W)&1:OUT1,1:NEXT
110 FOR W=0TO7:OUT1,0:OUT3,V>>(7-W)&1:OUT1,1:NEXT
120 OUT2,1:OUT2,0
130 RETURN


プログラムの簡単な説明

・MX7219では、16ビット単位でコマンドを送信して制御を行います。
  16ビットの上位8ビットがレジスタ番号(または表示用メモリアドレス)、
  下位が付随するデータとなります。
  その送信を90行~130行のサブルーチン @WRITE で行っています。
 

・10行は表示用文字列とその長さです。
  デモ動画で表示しているIchigoJamの特殊文字は削除して掲載しています。
 
・20行はレジスタ番号とその設定値を配列を使って定義しています。
レジスタと値の意味は下記の通りです。
  #B, 7  :スキャン制御レジスタ 表示制御を行う行数を0~7で指定する(ここでは7を指定)
  #A, 0  :輝度レジスタ 0~7で輝度を指定する(ここでは最低輝度0を指定)
  #C, 1  :シャットダウンレジスタ 1:稼働 0:シャットダウンを指定(ここでは1:稼働を指定)
   9 , 0  :デコードモードレジスタ 0:デコード不要 1~:デコードする(ここでは0を指定)
  #F, 0  :ディスプレイテストレジスタ 0:テストしない 1:全点点灯(ここでは0を指定)
 
・30行は20行の配列値を使ってレジスタ設定を5件分行っています。
 
・40行~80行がキャラクタ表示を行っています。
  文字列Mの内容を先頭から順番に表示しています。
  文字コードに該当するフォントデータの先頭格納アドレスを50行で計算して変数Aに
  格納しています。
  60行では、各文字のフォントデータ8バイトを順次取り出して、MAX7219に送信しています。
 

考察・問題点等
さて、遅い原因ですが、サブルーチン@WRITEの処理内容に起因します。
1ビット送信にOUT命令を3回実行する必要があります。
8x8ドットの表示用データを送るのにOUT命令は384回も実行する必要があります。

またロジックアナライザでビットレート(転送速度)を測定してみると約130bpsくらいでした。
8x8ドット表示に128ビット送信するので最低でも1秒かかることになります。

一方、HT16K33を使った場合、8x8ドット(64ドット)送信はI2CW命令1回で出来ます。
この差が大きいですね。

IchigoJamはArduinoのShiftOut()命令的な通信プロトコルを要するデバイスの利用は
遅いです。インタープリターとしてはShiftOut()類似の専用命令が欲しいところです。
ShiftOut()に置き換えれば、8倍は早くなると思います。

それと、本モジュールを使うとIchigoJamの画面に揺れ・乱れが生じました。
繋げただけでは発生はせず、プログラムを実行してシャットダウンレジスタを1:稼働に
セットすると発生します。
モジュール側のダイナミック駆動が影響しているっぽいです。

03

対策として、そのへんに転がっていた100μFのコンデンサをVCC・GND間に入れると
揺れ・乱れは無くなりました(本当はモジュールのVCC・GNDに入れるべきです)。

05

04

MAX7219のデータシートを見るとリップルノイズ対策にVCC・GND間に10μFと0.1μFの
入れるよう記載されています。
モジュールには、0.1μFのセラミックコンデンサしか乗ってないみたいです。
10μFの電解コンデンサを入れた方が良いようです。

2016年7月 5日 (火)

4連8x8ドットLEDマトリックスを試してみる 続編

前回の続きです。

4連8x8ドットLEDマトリックス2つを連結して32x16ドット表示にしてみました。
スケッチは前回からの少々の改造で実装出来ました。

01

1つめの出力を2つめの入力に接続しいます。増やしても5線のみので制御できます。

16x16ドットの日本語文を表示するため、自作フォントライブラリを利用しました。
フォントをmicroSDカードから読むため3.3V稼働させています。
(Arduino Unoも3.3V稼働出来るものを利用)

MAX7219としては3.3Vは動作保証外ですが問題なく動作しました。
3.3VでもOKなので、ARMやESP-WROOM-02でも利用出来ますね。

動作の様子


下段のモジュールのLEDが不良のため1点だけ点灯しませんが
動作としては期待以上に動いてくれました。

ただ、Arduino標準のshiftOut()関数によるシリアルデータの送り出しが遅いようです。
早いスクロール表示が出来ませんでした。そのため高速版のshiftOut()に置き換えました。

8個もLEDマトリックスを使用しているので消費電流が気になり、計ってみました。

Dscn5391

表示部(Arduino Unoを除く)は、最大35.1mAでした。まあ、こんなもんですかね。
バッテリー駆動も可能なレベルですかね。

このモジュールなかなか使いやすですね。用途に応じて、連結して利用出来ます。
更に、4連基板をカットして利用することも出来るみたいです。

基板の裏はこんな感じ

Dscn5380

今回作成したスケッチ(プログラム)  ダウンロード max7219_test3.zip (6.2K)

いくつかのファイルに別れますが、取りあえずメイン部はこんな感じです。

// max7219_test3.ino
// MAX7179ドライバーライブラリ動作チェック 32x16ドットバージョン
// 2016/07/05 たま吉さん

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

#include "MAX7219_matrix.h"
#include "libmatrix.h"

// MAX7219接続
#define MAX7219_DIN   2 // DIN
#define MAX7219_CLK   4 // CLK
#define MAX7219_LOAD  3 // LOAD

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

#define  SCREENS   8    // MAX7219カスケード接続数
#define  BRT       0    // LEDの輝度(0~7)
#define  SC_WIDTH  32   // マトリック表示横ドット数
#define  SC_HIGHT  16   // マトリック表示縦ドット数

uint8_t fbuf[SC_WIDTH*SC_HIGHT/8];  // 表示用バッファ

// 表示用バッファを表示
// (フレームバッファ32x16ドットをMAX7219用バッファ64x8にマッピング)
void update_screen() {
  uint8_t* ptr = MAX7219_getBuffer();
  for (uint8_t i=0; i < 8; i++) {
    memcpy(&ptr[i*8],&fbuf[i*4+32], 4);
    memcpy(&ptr[i*8+4],&fbuf[i*4], 4);
  }
  MAX7219_update();  
}

// デモ
void demo() {
  uint8_t font[MAXFONTLEN];
  SDfonts.open();            // フォントのオープン
  SDfonts.setFontSize(16);    // フォントサイズの設定

  char* str = "こんにちは埼玉県!熱いぞ!埼玉県!";

  MAX7219_clear();
  while(1) {
    str = SDfonts.getFontData(font, str);  // フォントデータの取得
    if (!str)
      break;
    scrollInFont(fbuf, font, 30);
  }
  SDfonts.close(); 
}

// 1文字分スクロール挿入表示
void scrollInFont(uint8_t*ptr, uint8_t *fnt, uint16_t dt) {
  for (int8_t t = 0; t < 16; t++) {
    scrollBitmap(ptr, SC_WIDTH, SC_HIGHT, B0001); // 左スクロール
    clearBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, SC_HIGHT, SC_HIGHT);
    setBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, fnt, SC_HIGHT, SC_HIGHT);
    update_screen();
    delay(dt);
  }  
}

void setup() {
  //Serial.begin(115200);
  SDfonts.init(10);     // フォント管理の初期化
  
  // マトリック表示ドライバの初期化
  MAX7219_init(MAX7219_DIN, MAX7219_CLK, MAX7219_LOAD, SCREENS, BRT);
}

void loop() {
  MAX7219_clear();
  demo();
  delay(1000);
}

別途自作ライブラリ sdfonts を利用しています。
  ・sdfonts : Arduino用漢字フォントライブラリ SDカード版
    https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD

今まで、LEDドットマトリックスを色々やってきましたが、このモジュールの利用で
落ち着きそうです。

関連記事
4連8x8ドットLEDマトリックスを試してみる 続々編
・4連8x8ドットLEDマトリックスを試してみる 続編 (この記事です)
4連8x8ドットLEDマトリックスを試してみる

2016年7月 4日 (月)

4連8x8ドットLEDマトリックスを試してみる

Aliexpressで4連の8x8ドットLEDマトリックが格安で売っていたので入手しました。
ドライバーにMAX7219を4つ使った製品です。

なんか、ドットマトリックスばっかりやってる感がありますが、表示器の制御は
面白いです。

MAX7219 Dot Matrix Module For Arduino Microcontroller 4 In One Display with 5P Line

01

到着した製品はこんな感じです。

Matrix

早速、Arduinoにて動作確認してみました。
輝度が強く、眩しいので輝度設定を最小にしました。LEDマトリック自体は明るい製品みたいです。

Dscn5373

Arduinoとの接続は5線(VCC、GND、DIN、CLK、LOAD)のみです。シフトレジスタを
使うような感じでデータを送ります。

購入した2つのうち1つは1ドット点灯しない不具合を発見。
入れ替ると点灯するので基板ではなく、8x8ドットLEDマトリックス1個が不良のようです。
まあ、これは諦めましょう。

本製品で使われている8x8ドットLEDマトリックスは5個で$3で売っているのでそちらを
買って差し換えるつもりです。

Dscn5377

動いている様子


4文字表示できると時刻や気温の表示なんかにも使えそうです。


スケッチ(プログラムソース)
ダウンロード max7219_test.zip (5.6K)

4連結の制御にちょっとはまりましたが、取りあえず出来ました。
下記のライブラリを参考にさせて頂き、制御部分を作成しました。
  https://github.com/lstoll/arduino-libraries/tree/master/Matrix

日本語フォント表示は美咲フォントを使わせて頂きて、自作ライブラリにて
行っています。コンパイルには上記スケッチとは別に下記が必要となります。

  Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版
  https://github.com/Tamakichi/Arduino-misakiUTF16

Arduino IDEの環境では文字コードとしてUTF-8が使われています。
デモスケッチでは、表示する日本語文字列はそのままUTF-8文字列にて指定できます。

日本語文字列の指定例(スケッチより抜粋)

// デモ1
void demo2() {
  uint8_t font[8];
  uint8_t* ptr = MAX7219_getBuffer();

  char* str = "こんにちは埼玉県!熱いぞ!埼玉県!";

  MAX7219_clear();
  while(1) {
    str = getFontData(font, str);  // フォントデータの取得
    if (!str)
      break;
    scrollInFont(ptr, font, 30);
  }
}

Arduino用 美咲フォントライブラリは、Arduinoのフラッシュメモリの容量の制約から
利用できるフォントを教育漢字に絞っています。ですのであまり難しい漢字は表示できません。

さて、2つあるので繋げてなんとか32x16ドット表示を実装したいですね。
その後は、ESP-WROOM-02に繋げてインターネットから取得した情報を表示なんてのを
やってみたいです。

関連記事
4連8x8ドットLEDマトリックスを試してみる 続々編
4連8x8ドットLEDマトリックスを試してみる 続編
・4連8x8ドットLEDマトリックスを試してみる (この記事です)

2016年7月 2日 (土)

ESP-WROOM-02を始めました(4) WiFi経由でLEDを制御

ESP-WROOM-02GPIOまわりの雰囲気が分かったので、
本来の目的のIoTをボチボチとやり始めました。

Dscn5367

まずは、Arduino IDEのサンプルソースのSDWebserverを修正して
簡単なLED制御プログラムを作って見ました。

スマートフォンにてESP-WROOM-02にて稼働するWebサーバーに接続して
LEDを制御しています。

動作の様子

動作としては単純なのですが、ESP-WROOM-02が具体的に何をやっていると言うと
  1)WiFiアクセスポイント 機能の提供
  2)接続したスマートフォンにIPアドレスの配布(DHCP)
  3)Webサーバー
  4)WebコンテンツをSDカードから配信
  5)URL名前解決(DNSサーバー)
  6)LEDの制御

てな感じです。

ESP-WROOM-02がWiFiアクセスポイントになっているので、既存ネットワークが無くても
スマートフォンから接続することが出来ます。

動画見ると分かりますが、表示レスポンス等、Webサーバーとしてはさすがに遅いです。
ですので、ボタン操作によるLED制御は、非同期通信を使ってページ更新が発生しない
ようにしました。

結線

05ピン    LEDのアノードへ接続
13ピン    microSDカードモジュールのMOISに接続
12ピン    microSDカードモジュールのMISOに接続
14ピン    microSDカードモジュールのCLKに接続
15ピン    microSDカードモジュールのCSに接続

microSDカードの接続・使い方はスイッチサイエンスさんの記事
   ESP-WROOM-02を使ったWi-Fi機能付き温度ロガーを作る(1)
が参考になると思います。

スケッチ
ダウンロード SDWebServerEx.zip (64.5K)

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <SPI.h>
#include <SD.h>

#define DBG_OUTPUT_PORT Serial
#define LED_PIN 5

const char* ssid = "esp8266";
const char* password = "xxxxxxx";
const char* host = "sd.local";
const byte DNS_PORT = 53;

IPAddress apIP(192, 168, 0, 1);
DNSServer dnsServer;
ESP8266WebServer server(80);

static bool hasSD = false;

void returnOK() {
  server.send(200, "text/plain", "");
}

void returnFail(String msg) {
  server.send(500, "text/plain", msg + "\r\n");
}

bool loadFromSdCard(String path){
  String dataType = "text/plain";
  if(path.endsWith("/")) path += "index.htm";

  if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf("."));
  else if(path.endsWith(".htm")) dataType = "text/html";
  else if(path.endsWith(".css")) dataType = "text/css";
  else if(path.endsWith(".js")) dataType = "application/javascript";
  else if(path.endsWith(".png")) dataType = "image/png";
  else if(path.endsWith(".gif")) dataType = "image/gif";
  else if(path.endsWith(".jpg")) dataType = "image/jpeg";
  else if(path.endsWith(".ico")) dataType = "image/x-icon";
  else if(path.endsWith(".xml")) dataType = "text/xml";
  else if(path.endsWith(".pdf")) dataType = "application/pdf";
  else if(path.endsWith(".zip")) dataType = "application/zip";

  File dataFile = SD.open(path.c_str());
  if(dataFile.isDirectory()){
    path += "/index.htm";
    dataType = "text/html";
    dataFile = SD.open(path.c_str());
  }

  if (!dataFile)
    return false;

  if (server.hasArg("download")) dataType = "application/octet-stream";

  if (server.streamFile(dataFile, dataType) != dataFile.size()) {
    DBG_OUTPUT_PORT.println("Sent less data than expected!");
  }

  dataFile.close();
  return true;
}

void handleNotFound(){
  if(hasSD && loadFromSdCard(server.uri())) return;
  String message = "SDCARD Not Detected\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " NAME:"+server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  DBG_OUTPUT_PORT.print(message);
}

// LEDの制御
void handleLED() {
  if (!server.hasArg("LED")) {
    String msg = "Command Error\n";
    returnFail(msg);
    return;
  }

  String cmd = server.arg("LED");
  if (cmd == "on") {
    digitalWrite(LED_PIN, HIGH);
    DBG_OUTPUT_PORT.println("LED ON");
  }    
  if (cmd == "off") {
    digitalWrite(LED_PIN, LOW);
    DBG_OUTPUT_PORT.println("LED OFF");
  }
  returnOK();
}

void setup(void){
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);  
  DBG_OUTPUT_PORT.begin(115200);
  DBG_OUTPUT_PORT.setDebugOutput(true);
  DBG_OUTPUT_PORT.print("\n");

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, password);

  dnsServer.setTTL(300);
  dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure);
  dnsServer.start(DNS_PORT, host, apIP);

  server.onNotFound(handleNotFound);
  server.on("/do",HTTP_GET, handleLED);
  
  server.begin();
  DBG_OUTPUT_PORT.println("HTTP server started");

  if (SD.begin(SS)){
     DBG_OUTPUT_PORT.println("SD Card initialized.");
     hasSD = true;
  }
}

void loop(void){
  dnsServer.processNextRequest();
  server.handleClient();
}


Webページ
とりあえず、トップ画面のみ掲載します。ファイルはSDカードに入れています。
SDカードライブラリの制約でファイル名は8.3文字となります。

スマートフォンに表示されているページや画像はSDカードに入れています。
ページは2ページ構成です。

簡単な説明
スマートフォンからは、まずssidがesp8266のアクセスポイントに接続します。
このあたりは、ESP-WROOM-02

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, password);
でやってます。

次にスマートフォンからブラウザにて、URL http://led.local  にアクセスして
LED制御画面を(index.htm)を表示します。

ESP-WROOM-02
でこのアクセスによるコンテンツ画面配信のための、
名前解決は DNSServer dnsServer にて生成したDNSサーバーがやってくれています。

コンテンツの配信は下記のコードでやっています。まずはハンドラの設定は
  server.onNotFound(handleNotFound);
  server.on("/do",HTTP_GET, handleLED);
です。 LEDを制御するためのURL(GET)は、スマートフォンから
   http://led.local/do?LED=on    でLED点灯
   http://led.local/do?LED=off   でLED消灯
のアクセスでやっています。

このled.local/do のURLでアクセスされた場合にLEDの制御を行うため
  server.on("/do",HTTP_GET, handleLED);
と記述して、処理を行う関数 habdleLED() を指定しています。またdo?LED=on 形式で
スマートフォンから変数LEDの値を渡す方式(GET)を指定するためにHTTP_GET
指定しています。

led.local/do 以外のURLでアクセスされた場合は、
  server.onNotFound(handleNotFound);
と記述して、関数 handleNotFound() を呼び出すように指定しています。

handleNotFound()では、loadFromSdCard(String path) を呼び出して
URLで指定したファイルがあればそのファイルをSDカードから
読みだして、配信を行っています("/" の場合は"/index.htm"ファイルを配信)。

今回はサンプルを参照してサクッと作成しましたが、
Webサーバーを操るにあたり、HTTPのプロトコルをちょっと突っ込んで学ばないと
いけないようです。

ただし、ライブラリが充実しており、ちょっとしたプログラムも意外と簡単に作れることが分かりました。

windows 10でwhoamiコマンドの動きがなんか違う?

自宅のWindows 10パソコンで、以前作成したレジストリを操作するバッチコマンドを
実行するとwhoamiコマンドの利用でエラーが発生して正常に動作ぜす。

単体でwhoamiコマンドを動かすとなんかオプション指定の/userが指定出来ない。

01

うーん、Windows 10だと仕様か変わったのだとうかと調べるとそのようなことは無いらしい。
標準とは別のwhoamiコマンドが入っているっぽい。

んで、調べると犯人(インストールしたのは私ですが)はWinAVRと判明しました。

02

環境変数PATHの設定を調べるとWinAVRが上位になっていました。

03

システム標準のwhoamiコマンドは%SystemRoot%\system32に入っているので、
これだとWinAVRのwhoamiが実行されてしまいます。

取りあえず、WinAVRのパスを%SystemRoot%\system32の後に設定してwhoamiコマンド
を動かしてみる。

04

無事に目的通りの出力を得ることが出来ました。
Arduino IDEの設定値とパッケージインストール先を変更するために
SIDの値を使ってレジストリ操作を行うのが目的でした。

パッケージをインストールする際は、パスの優先順番もちょっと意識する必要がありますね。

« 2016年6月 | トップページ | 2016年8月 »