ネット上の資料集めに時間がかかったので、自分なりにまとめて共有します。
全体像
下記の流れで説明します。- 使ったものの紹介
- 物理的な接続
- I2Cを有効化
- コマンドでLCDの動作確認
- プログラムでLCDを操作
- IPをLCDに表示
- 1分ごとにLCDを更新
- 日本時間をLCDに表示
使ったものの紹介
下記の道具や部品を利用しました。- Raspberry Pi
- I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キット AQM1602A
- I2Cバスリピーター PCA9515AD
Raspberry PiとLCDは相性が良くないのか、直接接続すると認識はするのですが、データを送信すると頻繁にエラーになります。
そのため、リピーターを間に挟んで、通信を安定させます。 - SOP8(1.27mm)DIP変換基板 金フラッシュ (9枚入)
- 基板用リードフレーム SS2.54-6SN (25本入)
変換基板にはピンヘッダが刺さらないので、こちらのリードフレームがあると見た目が綺麗になります。 - ブレッドボード
- ジャンパワイヤ
- オスメスジャンパワイヤ
- ハンダゴテ
I2Cバスの変換基板組み立てに利用します。 - ニッパー
リードフレームの切断に利用します。
物理的な接続
使ったものの紹介でも記述しましたが、Raspberry PiとLCEは相性が悪いのか、直接やりとりすると通信エラーを頻繁に起こすので、間にリレーを挟んで通信を安定させます。物理的な接続(回路作り)を行うために、まずはI2Cリレーを変換基板に乗せて、リードフレームを取り付けてください。
リードフレームが無い場合はピンヘッダでも代用できます。
変換基板の穴が小さくてピンが入らないため、基盤の位置が高くなりますが、ハンダ付けが出来ていれば性能に問題はありません。
LCDとピンヘッダもはんだ付けしてください。
ジャンパ(画像右下)にもはんだを盛って、プルアップさせます。
部品が準備できたら、このように接続します。
Raspberry Pi | I2Cリレー |
---|---|
3.3V | VCC |
2(SDA) | SDA0 |
3(SCL) | SCL0 |
GND | GND |
I2Cリレー | LCD |
---|---|
VCC | VCC |
SDA1 | SDA |
SCL1 | SCL |
GND | GND |
実際に繋ぐとこうなりました。
リレー付近はこのような配線にしました。
物理的な接続ができたら、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 件のコメント :
コメントを投稿