Lチカはできたので今度はLCDに文字を表示してみる。

先に部品表。
Arduino Uno x1
超小型LCDキャラクタディスプレイモジュール x1
(付属:ピンヘッダー 16P x1、抵抗100Ω x1)
10KΩ半固定抵抗 x1
ブレッドボード x1
ブレッドボード用ジャンパー線
Arduinoとブレッドボードをつなぐジャンパー線(両端子がオスで、柔らかい線のもの)

Arduino Unoは千石か若松、マルツにあったはず。液晶は秋月から買うと付属品がある。予算は4000円ぐらいかな?
あと、Arduino Unoとパソコンを繋ぐUSBケーブルが必要。

 以下を参考にした。
http://arduino.cc/en/Tutorial/LiquidCrystal 

 ここで示されている実体配線図を参考にしながら、手持ちの液晶モジュールに合わせて配線する。
全体はこんな感じ。
LCD2


 20年くらい前は各社から表示は同じでもコントローラが違う液晶モジュールが出ていたが、日立のコントローラのプロトコルがデファクトスタンダードとなった。行数や桁数が違うだけで同じ。

使用した液晶モジュールは秋月電子で買った16x2(2x16)液晶モジュール。
超小型LCDキャラクタディスプレイモジュール(16×2行バックライト・オレンジ) 

液晶面、下側に端子を置き、左から14,13,12,...2,1,16,15ピンになる。
 
14 DB7 (Data Bit7)
13 DB6 (Data Bit6)
12 DB5 (Data Bit5)
11 DB4 (Data Bit4)
10 DB3 (Data Bit3)
9 DB2 (Data Bit2)
8 DB1 (Data Bit1)
7 DB0 (Data Bit0)
6 E (Enable Signal)
5 R/W (Read/Write)
4 RS (Register Select)
3 VEE (コントラスト)
2 Vdd (5V)
1 Vss (GND)
16 A (LED +4.2V)
15 K (LED -)

 これに付属のピンヘッダーをハンダ付けする。ピンヘッダーの短い方を液晶モジュールに。ハンダ付けはたったこれだけ。あ、液晶モジュールのパネルを保護するためにセロハンテープなど貼っておきましょう。ハンダのヤニが飛んでくっつくことがあります。

ArduinoのLiquidCrystalライブラリは液晶モジュールからの読み出しを行わないためR/WはGNDに落とす。また、液晶モジュールは4bitモードと8bitモードがあるが、4bitモードを使用するためDB0-DB3は使わない。
VEEに与える電圧により文字のコントラストを調整できる。ここでは10KΩの半固定抵抗に繋いでいる。
Vdd,Vssは液晶モジュールの電源。A,Kはバックパネル照明のLED用。これは秋月のモジュールに付属している100Ωの抵抗を直列に接続する。
配線は以下を参照してください。

LCD1


で、表示するだけならサンプルで確認できるので、FizzBuzzができるように改変した。
Arduino IDE 1.0でのスケッチは以下のとおり。
setup() はArduinoスタートアップ後1回だけ実行される。周辺などのイニシャライズを書く。
続けてloop()内の記述を繰り返して実行する。

※Arduino IDEにコピペするときは#includeの行を手で打ちなおしてください
// include the library code:
#include <LiquidCrystal.h>

unsigned int t;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  t=1+millis()/200;
  lcd.setCursor(0,0);
  if(t%3==0 && t%5==0) {
    lcd.print("FizzBuzz");
  } else {
    if (t%3==0) {
      lcd.print("Fizz    ");
    } else {
      if (t%5==0) {
       lcd.print("Buzz    ");
      } else {
       lcd.print("        ");
      }
    }
  } 
  lcd.setCursor(0, 1);
  lcd.print(t);
} 
動画は以下を見てね:

 さて、表示だけでは物足りないのでアナログ入力を使ってみる。
ArduinoのA-D変換入力は0~1023の値をとる。これは0~5Vの電圧に対応する。ここに10KΩの可変抵抗をつないでみよう。黒のミノムシクリップはGNDへ、赤は5Vへ、黄色はA0ポートに接続する。
LCD10

 ソースはさっきのものを元に修正。A0ポートから値0~1023を読み取り、これを元にFizzBuzz判定する。
LCD11
こんな感じでつまみを回すと液晶の下の行に1~100ぐらいが表示され、上の行にFizzBuzz判定される。

ソースはこちら:
// include the library code:
#include <LiquidCrystal.h>

unsigned int t;
int sensorPin = A0 ;
int value = 0 ;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  t=analogRead(sensorPin)/10+1; // (0...1023)/10 +1
  lcd.setCursor(0,1);lcd.print("     ");
  lcd.setCursor(0,0);
  if(t%3==0 && t%5==0) {
    lcd.print("FizzBuzz");
  } else {
    if (t%3==0) {
      lcd.print("Fizz    ");
    } else {
      if (t%5==0) {
       lcd.print("Buzz    ");
      } else {
       lcd.print("        ");
      }
    }
  } 
  lcd.setCursor(0, 1);
  lcd.print(t);
  while(millis()%1000!=0); // wait 1sec.
} 
動画は以下を見てね:
Arduino de FizzBuzz Analog in

 で、感想だがArduinoすごく簡単にいろんなことが出来る。ふつうマイコンボード買ってなんかやろうとしたら接続先のデバイス調べて制御の方針決めてプログラム書いてデバッグし……と三日から一週間コースではないか?Arduinoは本家にライブラリが充実しておりIDEからすぐ呼び出せるので悩むことがなかった。また、Webを探せば先人の苦労がたくさん見つかる。
通常組み込みマイコンの作例は一般に流通することはなかったが、使いやすいワンチップマイコンが現れ、ボード込みで安価に入手できるようになったおかげでたくさん見かけるようになった。さらにArduinoはオープンソースであり、ライブラリもそうやって開発されている。そんなわけでハンダ付け16箇所のみで手先の不器用な僕でも一時間程度で作ることが出来た。この記事をまとめるほうがよっぽど時間がかかっている。組み込みのプロトタイピングとしても有効ではないか。
 昨年発表されてまだ販売されてないArduino Leonardoは小型のボードで価格も安くなりそうで、かなり期待している。プロトタイピングの結果を焼き直して利用できそうだ。前職のデバッグ担当の頃だったら色々な治具として使ってみたかった所だ。
 などと書いたが手元でチカチカ動くのは楽しいね。ほんとに簡単だからみんなもやってみよう!