2016年9月10日土曜日

Raspberry PiでLCD(AQM1602)を使い、IPを表示する方法


ネット上の資料集めに時間がかかったので、自分なりにまとめて共有します。

全体像

下記の流れで説明します。
  1. 使ったものの紹介
  2. 物理的な接続
  3. I2Cを有効化
  4. コマンドでLCDの動作確認
  5. プログラムでLCDを操作
  6. IPをLCDに表示
  7. 1分ごとにLCDを更新
  8. 日本時間をLCDに表示

使ったものの紹介

下記の道具や部品を利用しました。

物理的な接続

使ったものの紹介でも記述しましたが、Raspberry PiとLCEは相性が悪いのか、直接やりとりすると通信エラーを頻繁に起こすので、間にリレーを挟んで通信を安定させます。

物理的な接続(回路作り)を行うために、まずはI2Cリレーを変換基板に乗せて、リードフレームを取り付けてください。
リードフレームが無い場合はピンヘッダでも代用できます。
変換基板の穴が小さくてピンが入らないため、基盤の位置が高くなりますが、ハンダ付けが出来ていれば性能に問題はありません。


LCDとピンヘッダもはんだ付けしてください。
ジャンパ(画像右下)にもはんだを盛って、プルアップさせます。


部品が準備できたら、このように接続します。


Raspberry Pi I2Cリレー
3.3VVCC
2(SDA)SDA0
3(SCL)SCL0
GNDGND

I2Cリレー LCD
VCCVCC
SDA1SDA
SCL1SCL
GNDGND

実際に繋ぐとこうなりました。


リレー付近はこのような配線にしました。


物理的な接続ができたら、Raspberry Piの操作に移ります。

参考:
Raspberry Pi 変換
Raspberry Pi で LCD モジュールを使う

I2Cを有効化

Raspberry PiはデフォルトではI2Cが無効化されています。
そのため、下記の操作でI2Cを有効化します。

下記コマンドでraspi-configを開きます。
sudo raspi-config

「9 Advanced Options」を選びます。

「A6 I2C」を選びます。

「YES」を選びます。

I2Cが有効になりました。

I2Cの設定は有効になりましたが、I2Cの機器を動作するには一度再起動が必要です。
raspi-configを終了して下記のコマンドでRaspberry Piを再起動します。
sudo reboot

I2Cの確認のために、下記のコマンドでi2c-toolsをインストールします。
sudo apt-get install i2c-tools

下記のコマンドでI2C接続されている機器を確認します。
sudo i2cdetect -y 1

物理的な接続とI2Cの有効化が成功していれば、デバイス(3e)が表示されます。


参考:
Configuring I2C
Raspberry Pi SPI and I2C Tutorial

コマンドでLCDの動作確認

プログラムを作る前に、コマンドで動作確認を行います。 下記のコマンドを入力してください。
(#以後はコメントを意味するので、入力しなくても大丈夫です。)
i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c i # Function set,
i2cset -y 1 0x3e 0x00 0x38 0x0c 0x01 i # Function set,
i2cset -y 1 0x3e 0x00 0x80 # 1st line. Left.
i2cset -y 1 0x3e 0x40 0x41 0x42 0x43 i # Write String.

ABCと表示されれば、成功です。


参考:
i2c LCDを試す

プログラムでLCDを操作

pythonのプログラムでLCDを操作します。

pythonでI2Cを操作するのにsmbusというライブラリを利用するので、下記のコマンドでインストールします。
sudo apt-get install smbus

LCD操作用のディレクトリを作って、その中に移動します。
mkdir ~/programs/lcd
cd ~/programs/lcd

今回利用するLCD(AQM1602)を操作するためのライブラリ(asukiaaa_py_i2c_lcd)を作りました。
下記のようにpipでインストールできます。
sudo apt install python-pip
pip install asukiaaa_py_i2c_lcd

ライブラリを利用してLCDを操作するプログラムを作成します。
~/programs/lcd/hello.py
from asukiaaa_py_i2c_lcd.core import I2cLcd, AQM1602_ADDR

I2C_BUS_NUM = 1

lcd = I2cLcd(I2C_BUS_NUM, AQM1602_ADDR)

# col = 0, row = 0
lcd.setCursor(0,0)
lcd.write("Hello,")

# col = 4, row = 1
lcd.setCursor(4,1)
lcd.write("world!")

実行します。
python ~/programs/lcd/hello.py

このようにHello, worldと表示されれば成功です。


参考:
ストロベリー・リナックス/秋月電子のI2C液晶/OLEDほかをArduinoで使う

IPをLCDに表示

LCDのライブラリをダウンロードしたディレクトリにプログラムを作成します。
~/programs/lcd/print_ip.py
from asukiaaa_py_i2c_lcd.core import I2cLcd, AQM1602_ADDR
import socket

I2C_BUS_NUM = 1

lcd = I2cLcd(I2C_BUS_NUM, AQM1602_ADDR)

lcd.setCursor(0,0)
lcd.write("My IP is")

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8",80))
ip = s.getsockname()[0]

lcd.setCursor(0,1)
lcd.write(ip)

実行します。
python ~/programs/lcd/print_ip.py

IPがLCDに表示されれば成功です。


参考:
Finding local IP addresses using Python's stdlib

1分ごとにLCDを更新

起動直後はIPが取れなかったり、IPが変わることがあるので、cronに処理を追加して定期的にLCDを更新します。

下記のコマンドでcronの編集モードに入ります。
crontab -e

下記の記述を追加します。
*/2 * * * * python ~/programs/lcd/print_ip.py

「Ctrl + x」 -> 「Y」 -> 「Enter」でcrontabの編集モードを終了します。

成功すれば、1分ごとにLCDの情報が更新されるようになります。

日本時間をLCDに表示

LCDの更新を確認したいので、時間を表示させます。

下記のプログラムで日本時間の取得と表示を行います。
~/programs/lcd/print_ip.py
from asukiaaa_py_i2c_lcd.core import I2cLcd, AQM1602_ADDR
import socket
import time
import pytz
from datetime import datetime

I2C_BUS_NUM = 1

lcd = I2cLcd(I2C_BUS_NUM, AQM1602_ADDR)

jp_time =  datetime.now(tz=pytz.timezone('Asia/Tokyo'))

lcd.setCursor(0,0)
lcd.write( "at " + 
            str(jp_time.month) + '/' + 
            str(jp_time.day) + ' ' + 
            str(jp_time.hour).rjust(2, '0') + ':' + 
            str(jp_time.minute).rjust(2, '0') )

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8",80))
ip = s.getsockname()[0]

lcd.setCursor(0,1)
lcd.write(ip)

実行します。
python ~/programs/lcd/print_ip.py

成功するとこのように表示されます。


参考:
python - Give UTC time get Time in Japan using pytz
Python: Basic date and time types

共有は以上です。
この情報が何かの役に立てば嬉しいです。

変更履歴

2016/10/12
「1分ごとにLCDを更新」と「日本時間をLCDに表示」を追加しました。

2017/12/02
gistで共有していたLCDを扱うプログラム(I2cLcd.py)を元に、pipでインストールできるライブラリ(asukiaaa_py_i2c_lcd)を作ったので、ライブラリの設定方法とimport方法をpip版に更新しました。

2018/05/20
LCDとRaspberry Piが直接通信できない理由が分からないので、「相性が悪い」とだけ表記しました。(なぜ通信できないか理由を知っていれば、教えてもらえると嬉しいです。)
Raspberry Pi、リピーター、LCDの配線図を追加しました。

0 件のコメント :