2010-01-19

SC1602 LCDモジュール動作テスト

諸々の理由でサーキットへ行く余裕が無いので...来るべき日のために電子工作で遊んでおります。
LAP SHOT 持ってるので、なにも苦労して自作カウンタでラップを表示する必要は無い訳ですけども。まあ、それ以外の多目的な情報を、走行中に確認できたらいいなぁ...って事で、Arduino から LCD を使う実験です。

使ったのは、秋月などで扱っている LCDキャラクタディスプレイモジュール(16×2行バックライト付) という製品。昔(今もあるのか知らないけど)カシオのポケコンなんかに使われてたようなLCDディスプレイ。16キャラクタを2段表示でき、バックライト付きで、コントラスト調整可能です。

Arduino で LCD を操作しようとした場合、LiquidCrystal ライブラリというのが用意されていて、HD44780 を使った LCD 液晶なら、ライブラリを使ってラクに扱えるようになってます。んで、SC1602 は、ラクできる LCD な訳です。

Arduino 日本語リファレンス の LiquidCrystal の項に、Arduino と LCD の結線方法とかも出てますので、至れり尽くせり。
LCD をブレッドボードで使うための中継ハーネスは自作しました。また、LCD の 3番ピン(Vo -- CONTRAST ADJ.) に付ける抵抗は 20kΩ の半固定抵抗を使用しています。

デモ・プログラムでは、タイムを計測してるフリの表示をしてみました。
実際表示してみると、16キャラクタってのが、意外とネックとなりそうカモ。もうちょっと長い文字列を表示させたい気がします。

続きには、今回のスケッチ。


#include <LiquidCrystal.h>
//-----------------------------------------------------
// LCD テスト
//
//  SC1602
//  No.  Symbol Function
// ------------------------------------
//  1  Vdd  5V
//  2  Vss  0V
//  3  Vo  CONTRAST ADJ.
//  4  RS  REGISTER SELECT
//  5  R/W  READ/WRITE
//  6  E  ENABLE SIGNAL
//  7  DB0  DATA BIT 0
//  8  DB1  DATA BIT 1
//  9  DB2  DATA BIT 2
//  10  DB3  DATA BIT 3
//  11  DB4  DATA BIT 4
//  12  DB5  DATA BIT 5
//  13  DB6  DATA BIT 6
//  14  DB7  DATA BIT 7
//
//-----------------------------------------------------

#define  LCD_MAX_COLUMN  16

 int  s_iSec = 0;
 int  s_iMilliSec = 0;

// LCD ライブラリ・コンストラクタ
LiquidCrystal lcd( 5,    // RS
     6,    // R/W
     7,    // E
     8,     // DB4
     9,    // DB5
     10,    // DB6
     11 );   // DB7

//-----------------------------------------------------
// 初期化
//
//-----------------------------------------------------
void setup()
{
 char szStr[16];
 int  iDisplayColumn;

 lcd.begin(LCD_MAX_COLUMN, 2);

 lcd.home();
 lcd.print("BEST:");

 // for DEMO.
 sprintf(szStr, "0'53\"236");
 iDisplayColumn = LCD_MAX_COLUMN - strlen(szStr);
 lcd.setCursor(iDisplayColumn, 0);
 lcd.print(szStr);
}

//-----------------------------------------------------
// メイン
//
//-----------------------------------------------------
void loop()
{
 char szStr[16];
 int  iDisplayColumn;

 lcd.setCursor(0, 1);
 lcd.print("LAP:");

 sprintf(szStr, "%02d\"%03d", s_iSec, s_iMilliSec);
 iDisplayColumn = LCD_MAX_COLUMN - strlen(szStr);
 lcd.setCursor(iDisplayColumn, 1);
 lcd.print(szStr);

 // デモ用カウントアップ
 s_iMilliSec += 10;
 if(s_iMilliSec >= 1000){
  s_iMilliSec = 0;
  s_iSec++;
 }

 delay(8);  // 適当
}