LCDを使ってみよう

 今回は、前回に機続きKeyestudioのセンサー/モジュールに同梱されているLCDモジュールを使ってみます。LCDモジュールは16文字×2行サイズで文字/記号と数字を表示することができます。このLCDにセンサーの値を表示してみましょう。

 このLCDモジュールはI2Cで接続します。これまでのモジュールはデジタル端子とアナログ端子からの単純な入出力のみでした。LCDモジュールは複雑な処理を行う必要があるためI2Cで接続します。ただ、マイクロビット用に専用の拡張機能(ブロック)が用意されているので、とても簡単に扱うことができます。
 I2Cでマイクロビットと接続するにはKeyestudioのシールドの横にあるIICと書かれた端子とLCDモジュールを接続します。  LCDとシールドは以下のようにつなぎます。

LCD側 シールド側
VCC V1またはV2(VCC)
GND G(GND)
SCL 19番
SDA 20番

 このLCDモジュールはコントラスト比がよくないことがあるので、LCDモジュールの裏面にある青いつまみをマイナスドライバーで回して調整してください。

 これで準備完了です。

LCDモジュールを読み込む

 LCDモジュールを使うためには拡張機能を読み込む必要があります。「拡張機能」の項目が表示されていない場合は「高度なブロック」の項目をクリックします。

「拡張機能」の項目をクリックします。

拡張機能一覧が表示されます。

画面上部にある検索ボックスに以下のURLを入力して検索ボタン(虫眼鏡)をクリックします。

https://github.com/xuefengedu/pxt-lcd1602_CN

LCDモジュールの項目が表示されるのでクリックします。

するとLCDモジュールの拡張機能が読み込まれます。

LCDモジュールで使えるブロックは以下のようになっています。

これでLCDモジュールを使う準備ができました。

LCDに文字を表示する

 それでは最初にLCDにMicro:bitの文字を表示してみましょう。
 LCDに文字や数値を表示するには最初にI2Cアドレスなどを設定する必要があります。このLCDモジュールはI2C接続なので、制御のためのアドレスが割り当てられています。デフォルトでは16進数で27(プログラム上での表記は0x27になります)です。ブロックとしてあらかじめ用意されているので、単純に最初のブロック内に「LCD1602 I2C address 0x27」のブロックをはめこみます。
 次に表示する文字を指定します。これは「LCD show string ( )」ブロックを使います。文字と表示するXY座標を指定します。X座標は0〜15,Y座標は0か1になります。Y座標が0ならLCDの上の行に、1なら下の行になります。また、すでに文字や数値が表示されている場合は上書きされます。
 このLCDモジュールじゃ表示する文字を指定しただけでは表示されません。「set string visibled」ブロックを配置することで文字が表示されます。
 ここまでで文字が表示はされているのですが、ぱっと見では文字が表示されているのがわかりません。文字をより明確に見せるにはバックライトを点灯させないといけません。バックライトの点灯は「set LCD backlight on」のブロックを配置します。
 これでようやく文字が表示されます。Micro:bitの文字を表示するプログラムは以下のようになります。

 JavaScriptコードの場合は以下のようになります。

lcd1602.setAddress(
lcd1602.I2C_ADDR.addr1
)
lcd1602.putString(
"Micro:bit",
4,
0
)
lcd1602.set_LCD_Show(lcd1602.visibled.visible)
lcd1602.set_backlight(lcd1602.on_off.on)

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。LCDにMicro:bitの文字が表示されます。文字が表示されない場合はドライバーで背面にあるコントラスト調整つまみをまわしてください。コントラスト比がよくないので、LCDを傾けたりしてみないと分かりにくいかもしれません。

LCDに蒸気量/アルコール量を表示する

 それでは次に蒸気量をLCDに表示してみましょう。蒸気量を計測するモジュールは以下のものです。

 蒸気量を計測するモジュールとシールドを以下のようにつなぎます。

モジュール側 シールド側
+ V1またはV2(VCC)
- G(GND)
S 0番のS(信号線)

 蒸気量はアナログ値になるので、読み取った値を「LCD show number」ブロックに入れます。
 プログラムは以下のようになります。

 JavaScriptコードの場合は以下のようになります。

lcd1602.setAddress(
lcd1602.I2C_ADDR.addr1
)
lcd1602.set_backlight(lcd1602.on_off.on)
lcd1602.set_LCD_Show(lcd1602.visibled.visible)
basic.forever(function () {
    lcd1602.putNumber(
    pins.analogReadPin(AnalogPin.P0),
    1,
    0
    )
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。LCDに蒸気量の数値が表示されます。蒸気量のセンサーを指でつかむとリアルタイムに値が変化するのがわかります。

 センサーの中にはアルコール検知モジュールもあります。

アルコール検知モジュールの場合は以下のようにつなぎます。

モジュール側 シールド側
+ V1またはV2(VCC)
- G(GND)
AD 0番のS(信号線)

 アルコール検知量を表示するプログラムは蒸気量を表示するプログラムと同じなので、モジュールをつなぐだけです。

 他にも紫外線検出モジュールなどアナログ値を取得できるものは、同じように値をLCDに表示することができます。

距離センサーと組み合わせる

 それでは最後に距離センサーと組み合わせてみます。この距離センサーは2cm〜5m範囲内を計測できます。

距離センサーは以下のようにつなぎます。

モジュール側 シールド側
VCC V1またはV2(VCC)
GND G(GND)
Echo 0番のS(信号線)
Trig 1番のS(信号線)

 また、この距離センサーは付属の電池ボックスを接続しないと正しく計測できないことがあります。電池ボックスに電池を入れてシールドに接続します。

距離センサーはアナログ値を返しますが、そのままつなぐだけでは動作しません。拡張機能を追加する必要があります。最初にLCDモジュールの拡張機能を読み込ませます。その後、同様に距離センサーの拡張機能を読み込ませます。以下の図に示すsonarと書かれた拡張機能が表示されている場合は、そのままクリックして読み込ませます。 表示されていない場合は、検索ボックスにsonarと入力し虫眼鏡のボタンを押します。すると、いくつか拡張機能が表示されます。その中にSonarと書かれた拡張機能があるのでクリックして読み込ませます。 以前のバージョンのブロックエディタで読み込ませる場合、sonarでは拡張機能が表示されないことがあります。その場合はsとだけ入力し虫眼鏡ボタンを押してください。

 するとSonarというカテゴリが追加されます。読み込まれるブロックは1つしかありません。このブロックを使う事で距離を読み取ることができます。

 このブロックを使って距離を表示するプログラムは以下のようになります。

 JavaScriptコードの場合は以下のようになります。

lcd1602.setAddress(
lcd1602.I2C_ADDR.addr1
)
lcd1602.set_LCD_Show(lcd1602.visibled.visible)
lcd1602.set_backlight(lcd1602.on_off.on)
basic.forever(function () {
    lcd1602.clear()
    lcd1602.putNumber(
    sonar.ping(
    DigitalPin.P1,
    DigitalPin.P0,
    PingUnit.Centimeters
    ),
    1,
    0
    )
    basic.pause(500)
 })

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。LCDに距離センサーから障害物までの距離が表示されます。距離センサーの前で手を近づけたり離したりするとリアルタイムに値が変化するのがわかります。

拡張機能で用意されたブロックでは、より細かい値を計測することができません。そこまでの精度を求めるかどうかというのはありますが、以下のようにすると小数点以下まで計測することができます(単位はcm)。なお、旧バージョンのブロックエディタでは小数値を扱えないので以下のプログラムは動作しません。

 JavaScriptコードの場合は以下のようになります。

let 距離 = 0
lcd1602.setAddress(
lcd1602.I2C_ADDR.addr1
)
lcd1602.set_LCD_Show(lcd1602.visibled.visible)
lcd1602.set_backlight(lcd1602.on_off.on)
basic.forever(function () {
    pins.digitalWritePin(DigitalPin.P1, 0)
    control.waitMicros(2)
    pins.digitalWritePin(DigitalPin.P1, 1)
    control.waitMicros(10)
    pins.digitalWritePin(DigitalPin.P1, 0)
    距離 = pins.pulseIn(DigitalPin.P0, PulseValue.High)
    距離 = 距離 / 58.2
    lcd1602.putNumber(
    距離,
    1,
    0
    )
    basic.pause(500)
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。LCDに距離センサーから障害物までの距離が、小数点以下まで表示されます。なお、時々値が実際の距離より大きくなったり小さくなったりすることがあるので、10回計測した値の平均値を採用するなどの処理を追加した方がよいかもしれません。

 他にもいくつかモジュールがありますので、つなげて使ってみるとよいでしょう。keyestudioのシールドは便利なので、他のセンサーを利用する場合にも役立つはずです。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/