2012年10月30日火曜日

ArduinoにLCD表示器をつなぐ

Arduinoに秋月で500円で売ってるLCDキャラクタディスプレイをつなげてみた。
素直に4ビットで配線すれば、IDEのLiquidCrystalライブラリでそのまま表示できる。

しかしこれでは表示制御のために6本のピンが必要で、何だか無駄だ。シフトレジスタを使えばもっと少ない信号線で制御できると思って、ちょっとGoogleを検索すると、みんな同じ事を考えるようで、すでにちゃんと動作する配線方法と、そのためのライブラリまで存在する。

このシフトレジスタを使った制御方法だと3本、抵抗とダイオードを追加すれば2本、さらに工夫すればたった1本でLCDの表示を制御することもできる。しかも、4ビットでつなぐよりも、表示速度がずっと早い。

とりあえず先日、LEDの点灯にでも使おうかと思って買っておいた74595があったので、 これで3線接続と2線接続を試してみたけど、結果としてちゃんと表示させることができた。
ちょっとひっかかったのは、2本で制御する場合で、ANDゲートを入れるか、抵抗とダイオードでダイオードロジックを組まなければいけないのだが、ダイオードによってはうまくタイミングが取れないことがある。サイトのディスカッションによれば、接合容量が小さくないとダメとのこと。抵抗は、マイコン側ポートがHighで、シフトレジスタ側の出力がLowの時に、シフトレジスタ側に流れてしまう電流を制限する。ここで抵抗とダイオードの接合容量がローパスフィルタになっちゃうので、抵抗はできるだけ小さく、ダイオードの接合容量もできるだけ小さくないと、LCDのEnableのタイミングがずれてしまうということなんだと思う。
部品箱の中に転がってるダイオードの品番なんてわからないので、適当に付けてみたら、最初のトライでは表示が乱れたので、別のダイオードに変えたらオッケーでした。たった2本でつながるのはうれしい。
ただし、2線接続の場合、やや不安定。74595を使うんだったら3線接続の方が確実。2線接続をしたいんだったら74164を使うほうが安定していると思う(けど、似たようなものかもしれない)。上記のEnableのタイミングが乱れるんじゃないかと思う。ブレッドボードなんかを使ってると、シフトレジスタのVccとGND間のパスコンを入れなかったりとか、無意味に長い線で配線したりとか、つい不精してしまうのだけど、ちゃんと気を使ったほうがいいみたい。

なお、New Liquid Crystalライブラリは、標準のLiquidCrystalライブラリの上位互換で、そのうち、Arduino IDEの標準ライブラリになる予定だそうだ。
つまり従来通り、4ビットでつなぐときはそのままNew LiquidCrystalの4bitモードでつなげられる。
2wireと3wireを使いたい場合は、LCD.h(Wire.h?)とLiquidCrysatl_SR.hをインクルードして、LiquidCrystal_SRのインスタンスを作ればいい。

2線接続の場合
#include <LCD.h>
#include <LiquidCrystal_SR.h>

LiquidCrystal_SR lcd(2,3,TWO_WIRE); // data, clockのポートを指定

3線接続の場合
#include <LCD.h>
#include <LiquidCrystal_SR.h>

LiquidCrystal_SR lcd(2,3,4); // data, clock, enableのポートを指定

ただ、現時点(2012/10)段階では、まだこのライブラリは活発な開発が続いているのでいろいろ細かい問題もある。たとえば標準のCustomCharacterだとwriteの型についてのエラーが出る。Arduinoのコアで定義されているwrite(char*)とNewLiquidCrystalのwrite(uint8_t)が異なるのが問題らしいのだけど、ここは強引にwrite((unit8_t)0)みたいにuint8_tなどでキャストしてしまえばコンパイルは通る。ただコンパイルは通っても、なんかおかしい。
あと、NewLiquidCrystalライブラリの例にあるperformanceLCDでもエラーが出てコンパイルできない。これはArduino 1.0.1のバグなのでArduinoのライブラリにパッチを当てる。




2012年10月25日木曜日

Arduino

先日、Arduinoというマイコンを買った。これは面白い。
面白いという話はいろいろ聞いていたけど、しばらくいじってるうちに、想像以上にこれは面白いシステムだということがわかってきた。

とてもよくできていて、ろくにソフトウェアの知識もハードウェアの知識もハンダ付けの技術もない人でも、割と簡単にいろんな部品を思ったように動かせる。そんな知識が全く無い人でも何とかなるんじゃないだろうかと思うぐらい。それに、安い。現時点で標準的なArduino Unoは2500円から3000円ぐらいで売られてるし、Leonardoなら2000円弱。この値段が高いと思えば、自分でもっと安いArduinoもどきを作ることもできる。

買ってきたArduinoに部品箱の中のLEDやらセンサーやらスイッチやらをつないで、パソコンで適当にスケッチ(Arduinoのプログラムは「スケッチ」と呼ぶらしい)を書いてArduinoに転送してやると、いきなり動き始める。部品箱にごちゃごちゃいろんなパーツを持ってる人は、適当に手持ちのパーツを組み合わせることができる。電子部品なんてもってない、という人なら、スターターキットを買ってくれば、Arduinoにつないで使えるような部品がいくつも入っていて、それを組み合わせてしばらく遊べる。しかもハンダ付けをしなくても回路を作ることができるブレッドボードも入っているので、組立用の工具もいらない。
まあ、その程度の仕掛けなら、どんなマイコンでも似たような話なのだけど、Arduinoは「オープンソース」のシステムということになっていて、ハードウェアもソフトウェアも基本的には全部公開されている。だから「これをつなげるにはどうしたらいいんだろう」と思った時はネットを検索すれば接続の方法やサンプルのスケッチまで、たいていのものが見つかる。ブレッドボードでは間に合わないハードウェアは、自分で作ってもいいけれど、普通、使いたくなるようなハードウェアはたいてい、Arduinoにドッキングさせて使う「シールド」という形で売られているので、自作できなければ必要なシールドを買ってきて取り付けてやればいい。

実際、センサーからデータを読み込んでモーターを制御するとか、ちょっと前はむちゃくちゃめんどくさかった。ろくに資料もなく、データシートを読み ながらアセンブラで試行錯誤しながらやってたもんだけど、Arduinoだったらモーターシールドあたりを買ってきてモーターをつないでモーターオンとか モーターオフといった調子のスケッチを書けばそれだけでできちゃうんだから。

そうしてArduinoをいじっていれば、そのうち、ソフトやハードの知識も身についてくる。そうすれば、自力でさらに高度なこともできるようになるはず。
Arduinoに必要なものは、技術でも知識でも材料でもなく、好奇心だけというわけだ。