DE0-nano + ドットマトリックスLED で遊ぶ その3
- 2012/05/25
- カテゴリー:電子工作, スマートフォン
- タグ:DE0-nano ドットマトリックスLED
さて前回の続きですが、USBホストコントローラ部分の回路については触れていませんでした。ざっくりと言ってしまえば、Sparkfun の USB Host Shield と回路は同じです。
SparkFun Electronics - USB Host Shield
http://www.sparkfun.com/commerce/product_info.php?products_id=9947
DE0-nanoとの接続については、前回紹介した microbridge_nios2 の README.md に書かれていますので、そちらをご参考にということで。
DE0-nanoへ繋ぐ端子のうち、唯一オープンになっていないINT端子は MAX3421E 直近から引き出します。抵抗を挟んだ向かい側(電源側)に繋ぐと意味がなくなってしまうので注意です。
MAX3421E に供給する12MHzのクロックですが、せっかくFPGAがありますので水晶等は使わずにFPGAのPLLで生成することにしました。
FPGAのクロック50MHzを6逓倍して25分周する設定で12MHzが得られます。これはNiosIIコンポーネントに組み込む必要がないので、MegaWizardを使ってNiosIIの外に置きます。またクロックを出してくる端子は、MAX3421Eになるべく近くなるようにアサインします。
次に、ドットマトリックスLEDを制御するモジュールを、NiosIIのコンポーネントとして組み込みます。「SOPC Builder」と「Qsys」 というツールがあり、どちらを使ってもできますが、私はQsysを使いました。(QuartusがQsysを使えと言うので)
組み込み方法は・・・長くなるので省略します。スミマセン。
Sim さんの blog 「Qsysを使ってみた」という記事で紹介されていますので、そちらをご覧ください。
・Sim's blog
http://blog.goo.ne.jp/sim00
とりあえず、試行錯誤でやっていれば、そのうちなんとなく理解できて形になります。組み込んだ後の状態はこのようになります。
電源を切っても、回路データやNiosIIのプログラムが消えないように、EPCSにこれらを保存します。EPCSからプログラムをロードするには、EPCS Flash Controller のコンポーネントを追加しておく必要があります。
ただしリセットベクタの飛び先をメモリからEPCSに変えることになるので、NiosIIのEclipseからプログラムを直接実行できなくなります。デバッグが終わってから組み込んだほうがいいかもしれません。(まあリセットベクタのアドレスをメモリに設定すればいいだけですが…)
NiosIIで走らせるプログラムは、@iseroidさんのサンプルプログラムに若干手を加えた程度です。Android側からは、ドットマトリックスの 32x16 の64バイトデータが直接来ることを期待しています。というわけで実はFPGAはあまり仕事をしていません。
修正したファイルです。
mb_de0nano_demo.c
後は回路合成後のsofファイルと、NiosIIプログラムのelfファイルをEPCSに書き込むだけ・・・と、まあこのような感じでDE0-nano側は作っています。途中の工程をかなりブッ飛ばして書いていますが、細かいところはグーグル先生にお任せすることにしましよう。
ここからいよいよお待ちかねの、Android側のプログラミングです。
早速ですが、Androidの画面に描いた絵をドットマトリックスLED上に表示させるデモを作ってみました。そんなに難しいことをしているわけではないので、詳細はソースコードをご覧ください。
LEDを点灯させるかどうかは、特定のポイントで判定するよりも領域の平均的な明るさから決めたほうが、輪郭が綺麗になるとは思いますが、今回は時間があまりなかったということを言い訳として簡単な処理にしました。
ソースコードはこちら。
touch2matrix.zip
動いているところなど。
最後にLED上で動画を表示させてみたかったのですが、
残念、静止画で~す。
動画表示は無理っぽいですね。というのも・・・
- 画面を取り込む手段が無い
一番やりたかったことは、Android側で画面データを逐次取り込み、 LEDに送るデータに加工して転送するということでした。
しかし、通常のJava(というかAndroid-API)を使っての開発では無理ということが徐々に判明してきました。フレームバッファ等に直接もしくは間接的にアクセスする手段がないので、例えば、動画を再生しつつその映像に対して独自の効果をかける、ということもできません。(カメラの映像ならできるんですよね。ファイルからの映像でできないのは著作権がらみ?)
NDKならできるかもしれませんが、詳しくないのでわかりません。
機種によっては、ADB経由でフレームバッファのデータを取得できます。日曜エレクトロニクスの @yishii さんが試されています。Garaxy-SでもできたのでSamsungの他の端末でもおそらくできます。IS01では無理でしたのでSHARPの端末は不可能かと。
- 転送速度が遅い
フレームバッファがADB経由で読めたとしても、800x480の画面サイズのデータがRGB888で送られてくるので、Hi-Speedでないと間に合いません。
USBの転送速度、MAX3421EとFPGA間(SPI)の速度が遅いので、頑張っても1fpsいければいいところだと思います。
=====
先日5/19に、ECCコンピュータ専門学校を会場とした「関西FPGA・DE0勉強会」がありました。拙作のボードを持って行ってデモをしたところ、キャンパスニュースに(かなり大きく)載ることになりました。ありがとうございます! (テヘ
・ECCコンピュータ専門学校
http://comp.ecc.ac.jp/
・ECCコンピュータ専門学校 キャンパスニュース (5/22)
http://comp.ecc.ac.jp/news/campus/detail.php?id=2592