JR6PUE HOME PAGE

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)