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

« 2014年9月 | トップページ | 2014年11月 »

2014年10月の7件の記事

2014年10月29日 (水)

Arduinoで16x16 LEDドットマトリックスを利用する(7)

前回からの続きです。
16x16LEDドットマトリックスと駆動部の回路をユニバーサル基板上に実装しました。

Dscn3200

小型化のためにSOP版のICに変更して強引に実装したため、基板はこの有様です。

Dscn3199

フラックスまみれの状態、後で洗浄しましょう。

全体としては、ブレッドボード1枚に乗るレベルになりました。

Dscn3205

フォントROMは中華ROMからフラッシュメモリW25Q64VBに置き換えました。
中央の8ピンICがW25Q64VBで横のICが電圧レベルシフタのCD4050です。

最終的には、キューブ型の手のひらにのるサイズにする予定です。
「Arduinoで16x16 LEDドットマトリックスを利用する(8)」 に続きます。

関連記事
Arduinoで16x16 LEDドットマトリックスを利用する(1)
Arduinoで16x16 LEDドットマトリックスを利用する(2)
Arduinoで16x16 LEDドットマトリックスを利用する(3)
Arduinoで16x16 LEDドットマトリックスを利用する(4)
Arduinoで16x16 LEDドットマトリックスを利用する(5)
Arduinoで16x16 LEDドットマトリックスを利用する(6)
Arduinoで16x16 LEDドットマトリックスを利用する(7) (この記事です)
Arduinoで16x16 LEDドットマトリックスを利用する(8)

再チャレンジ版
aitendo 16x16LEDマトリックスの制御 (1)
aitendo 16x16LEDマトリックスの制御 (2)
aitendo 16x16LEDマトリックスの制御 (3)
aitendo 16x16LEDマトリックスの制御 (4)
aitendo 16x16LEDマトリックスの制御 (5)
ESP-WROOM-02を始めました(2)

2014年10月23日 (木)

Aliexpressで購入したFT232RL搭載シリアル通信モジュールが動かない

USB - シリアル通信モジュールをAliexpressで購入したのですが、最新のドライバーを
インストールしてもモジュールを正常に認識せず動作しませんでした。

01

実際の製品

Dscn3197

現象としては、この製品から読み取ったPIDが本来なら6001のはずが0000となっていて、
デバイスを正常に認識しません。

02

取りあえず、ドライバーインストールファイルのftdiport.infとftdibus.infの
PID_6001をPID_0000に書き換えて強引にインストールしたところ正常に動作しました。
(windows 8/8.1では、署名なしドライバのインストールを行う必要があります)
機能的には正常に動作するようです。

ならば、FT_Prog(FTDI社のEEPROM書き換えツール)でPIDを6001に戻したのですが、
書き換え後に再接続した直後はPIDを6001と認識するのですが、更に抜き差しすると
PIDが0000になってしまいます。
FT_Progで調べると、どうもEEPROMのPIDが何者かに書き換えられている感じです。

03


ドライバーソフトが怪しい感じがしたので、調べると原因が分かりました。
同様の症状が今月10月になって多発しているようです。

その原因は、FTDI社がドライバーソフトに偽物製品対策を施したためのようです。
下記のフォーラムにそんな感じのことが書かれています。
 ・Topic: Nano ft232r error,  worked till today :( (Read 1 time)
  http://forum.arduino.cc/index.php?topic=270176.0

  ・Topic: Unable to get FT232R drivers loaded under Windows 7 64bit (Read 8 times) 
    http://forum.arduino.cc/index.php?topic=270175.0

私の購入した、製品に搭載しているFTDI社のFT232RLは正規品ではなく、中華製コピー
製品だったようです。
どうも、かなり偽物が出回っているようです。

別の手持ちのFT232RL搭載製品も当初は動いていたのですが今はPIDが0000と認識して
通常の利用では動作しなくなってしましました。

最近、Windows UpdateでもFTDIのドラーバーの更新が自動で行われたのですが、
これをやると使えなくなるようです。ドラーバーのバージョン2.12(リリース 14/9/29)は
模造品のFT232RLではだめなようです。

うーん、困ったもんだ。偽物だったのか。安いはずですね。

対策としては、正規品のFTDI社のICが乗った製品を購入するか、
ドライバーソフトのftdiport.infとftdibus.infを書き換えて利用するか、古いドライバーを
利用するか、安価なch340搭載製品に代替えするかでしょう。

私もArduino Nanoの中華安物を所有しているのですがch340なので問題なしでした。

取りあえず私は、ドライバーソフトを修正で対応しましたが、Linux機で認識させる
方法が分からずCentOSでは利用できなくなってしまいました。

2014年10月 8日 (水)

CEATEC JAPAN 2014に行ってきました

今年もCEATECに行ってきました。

今年の展示ではウェアラブルデバイスが目立ちました。多くの企業で展示していました。

ただ、全体的にはあまり目新しいものがありませんでした。
出店企業も減った感じです。SONYが不参、日立の不参加も継続。
去年展示していたビクターや沖電気、日産自動車も見かけなかったですね。
展示企業数は過去最低の547社だそうです。

関連情報
「CEATEC」出展企業数、過去最低更新 ソニー見送り、薄れる存在感 - Itmagia

ちなみに、去年の感想はこちら。日経平均上がっても展示企業数は減っちゃいました。
来客数も減った感じがします。

取りあえず、気になった展示物を掲載します。
まず最初の驚き。駅から会場までの2連結バス。こんなのよく運転できるなと感心しました。

Dscn3106

8Kテレビ、去年は感動したけどもう感動が薄くなってしまった。でも綺麗。

Dscn3110

四角くないディスプレイ(シャープ)

Dscn3112

5G。周辺技術も何社かで展示していました。

Dscn3113

液晶テレビは三菱電機が一番映像が綺麗だと思う

Dscn3117

東芝のロボット受付嬢
可愛くない。なぜか設定が32歳、微妙。

Dscn3124

オムロンの卓球ロボット。卓球は今一うまくない。

Dscn3127

オムロンの3Dパネル。微細加工したパネルに光を当てると像は浮き上がる。
このネタで株価が急騰したようですが、固定パターンしか表示できないので微妙。

Dscn3142

相変わらず、よくわからないオブジェを展示するホンダ

Dscn3137

大人気の村田製作所のチアリーダー部

Dscn3156

ちっこくてめんこいロボットが踊ってました。

Dscn3161

エプソンのメガネ型のデバイスは軽くて実用てきでよかったです。
もう販売しているそうですが、7、8万円とちょっとお値段高め。

Dscn3139

全体的にウェアラブルデバイス、拡張現実用デバイスが目立ちました。
展示は派手なステージショーも減った感じ。全体として実用的な展示が多かったです。

未来のビジョンやコンセプトを掲げた夢のある展示が無くなってきてちょっと寂しいです。



2014年10月 6日 (月)

arduinoで利用可能な漢字フォントROMの製作

作業メモです。

以前、arduinoで大容量のメモリが使いということで調査した
SPIインタフェースのSerial Flash memory W25Q64VBを使って漢字フォントROMを製作しました。

16x16LEDドットマトリックス表示やグラフィック液晶なんかに使おうと思います。
Unicodeで利用できるようにしました。

フォントデータは、電子書体オープンラボさんで配布している
日本語 ビットマップフォント集のjapanese-bitmap-fonts-0.4.5.tar.bz2と
Little Limitさんが配布している美咲フォントを利用させていただきました。

8〜24ドットの半角・全角文字 14種類のフォントを詰め込みました。
Unicode対応ですが、半角と全角JISX0208のみなので7000字弱のみの対応です。
データサイズは1.73Mバイトとなりました。

W25Q64VBへ書き込みは、flashromで紹介されている「Serprog/Arduino flasher」を利用しました。
Arduinoをprogrammerとして利用し、flashromコマンドを使ってフラッシュメモリに書き込みします。
flashromでは「FT2232SPI Programmer」なんかも紹介しているので
秋月のFT232RL USBシリアル変換モジュール何かでも書けそうです。

以降、「Serprog/Arduino flasher」利用の作業メモです。
書き込みのためのホストとしてCentOS6.5を利用しました。

CentOS6.5上でのツールの入手と作成
1)flashromツール
下記の手順でコマンドを実行してソースのダウンロードをコンパイルを行う。
$ svn co svn://flashrom.org/flashrom/trunk flashrom
$ cd flashrom && make
$ cd ../

コンパイル時、幾つかのライブラリ不足でパッケージを適宜インストールする必要あり。
pciutils-develをインストールした。

#yum install pciutils-devel

2)arduino用プロフラムの入手と書き込み
下記の手順でコマンドを実行してソースのダウンロードをコンパイルを行う。
$ git clone git://gitorious.org/gnutoo-personal-arduino-projects/serprog-duino.git
$ cd serprog-duino && make && make upload

ここでは、arduinoのCPU AVRをターゲットとしたクロスコンパイルを行うので
avr-gcc等のavr toolchain環境が必要となる。
make upkoad でavrdudeコマンドにてarduinoへのブログラムの書き込みを行っている。
デバイスとして/dev/ttyACM0を使う。
/dev/ttyACM0のアクセス権限をいじる必要あり。

 The AVR GCC ToolchainのRedHatのインストールの説明のパッケージをインストールすることで
対応できる。
 #yum install avr-gcc

 #yum install avr-binutils
 #yum install avr-libc
 #yum install avr-gdb
 #yum install avrdude 

flashromコマンドを使った書き込み

/dev/ttyACM0のアクセス権限の変更は面倒なのでスーパーユーザ権限で行った。
書き込み時には、「Serprog/Arduino flasher」の説明のようにarduonoにSPI接続で
W25Q64VBを接続させる。3.3V駆動なのでレベル調整が必要。CD4050で対応。

Dscn3095

01
書き込むイメージについて
flashromコマンドは、フラッシュメモリのメモリ領域の全書き込みしかできないので
フォントデータ1.73Mバイト(1,817,162バイト)にダミーデータをつけてきっちと
8,388,608バイトのイメージファイルにしないとダメ。
ddコマンドでダミーを作成し後ろに結合して image.binファイルを作成した。

コマンドの実行

[root@marimo fontbin]# time flashrom -p serprog:dev=/dev/ttyACM0:2000000 -w ./image.bin
flashrom v0.9.7-r1850 on Linux 2.6.32-431.5.1.el6.i686 (i686)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "serprog-duino"
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) on serprog.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

real    3m32.206s
user    0m10.409s
sys     0m0.211s

3分32秒で書き込み完了。
当初、途中で止まったりベリファイエラーが発生したがコンデンサを入れることで
安定し回避できた。

イメージをROMから読みだして念のため確認

[root@marimo fontbin]# time flashrom -p serprog:dev=/dev/ttyACM0:2000000 -r test.bin
flashrom v0.9.7-r1850 on Linux 2.6.32-431.5.1.el6.i686 (i686)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "serprog-duino"
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) on serprog.
Reading flash... done.

real    1m47.215s
user    0m6.013s
sys     0m0.139s

[root@marimo fontbin]# cmp test.bin image.bin -l
[root@marimo fontbin]# echo $?
0

問題なし
bviコマンドでバイナリデータの中も見たが問題なし

取りあえず、正常に焼けたのでフォント利用のライブラリを作成します。

---
この記事には続きがあります。
  arduinoで利用可能な漢字フォントROMの製作(2)
 

2014年10月 5日 (日)

映画 2001年宇宙の旅 船内でタブレットが使われている

今日は台風接近というとこで、雨降りの一日なので自宅で映画です。
2001年宇宙の旅」のブルーレイ版を借りてきて鑑賞です。

06

ジャケット画像はamazonのものをお借りしました。

この作品、子供の頃見たときは鳥肌ものでした。未来・宇宙感の描写がすごいです。
とても1968年公開の映画とは思えないですね。

定期的に見たなり、何回も見ているのですが今一意味が分かりません。
そこで今回は小説版を読んだうえで鑑賞しました。

小説を読むと、黒い石碑(モノリス)の意味、HAL9000が暴走した理由、
後半の意味不明の描写、赤ん坊の意味が分かります。
映画は話を省略し過ぎている感がありますね。

ただし小説と映画は平行して制作されたそうですが微妙に設定が違くて、
小説では目的地が木星ではなく土星なんですよね。

映画で気になったシーンで、食事中にタブレットでニュースを見ている映像があります。
(映像は映画からキャプチャしたものです)

02

03

04

01

ほとんど、今あるタブレットそのまんです。15インチくらいのサイズでしょうか。
タブレットの右下には「IBM」のロゴが入っています。
1968年(45年前)でこの発想が出来ていたのはすごいです。

タブレットが無かった頃にもこの映画を見たのですが、このシーンは気に留め無かった
のですが、今見ると「うおっ、この映画の設定がすごい」と感服します。

2014/10/06 追記
このタブレットのシーンって、サムソンとアップルの特許侵害でもめたときに
サムソンが反論に利用したんですね。知りませんでした。
確かにサムソンの言い分は分かります。
小説では、電子新聞の閲覧の描写がありますが、機器の具体的なイメージの
説明はないですね。監督のスタンリー・キューブリックが曖昧なイメージを具現化した
してこうなったのでしょう。

スタンリー・キューブリックの履歴を見ると映画「時計仕掛けのオレンジ」もこの監督が
制作したんですね。あれも描写が独特で記憶に残る映画です。




2014年10月 4日 (土)

OCN モバイル ONEが通信容量増量

「OCN モバイル ONE」主要4コースで通信容量が大幅拡大されました。

30M/日コースに加入していましたが、

改定を重ね、10月1日からは、70MB/日となりました。

01

70MBx30日とすると 2.1Gバイト/月 900円(税込 972円)です。
かなりお得ですね。

おなじNTTグループの「NTTぷらら」の定額無制限も魅力的です。

02

こちらは通信速度が3Mbpsのようですが、3Mbpsなら十分な速度です。
3Mbpsあれば動画も十分楽しめます。

私は、モバイル通信機器としてガラケーとスマホ(NVMO)の2台持ちでしたが、
徐々にスマホの利用頻度がなくなり、ガラケー+SIM入り7インチタブレットが
定着してきました。
最近の7インチタブレットは軽いしバッテリーも持つし、持ち運びも苦になりません。
通話とメールはガラゲーで、データ通信はタブレットでという具合です。

通信料、もっともっと業者どうしで競って安くなってほしいです。

2014年10月 2日 (木)

Arduinoで16x16 LEDドットマトリックスを利用する(6)

Dscn3081

前回の続きです。

スクロール表示の動作検証および、日本語フォントROM GT20L16J1Yを使ってみました。
割り込み処理とSPI通信の併用を心配していましたが、まったく問題なしでした。

動画の"こんにちは埼玉県"は、arduinoのSRAMにあるフォントデータを利用しています。
"色は..."のいろは歌はSPI接続のフォントROM  GT20L16J1Yを参照して文字を
表示しています。

スクロールをちょと速めにしてもちゃんと表示出来ています。
GT20L16J1Yは3.3V駆動なので、CD4050を使って5V -> 3.3Vのレベル調整をしました。

Photo_2

LED表示部は前回と変わらずですが、清書しました。
清書してD9接続の74HC595とTB62706のLATCHのタイミングが違うことに初めて気づきました。
まあ、動作しているのでOKということで..(タイミング的にも大丈夫なはず)。

Photo_3

プロフラムソースはこんな感じです。

//
// TB62706を使ったLEDの点灯サンプル
//

#include <arduino.h> #include <MsTimer2.h> #include <string.h> #include <SPI.h> /// #define ASC8x16S 255968  // 8x16 ASCII 粗体字符(半角) #define ASC8x16N 257504  // 8x16 ASCII 日文假名(半角) #define DATAPIN (7) // TB62706のSERIAL-INへ #define LATCHPIN (9) // TB62706のLATCHへ #define CLOCKPIN (8) // TB62706のCLOCKへ #define ENABLEPIN       (6)     // TB62706のENABLEへ uint16_t fbuf[16];    // 表示パターンバッファデータ byte rowdata[32];     // 漢字ROM読み取り用バッファ // 文字データ "こんにちは埼玉県" uint16_t fnt[11][16]= { {// ""   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff },   {// こ   0x0000,0x0000,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x2000,0x3000,0x1c00,0x07fc,0x0000,0x0000 }, {// ん   0x0200,0x0200,0x0600,0x0400,0x0c00,0x0800,0x0800,0x1b80,   0x1440,0x1840,0x3040,0x2042,0x2046,0x604c,0x4038,0x0000 }, {// に   0x0000,0x1000,0x1000,0x31fc,0x2000,0x2000,0x2000,0x2000,   0x2000,0x2000,0x2200,0x2200,0x2b00,0x31fe,0x1000,0x0000 }, {// ち   0x0100,0x0100,0x0100,0x7ffc,0x0200,0x0600,0x0400,0x0ff0,   0x1808,0x3004,0x0004,0x0004,0x000c,0x0038,0x07e0,0x0000 }, {// は   0x0000,0x2020,0x2020,0x6020,0x47fe,0x4020,0x4020,0x4020,   0x4020,0x4020,0x43e0,0x4438,0x542c,0x6466,0x23c0,0x0000 }, {// 埼   0x2020,0x2020,0x23fe,0x2050,0xf8d8,0x218c,0x2000,0x27ff,   0x2004,0x21e4,0x3924,0x6124,0xc124,0x01e4,0x0004,0x001c}, {// 玉   0x0000,0x7ffe,0x0100,0x0100,0x0100,0x0100,0x0100,0x3ffc,   0x0100,0x0100,0x0118,0x010c,0x0104,0x0100,0xffff,0x0000 }, {// 県   0x07f8,0x2408,0x2408,0x27f8,0x2408,0x2408,0x27f8,0x2408,   0x2408,0x27f8,0x2000,0x3fff,0x0888,0x188c,0x7087,0x0080 }, {// ""   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 }, {// ""   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555 } }; //いろは歌(JISコード文字列) uint16_t iroha[] = {   0x3f27,0x244f,0x244b,0x245b,0x2458,0x2449,0x3b36,0x246a,//1   0x244c,0x246b,0x2472,0x3266,0x242c,0x4024,0x243f,0x246c,//2   0x243e,0x3e6f,0x244a,0x2469,0x2460,0x4d2d,0x3059,0x244e,//3   0x317c,0x3b33,0x3a23,0x467c,0x315b,0x2428,0x2446,0x4075,//4   0x242d,0x4c34,0x382b,0x2438,0x3f6c,0x2452,0x2462,0x243b,//5   0x243a }; // 漢字ROM  GT20L16J1Y用 // 全角JISコードからフォント格納先頭アドレスを求める //   GT20L16J1Y データシート VER 4.0 2013-3のサンプルを参照した //   (サンプルでは区点コードからの変換であることに注意) unsigned long calcAddr(unsigned short jiscode) {   unsigned long MSB;      unsigned long LSB;   unsigned long Address;   char buf[32];   // 上位、下位を区点コードに変換   MSB = (jiscode >> 8) - 0x20;   LSB = (jiscode & 0xff) -0x20;     // データ格納アドレスを求める   if(MSB >=1 && MSB <= 15 && LSB >=1 && LSB <= 94)     Address =( (MSB - 1) * 94 + (LSB - 01))*32;   else if(MSB >=16 && MSB <= 47 && LSB >=1 && LSB <= 94)     Address =( (MSB - 16) * 94 + (LSB - 1))*32+43584;   else if(MSB >=48 && MSB <=84 && LSB >=1 && LSB <= 94)     Address = ((MSB - 48) * 94 + (LSB - 1))*32+ 138464;   else if(MSB ==85 && LSB >=0x01 && LSB <= 94)     Address = ((MSB - 85) * 94 + (LSB - 1))*32+ 246944;   else if(MSB >=88 && MSB <=89 && LSB >=1 && LSB <= 94)     Address = ((MSB - 88) * 94 + (LSB - 1))*32+ 249952;     return Address; } // 漢字ROM  GT20L16J1Y用 // JISコードからキャラクタデータを得る void getCharData(unsigned short code) {     byte data;     unsigned long addr=0;     byte n;     if (code > 0xFF) {       // 全角       addr =calcAddr(code);       n = 32;     } else {       // 半角       addr = ASC8x16N + (code<<4);       n = 16;     }         digitalWrite(10, HIGH);     //delayMicroseconds(10);        digitalWrite(10, LOW);     SPI.transfer(0x03);     SPI.transfer((addr>>16) & 0xff);     SPI.transfer((addr>>8) & 0xff);     SPI.transfer(addr & 0xff);     SPI.setBitOrder(LSBFIRST);         for(byte i = 0;i< n; i++)       rowdata[i] = SPI.transfer(0x00);         SPI.setBitOrder(MSBFIRST);     digitalWrite(10, HIGH); } // 漢字ROM  GT20L16J1Y用 // 漢字ROMフォントを表示用形式に変換する void rowtofont(uint16_t* fnt) {   for (byte i=0; i <16; i++)     fnt[i]=0;     for (byte i=0;i<8;i++)     for (byte j=0; j<16; j++) {         fnt[7-i] |= (rowdata[j] & 0x1<<i ? 0x8000: 0) >>j;         fnt[15-i] |= (rowdata[j+16] & 0x1<<i ? 0x8000: 0) >>j;     }    } // 漢字ROM  GT20L16J1Y用 // JIS漢字コートに対応するフォントデータの取得 // void loadfontdata(uint16_t *fnt, unsigned short code) {    getCharData(code);    rowtofont(fnt);       } // 漢字ROM  GT20L16J1Y用 // 漢字ROMを参照してフォントを表示する void test_iroha() {   uint16_t buf[16];   for (int i=0; i <41; i++) {     loadfontdata(buf, iroha[i]);     setfontscl(buf, 25);   } } // // 行の指定 // void selectRow(byte no) {         uint16_t val = _BV(15-no);         // ビット列データの出力 for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } // // 行フォントパターンの送信 // void dataOut(uint16_t val ) { for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } // // バッファ内データを表示する // void fontout() {     // 点灯LEDが移動するパターン     digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする     for( byte i = 0; i < 16; i++ ) {        digitalWrite(LATCHPIN, LOW); //送信開始               selectRow(i);                    dataOut(fbuf[i]);        digitalWrite(LATCHPIN, HIGH); //送信開始             }     digitalWrite(ENABLEPIN,HIGH);            // OUTを有効にする } // // バッファにフォントパターンをセット // void setfont(uint16_t* fptr) {   memcpy(fbuf, fptr, 32);  } // // バッファ内の指定座標に点をセット // void setdot(uint8_t x, uint8_t y, byte dot) { // uint16_t v = ;   fbuf[y] = dot ? fbuf[y]| (0x8000>>x): fbuf[y] & ~(0x8000>>x); } void testdotset() {   for (byte y=0; y<16; y++) {     for (byte x=0; x<16; x++) {       setdot(x,y,1);       delay(10);     }   }   for (byte y=0; y<16; y++) {     for (byte x=0; x<16; x++) {       setdot(x,y,0);       delay(10);     }   } } // // 指定座標にフォントパターンをセット // void setfontat(uint16_t* fptr, uint8_t x, uint8_t y) {   uint16_t w;     if (x>15 || y >15)     return;       for (byte j=y,i=0; j < 16; j++,i++)     fbuf[j] = (fbuf[j]>>(16-x))<<(16-x) | fptr[i]>>x; } void test01() {   for (byte i=0; i <11; i++) {     for (byte x=15; x > 0; x--) {       setfontat(fnt[i],0,x);       delay(20);     }   } } // // ドット表示チェック(デバッグ用) // void dottest() {   for (byte y=10; y < 11;y++)     for (byte x=0;x <16;x++) {       fbuf[y]= 0x8000>>x;      delay(50);       fbuf[y]= 0;     }        } // // バッファーデータのスクロール // h_mode : 0 なし,1 左 ,2 右 // v_mode : 0 なし,1 上, 2 下       // void scroll(uint8_t h_mode, uint8_t v_mode) {   if (h_mode ==1)     for (byte i = 0; i < 16; i++)       fbuf[i] = fbuf[i]<<1;   if (h_mode ==2)     for (byte i = 0; i < 16; i++)       fbuf[i] = fbuf[i]>>1;   if (v_mode ==1) {     for (byte i = 0; i < 15; i++)      fbuf[i]= fbuf[i+1];     fbuf[15]=0;   }   if (v_mode == 2) {     for (byte i = 15; i >0; i--)      fbuf[i]= fbuf[i-1];     fbuf[0] = 0;      } } // スクロールテスト void test02() {     byte i;     setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(1,0);       delay(50);     }     delay(200);     setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(2,0);       delay(50);     }     delay(200);     setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(0,1);       delay(50);     }     delay(200);             setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(0,2);       delay(50);     }     delay(200);         setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(1,1);       delay(50);     }     delay(200);     setfont(fnt[6]);     for (i=0; i<16;i++) {       scroll(2,2);       delay(50);     }     delay(200); } // // スクロールしながらパターンを表示 // void setfontscl(uint16_t* fptr, uint16_t dly) {   for (byte i=0; i<16; i++) {     scroll(1, 0);     setfontat(fptr, 15-i, 0) ;     delay(dly);   } }  void setup() {     pinMode(10,OUTPUT);     SPI.begin();     //SPI.setClockDivider(SPI_CLOCK_DIV4);         pinMode(ENABLEPIN,OUTPUT);     pinMode(DATAPIN, OUTPUT);     pinMode(LATCHPIN, OUTPUT);     pinMode(CLOCKPIN, OUTPUT);     digitalWrite(ENABLEPIN,HIGH);     digitalWrite(CLOCKPIN, LOW);     digitalWrite(LATCHPIN, HIGH);      digitalWrite(ENABLEPIN,LOW);         // OUTを有効にする      setfont(fnt[9]); // フォントバッファに初期パターン設定           // 割り込み開始      MsTimer2::set(15, fontout); // 1/60秒程度で1文字を表示      MsTimer2::start(); } void loop(){   test_iroha();  // いろは歌表示(漢字ROM利用)   delay(1000);   test02();      // スクロールテスト   testdotset();  // ドット単位アクセス表示   // 配列格納文字パターンを順番に表示する   for (byte i =0; i < 11; i++)     setfontscl(fnt[i],40); } 

 

arduinoの文字列がUTF8を使っているのに対して、漢字フォントROMはJISコードなので、
プログラムで「はいろは歌」の文字列をJISコードにて保持して表示しています。
この点はちょっと面倒です。 この対応を模索しています。

「Arduinoで16x16 LEDドットマトリックスを利用する(7)」 に続きます。

関連記事
Arduinoで16x16 LEDドットマトリックスを利用する(1)
Arduinoで16x16 LEDドットマトリックスを利用する(2)
Arduinoで16x16 LEDドットマトリックスを利用する(3)
Arduinoで16x16 LEDドットマトリックスを利用する(4)
Arduinoで16x16 LEDドットマトリックスを利用する(5)
Arduinoで16x16 LEDドットマトリックスを利用する(6) (この記事です)
Arduinoで16x16 LEDドットマトリックスを利用する(7)
Arduinoで16x16 LEDドットマトリックスを利用する(8)

再チャレンジ版
aitendo 16x16LEDマトリックスの制御 (1)
aitendo 16x16LEDマトリックスの制御 (2)
aitendo 16x16LEDマトリックスの制御 (3)
aitendo 16x16LEDマトリックスの制御 (4)
aitendo 16x16LEDマトリックスの制御 (5)
ESP-WROOM-02を始めました(2)

« 2014年9月 | トップページ | 2014年11月 »