(Python) バックグラウンド処理での問題

rc.localに入れたPythonスクリプト(gpio初期化、co2センサーアクセス、gpio(led)制御、mysql書き込み)が正常に実行されない。

・処理の最初(gpio初期化からgpio制御まで)は動作していているから、おそらくmysqlへのアクセスで失敗している。うまくいくこともあるからタイミング問題であろう。多分pythonからアクセスに行ってもmysqlが立ちあがっていないんだろう、例外処理入れてないから推測ですが。

・一番安易に時間待ち(5秒)入れて見て問題ない様子、それほど長くは待つ必要はないだろうから。もともとco2センサーが安定するまでには2~3分必要というから、mysql起動待ちではなくセンサー安定待ちでその程度の時間待ちを入れても良さそう。

 

admin

Ubuntuクラッシュとパーティション拡張

VMwareのubuntuに大容量ソフトインストールで途中でデスク容量無くなってハング。再起動も当然できないし、起動できないと領域拡張もできないから最近とっておいたバックアップ、とは言ってもmacで該当するディレクトリの丸ごとバックアップを上書きすると回復。常にバックアップは重要です。

領域拡張はvmware領域の拡張ではダメでubuntuのパーティション領域の拡張が必要です。

ツールは揃っていて「デスク管理ツール」を使います。その前にvmwareへのデスク割り当て容量の拡張も無論必要です。

以前は20GBもあればと思っていたけど、このままだといずれアップデートもできなくなりそうだから50%拡張することにしました。

dfでルートディレクトリも使用率44%となったのでしばらく安心です。これでmacの500GBも200GB使用することになりました。写真とか動画はほとんどないのでソフトだけでも相当デスクを圧迫します。

 

admin

ヘッドレスは地雷

Raspberry piにwi-fi追加しようとしてconfファイルいじってたら、使えてたwi-fiにもつながらなくなった。

wi-fiつながらないと他に手段なく、① デスクトップ無し、② 外部モニター/キーボード無しなのでアクセス手段が無くなって手出しできなくなります。

imageバックアップしてたからリカバリー出来たけど、もしそれが無かったら再構築するしかなさそう。

Raspberry pi標準のイメージ書き込みツールはカスタムイメージも書き込みできるので、コンソールでddコマンド打つよりも簡単かも知れません。

 

admin

Volumioの最新版

ラズパイで稼働しているvolumioが不調(おそらくsdカードが寿命か)になってきたので、現行最新版を入れてみた。

ビューは結構変更されてて、日本語メニューも選択できるようになっています。

Spotify用のプラグインもあるけど、これは有料アカウントでないと使えないらしいので諦めました。macからairplayでvolumio選択もあるけど、これはつながるだけで音質は望めない。

もともとI2S-DACは音がいいので、ラズパイゼロと組み合わせた音楽サーバーは現状最強だと思います。

 

admin

Mac自動再起動のタイミング

毎日早朝に「システム環境設定」で自動起動させる設定にしていますが、再起動しない時があります。なぜと思って振り返ってみると、二十四時間以内に何らかの原因、例えばosアップデート後の再起動などが発生しているときは再起動しないようです。ただしそれ以外にも再起動しない時はあるから、イマイチロジックは不明なのですが。

いずれにしろ、元々がリフレッシュブートなのだから、論理的な処理のように思います。

Edraw Max

回路図用の無償(15日間限定)お絵かきソフトはmacではまともなものが無いから、Linuxで探すとこれが良さそう。

簡単な回路図作成だけならこれで十分のように思う。もちろん業務で使うときには別の解となりますが。

 

admin

SDカードイメージのバックアップについて

Raspberry piのイメージバックアップでMacのコンソールから行うやり方。ddコマンドが使えるのでlinuxと同じと言えばそれまでですが。

対象のsdカードを特定して、

$ diskutil list

〜〜部分〜〜

/dev/disk2 (external, physical):

   #:                       TYPE NAME                    SIZE       IDENTIFIER

   0:     FDisk_partition_scheme                        *8.0 GB     disk2

   1:             Windows_FAT_32 ⁨boot⁩                    268.4 MB   disk2s1

   2:                      Linux ⁨⁩                        7.7 GB     disk2s2

アンマウントして、

$ diskutil umountDisk /dev/disk2

ddコマンドでバックアップします

$ sudo dd if=/dev/disk2 of=raspi-backup.img bs=1m

進捗は別の端末をcommand+nで開いて、

$ sudo killall -INFO dd

で、実行中のコンソールに、

1286+0 records in

1286+0 records out

1348468736 bytes transferred in 297.716017 secs (4529379 bytes/sec)

のように表示できます。ddもkillallもmacのパスワード要求されます。

転送速度は4MB/secぐらいだから、sdカードのサイズにもよりますが時間はたっぷりかかります。

進捗はFinderでimgファイルのサイズを見ても想像はつくのですが。

 

admin

pythonからシェルコマンドを起動

・pythonでshellコマンド使う(sw押されたらシャットダウン処理)

>> import subprocess

>> subprocess.call([“ls”, “-l”])

二行目は、

>> subprocess.call(‘ls -l’, shell=True)

shell=True指定でベタ書きできるけど、インジェクションリスクはある。

shutdownは、

>> subprocess.call(‘sudo shutdown -h now’, shell=True)

・起動時のスクリプト自動起動(co2センサーのログ取りとdio制御スクリプト)

/etc/rc.localのexit前に以下のように記述しますが、

/usr/bin/python /home/pi/gpio.py &

ルート権限実行なのでフルパスで記述することと、終了しないスクリプトの場合にはバックグランド動作とするために最後に”&”を付加します。

 

admin

co2 センサー(NDIRとは、Non Dispersive InfraRed(非分散型赤外))MH-Z19BをPythonから使う

・センサーの動作確認

$ sudo raspi-config

UARTで使うので初期状態では有効になっていないシリアルインタフェースを有効にする

特に設定なしでそのまま使えるmh-z19をインストール

https://test.pypi.org/project/mh-z19/

$ sudo pip3 install mh-z19

シリアルインターフェースはroot権限ないと動作しません。

$ sudo python -m mh_z19

{“co2”: 934}

キャリブレーション(最低値400ppm付近にするだけみたいです)

$ sudo python -m mh_z19 –zero_point_calibration

Call Calibration with ZERO point.

$ sudo python -m mh_z19

{“co2”: 404}

co2濃度以外の数値も吐き出せるから、このライブラリは値を辞書形式で出力しています、

パラメータに—all指定でco2濃度以外も測定できます

$ sudo python -m mh_z19 –all

{“co2”: 405, “temperature”: 31, “TT”: 71, “SS”: 0, “UhUl”: 0}

Python中ではこういう風に使います

>>> import mh_z19

>>> mh_z19.read()

{‘co2’: 572}

 

admin

raspberry piのgpioを使う

GPIO用のライブラリRPi.GPIOは標準で組み込まれています

  1. Pythonからのアクセス方法

——————————————

# BCM PIN ASSIGN

# ledは23:blue, 24:yellow, 25:red

BLUE = 23

YELLOW =24

RED = 25

# Shut down sw is assigned to 17

SHUTDOWN = 17

def init():

    # initialise Pins

    GPIO.setwarnings(False)

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(BLUE, GPIO.OUT)

    GPIO.setup(YELLOW, GPIO.OUT)

    GPIO.setup(RED, GPIO.OUT)

    GPIO.output(BLUE, True)

    GPIO.output(YELLOW, False)

    GPIO.output(RED, False)

# switchの割り当てとイベント待ち

    GPIO.setup(SHUTDOWN, GPIO.IN)

    GPIO.setup(SHUTDOWN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    return

def handle_sw_input():

    def switch_callback(gpio_pin):

        print(‘sw was pushed’)

    #

    GPIO.add_event_detect(SHUTDOWN, GPIO.FALLING,bouncetime=250)

    # when the sw was pushed, call the ‘call back routine’ 

    GPIO.add_event_callback(SHUTDOWN, switch_callback) 

    return

 

・イベント待ちのサンプルはこちらから

https://qiita.com/maoutokagura/items/9aef5e23167ce2bc1d10

 

  1. 個別プログラムgpioのインストール

動作確認用が主目的と思いますが

$ sudo su –

# wget https://project-downloads.drogon.net/wiringpi-latest.deb

# dpkg -i wiringpi-latest.deb

# exit

$ gpio -v

gpio version: 2.52

Copyright (c) 2012-2018 Gordon Henderson

This is free software with ABSOLUTELY NO WARRANTY.

For details type: gpio -warranty

Raspberry Pi Details:

  Type: Pi Zero-W, Revision: 01, Memory: 512MB, Maker: Sony 

  * Device tree is enabled.

  *–> Raspberry Pi Zero W Rev 1.1

  * This Raspberry Pi supports user-level GPIO access.

こういう風に設定します。

$ gpio -g mode 23 out ; -g bcmモード指定の意味

$ gpio -g write 23 0 ; 

GPIOのピン指定にはBOARDとBCMあるので紛らわしいのですが、以下BCM指定時のピン名称です。BOARDはその名の通り物理ピン番号指定のようです。

 

admin