さて、少し間が開きましたが、今回はいよいよ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 ディスプレイで「静止画撮影!」の文字列表示、動画撮影時のプログレスバー表示を行いたいと思います。