マイコンは取り扱いが難しい電子部品ですが、Arduinoは「マイコンボード」と「開発環境」の使いやすさを重視しており、初心者でも簡単に利用できるようにしています。
もちろん初心者の電子工作だけでなく機器に組み込んで装置を制御するなどのプロユースにも十分実用的です。
しかし、マイコン特有の弱点も残っており、その一つがユーザインターフェースを搭載していないことです。ユーザからの指示に応じて処理を変えたり、結果をユーザに通知したりする機能は自分で作成する必要があります。
状態をLEDで表示するならまだしも、文字を表示するLCDの制御をマイコンで行うのは手間のかかる作業です。
Arduinoは、このLCDもシールドと呼ばれるArduinoボードの拡張基板と、Arduino IDEにライブラリを組み込むことで手軽に扱えるようにしています。
本記事ではシールドの一つであるLCDシールドを使用してArduinoボードに表示機能を追加します。
目次
1. LCDシールドとは
本記事ではLCDシールドを使用します。
LCDとは「Liquid Crystal Display」の略で、日本語では「液晶ディスプレイ」と訳されます。腕時計などに使用される小さなものからパソコンに接続して使用する大型なものまであります。
ArduinoのシールドとはArduinoボードに接続して機能を追加する拡張基板です。用途に合わせたさまざまな機能をもつシールドが販売されています。
シールドの中には積み重ねることができるものがあり、1個のArduinoボードに複数の拡張基板を追加できます。
通常、シールドを提供するメーカーは、Arduino IDEに読み込んでスケッチに組み込むためのライブラリを配布しています。配布ライブラリを適用することでハードウェアだけでなくソフトウェア面でも手軽に機能を拡張できます。
今回使用するLCDシールドは、ArduinoにLCDを接続するための拡張基板です。表示するサイズなどによってさまざまな種類が販売されています。
本記事では、このLCDシールドを使用します。このシールドに搭載されている液晶ディスプレイには16文字表示する行が2行(32文字)あります。
このシールドには28本のピンがありArduino Unoに重ねるように取り付けられます。
ただしLCDの制御で28本のピン全てを使用するわけではありません。Arduinoボードに接続しやすくするためにArduinoボードのコネクタと合わせています。
そのため、このシールドを使用すると未使用の入出力ピンをほかの用途に使えないので、その場合は足の長いヘッダーソケットなどを使用する必要があります。
このシールドは、Arduinoが提供するLiquidCrystalライブラリを使用して制御できます。LiquidCrystalは一般的なLCDに対してテキスト表示やスクロール、カーソル移動などを行う処理を実装したライブラリです。
LiquidCrystalライブラリに対応しているLCDでもピンの配列は製品によって異なります。使用しているLCDのピンの配列はスケッチで設定します。
2. 準備
以下のものを準備してください。
Arduino Uno
LCDシールド
Arduino IDE
本記事では接続を簡単にできるようArduinoボードに直接取り付けられるLCDシールドを選択しました。
LCDは単体の製品もありArduinoボードとLCDの信号線を適切に接続することで利用できます。
上記以外に、USBケーブルが必要です。
3. スケッチ全体
Arduino IDEには、さまざまなサンプルスケッチが付属しています。LCDの制御のサンプルもあるので、それを使用します。[ファイル]メニューから[スケッチの例] ≫ [LiquidCrystal] ≫ [HelloWorld]と選択してください。
以下がスケッチ全体です。スケッチのあとに解説が続きます。
// include the library code: #include <LiquidCrystal.h> // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); } 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); }
ポイントを説明します。
この行はスケッチでLiquidCrystalライブラリを使用できるようにするinclude文です。
#include <LiquidCrystal.h>
include文はライブラリで提供される機能を使用する前に書く必要があり、通常はスケッチの先頭に置きます。
以下の2行はLCDを制御するための6本のピンの番号を指定します。
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
今回使用するLCDは4本のデータ線(d4・d5・d6・d7)と2本の制御線(rs、enable)で制御します。
ピン番号の対応はLCDシールドによって異なります。製品のマニュアルを参照してください。単体のLCDを使用する場合も同様にピン番号を合わせます。
LCDの種類によってはデータ線が8本の場合、制御線が3本の場合があり、いずれも対応します。詳細はArduinoの公式マニュアル、LiquidCrystal(英語)を参照してください。
2行目は1行目で定義したデータ線、信号線を指定してLiquidCrystal型の変数を生成します。以降、スケッチの中から接続したLCDにアクセスするには、この変数lcdを使用します。
以下はsetup()関数です。ここではLCDを初期化して文字を表示します。
void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); }
LCDの初期化はbegin()関数を呼び出します。引数はLCDの表示領域の列数(1行の文字数)と行数です。初期化によってカーソル位置はLCDの画面の左上(0,0)になります。
2行目のprint()関数でLCDの画面上に「hello, world!」と表示します。
print()関数は以前の記事でSerial.print()と使用しました。これはシリアルモニタにデータを送信するコマンドで今回のLCDには全く関係ありません。
以下はloop()関数です。ここではカーソル位置を2行目の先頭に移動して、Arduinoボードが動作を始めてからの経過時間(秒数)をLCDの画面上に追加します。
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); }
setCursor()関数は引数に指定された「列、行」の位置にカーソルを移動します。
この列数、行数は0から始まるので注意が必要です。setCursor(0,1)は「先頭の列、2行目」を意味します。
カーソルの移動後はprint()関数を使用して文字を表示します。ここではmillis()関数を使用してスケッチが実行を開始してからの時間(ミリ秒)を取得、それを1000で割ることで「秒」に変換した値をLCDの画面上に追加で表示します。
4. 配線
それではArduinoとLCDを接続します。
LCDシールドを使用している場合、特別な配線は必要ありません。LCDシールドの背面に取り付けられているピンとArduinoボードのコネクタを合わせて差し込むだけです。
取り付ける際にはArduinoボードの端にあるA5ピンとLCDシールドの端のピンを合わせます。
その後、順次ArduinoボードとLCDシールドのピンを合わせていき、全てのピンの位置が一致したら静かに押し込むようにすると差し込みやすいでしょう。
5. まとめ
Arduinoの弱点はユーザインターフェースに対応していない点です。そこでLCDを使えばArduinoを利用するシーンが大きく広がります。
LCDのような表示デバイスは一見すると取り扱いが難しそうに感じるでしょう。
ところがArduinoにはLCDを制御するためのライブラリがあらかじめ用意されているので、標準的な製品であれば数本の配線で手軽に使用できます。
今まで躊躇していた人にも「それほど難しくなさそう」と感じていただけたのではないでしょうか。皆さんもぜひ試してみてください。