第5回「LEDディスプレイをPCにつないでみよう」



 今回から4回連続でArduino(アルドゥイーノ)を使った作例をご紹介します。Arduinoのおさらいをしたい人は次の記事がオススメです。

・週刊スタパトロニクスmobile「2009年、Arduinoの現在」
・武蔵野電波のブレッドボーダーズ「かんたんマイコンArduinoの始め方」

 前回使った16セグメントLEDを8桁並べて、ディスプレイを作りましょう。表示するメッセージはPCから自由に変更できるようにします。Arduinoを使うと、最小限の手間で実現可能です。

 ハンダ付けとブレッドボーディングを組み合わせて、工作がなるべく簡単になるようにしました。それでも今回のハンダ付けの量はちょっと多めです。不安な人は、作例のとおりに作ることにこだわらず、PCとArduinoの間の通信やたくさんのLEDをドライブする方法を参考にして、自分なりの応用例を考えてみてください。

ネットブックにLEDディスプレイを接続し、「HI SCORE」と表示しました。LEDの制御にはArduinoを使い、PC側のソフトウエアはProcessingで書かれています。LEDの配線はちょっと面倒ですが、それ以外の部分は思いのほかあっさりとできあがりました。

 さて、さきほど「前回使った16セグメントLEDを8桁並べて」と書きましたが、今回使用するのは16セグではありません。一見同じでも、よくみると字形をあらわすLEDの線が少なくなっています。上の横棒と、下の横棒が1本ずつしかない、14セグメントLEDです。以下、14セグと表記します。

 14セグは16セグにくらべると表現力の点で若干劣るかわりに、1桁につき16bitでコントロールできるメリットがあります。16セグの場合、ドットまで含めると1桁につき17bitの情報を扱う必要がありました。これは案外面倒です。14セグならば15bitで表現できるので、お釣りがきます。

 また、今回使うNFD-5421という14セグは2桁で1つのパッケージになっていて、配線が半分で済みます(4桁のパッケージがあればもっといいのですが、我々はまだ見たことがありません)。

14セグメントLED「NFD-5421AS」。字面に向かって左下が1番ピンです
裏面の様子。小さなプリント基板が封入されているようです
内部配線はこのようになっています(NFDシリーズ・データシートより)。カソードコモンですね。中段の線がG1とG2の2本に分かれている点に注意してください。3番ピンは使用しません
この部品はFuturlecというオンラインショップから1個1.30ドルで購入しました。Futurlecは品揃えがユニークで値段も送料も安いので、我々はときどき利用します。ただし、買い物がしやすいお店とは言えないかもしれません。発送に時間がかかり、メールのやりとりが必要となる場合があります。荷物はタイから送られてきます

 今回初めて使用する部品の説明をしておきましょう。

 14セグが8桁ということは、ドットを入れると全部で120個のLEDをコントロールすることになります。ブレッドボーダーズで説明した「ダイナミック点灯」のテクニックを使うことは必須です。1桁あたり15本のアノードと、8桁分のカソードがありますから、それでも23本の信号線が必要です。Arduinoではピンが足りません。Arduino Megaならばピン数は十分ですが、LEDに対する駆動力(流せる電流の大きさ)の問題があります。

 必要なピン数を減らし、十分な電流を供給できる部品が欲しいところです。選択肢はいくつかありそうですが、今回はアノード側に74AC164というICを使ってみました。

 74AC164は「シフトレジスタ」です。シフトレジスタはシリアルデータをパラレルに変換してくれます(逆の働きをするシフトレジスタもあります)。Arduinoから1ビットずつデータを送りつけると(シリアル入力)、複数の出力端子に対して同時に反映されます(パラレル出力)。

 74AC164の場合、シリアル側のピンは2本だけ。出力は8本です。ということは、Arduinoのピンを2本使うだけで、LEDを8個コントロールできることになり、かなりの節約になります。さらに、複数個を連結することで、出力を増やすことができます。2個連結すれば出力は倍の16です。その場合もシリアル側の線数は2本のままです。

 今回はそのようにして、14セグ1桁に相当する15個のLEDを2個の74AC164でコントロールしています。また、74AC164が出力できる電流はピンあたり最大50mA(合計200mA)と、駆動力に余裕があります。

 カソード側には点灯させる桁を選択するスイッチのような仕組みが必要です。ブレッドボーダーズではトランジスタ(2SC1815)を使用しましたが、8個も並べるのは大変なので、かわりにトランジスタアレイと呼ばれるIC(TD62083APG)を使います。東芝の資料によると、トランジスタアレイは「1個のIC中に複数個のトランジスタが整列(アレイ)している構造である所から、このように呼ばれています」とのことです。

型番が見やすい東芝製74AC164。他のメーカーからも同型番の製品が供給されています。74HCシリーズの74HC164に比べると、入手先は限られています。我々はサンエレクトロで購入しました。1個100円
東芝TD62083APGは8組の入出力を持つトランジスタアレイです。8桁分のカソードをこれ1個でコントロールできます。素のトランジスタを8個並べるよりもずっとスッキリしますね。共立電子エレショップで136円でした

 14セグとIC類の他に必要な電子部品は、330Ωの抵抗器が15本と0.1μFの積層セラミックコンデンサが2個です。

 Arduinoボードは5V動作のUSB給電に対応しているものならばどれでも使えます。今回はブレッドボード上に小さくまとめるためArduino Nanoを使いましたが、Duemilanoveのような形状のボードも問題なく使えます。

 それでは、組み立てに入りましょう。

 最初に14セグが8桁並ぶ表示モジュールを作ります。ユニバーサル基板を適当な大きさに切り、その上でハンダ付けをします。今回はサンハヤトの「ICB-96P2」から12×4.5cmほどの長方形を切り出しました。

 「切る」と書きましたが、正確には「割る」ですね。カッターで基板表面に筋を入れ、机のフチに当てて手のひらで力を加えれば、簡単にまっすぐ割れます。断面の銅箔がチクチクするかもしれませんので、軽くヤスリ掛けしたほうがいいでしょう。

 このボードの上でハンダ付けする線は68本です。なにか単調な作業をしてリラックスしたいときにちょうどいい分量だと思います。急いでいるときや気持ちに余裕がないときはツライかもしれません。配線の詳細については回路図を参照してください。線は多いですが、構造は単純です。

線はたくさんありますが、各桁のセグメントをつなぎ合わせているだけの単純な回路です。表記の仕方がこれまでの回路図と違うのは、複数の線をまとめる「バス」という書き方を使っている部分があるところです。太い線は複数の線が集まっていることを表しています。1本1本描いていると、線があまりにも多くなってしまい、かえってわかりにくくなってしまうからです
切り出したユニバーサル基板に14セグを4個ハンダ付けした状態です。サンハヤトのICB-96P2は2個または3個のランドがつながったパターンになっていて、ICやLEDモジュールを使うときに便利です
配線に使う線材にはいろいろな選択肢があります。今回は細いビニール線(撚り線)を使いました。皮をむいてハンダメッキをする手間がかかりますが、取り付けやすく、やり直しも容易だと思います。手元にあった線なので型番が分かりません。たぶん、AWG30から32程度の太さです
表示モジュールが完成したところ。コネクタは2列のL型ピンヘッダを使っています。1列でも電気的には十分なのですが、ブレッドボードに立てたとき、より安定するよう2列にしました。根本までしっかり挿すと、ほとんどぐらつきません
ハンダ面はスパゲティ状態です。この写真を見て作る気をなくす人もいそうですが、音楽を聴きながら淡々と作業していると、思いのほかすぐにできあがります。線をハンダ付けするときは、LEDのピンにではなく、隣の空いているランドに付けるようにするとラクです。線が太いと盛り上がってしまい、作業性が悪くなるので、なるべく細いものを使いましょう
ブレッドボードに立てた状態。連結用のケーブルを作れば、Arduino側から少し離すこともできます。表示部のサイズはデスクトップPCの5インチベイに収めるのにちょうど良さそうです。

 表示モジュールの次はArduinoに部品を付け加えてコントローラを作りましょう。こちらはブレッドボードだけで組める配線量です。回路図は少し複雑に見えますが、線が多いのは表示モジュールのコネクタにつながる部分だけで、構造は単純です。

 少し注意が必要なのは、Arduinoとシフトレジスタをつなぐ部分かもしれません。

 74AC164は「データ」と「クロック」の2本の線で入力を受け取ります。LEDの点灯パターンが1bitずつデータの線を通じて送られます。この線1本で用は済みそうですが、複数の素子がきちんと同期するよう、クロックと呼ばれる信号を併用します。シフトレジスタのようなICは、クロックに合わせて動作することで、タイミングを揃えます。

 ここで次の回路図を見てください。クロックは2つの74AC164に分配されていますが、データの線は下の74AC164にだけつながっています。上の74AC164は、下の74AC164を通り抜けてきたデータを受け取ります。このようなつなぎかたをカスケード接続と言い、複数個連結して、出力を増やす方法です。

表示モジュールをコントロールする回路です。Arduinoとシフトレジスタをつなぐ2本の信号線「データ」と「クロック」に注意してください。クロックは2つの74AC164に分配します。ちなみに、このクロック周波数を実測するとおよそ90KHzでした
コントローラ側の配線の様子です。余裕をみて大きめのブレッドボード「EIC16041」を使用しました。この製品は汎用のブレッドボードをつなぎあわせたものですが、土台がしっかりしているので安定感があります
回路図とほぼ同じ部品配置です。ICの位置を表示モジュールのコネクタの位置に合わせると、直線的に接続できて作業効率がいいと思います

 さて、次はArduinoで実行するプログラム「スケッチ」の説明です。スケッチ全体はここからダウンロードできます。

ダウンロードしたスケッチは単なるテキストファイルです。Arduino IDEでFile→Newとして新しいスケッチを開き、そこにペーストしてください

 このスケッチはMsTimer2というライブラリを使っています。このライブラリは標準では付属しないので、自分でダウンロードし、インストールする必要があります。このページからMsTimer2.zipをダウンロードしてください。

ダウンロードしたzipファイルを解凍したら、Arduinoのライブラリフォルダへ移します。これでインストール完了です。Arduino IDEでSketch→Import Libraryとしたときにライブラリ名が表示されれば、インストールは正しく行なわれています

 MsTimer2ライブラリはタイマー割り込みという機能を簡単に利用するための命令を追加してくれます。

 今回のスケッチのなかに、この機能を呼び出すコードが2行だけあります。

MsTimer2::set(3, refresh);
MsTimer2::start();

 上の行は「refreshという関数を3msに1回のペースで呼び出す」という命令です。refreshは我々が作った関数の名前で、14セグLEDを1桁ずつ点灯させる機能を持っています。つまり、1秒間に333回の速さで14セグは点滅しています。1度に光るのは1桁だけですので、桁ごとに見ると毎秒約40回(333÷8)のリフレッシュレートということになります。

 この点滅レートはちょっと低いようです。わずかながらチラツキが感じられます。MsTimer2::setの値を3ではなく2にすると、リフレッシュレートは毎秒60回以上になり、とても滑らかになるのですが、かすかなチラツキに味わいを感じて、あえてこの値にしてあります。

 refresh関数のなかでshiftOutという命令が使われています。これはシフトレジスタにデータを送る命令です。クロックの生成も自動的にやってくれます。1度に8bitの情報を送れます。今回は8bitのシフトレジスタを2個カスケード接続しているので、shiftOut命令も2回続けて実行し、16bitのデータを送っています。

 今回使った機能のなかで特徴的なのは上記の2つ(タイマー割り込みとシフトレジスタ)です。スケッチのその他の部分についてはリファレンスを参照してください。日本語リファレンスはこちらです。

USBに接続すると電源が入って、初期メッセージ「ABCD0123」が表示されます。最初のメッセージが受信されるまで、このままです

 最後に、PC側のプログラムに触れておきます。Processingを使って、表示のテストをするスケッチ(Processingのプログラムもスケッチといいます)と、撮影用にブロック崩しスケッチを用意しました。ただし、こうした専用プログラムを作らなくても実験は可能です。シリアルでテキストを送るだけですので、さまざまなプログラムを送信元として使うことができるでしょう。

ターミナルソフトのTera Termを使って、文字を送る実験をしているところです。シリアル通信に対応しているターミナルソフトならばどれでも使えます。COMポートは、Arduino IDEのTools→Serial Portと同じ値を選択します。スピードは9,600bpsです。最長8文字のアルファベット(大文字のみ)と数字に対応しています(これはArduinoのスケッチの制約です)。セミコロン(;)がいくつか表示されていますが、これは文末を表しています
Processingで作成したテスト用スケッチ。左のウインドウ内をクリックすると、HI SCOREと表示されます。Arduinoが接続されているシリアルポートの選択はスケッチ上で行ないます。Serial.list()[2]の部分がそれで、自分の環境に合わせて、最後の数字(例では2)を変更してください。シリアルポートが、Arduinoのつながっている1つしかない場合は0となるはずです

 Processingはひと目見てわかるとおり、Arduino IDEとよく似た環境です(Processingが兄貴分に当たります)。ArduinoとPCを連携させたいとき、たとえば、インターネットから情報を取得してArduinoで表示させたいときにとても便利です。Arduino抜きで使っても強力です。さまざまな利用例をインターネット上で見ることができます。

Processing用のブロック崩しスケッチを改造して、14セグにスコアやステータスを表示するようにしてみました。元にしたスケッチのライセンスが確認できていないため、現時点ではソースを公開できないのですが、追加したコードは10行ほどです。
【動画】1ブロック=10,000点のインフレ気味な設定です。今回はブロック崩しですが、我々の目標は14セグLEDやティルトセンサといったハードウエアを備えたピンボール用のインターフェイスを作ることです
16セグ/14セグLEDは、いろんな単語を表示させているだけで飽きません。今回使ったICはすべて東芝製で、撮影に使ったネットブックも東芝でした。そこで、TOSHIBAと表示してみました

 次回はArduinoを使ったシンプルなシンセAuduinoを作ってみたいと思います。