Howto

SC1602BS LCDモジュールをつけよう

a210_lcd

Armadillo-210は、表示装置をもっていません。 簡単な文字列を表示できれば、様々な場面で活躍が期待されます。 例えば、

  • Network家電の簡易ディスプレイ
  • バーコードリーダなどの入力装置からのデータを表示
  • ネットワークのトラフィック情報の表示

等、挙げると限りがありません。

ここでは「LCD キャラクターディスプレイ SC1602BS」をArmadillo-210にとりつけ、動作させてみましょう。 今回使用するLCDは、「16文字×2行」の表示が行なえます。 LCDの他にボタンを取り付けることで、メニュー表示なども行なえると思います。

1. ハードを作る

SC1602BSは、以下のようなピンアサインとなっています。

Pin No Symbol Function
1 Vdd Power Supply 5V
2 Vss 0V(GND)
3 Vo for LCD Drive
4 RS Register select signal
5 R/W Data read/write select signal
6 E Enable signal
7 DB0 Data bus line
Pin No Symbol Function
8 DB1 Data bus line
9 DB2
10 DB3
11 DB4
12 DB5
13 DB6
14 DB7

データバスが8本となっていますが、SC1602BSはデータバスを4本で動かすことができるモードがあります。 今回はその機能を使用したいと思います。

Armadillo-210のパラレルポートと接続しなければならないのは、"RS,E,DB4-DB7"となります。
※ R/Wは"L"固定で使用します。

サンプルの回路図です。 この回路図では、Armadillo-210のCON9の1pinの外部出力電源からシリーズレギュレータで5Vを生成しています。

実際に作成した基板です。

lcd_board_a-s lcd_board_b-s
※ ソフト屋さんが作成したのであまりキレイではありません。

2. ドライバを作る

Armadillo-210用のドライバを作成します。 今回は、Baseイメージでそのまま動作させることができるように、 デバイスノードはGPIOと同じにしておきます。

パッチです。 特に注意する箇所は無いと思います。

[PC ~]$ ls
<span class="input">atmark-dist driver_sc1602bs.patch</span>
[PC ~]$ cd atmark-dist
[PC atmark-dist]$ patch -p1 < ../driver_sc1602bs.patch

3. カーネルイメージを作成する

ユーザーランドは、ベースイメージそのものを使うので、ここではカーネルイメージのみを作成することとします。
まずは、コンフィグレーションです。

[PC ~]$ cd atmark-dist
[PC atmark-dist]$ make menuconfig
※デフォルト設定からの差分だけ以下に記載します。
Device Driver -->
  Character devices -->
<span class="input">    <*> SC1602BS LCD Character Display driver</span>

<span class="input">    < > Armadillo-210 GPIO driver</span>
※先にGPIO driverを無効にしなければ、LCD Driverは表示されません。

あとは、ビルドしてArmadillo-210のカーネルを書き換えます。

4. 動作確認

Armadillo-210を起動すると、LCDに「Hello World!」と表示されると思います。 されない場合は、回路または、カーネルコンフィグレーションを再度見直してみてください。 表示メッセージの入力は、デバイスノードにWriteするだけです。

●メッセージの表示
[armadillo ~]$ <span class="input">printf "message" > /dev/gpio</span>

●2行メッセージ例
[armadillo ~]$ <span class="input">printf "1st line\n2nd line" > /dev/gpio</span>

●メッセージのクリア
[armadillo ~]$ <span class="input">printf " " > /dev/gpio</span>

5. ドライバの仕様

今回使用したドライバについて簡単に説明します。

  仕様 備考
ボタン ボタンの入力(通常/長押し)を検出します。
割込みは使用せず、100ms間隔でポーリングしています。
GPIO_0:選択ボタン
GPIO_1:決定ボタン
カーソルがOFF状態のときは選択ボタンの通常押しは無視されます。
カーソルがONのときは選択ボタンの通常押しでカーソルが移動します。
WRITELCDに文字を出力します。
また、制御コマンドを送ることもできます。
制御コマンド
  "@C":カーソルOFF
  "@c":カーソルON
  "@A":有効行数の変更("@A3"だと有効行数を3に変更)
READ ボタンの入力を待ち、その状態を返します。 選択ボタンが長押しされた場合は"S"が。
決定ボタンが長押しされた場合は"E"が。
決定ボタンが通常押しされた場合は、カーソル行の行番号が返ります。

6. サンプルスクリプト

ドライバの仕様で大体使い方が理解できると思います。 色々な機能を使ったスクリプトを作ってみました。

※注意※

  1. バックグラウンドで実行している子プロセスを停止させる処理が、 スクリプトでは望んだようにうまくいっていません(停止させるまでに時間がかかる)。 バックグラウンドプロセスの起動/停止をする場合は、 C言語とかで作成してみてください。

2.IPアドレスを表示したり、時刻を表示したりした後、 Enterボタンを押したらメインメニューに戻るようにしています。