Raspberry Pi 5 で遊ぶ(スイッチオンで LED)

さて、少し間が開きましたが、今回はいよいよTKJ製作所さんの「汎用UI基板」を RaspberryPi 5 に接続し、プログラム開発環境を整えて、実際のプログラミングに入ります。

まだ目標の「カメラで静止画、動画撮影」まで先は長いですが、いきなり全ての機能を実装するのは難しいので、一つ一つ実装していきます。今回は、ゆくゆくは「撮影ボタン」になるスイッチ1、スイッチ2をプッシュすると対応する LED が点灯するところまでです。

「汎用UI基板」を接続

Raspberry Pi 5 の電源を切った状態で、念のため電源供給の USB TypeC ケーブルも抜いておき、GPIOヘッダー端子(40ピンの端子)に、「汎用UI基板」の下部に突き出た 40ピンコネクタを挿します。間違えにくいとは思いますが、向きを間違えないよう気をつけましょう。

Raspberry Pi に「汎用UI基板」が覆い被さるように挿すのが正解です。

終わったら、USB TypeC 給電ケーブルを挿して Raspberry Pi 5 を起動します。

開発環境の構築(その1)

Visual Studio code の導入と設定

Raspberry OS の GUI には、あらかじめ「Thronny」という Python スクリプト開発環境が入っていますが、UI が日本語化されていないなど使い勝手が悪い面もありますので、Windows で多少触ったことがある Visual Studio code を開発環境とすることにします。

デフォルトではインストールされていないと思いますので、「Raspberry アイコン」→「設定」→「Recomend Software」と開き、「Programing」の項目にある「Visual Studio code」にチェックを入れて「Apply」を押してしばらく待つと、メインメニューの「プログラミング」に「Visual Studio code」が現れます。

Visual Studio code 日本語化と Python 拡張機能のインストール

まずは日本語化です。

Visual Studio code を開いたら、左列アイコンの中から「拡張機能」をクリックし、検索窓に「Japan」と入れると、「Japanese Laguage Pack」がヒットしますので、インストール。

すると、右下に「Chage Language and Restart」のボタンがついたポップアップが現れますので、クリックして VS code をリスタートすると、日本語化されます。

次に、Python スクリプトの開発を行うので、Python 拡張をインストールします。やはり検索窓に「python」といれるとヒットします。

「汎用UI基板」のサンプルコードを取得

次に、そのままでは何をどうして良いか分からないので、「汎用UI基板」のサンプルコードを取得します。サンプルコードは https://github.com/momorara/OLED/tree/main に有り、ReadMe に取得方法も含めて説明があるので、読んでおきます。

LXTerminal を開き、ホームディレクトリで

git clone https://github.com/momorara/OLED

を実行すると、ホームディレクトリ直下に「OLED」ディレクトリが出来、その中に説明書などドキュメントやサンプルコードが入っています。

拡張子「py」のファイルがサンプルコードで、「OLED_」から始まるファイルは OLED ディスプレイ関係のサンプルコードですが、そのままでは実行できませんので、次回に説明します。

今回の目的は「スイッチ」と「LED」の連携なので、関係がある「test_sw.py」と「test_LED.py」を VS code で開いてみます。

VS code の左列アイコンの中の一番上「エクスプローラー」をクリックします。

「フォルダーを開く」をクリックし、/home/pi/OLED ディレクトリを開きます。

現れたダイアログで「はい、作成者を信頼します」をクリック。

左側にエクスプローラーツリーが表示されるので、「test_sw.py」をクリック。

なんとなく test_sw.py の内容に目を通したら早速実行してみましょう。右上の「右向き三角」をクリックすると、下部に VS code のターミナル画面が現れ、実行状況が表示されます。

どうやら、スイッチを押しているか押してないかを1秒単位で検出しているようです。

試しに「汎用UI基板」のスイッチ1(青)を押すと「sw_1 on」の表示が現れます。

同様にスイッチ2(赤)を押すと「sw_2 on」の表示が現れます。

ということは、ターミナルに「sw_1 on」とか出力する代わりに、LED を点灯させるようにすれば、今日の目的は達成ですので、この「test_sw.py」を元に開発していけば良さそうです。

開発用ディレクトリを作成、開発開始

開発用ディレクトリを作成

ホームディレクトリやデスクトップ上で開発を行っても良いのですが、整理の意味で今回はホームディレクトリ直下に「CAM」というディレクトリを作成し、そこに先ほどの「test_sw.py」をコピーして、「cam_01.py」というファイル名にリネームします。

コーディング

最初に成果物を示すと、こうなりました。

#!/usr/bin/python

"""
###########################################################################
カメラで静止画、動画を撮影する。

#Filename      :cam.py

#Update        :2024/07/06
2024/07/06  Ver. α 0.01 SW ブッシュ で LED 点灯
############################################################################
"""
# タイマー用時刻取得拡張
import time

# ボタンスイッチ用 gpio 拡張
from gpiozero import Button

# ボタンスイッチ初期設定
SW_1 = Button(5,pull_up=False)
SW_2 = Button(6,pull_up=False)


# LED 用拡張
from gpiozero import LED

# LED 初期設定
LEDPIN1 = LED(17)
LEDPIN2 = LED(27)

#print message at the begining ---custom function
def print_message():
    print ('|********************************|')
    print ('|   カメラ撮影(Still & Movie)  |')
    print ('|********************************|\n')
    print ('Program is running...')
    print ('Press Green Switch = Still')
    print ('Press Red Switch = Movie')
    print ('Please press Ctrl+C to end the program...')

# Switch 状態把握
#read SW_PI_1's level
def ReadSW_1():
    if SW_1.is_pressed:
        sw_ = 'on'
    else:
        sw_ = 'off'
    return sw_

#read SW_PI_2's level
def ReadSW_2():
    if SW_2.is_pressed:
        sw_ = 'on'
    else:
        sw_ = 'off'
    return sw_

#main function
def main():
    loop_n = 0
    # Switch状態初期化
    sw_ = 'off'
    # 初期メッセージ表示
    print_message()
    # ループ処理開始
    while True:
        # スイッチ1状態取得
        sw_ = ReadSW_1()
        # スイッチ1プッシュ時
        if sw_ =='on':
            # LED1点灯
            LEDPIN1.on()
            time.sleep(1)
            # LED1消灯
            LEDPIN1.off()
#            break

        # スイッチ2状態取得
        sw_ = ReadSW_2()
        # スイッチ2プッシュ時
        if sw_ =='on':
            # LED2点灯
            LEDPIN2.on()
            time.sleep(1)
            # LED2消灯
            LEDPIN2.off()
#            break
    pass
    # ループ処理ここまで
#
# if run this script directly ,do:
if __name__ == '__main__':
    try:
        main()
    #when 'Ctrl+C' is pressed,child program destroy() will be executed.
    except KeyboardInterrupt:
        pass
    except ValueError as e:
        print(e)

プログラミングは専門では無く、ましては python コードを「書く」のは初めてでしたが、とにかくサンプルコードの「test_sw.py」「test_LED.py」をガッチャンコさせるとこうなり、実行すると意図通り、スイッチ1プッシュで LED1(青)1秒間点灯、スイッチ2で LED2(赤)点灯、となりました。

詳しい説明は、次回以降、コードを追加しながら追々試みたいと思います。

さて、次回は今回の成果に加えて、OLED ディスプレイで「静止画撮影!」の文字列表示、動画撮影時のプログレスバー表示を行いたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください