コンパニオンコンピューターの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について詳しくは他ブログで探してみてください。