I2C LCD AQM0802

プログラミング
image_print

コンパニオンコンピューターのRaspberry Piにほんのちょっとの表示ができるディスプレイを取り付けます。
ところでraspiにUbuntuを入れてハードウェアを動かそうとしている人を見かけますが、賛成できません。
raspi-configやGPIOを使うツールが根こそぎないわけですから。

そのraspi-configからセットアップを始めます。

sudo raspi-config

で、i2cを有効にします。

i2cdetectが欲しいので

sudo apt install i2c-tools

*pipがないようなら

sudo apt -y install python3-pip

pythonのsmpus2をインストール(sudo いります)

sudo pip install smbus2

さて、ここからは例題として(I2C接続AQMシリーズのキャラクタ表示LCDをラズパイで使う (1) AQM0802)を参考にさせていただきました。
というのも、秋月電子のLCDモジュールは単純にディスプレイだけでなく、PCA9515というパスリピーターをちゃんと備えているからです。
jp4をはんだ付けしておくと、自動的に光ります。

このように表示されました。

 

このディスプレイをつけた理由は少なくとも、WIFIとダイアルアップで得たipアドレスを表示したかったからです。

コードは以下のとおり。ファイル名はipdisp.pyとします。
Wはwifi, XはUSBドングル, Pはダイアルアップ, Eはイーサネットアダプターを示します。

#!/usr/bin/python
#!/usr/bin/python
from smbus2 import SMBus
import time
import subprocess
import atexit

i2c = SMBus(1)
addr02 = 0x3e 
_command = 0x00
_data = 0x40
_clear = 0x01
_home = 0x02
display_On = 0x0f
LCD_2ndline = 0x40 + 0x80

def command( code ):
    i2c.write_byte_data(addr02, _command, code)
    time.sleep(0.1)

def writeLCD( message ):
    mojilist = []
    for moji in message:
        mojilist.append(ord(moji))
    i2c.write_i2c_block_data(addr02, _data, mojilist)
    time.sleep(0.1)

def getIPs(nwdev):
    ip_addrs = {"eth0":"", "wlan0":"", "wlan1":"", "lo":"", "ppp0":""}
    res = subprocess.check_output(['ifconfig'])
    str_out = res.decode("ascii", "ignore")
    str_out_lines = str_out.splitlines()

    for line in str_out_lines:
        line = line.lower()
        if line.startswith("eth0:"):
            now_if = "eth0"
            continue
        elif line.startswith("wlan0:"):
            now_if = "wlan0"
            continue
        elif line.startswith("wlan1:"):
            now_if = "wlan1"
            continue
        elif line.startswith("lo:"):
            now_if = "lo"
            continue
        elif line.startswith("ppp0:"):
            now_if = "ppp0"
            continue
    
        if "inet6" in line:
            pass
        elif "inet" in line:
            blocks = line.split()
            ip_addrs[now_if] = blocks[1]

    return (ip_addrs[nwdev])

        
def init():
    command(0x38)
    command(0x39)
    command(0x14)
    command(0x73)
    command(0x56)
    command(0x6c)
    command(0x38)
    command(_clear)
    command(display_On)
    
def sig_handler():
    command(_clear)
    
def show_IP(dev,ipaddr):
    nwpart = dev + ipaddr[0] + "." + ipaddr[1]
    writeLCD(nwpart)
    command(LCD_2ndline)
    hstpart = ipaddr[2] + "." + ipaddr[3]
    writeLCD(hstpart)
    
    time.sleep(15)
    command(_clear)
    

if __name__ == "__main__":  
    
    init()
    command(_clear)
    atexit.register(sig_handler)
    
    while 1:
        
        x = getIPs("wlan0")
        if x != "":
            ipaddr = x.split(".")
            show_IP("W", ipaddr)
        
        x = getIPs("wlan1")
        if x != "":
            ipaddr = x.split(".")
            show_IP("X", ipaddr)
                
        x = getIPs("ppp0")
        if x != "":
            ipaddr = x.split(".")
            show_IP("P", ipaddr)
                        
        x = getIPs("eth0")
        if x != "":
            ipaddr = x.split(".")
            show_IP("E", ipaddr)

まず、chmod +x ipdisp.pyで実行権限をつけて、実行してみます。
無事にIPアドレスが表示されたら、調子にのって自動スタートすることにします。

これが以外と難しい。
ifconfigを見ている以上、ネットワーク接続が終了してからでないといけません。

ここを参考にさせていただいて、次のようにします。

まず、サービスとして登録するために/etc/systemd/system/ へ移動します。

ここではipdispというサービスを作ります。(ファイル名: ipdisp.serviceを作ります)

[Unit]
Description=IPaddress Display
After = network.target

[Service]
ExecStart=/home/tsukasa/Documents/ipdisp.py
Type = simple

[Install]
WantedBy=multi-user.target

セーブします。

サービスを開始します。

sudo systemctl start ipdisp.service

状況確認します。 sudo systemctl status ipdisp.service

スタートアップに登録するには

sudo systemctl enable ipdisp.service

止めるのはdisable

ipdisp.serviceを書き換えた場合、

sudo systemctl daemon-reload

してください。

systemctlについて詳しくは他ブログで探してみてください。

タイトルとURLをコピーしました