インタネット接続障害(記録)
インタネット接続不可となるネットワーク障害が発生(厳密には未明に発生していた)
PCから有線によるインタネット接続障害を確認し各端末の無線LANも同様であることを確認
ローカルエリアでの通信障害はなし
①ルータの異常を疑い再起動 → 復旧せず
②HGWのリセット → 復旧せず
③BBユニットのリセット → 復旧
※)ONUとHUBは何もせず
記録として残しておく
日々の生活を好き勝手につづったブログ(My blog is written by inoshita.jp)
インタネット接続不可となるネットワーク障害が発生(厳密には未明に発生していた)
PCから有線によるインタネット接続障害を確認し各端末の無線LANも同様であることを確認
ローカルエリアでの通信障害はなし
①ルータの異常を疑い再起動 → 復旧せず
②HGWのリセット → 復旧せず
③BBユニットのリセット → 復旧
※)ONUとHUBは何もせず
記録として残しておく
そろそろPC1台を新しいCPUに更新しようと考えていたが,あんまり必要性も無いこともありFX-4100を使い倒そうと余っていたWindows10 HOMEをセットアップ
FX-4100は起動ディスクを交換式にしマルチOS対応にしていたので,これまで使用していたXP64も(ディスク交換によって)使用可能
(昔intel CPUが入っていたのでCoreシールが貼ってあるが中身はAMD FX-4100)
また,ついでにUbuntuの起動ディスクを作成した際「Memtest86+」も導入されGRUBから起動できるようになっていたのでテストしてみたところ・・・
なんと!エラーが続出
これまでFX-4100では稀に原因不明の動作異常となる事があったが,もしかするとメモリの問題だったのか?
ノンパリティメモリのためメモリエラーがあっても判断できず,異常データのまま使用されプログラムの動作がおかしくなるだけでなく,ディスクに書き込まれたデータの信頼性の問題,ファイルシステムの不整合を発生する可能性がある
どうしたもんか一晩考え,メモリの調整を行うことにした
(利用している4GB×2のメモリ)
しかしメモリスロットの変更やアルコールで清掃,またクロックを下げたり電圧を上げたりアクセスタイミングを変えたりとやってみたが改善せず,最終的にどうやらデュアルチャネルで使用するとエラーとなることが判明
シングルチャネルで「Memtest86+」を実行するとエラーは発生しない
だがこれだとOSからは半分の4GBしかメモリを利用できないため勿体ない
どうにかならないかネットでマザーボードのメモリサポート状況(ASRock 990FX Extreme4)を確認してみるとデュアルチャネルで使用する場合は4枚の方が多い事が判る
もしかすると4枚だと正常になるかと思い確認してみた
他の手持ちのDDR3メモリはCore i3で使用中の4枚
(1GB×2)
(2GB×2)
(2GB×2)を取り出し(4GB×2)と組み合わせて「Memtest86+」を実行してみるとエラーが無くなった
とりあえずは解決し,FX-4100では12GBで使用することにした
Core i3はUbuntuでの使用なので2GBで問題ない
ラズパイ4のCPU温度が気になってターミナルから監視してたのだけど・・・簡単にI2Cが使えるのだから表示器を接続して常時見えるようにすれば良いじゃないか!と気付くまで時間が掛かってしまった
情報取集したところ手持ちのI2C接続表示器のうちLCD(「AQM1602*」や「AQM0802*」)は,通信電圧の問題があって工夫すれば使用できるものの綺麗な接続でないので断念しOLEDを使う
OLED使用となるとSSD1306のグラフィックライブラリ(ArduinoならU8glibやU8g2lib)が必要でラブパイ(debian)だとpython用にライブラリがある
(参考)
ライブラリ(U8glib)の移植という方法もあったが折角の機会なのでpythonに初挑戦
しかし当然というかpythonの環境がすんなり出来なくてすったもんだ楽しむことになる
OLEDをラズパイのGPIOに接続する
多数の方が選択している片側(奇数)ピンの連続5ピンを利用(もう片側の偶数ピンの電源ピンをFANで使用しているという理由もある)
ピン接続用の変換アダプタを作製
ラズパイ4と接続
OLED接続確認
(I2Cの有効化)
$ sudo raspi-config
$ sudo shutdown -r now
(ツールインストール)
$ sudo apt install i2c-tools
$ sudo i2cdetect -l
i2c-1 i2c bcm2835 I2C adapter I2C adapter
$ sudo i2cdetect -y 1
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: -- -- -- -- -- -- -- --
$
CPU温度表示プログラムの作成
(python環境セットアップ)
$ sudo apt-get install python-setuptools
$ sudo apt-get install python3-setuptools
(ライブラリインストールのためのpipセットアップ)
$ sudo apt install python3-pip
(GPIOライブラリのインストール)
$ sudo pip3 install RPi.GPIO
(SSD1306ライブラリのインストール)
$ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
loning into 'Adafruit_Python_SSD1306'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 137 (delta 0), reused 0 (delta 0), pack-reused 134
Receiving objects: 100% (137/137), 43.42 KiB | 225.00 KiB/s, done.
Resolving deltas: 100% (69/69), done.
$ cd Adafruit_Python_SSD1306
$ sudo python3 setup.py install
(Pillowのインストール)
$ sudo pip3 install pillow
(追加:OS版数により以下が必要かも)
$ sudo pip3 install Adafruit_BBIO
(サンプル実行)
(嵌った点)
(CPU温度表示プログラム)
#!/usr/bin/python3
# coding: UTF
#
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
# 128x32 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_address=0x3C)
# Initialize library.
disp.begin()
# Clear display.
disp.clear()
disp.display()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a black filled box to clear the image.
draw.rectangle((0, 0, width, height), outline=0, fill=0)
# Load default font.
#font = ImageFont.load_default()
# Load font.
font1 = ImageFont.truetype('/home/pi/font/8-BIT WONDER.TTF', 8)
font2 = ImageFont.truetype('/home/pi/font/upheavtt.ttf', 40)
while True:
# Draw a black filled box to clear the image.
draw.rectangle((0, 0, width, height), outline=0, fill=0)
clock = str(subprocess.check_output("vcgencmd measure_clock arm", shell = True))
clock = clock[clock.find('=')+1:-9] + "MHz"
temp = str(subprocess.check_output("vcgencmd measure_temp", shell = True))
temp = temp[temp.find('=')+1:-3]
# Write two lines of text.
draw.text((0, 0), clock, font=font1, fill=255)
draw.text((8, 2), temp, font=font2, fill=255)
# Display image.
disp.image(image)
disp.display()
time.sleep(5)
(補足)
(実行)
/etc/rc.local から起動(cronという選択もある:cron実行用に修正が必要)
以下をrc.localの適正な位置に追加
# OLED Display
if [ -x /home/pi/disptemp.py ]
then
/home/pi/disptemp.py > /dev/null 2>&1&
fi