諸々の理由でサーキットへ行く余裕が無いので...来るべき日のために電子工作で遊んでおります。
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); // 適当
}
