You are here

CLCD-STACK

CLCD-STACK は基本的で利用範囲の広い16 文字× 2 行の文字液晶表示器を装備した、Arduino UNO/MEGALeonardo/DUE R3用シールドキットです。CLCD-STACK はArduino の入門者にはもちろんですが、Arduino の基本機能を一通り習得し、応用に取り組みたい人が手元に置いておくと重宝する文字液晶シールドです。

CLCD-STACKの組み立て例

CLCD-STACK の特徴を以下に示します。


  • I2Cインターフェースを利用した16文字×2行の文字液晶ディスプレイを装備し、信号線2本のみで制御できます。
  • LiquidCristalと互換のST7032ライブラリを提供しており、すぐに利用することができます。
  • タクトスイッチによる入力や機能の選択を行えます。
  • 圧電スピーカーを装備し、ビープ音などの電子音の出力を行えます。
  • リアルタイムクロックDS3231モジュール、超音波距離センサーHR-04モジュールの接続端子を装備しています。
  • 電子工作で広く利用されているArduinoのシールドとして開発されており、手軽に利用できるArduinoのIDEを利用して独自のスケッチを行えます。

ネットショップ:



CLCD-STACKへの文字表示

LiquidCrystalと互換性があるST7032ライブラリを使用したCLCD-STACKの利用例を以下に示します。

CLCD-STACKの表示例

CLCD-STACKの文字液晶ディスプレイには、英数字や記号のほかに、カタカナを指定することができます。

#include <ST7032.h>
#include <Wire.h>

#define	JAPANESE

ST7032 lcd;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
#ifdef JAPANESE
  lcd.print("\272\335\306\301\312 \320\305\273\335!");
#else
  lcd.print("CLCD-STACK");
#endif
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}



スイッチと圧電スピーカーのサンプルスケッチ

CLCD-STACKに搭載されているスイッチと圧電スピーカーの使用例を示します。

#define SW1 3
#define SW2 4
#define SW3 5
#define SOUNDER 8

void setup() {
  pinMode(SW1, INPUT) ;
  pinMode(SW2, INPUT) ;
  pinMode(SW3, INPUT) ;
}

void loop() {
  int hz = 0 ;

  if (digitalRead(SW1) == LOW)
     hz += 200 ;
  if (digitalRead(SW2) == LOW)
     hz += 400 ;
  if (digitalRead(SW3) == LOW)
     hz += 800 ;

  if (hz != 0)
    tone(SOUNDER, hz) ;
  else
    noTone(SOUNDER) ;

  delay(100) ;
}



コントラストを変化させるサンプルスケッチ

CLCD-STACKに搭載している液晶文字ディスプレイは、可変抵抗器ではなく、ソフトウェア的に表示コントラストを変更できるようになっています。

コントラストを段階的に変化させて液晶文字ディスプレイの表示状態を確認できるようにしたスケッチを以下に示します。液晶文字表示装置のコントラストは、setContrast()メソッドを使用して設定することができます。設定できるコントラスト値は0-63ですが、以下のプログラムでは0-31の範囲で変化させるようにしています。

ライブラリでは、初期状態でそれなりのコントラストで文字を表示できるように設定されていますが、このようなスケッチで、自分自身が最適と感じるコントラストの設定値を確認して、setup()の中の液晶文字ディスプレイの初期化の直後にsetContrast()を使用してその値を設定することもできます。

#include <ST7032.h>
#include <Wire.h>

#define	JAPANESE

// initialize the library
ST7032 lcd;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
#ifdef JAPANESE
  lcd.print("\272\335\306\301\312 \320\305\273\335!");
#else
  lcd.print("hello, world!");
#endif
}

int cnt = 0 ;

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print and set new contrast value
  lcd.print(cnt);
  lcd.print(" ");
  lcd.setContrast(cnt) ;

  if (++cnt >= 32)
    cnt = 0 ;
    
  delay(500) ;
}



超音波距離センサーのサンプルスケッチ

CLCD-STACKでの超音波距離センサHC-SR04の使用例

CN1に超音波距離センサーHC-SR04を接続して計測した距離を表示するスケッチを以下に示します。

HC-SR04の利用には特別なライブラリは必要ありません。
ArduinoのpulseIn関数を利用して、超音波の反射時間を計測して、距離を求めます。

#include <ST7032.h>
#include <Wire.h>

ST7032 lcd;

#define USDS_TRIG 7
#define USDS_ECHO 6
#define USDS_TIMEOUT (100*1000L) // us

#define ONSOKU  (340.0*100) // cm

void setup()
{
  lcd.begin(16, 2);
  lcd.print("");

  pinMode(USDS_TRIG, OUTPUT);
  digitalWrite(USDS_TRIG, LOW) ;
  pinMode(USDS_ECHO, INPUT);
}

void loop()
{
  int duration ;
  float distance ;

  digitalWrite(USDS_TRIG, HIGH) ;
  delayMicroseconds(10) ;
  digitalWrite(USDS_TRIG, LOW) ;

  duration = pulseIn(USDS_ECHO, HIGH, USDS_TIMEOUT) ;
  if (duration > 0) {
    // 音速: 340m/s = 34000cm/s = 0.034cm/us
    distance = duration / 2.0 * ONSOKU / 1000000 ;

    lcd.clear() ;
    lcd.print(duration) ;
    lcd.print(" us ") ;
    lcd.print(distance) ;
    lcd.print(" cm") ;
  }
  delay(200) ;
}



リアルタイムクロックDS3231のサンプルスケッチ

CLCD-STACKは、その上部のCN2にDS3231のモジュールを接続することができます。

CLCD-STACKでのリアルタイムDS3231モジュールの使用例

CN2にリアルタイムクロックDS3231を接続して日時表示するスケッチを以下に示します。
DS3231を利用するためにはRtcDS3231ライブラリをArduino IDEにインストールして利用します。

#include <Wire.h>
#include <RtcDS3231.h>
#include <ST7032.h>

RtcDS3231 Rtc ;
ST7032 lcd ;

void setup ()
{
  Rtc.Begin() ;

// DS3231の日時を「それなりの値」に設定する場合に、以下の2行をコメントアウト
//  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__) ;
//  Rtc.SetDateTime(compiled) ;

  lcd.begin(16, 2) ;
}

void loop ()
{
  char buff[12] ;

  RtcDateTime dt = Rtc.GetDateTime() ;

  sprintf(buff, "%04u/%02u/%02u", dt.Year(), dt.Month(), dt.Day()) ;
  lcd.setCursor(0, 0) ;
  lcd.print(buff) ;

  sprintf(buff, " %02u:%02u:%02u", dt.Hour(), dt.Minute(), dt.Second()) ;
  lcd.setCursor(0, 1) ;
  lcd.print(buff) ;

  delay(100) ;
}

リアルタイムクロックモジュールは、最初の状態では適切な日時が設定されておらず、でたらめな日時が表示されるようです。私の例では、2000年の適当な日時が表示されました。

リアルタイムクロックモジュールに正確な日時を設定するのは少し面倒ですが、おおざっぱな時間を設定するのは簡単にできます。
上記のスケッチのsetup()中の2行のコメントを外して実行できるようにしてコンパイルし、スケッチをArduinoボードに書き込んで実行すると、コンパイルを行った日時がリアルタイムクロックに設定されます。
スケッチのコンパイルとスケッチの実行では少し時間差があるので、リアルタイムクロックモジュールに10-20秒程度遅れた時間を設定することになりますが、それなりの日時を簡単に設定できます。この方法は、ライブラリのデモプログラムの中に記載されていたもので、「なるほど」いい手だと思いました。

一度リアルタイムクロックに日時を設定すると、リアルタイムクロックは電池でバックアップされているため、Arduino本体の電源を切っても日時は自動的に更新されます。バックアップ電池はリアルタイムモジュールそのものに組み込まれているため、モジュールをCLCD-STACKから取り外してそのへんに転がしておいても、日時を正確に更新していくのはなんだか不思議な感じです。


開発ソフト: