Pico・MicroPythonを使って、ビデオの自動録画を行う(イベントドリブンな)プログラムについて質問をいただいたので、解説したいと思います。これまでの記事は、センサから温度・距離を取得するなどの、「単体の処理」についての解説をしてきました。「処理を組み合わせて目的を達成する」ような「システムの作り方」については解説してこなかったので「ビデオの自動録画」を題材に、システムの作り方について解説してみたいと思います。全体コードコードのポイントまとめこんなことに使える複数のセンサを組み合わせたシステムを作るPicoから外部のセンサを動かす外部センサからの入力(I/O)をPicoで取得するPicoからPWM信号を出力する環境この記事は以下の環境で作成しています。Picoのセットアップ方法については、こちらの記事をご覧ください。使用する機材や部品この記事では以下の機器や部品を使用します。リンクには同等品や人気・評判がよく、高価(ぼったくり価格)でないものを選んで掲載しています。Amazon調べ)口コミを見るAmazonYahooショッピングポチップビデオ自動録画のシステム構成コメントでいただいた自動録画システムの構成は以下の通りです。この記事では入力をタクトスイッチ。出力をLEDに置き換えた回路を使って解説します。ビデオ自動録画システムの流れ自動録画システムの動作内容は以下の通りです。人感センサに反応があったら、ソレノイドでビデオカメラの電源ボタンを押す。10秒待機する(ビデオカメラの起動待ち)ソレノイドで録画ボタンを押す(録画を開始する)10秒待機する(録画中)ソレノイドで録画ボタンを押す(録画を停止する)人感センサに反応があったら3に戻る。ない場合は次に進む10秒待機する(録画データの書き込み待ち)ソレノイドでビデオカメラの電源ボタンを押す。1に戻るまた、上記の動作に以下の機能も付け加えます。録画ボタン操作時はスピーカーから音を鳴らす。コメントでは「次回の録画時」となっていますが、簡素化しています。実行結果システムを簡易化した回路で、後述するプログラムを実行した際の動画です。見やすさのためPWMの周波数を10Hzにしています。全体コード全体コードは以下の通りです。メインの処理をシンプルにするため、センサとのやり取りを「関数」にまとめています。(関数は細かい処理をまとめた部品・ブロックのようなものと考えてください)前述した自動録画システムの動作内容と合うように、プログラムのメイン処理を記載しています。その他、詳細な内容は後述のコードのポイントをご覧ください。ソレノイドを「onTime」で指定した時間、Highにして戻します。ソレノイドを「onTime」で指定した時間、Highにして戻します。Duty比を50にセットする。無限ループで終了を防止します。ビデオの録画ボタンを押して、録画を止めます。セセンサをチェックします。以下の部分がプログラムのフレームになります。センサの反応があるまでプログラムを動かし続けるため、while(True)でプログラムを無限ループさせます。無限ループの中でisMotionSensorDetect関数を使って人感センサを確認し、反応があった場合はその下の処理に。ない場合はループの最後のelseに飛びます。elseに飛んだあとは、1秒待機するのみで、無限ループの冒頭に戻ります。上記「無限ループ」と「反応がない場合は何もしない」という仕組みで、「人感センサの反応があるまで待ち続ける」という処理を作ることができます。自動録画システムの動作内容の1と9に該当します。無限ループで終了を防止します。IN)から、センサ情報を取得して、判定結果を返します。このように関数化しておくと、センサの論理(High/Low)の仕様が変わったり、センサを変更したい場合に、関数内の修正だけで対応できます。バグの発生防止や問題切り分けに有効なのでおすすめです。Falseビデオカメラの電源ON人感センサを検知すると、videoPowerPush関数を使ってビデオカメラの電源用ソレノイドを動作させます。関数の後ろの(1)は「引数」というものです。数値・文字・True/Falseなどを関数にセットした上で、関数を実行します。以下のコードはvideoPowerPush関数のの「onTime」に「1」がセットされた状態で、関数が実行されます。「onTime」に1がセットされると「ビデオ電源用のソレノイドを1秒間Highにして、Lowに戻す」という動作になります。print("LED照明はいりません")再録画のループ録画に関する処理内容です。自動録画システムの動作内容の3~6に該当します。以下の録画に関する処理は、繰り返し行われる可能性があるため、ループで囲っています。ループを終了する条件については、後述します。ビデオの録画ボタンを押して、録画を止めます。ledOff()明るさのチェックcheckNight関数を使って、明るさの確認とLED照明の点灯を行います。人感センサのチェックと同様ですが、暗い場合のみLED照明をON(GPIOをHigh)にしています。print("LED照明はいりません")ビデオ録画ボタン操作とブザーvideoRecPush関数を使って、録画ボタンの操作と操作時のブザーを鳴らします。videoRecPush(1)videoRecPush関数ビデオ電源操作用の関数と同様ですが、ソレノイドをONにしている間、後述のSound()関数を使ってブザーを鳴らします。ソレノイドを「onTime」で指定した時間、Highにして戻します。VideoRec.value(0)Sound関数duty_u16という関数を使ってPWM信号を出力します。引数でデューティー比は、16bit(0~65536)で指定する必要があるため、デューティー比50となる「32768」を指定しています。PWM信号を止める場合は「0」を指定します。Dutyを50でON。前述したvideoRecPush関数を使って録画を停止します。checkNight関数によって、LED照明が点灯している場合があるので消灯します。ビデオの録画ボタンを押して、録画を止めます。録画処理を行ったら、再度isMotionSensorDetect関数を使って、人感センサの反応を確認します。検知した場合は再録画のループの先頭に戻って、録画処理を繰り返します。人感センサの反応がない場合は、ループを終了する(抜ける)breakという構文を使って、再録画のループの外側に移動します。breakビデオの電源OFFと最初に戻る前述した再録画のループがbreakになると、以下に移ります。録画データの保存を10秒待ったのち、videoPowerPush関数を使ってビデオの電源をOFFにします。上記の処理で電源ON~録画の処理が完了し、無限ループの先頭に戻ます。戻った後は再度、人感センサ反応があるまで待つ。Pico・MicroPythonを使って、ビデオの自動録画を行う(イベントドリブンな)プログラムについて解説しました。今回の方法以外にも、タイマーやスレッド、状態遷移を使った方法など、いろいろな実現方法はあるかと思います。今回はシンプルで入門者にも優しいSleepを使った同期的な方法で作成してみました。(H/W・S/W的エラー処理も省略しています)つたないコードと解説ですが、お役に立てればうれしいです。お知らせMicroPythonのプログラミングガイドブックが遂に発売!「MicroPython」の本が遂にでました。この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!。内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。Wに使える良書3選を紹介したいと思います。以下のような方におすすめです。大歓迎です「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。質問・要望に、中の人ができる限り対応します。使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。MEえす現役のソフトウェアエンジニアです。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目です次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。MicroPythonでアナ...サイト内検索ブログの中の人えす現役のソフトウェアエンジニアです。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。おかげさまでたくさんのアクセスをいただいています。皆様本当にありがとうございます。Assetランキング!今もっともダウンロードされているAssetのランキングです。最近のトレンドを確認してみてください。Investment。