Raspberry PiにふられたIPアドレスをHDMIディスプレイ以外で知る方法 (2) 7セグLED

ネットワーク上のマシンの存在を確認

 前回は、DHCPサーバによってRaspberry PiにふられたIPアドレスを音声で通知するプログラムを作りました。今回は、得られたIPアドレスを表示器に表示するプログラムを作成します。

 IPアドレスは、シェル(ターミナル)で、

hostname -I

とすると、

IPアドレスの文字列が返ってきます。192.168.xxxまでは、家庭内LANは同じなので、最後の3桁を表示できればよいです。筆者のルータにあるDHCPサーバでは、100以降を振り出すように設定しています。そのような設定をしていない場合は、1桁もしくは2桁の数字になる場合があります。

GPIOにつないだ7セグメントLEDで表示

 Raspberry Piで7セグメントLEDを簡単に点灯させよう (4) 配線量を少なくできるシフトレジスタを使った点灯方法 その3

 この記事では、4桁の7セグメントLEDに数値を表示しました。この表示器に、IPアドレスの最後の3桁を表示します。

 ラズパイと4桁の7セグメントLEDのピンヘッダの接続は次のようになります。SPIインターフェースを利用しています。

GPIOのピン番号と機能 7セグメントLEDボードのピン名称
17 +3.3V VDD
19 MOSI SDI
20 GND GND
23 CLK SCK
24 CE0 LOAD

プログラムはPython

 SPIを使うので、「コラム SPIを有効にする」を参照してください。

 WiringPiのPythonライブラリのインストールはこちらを参照してください。

 前回と同じく、IPアドレスは、hostname -I で得ます。Pythonのプログラムの中でbashの外部コマンドを使い、stdout=PIPEを使うと、標準出力から文字列を受け取れます。

p = Popen(["hostname","-I"],stdout=PIPE)

 受け取ったIPアドレスはすべて3桁で構成されていれば、11文字は家庭内LANではみな同じです。筆者は「192.168.111」を指定しています。

 その次はドットです。ここまで読みます。

c = p.stdout.read(11)
d = p.stdout.read(1) #dot

 筆者の家庭内LANでは、DHCPサーバは100からふり出します。3文字を読み、それぞれ変数に入れます。

d1 = p.stdout.read(1)
d2 = p.stdout.read(1)
d3 = p.stdout.read(1)

 LEDのセグメントは負論理で光るところを指定します。

表示の数字 10進表記
0 192
1 249
2 164
3 176
4 153
5 146
6 130
7 248
8 128
9 152

 seglistというリストに10進表記のデータを入れます。読みだしたd1、d2、d3は0~9の数値なので、リストの先頭からその数値にある場所のデータを取り出せば、10進数になります。

 これらの3桁の数値をdataとして表示します。

data = chr(seglist[int(d3)])+chr(seglist[int(d2)])+chr(seglist[int(d1)])+chr(127)
wiringpi.wiringPiSPIDataRW(SPI_Ch, data)

 プログラム全体を示します。ファイル名IPspi595-1b.pyで保存しました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wiringpi
from subprocess import check_call,Popen,PIPE
import time

#pin raspi 74HC595
#MOSI= 19 #SDI
#CLK = 23 #SCK
#CE0 = 24 #LOAD

SPI_Ch= 0 #CE0
SPI_Speed = 100000

#0 1 2 3 4 5 6 7 8 9
#192 249 164 176 153 146 130 248 128 152

# initialization
print("Initialization...")
wiringpi.wiringPiSPISetup (SPI_Ch, SPI_Speed)
seglist=[192,249,164,176,153,146,130,248,128,152]

#main
time.sleep(5.0)
p = Popen(["hostname","-I"],stdout=PIPE)
c = p.stdout.read(11)
d = p.stdout.read(1) #dot
d1 = p.stdout.read(1)
d2 = p.stdout.read(1)
d3 = p.stdout.read(1)
print c,d
print d1,d2,d3

data = chr(seglist[int(d3)])+chr(seglist[int(d2)])+chr(seglist[int(d1)])+chr(127)
wiringpi.wiringPiSPIDataRW(SPI_Ch, data)

print("done")

 sudo chmod 755 IPspi595-1b.py で実行権を付けて sudo python IPspi595-1b.pyで実行します。

ラズパイの立ち上がり時にこのプログラムを実行させる

 前回と同様に、/etc/rc.localに記述します。エディタnanoを起動します。

sudo nano /etc/rc.local

 exitの前の行に sudo python /home/pi/IPspi595-1b.py を追加し、Ctrl+o、Ctrl+xで保存します。リブートして、動作を確認します。実行しません。前回はシェル・プログラムで、実行できました。別のプログラムで実験しましたが、シェル・プログラムは起動しましたがPythonのプログラムは動きませんでした。

 次の手段として、Xwindowの起動時のプログラムとして動かします。下記のWebページを参考にしました。ありがとうございます。

http://www.lukesys.co.jp/index.php?RaspberryPI2_%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95

Xwindowで自動起動の設定

 2016年9月23日版で実行しています。条件として、下記の設定はデフォルトです。

  • Xwindowを自動で立ち上げている
  • piユーザで自動ログインしている

 この条件では、管理者権限でコマンドを実行するsudoを使ってもパスワードを聞かれません。

 隠しファイルを見えるようにします。View->Show Hiddenを選ぶと、ドットが先頭についたファイルが見えるようになります。各種設定ファイル類が編集できるようになります。

 /home/piのルートにある .configフォルダを開きます。

 この中にあるlxsessionを開きます。

 この中にあるLXDE-piを開きます。

 この中にあるテキスト・ファイルのautostartを開きます。

@/home/pi/ipdisplay.sh

を追加します。ipdisplay.shはまだ存在しません。

 テキスト・エディタを立ち上げて、次のプログラムを入力し、ipdisplay.shのファイル名で保存します。実行権を付けます。

#!/bin/sh
cd /home/pi/
sudo python IPspi595-1b.py

 リブートすると、GUI画面を表示した後、7セグメントLEDにIPアドレスを表示しました。