plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

ラズパイでキャラクタLCDに文字を表示させてみる

こんばんは。らずべりーです。

今日は旦那ちゃんの協力でラズパイさんとキャラクタLCDを繋いで、文字列を表示させてみました。なんとか完成したので備忘録として。

目次

  1. 動作環境
  2. ラズパイとキャラクタLCDのつなぎ方
  3. キャラクタLCDの動かし方

1. 動作環境

  • Raspberry Pi3 ModelB
  • Raspbian Jessie
  • Python3.4.2
  • 16文字x2桁のキャラクタLCD (SC1602BS-B: 秋月電子で購入)
  • Adafruit_Python_CharLCD (キャラクタLCDを動かすためのPythonモジュール)

2. ラズパイとキャラクタLCDのつなぎ方

私がやったのではないので、詳細は割愛しますが、このあたりが参考になりそうです。

www.nikkeibp.co.jp

w-jiro.hateblo.jp

3. キャラクタLCDの動かし方

Adafruitの方がGitHubで公開されているAdafruit_Python_CharLCDというモジュールを使いました。

github.com

コードの中身をみてみると、LCDやらPINの設定、初期化、文字列の変換などを良い感じにしてくれているみたい。Python2、Python3どちらでも動くところもGOOD。(どちらも動作確認済み)

このモジュールの使い方は先程ご紹介したページも併せて参考に。

w-jiro.hateblo.jp

3-1. インストール方法

以下、ラズパイのLXTerminalで入力。

$ sudo pip install Rpi.GPIO
$ git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git

Python2で使う場合は

$ cd Adafruit_Python_CharLCD
$ sudo python setup.py install

Python3で使う場合は

$ cd Adafruit_Python_CharLCD
$ sudo python3 setup.py install

これで導入完了です。

3-2. 文字列表示のためのPythonプログラム

今日の日付と現在時刻を表示してみます。

まずはじめに時刻の確認と時計合わせ。

LXTerminalで

$ date
$ sudo timedatectl set-timezone Asia/Tokyo
$ date

次に、プログラムを書いていきますが、基本的にはexamplesに入っている.pyファイルやAdafruit_CharLCD.pyファイルの中身をみるとなんとなく何をやっているかはわかるようになっています。(Beautiful code万歳!!)

Adafruit_CharLCD.pyの中身を参考に、表示する文字列のコードも表示できるようにしてみました。

GPIO番号(d4-d7)はつなぎ方によって違う番号になるので注意です。(これをまちがうと、思ったのと違う文字が出ます!)

#!/usr/bin/python3
# coding: utf-8

import Adafruit_CharLCD as LCD
from datetime import datetime

dt_now = datetime.now()

# GPIO番号 
lcd_rs        = 23
lcd_en        = 24
lcd_d4        = 22
lcd_d5        = 27
lcd_d6        = 4
lcd_d7        = 17

# 16文字x2行
lcd_columns = 16
lcd_rows    = 2

# Adafruit_CharLCDクラスのインスタンス化(初期化も同時に行われている模様)
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
                       lcd_columns, lcd_rows)
# 液晶をリセット
lcd.clear()

# 文字列の表示(時刻を表示してみます。)
message_text = dt_now.strftime("%Y/%m/%d\n%H:%M:%S")

lcd.message(message_text)

# 文字列のコードをターミナルで表示
for i in message_text:
    value = ord(i)
    ud4 = ((value >> 4) & 1) > 0
    ud5 = ((value >> 5) & 1) > 0
    ud6 = ((value >> 6) & 1) > 0
    ud7 = ((value >> 7) & 1) > 0
    ld4 = ((value) & 1) > 0
    ld5 = ((value >> 1) & 1) > 0
    ld6 = ((value >> 2) & 1) > 0
    ld7 = ((value >> 3) & 1) > 0
    print("Char:", i, "->", value)
    print("  Upper -", int(ud7), int(ud6), int(ud5), int(ud4))
    print("  Lower -", int(ld7), int(ld6), int(ld5), int(ld4))

このコードをファイル名lcd_test_3.pyという名前で/home/pi/Adafruit_CharLCDフォルダに保存し、LXTerminalにて

sudo python3 lcd_test_3.py

で実行すると、、、表示されました!!

f:id:plant-raspberrypi3:20171120021952j:plain

ちなみに、LXTerimalに表示させた2017/までの文字列コードの結果は以下の通りです。Char:の後がUnicode 文字1つ分、その後ろはその文字の Unicodeポイントを表す整数に置き換えた数字です。Upper, LowerはキャラクタLCDに送るためのコード8桁に対応します。

"""
Char: 2 -> 50
  Upper - 0 0 1 1
  Lower - 0 0 1 0
Char: 0 -> 48
  Upper - 0 0 1 1
  Lower - 0 0 0 0
Char: 1 -> 49
  Upper - 0 0 1 1
  Lower - 0 0 0 1
Char: 7 -> 55
  Upper - 0 0 1 1
  Lower - 0 1 1 1
Char: / -> 47
  Upper - 0 0 1 0
  Lower - 1 1 1 1
"""

視覚化すると理解が進みますね。

とりあえず表示できるようになってよかったです(^ ^)ノ