Raspberry Pi 4でPythonスクリプトを自動起動(Ubuntu + venv)。

前書き

私は仕事で PLC (Programmable Logic Controller)と Raspberry Pi 4 Model BRaspberry Pi Pico などのデヴァイスを通信させて検査システムを構築しています。
尚、開発用PCのOSは Ubuntu 24.04 LTS です。

PLCラダー言語でシーケンシャルな動作を記述し、24Vなどの入出力を行います。
電磁弁エアー シリンダーを駆動させたり、パイロット ランプを点灯させたり、判定信号を受け取ったりします。

Raspberry Pi 4 Model BはOSとして Ubuntu 22.04 LTS をインストールし、幾つかのUSBカメラと接続してPythonスクリプトPyTorchによる自作の画像認識画像判定数字認識などの機械学習モデルを走らせます。

Raspberry Pi Picoは外付けのADCチップで電圧判定をしたり、servo motorをPWM駆動して検査治具を回転させたり、判定音を鳴らしたり、I2C接続の小型LCDに文字や数値を表示させたりします。
PWMの波形生成に工夫を凝らし、モーターの加減速や目標角度へ滑らかに遷移させる事が出来ます。
判定音の波形も包絡線を生成して変調させたり高調波を合成するなどして合格と不合格の音を全く違うものにするなど工夫を凝らしています。
据え置き型DMM(Digital Multimeter)とRaspberry Pi Picoの外付けADCを同時に接続するので、各デヴァイスが互いに影響を及ぼさないようにする為、ADCの入力インピーダンスを高くする必要があるのでフルスウィング(rail to rail)のオペアンプICを咬ましています。
過電圧からの保護の為にツェナー ダイオードを、電圧の逆流防止の為にショットキー バリア ダイオードを咬ましています。
測定値の補正の為に半固定抵抗器を入れてあります。

目的

私のシステムのRaspberry Pi 4 Model Bについてですが、電源ケーブルのスウィッチをONにするとUbuntu OSが起動します。
ユーザーは検査作業者なので管理者権限は付与せず、一般ユーザーとして起動時にパスワード不要で自動ログインするように設定してあります。

ここで、小型タッチ スクリーンが接続されている装置も作りましたが、ディスプレイが無い検査装置もあり、こちらはキーボードもマウスも何も無く、操作が不能です。
ですので、電源ONから自動的にPyTorchによるPythonスクリプトの検査プログラムが走る必要があります。

Pythonの実行は仮想環境で行うのが2024年現在の主流ですので、仮想環境の venv で実行します。
また、デバッグや調整の為に端末アプリ(gnome-terminal)のウィンドウを表示させ続け、標準出力を表示させます。

成功した方法

沢山試行錯誤した後に辿り着いた、最も簡便な方法は以下のものとなります。

まず、Ubuntu標準の設定アプリでユーザーをパスワード入力不要で自動ログインするように設定して置きます。

再起動して自動ログインが出来る事を確認したら、以下のディレクトリーに .desktop ファイルを作成して入れます。

/home/UserName/.config/autostart/

ここで UserName は各自の環境に合わせたユーザー名にします。
autostart ディレクトリーが無い場合は同名のフォルダーを作成します。
.desktop ファイルの内容は以下のように記述します。

[Desktop Entry]
Name=AutoStarter
Exec=gnome-terminal -- bash -c "'/home/UserName/ProjectName/venv/bin/python' '/home/UserName/ProjectName/test.py';$SHELL"
Icon=/home/UserName/ProjectName/Icon.png
Type=Application
Terminal=False

ここで ProjectName は各自の実行したいPythonスクリプトがあるフォルダー名です。
Icon.png は各自が用意したアイコン画像ファイルです。
必要が無ければ Icon= の行は不要です。
ファイル名は例えば gnome-terminal.desktop などとし、上記のディレクトリーに入れます。

これでRaspberry Pi 4 Model Bの電源をONにしてUbuntu OSが起動すると自動ログインされPythonスクリプトが venv 上で自動的に起動します
端末のウィンドウも表示されています。
普段はディスプレイを繋ぎませんが、必要な時にディスプレイを接続すればデバッグや調整が捗ります。

因みに、上記の Exec= の行の半角スペースやセミコロンの使い方が異なると、Python仮想環境が activate されなかったり端末ウィンドウが直ぐに閉じてしまうので注意して下さい。

GPIOの操作について

私はPythonでRaspberry Pi 4 Model BのGPIOを自在に操る為に、 PyPIgpiod を import しています。
ここで、PyPIではない方のgpiodもありますが、私が利用しているのは PyPI の方です。

pip install gpiod
gpiod
Python bindings for libgpiod

以下は Raspberry Pi 4 Model B 用の只のLED点滅のサンプル コードです。

#! /usr/bin/python3
# -*- coding: utf8 -*-

import gpiod

#cd ~/ProjectName/
#source venv/bin/activate
#python3 ~/"ProjectName/test.py"

print(gpiod.is_gpiochip_device("/dev/gpiochip0"))

from gpiod.line import Direction, Value

LINE = 4

request1 = gpiod.request_lines('/dev/gpiochip0', consumer='blinkLed',
    config={LINE: gpiod.LineSettings(direction=Direction.OUTPUT, output_value=Value.ACTIVE)},)

while True:
    request1.set_value(LINE, Value.ACTIVE)
    print('Active')
    time.sleep(1.0)
    request1.set_value(LINE, Value.INACTIVE)
    print('Inactive')
    time.sleep(1.0)

ところで、小型LCDモジュールとのI2C通信が巧く行かない場合は、バス リピーターICを咬ませると良いかも知れません。

他にも検査システム開発の為に必要な知識を沢山収集してあるのですが、全部を書いても仕方無いのでここまでにして置きます。

余談(私のスキル)

因みに私のスキルですが、機械学習AIのオプティマイザーやネットワークや活性化関数からの開発、板金の図面展開(溶接しろや多段の折返しなどを考慮)、PCBのガーバー データ作成、ボール盤や蹴飛ばしなどを用いた金属加工、マイコン プログラミング、PLCのラダー プログラミング、Pythonプログラミング、昔の仕様のJavaScript、古いC言語など。
ですが、まだまだ勉強と経験が必要です。

コメント

タイトルとURLをコピーしました