OLEDモニターにIPアドレスとMyCALLサインを表示する
私の環境では、Raspberry pi ZERO上でNoraGateway+なんちゃってモニターの利用は厳しいことが分かりました。
CPUへの負荷がかかりすぎてケロリが出て思うように使えません。しかし、一度、JumbospotについているOLEDに表示が
出るのを体感すると何も表示していないのはさみしいものです。ネットを探していたら
JG3EBB局のブログにヒントが
ありました。そこで、NoraGatewayが利用できるという前提で、IPアドレスと自分のコールサインだけを表示することに
チャレンジすることにしましたが、分らないことが多くてJG3EBB局にいろいろとご教授をいただきました。
また、OLEDの表示は、電源を切らない限り消えなかったのでrebootした時にシェルスプリクトを使って、一度画面を
クリアできるようにするスプリクトも教えていだきました。
お忙しい中、JG3EBB局にはいろいろアドバイス頂きありがとうございました。心から感謝です。
なお、NoraGatewayについては、JR1OFP局公開のイメージファイルを利用しての設定方法を記載します。
初期設定を終わらせ、SDカードにイメージを焼いてプログラムが起動しているという前提です。
JR1OFP局が公開されているイメージファイルは、ログなどの書き込みを禁止して途中で電源をDownさせてもファイルが
壊れないように書き込み禁止措置が施されていますので、必ず、起動した後は、書き込みを許可するように下記コマンドを
実施してください。
事前準備
sudo mount / -o remount,rw
JR1OFP局作成のイメージファイルは、SDカードへの書き込み禁止措置がなされていますので
再起動の都度、上記のコマンドを実施し書き込み可能状態にしてください。
まずは、最新の状態にします。
sudo apt-get update
sudo apt-get upgrade
1回目は、18分くらいかかります。気長に待ちましょう。
Errors were encountered while processing:
dhcpcd5
E: Sub-process /usr/bin/dpkg returned an error code (1)が出ます。
これは、たぶん、このイメージファイルがwifi関係の設定をリンクを使って読み込むようにしているからだと
推察しています。
ちゃんと、DHCPCDは動いていますので気にせずいきます。
このあとの作業でもこのエラーが出ますが気にせずいきましょう。
1.OLED表示用のプログラムのインストール
詳細は、
ここに記載されています。
(1)RPI.GPIOライブラリーのインストール
sudo apt-get install build-essential python-dev python-pip
sudo pip install RPi.GPIO
(2)Python関係ライブラリーのインストール
sudo apt-get install python-imaging python-smbus
最新のAdafruit SSD1306 Pythonライブラリのサンプルコードをダウンロード
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
cd Adafruit_Python_SSD1306/
sudo python setup.py install
(3)OLEDを利用するためi2cの有効化
sudo raspi-config
5 Interfacing Options Configure connections to peripherals
P5 I2C Enable/Disable automatic loading of I2C kernel module
The ARM I2C interface is enabledとします
一度再起動
sudo reboot
再起動したら必ず下記コマンドで書き込み許可をしてください。
せっかく設定しても書き込めないと怒られますよ。
sudo mount / -o remount,rw
JR1OFP局が公開してくれているイメージファイルは、突然の電源OFFなどで
OSが壊れないように書き込み禁止が施されていますので、再起動したら必ず
この作業を忘れないようにしてください。
i2c有効化の確認
sudo i2cdetect -y 1
PiOLEDのアドレス0x3cが表示されたのを確認します
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
(4)表示プログラム起動
cd Adafruit_Python_SSD1306/
sudo python examples/stats.py
IPアドレス、CPU使用率、メモリー使用率、ディスク使用量が表示されます。
ctrl+zで抜けます。
2.フォントを変更して表示内容も変更
倍率を変更するので活躍することもないかもしれませんが
日本語フォントを入れてみます。
(1)フォントをインストール
sudo apt install fonts-ipafont
インストールされたフォントは、/usr/share/fonts下にあります
pi@raspberrypi:/usr/share/fonts/opentype/ipafont-gothic $ ls -l
total 12184
-rw-r--r-- 1 root root 6235712 Apr 12 2011 ipagp.ttf
-rw-r--r-- 1 root root 6235344 Apr 12 2011 ipag.ttf
pi@raspberrypi:/usr/share/fonts/opentype/ipafont-mincho $ ls -l
total 15720
-rw-r--r-- 1 root root 8046048 Apr 12 2011 ipamp.ttf
-rw-r--r-- 1 root root 8046712 Apr 12 2011 ipam.ttf
(2)stats.py設定ファイルで設定を変更します。
cd ~/Adafruit_Python_SSD1306
sudo nano examples/stats.py
@フォントを変更
100行目
# Load default font.
font = ImageFont.load_default()
を下記のように変更します。
font = ImageFont.truetype("fonts-japanese-gothic.ttf", 14)
A一回だけプログラムを動作させます
104行目の前後を下記のようにして、一度だけ設定を読み込み表示するように
します。本来は、数秒おきに読み込みを行わないと意味がないのですが
NoraGatewayと同時に行うとCPU利用率が100%近くになりケロリが発生するので
このように行います。
プログラムを1回で停止させる方法については、JG3EBB局にアドバイスを頂きました。
また、JumbospotのOLEDは、shutdownしても表示が消えません。
本当に再起動したのかわからないので、電源を抜かなくてもrebootで表示を一度
消すようにするシェルスプリクトも教えて頂きました。本当にありがとうございました。
i=1
while True:
if i > 2 :
break
i = i+1
pythonの文法にのっとりスペースの数は合わせて下さい。
if i > 2 :は 半角スペースが前に4つです。
breakは、半角スペースが前に8つあります。
i = i+1は、半角スペースが前に4つあります。
これがあわないとエラーが出ます。当初、適当にスペースを入れていて
システムから怒られました。(^^;
BIPアドレスと自分のコールサインが出るように設定します。
CPU稼働率、DISK利用状況とかは、一度だけしか読み込まないので意味を
なしません。フォントのサイズを倍にするためここは表示しないように
コメントアウトします。IPアドレスだけを読み込むようにします。
# Shell scripts for system monitoring from here : https://unix.stackexchang$
cmd = "hostname -I | cut -d\' \' -f1"
IP = subprocess.check_output(cmd, shell = True )
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2$
MemUsage = subprocess.check_output(cmd, shell = True )
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
Disk = subprocess.check_output(cmd, shell = True )
111行目以降の上記設定を下記のようにコメントアウトします。
# Shell scripts for system monitoring from here : https://unix.stackexchang$
cmd = "hostname -I | cut -d\' \' -f1"
IP = subprocess.check_output(cmd, shell = True )
# cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
# CPU = subprocess.check_output(cmd, shell = True )
# cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2$
# MemUsage = subprocess.check_output(cmd, shell = True )
# cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
# Disk = subprocess.check_output(cmd, shell = True )
次に、表示する設定で自分のコールサインを表示するようにします。
# Write two lines of text.
draw.text((x, top), "IP: " + str(IP), font=font, fill=255)
draw.text((x, top+8), str(CPU), font=font, fill=255)
draw.text((x, top+16), str(MemUsage), font=font, fill=255)
draw.text((x, top+25), str(Disk), font=font, fill=255)
同じく、上記表記を下記のように変更します。これで、フォントが大きくなり
IPアドレスと自分のコールサインが表示されるようになります。
# Write two lines of text.
draw.text((x, top+3), "IP: " + str(IP), font=font, fill=255)
# draw.text((x, top+16), str(CPU), font=font, fill=255)
# draw.text((x, top), str(MemUsage), font=font, fill=255)
draw.text((x, top+17), u' J R 6 P U E', font=font, fill=255)
**自分のコールサインにします。
前のスペースは、表示した時にOLEDの真ん中に表示するように半角スペースを2個いれました。
3.自動起動の設定を行います。
/etc/rc.localの最終行のexit 0の前に、以下のように追記します。
sudo nano /etc/rc.local
# Wi-Fi Setting
# wfparacp.sh
# IP Adress Setting
# dhcpcd.sh
sudo python /home/pi/Adafruit_Python_SSD1306/examples/stats.py
exit 0
保存します。
4.rebootした時にOLEDの表示を一度消すようにします。
これ以下のシェルスプリクトは、JG3EBB大寺OMに教えて頂きました。
ありがとうございました。
cd /home/pi
(1)clr_oled.shを作成
sudo nano clr_oled.sh
下記内容を記載します
#!/bin/bash
sudo killall python
sleep 1
cd /home/pi
sudo python clr_oled.py
保存
sudo chmod 777 clr_oled.sh
(2)clr_oled.pyを作成
sudo nano clr_oled.py
下記内容を記載します
#************** clr oled python****************
import time
import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import subprocess
# Raspberry Pi pin configuration:
RST = None # on the PiOLED this pin isnt used
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0
# 128x32 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)
# 128x64 display with hardware I2C:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
# Initialize library.
disp.begin()
# Clear display.
disp.clear()
disp.display()
保存します
sudo chmod 777 clr_oled.py
(3)clr_oled.serviceを作成します
sudo nano /etc/systemd/system/clr_oled.service
下記内容を記載します
[Unit]
Description=Pronama-chan gives you to greeting when system is going to be shutdown
Before=shutdown.target alsa-store.service
DefaultDependencies=no
ConditionFileIsExecutable=/home/pi/clr_oled.sh
[Service]
Type=oneshot
ExecStart=/home/pi/clr_oled.sh
[Install]
WantedBy=shutdown.target
保存します。
4.サービスの自動起動設定
sudo systemctl enable clr_oled.service
sudo systemctl start clr_oled.service
5.OLEDの焼き付き防止
OLEDも同じ文字をずっと表示していると焼きつくそうです。
とは言ってもどれくらいの時間で焼きつくのかはわかりません。
1週間程度では問題ないようですが、気休め的にcrontabを使って
IPアドレスとコールサインを上下入れ替えるようにしたいと思います。
(1)設定用ファイルを2つにします
まず、/home/pi/Adafruit_Python_SSD1306/examples/stats.pyファイルをもう一つ作成します。
cd /home/pi/Adafruit_Python_SSD1306/examples/
cp stats.py stats1.py
sudo nano stats1.py
# Write two lines of text.
draw.text((x, top+3), "IP: " + str(IP), font=font, fill=255)
# draw.text((x, top+8), str(CPU), font=font, fill=255)
# draw.text((x, top+16), str(MemUsage), font=font, fill=255)
draw.text((x, top+17), u' J R 6 P U E', font=font, fill=255)
ここを上下逆転させます。
# Write two lines of text.
draw.text((x, top+17), "IP: " + str(IP), font=font, fill=255)
# draw.text((x, top+8), str(CPU), font=font, fill=255)
# draw.text((x, top+16), str(MemUsage), font=font, fill=255)
draw.text((x, top+3), u' J R 6 P U E', font=font, fill=255)
(2)crontabで毎時0分と30分で上下を入れ替えるように設定します。
cronはpiで走らせますのでsudoコマンドは使いません
$ crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
エディターは何を使うかと出ますので、2番をデフォルトのnanoを私は設定しました。
# m h dom mon dow command
00 * * * * sudo python /home/pi/Adafruit_Python_SSD1306/examples/stats.py
30 * * * * sudo python /home/pi/Adafruit_Python_SSD1306/examples/stats1.py
保存
とりあえず、目的の事が出来ました。(2019.03.23)