ラズパイの特徴の一つが、GPIOというインターフェースを使って、電子工作ができることです。今回は、このGPIOに液晶ディスプレイ(LCD:Liquid Crystal Display)をつなげて、時間を表示させてみましたので、その方法をまとめたいと思います。
ちなみに、LCDに時間を表示できるようにしたのち、家にある廃材を使ってケースをつくってみたらこんな感じになりました。(本記事で紹介するものの最終形態)
ラズパイでデジタル時計をつくってみよー!
デジタル時計をつくるために準備・設定するもの
ラズパイでデジタル時計をつくるために、機器の準備と、ラズパイ側への事前設定が必要です。それらの準備、設定についてまとめます。
機器の準備
ラズパイでデジタル時計をつくるにあたって、ラズパイ以外に必要な機器は、以下の2点です。
- LCDモジュール(LCD1602)
→ 小型の液晶ディスプレイ。今回時刻を表示させるものです。
▼表
▼裏
- ジャンパーワイヤ(メスーメス:4本)
→ 機器と機器を電気的に繋げるワイヤ。今回はラズパイとLCDモジュールを繋げます。
LCDモジュールもジャンパーワイヤともに、Amazonで購入した「SunFounder Raspberry pi スターター電子工作キット」の中に入っているものを使用しました。
ラズパイの設定(I2C通信の許可)
デジタル時計をつくるにあたって、今回は、I2C通信というものを使います。
(I2C通信の詳細説明はここでは割愛します。)
ラズパイの初期状態では、このI2C通信の使用が許可されていない状態になっているので、許可設定が必要となります。
まず、ラズパイのデスクトップ左のメニューから、”設定” > ”Raspberry Piの設定”を選択します。
次に、「Raspberry Piの設定」画面で、”インターフェース”タブを選択します。
すると、いくつかの項目が出てきますが、その中で、”I2C”の項目で右端のボタンが右側にします。これにより、”I2C”通信が有効化されます。
※上図は、I2Cが無効の状態ですので注意。
デジタル時計をつくるための構成(ラズパイと電子機器の接続)
接続する前のラズパイ側の事前設定
それでは、デジタル時計をつくるために、ラズパイとLCDモジュールをジャンパーワイヤで接続します。
<ラズパイ側>
ラズパイ側の接続方法は、以下の通りです。
- 2番ピン:5V power → 赤色ジャンパーワイヤで接続
- 3番ピン:GPIO 2 (SDA) → オレンジ色ジャンパーワイヤで接続
- 5番ピン:GPIO 3 (SCL) → 黄色ジャンパーワイヤで接続
- 6番ピン:Ground → 黒色ジャンパーワイヤで接続
<LCDモジュール側>
LCDモジュール側の接続方法は、以下の通りです。
- 1番上のピン:GND → 黒色ジャンパーワイヤで接続
- 上から2番目のピン:VCC → 赤色ジャンパーワイヤで接続
- 上から3番目のピン:SDA → オレンジ色ジャンパーワイヤで接続
- 上から4番目のピン:SCL → 黄色ジャンパーワイヤで接続
以上で接続は完了です。
接続がおわったら、念のためラズパイがモジュールを認識しているか確認してみます。
まず、ターミナルを開きます。
ターミナルに次のコマンドを入力して実行(Enter)します。
このコマンドをたたくと、次のような画面が表示されます。
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
上図であれば、”27”という値が表示されていますが、これが、ラズパイがI2C通信でLCDモジュールを認識している場合の表示となります。
もし何も表示されていなかったら、ラズパイがLCDモジュールを認識できていない、ということになりますので、機器を再度接続し直してみましょう。
ラズパイがLCDモジュールを認識できたら、機器の接続は完了です。
液晶ディスプレイに時間表示させてみた
それでは、液晶ディスプレイに時間を表示させてみたいと思います。
今回は、以下のプログラムを作成し、”LCD_TimeDisplay.py”というファイルで保存しました。ファイルの保存先は、ディスクトップにしました。
import smbus
import time
import datetime
# I2C通信設定
I2C_ADR = 0x27 # I2Cアドレス
LCD_WDT = 16 # 文字数上限
LCD_BKL = 0x08 # バックライトON
LIST = [0x33, 0x32, 0x06, 0x0C, 0x28, 0x01]
bus = smbus.SMBus(1) # 接続バスの番号指定
def initialize():
for i in LIST:
send_data(i, 0)
time.sleep(0.0005)
def send_data(bits, mode):
upbits = mode | (bits & 0xF0) | LCD_BKL
lwbits = mode | ((bits<<4) & 0xF0) | LCD_BKL
bus.write_byte(I2C_ADR, upbits)
bus.write_byte(I2C_ADR, (upbits | 0b00000100))
bus.write_byte(I2C_ADR, (upbits & ~0b00000100))
bus.write_byte(I2C_ADR, lwbits)
bus.write_byte(I2C_ADR, (lwbits | 0b00000100))
bus.write_byte(I2C_ADR, (lwbits & ~0b00000100))
def set_display(message,line):
message = message.center(LCD_WDT," ") # メッセージ表示 中央揃え
send_data(line, 0)
for i in range(LCD_WDT):
send_data(ord(message[i]), 1)
# メイン処理
def main():
initialize() # 初期化
while True:
# 現在時刻取得
current_time = datetime.datetime.now() # 現在時刻取得
set_display(time.strftime("%Y/%m/%d (%a)", time.gmtime()) , 0x80) # 1行目:年月日(曜日)表示
set_display(current_time.strftime("%H:%M:%S"), 0xC0) # 2行目:現在時間表示
time.sleep(0.1)
try:
#mainを実行
main()
except KeyboardInterrupt:
# 例外処理(Ctrl+C)
pass
finally:
# 終了時に行う処理
LCD_BKL = 0x00 # バックライトOFF
send_data(0x01, 0) # LCD表示クリア
それでは、プログラムを実行して液晶ディスプレイに時計を表示してみたいと思います。今回は、上記プログラムを、ターミナルから実行してみました。
方法は、ターミナルを開き、以下のコマンドを実行するだけです。
ちなみに、コマンド実行中が常に表示されることになります。コマンド実行中にターミナル上で「Ctrl+C」をするとプログラムは停止し、表示が消えます。
デジタル時計のケース作ってみた(余談)
液晶ディスプレイにデジタル時計を表示できるようになったのは良いですが、この状態だと少し不格好だと感じたため、家にある廃材を使って、ものすごい簡易的ですが、ラズパイ含めたケースを作ってみました。
捨てる予定だった黒い箱をカッターで切り取って、紙テープで繋げただけですが、思ったよりいい感じでできました。
子供のころの自由工作を思い出して、結構楽しい時間を過ごしました。
まとめ
今回、ラズパイで電子時計を作ってみました。廃材を使ってケースも作ってみましたが、童心に戻って時間を忘れて楽しめました。
今回は液晶ディスプレイに時間を表示しましたが、今後は、何か別の情報、例えば天気やニュースなんかを、自動で取得して表示できるようなものも作ってみたいと思います。
コメント