はじめに
Raspberry Pi Picoを使って押しボタンスイッチの状態を取得してみたいと思います。
押しボタンスイッチは、チャタリングを考慮するため、スイッチの状態に応じてブログラムを呼び出していく状態遷移プログラムをつくっていきたいと思います。
Raspberry Pi Picoの開発環境構築や自作のプロジェクトのプログラムをRaspberry Pi Picoに書き込む詳細は、下記の記事にまとめています。
プログラムはC言語を使っていきますが、C言語による状態遷移設計は、関数ポインタを使って実装します。関数ポインタについては、C言語の記事にまとめています。
回路図
押しボタンスイッチと1kΩの抵抗を使ってRapberry Pi Picoに次のように接続します。
図のブレッドボード上部のRaspberry Pi Picoの36ピン(3.3VOUT)に押しボタンスイッチの片側を接続して、もう一方を1ピン(GP0)と1kΩの抵抗を挟んで接地(8ピンを使用)します。
プロジェクトのディレクトリ作成
まず、作成するプロジェクトのディレクトリをつくっていきます。
環境構築の部分で、pico-sdkが作成されているとして、次のようなディレクトリ構成とします。
buttonディレクトリ内にbutton.cファイルを作成して、ボタンスイッチの状態を取得するプログラムをこのファイルに書いていきます。
C:¥prog¥pico¥DL
┗¥pico-sdk
┗¥button
┗¥build
┗button.c
┗CMakeLists.txt
┗pico_sdk_import.cmake
SourceファイルとMakeファイルの作成
次にソースファイルとビルドファイルを準備します。
作成したプロジェクトディレクトリに移動します。(ここでは、buttonディレクトリ)
buttonディレクトリの中に実行するソースファイルbutton.cを作成します。
button.cには、次のようなコードを記述します。
押しボタンスイッチをひとつのセンサーとして捉えて、センサー処理をするsensor_main()関数を10msごとにタイマー処理で実行するようなプログラム構成です。
sensor_main()関数では、上のファイルのようなセンサー設計で各センサー状態ごとにプログラムを切り替えて処理を行います。
ボタンスイッチの状態は、ST_SNS構造体のstmatrix.statusを参照することでわかります。
ステータスには、次の10種類を定義しました。
プログラムを実行することでこの状態の値を出力して確認します。
No | 定義名 | 状態 |
0 | DF_SNS_STATUS_UDL | 初期状態からLowを検知 |
1 | DF_SNS_STATUS_UDH | 初期状態からHighを検知 |
2 | DF_SNS_STATUS_LL | Low状態でLowを検知 |
3 | DF_SNS_STATUS_LH | Low状態でHighを検知 |
4 | DF_SNS_STATUS_EL | 指定期間Lowを検知した状態(Empty)でLowを検知 |
5 | DF_SNS_STATUS_EH | 指定期間Lowを検知した状態(Empty)でHighを検知 |
6 | DF_SNS_STATUS_HL | High状態でLowを検知 |
7 | DF_SNS_STATUS_HH | High状態でHighを検知 |
8 | DF_SNS_STATUS_FL | 指定期間Highを検知した状態(Full)でLowを検知 |
9 | DF_SNS_STATUS_FH | 指定期間Highを検知した状態(Full)でHighを検知 |
続いて、buttonディレクトリの中にCMakeLists.txtを作成します。
CMakeLists.txtには次のように記述しておきます。
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(button_project C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(button
button.c
)
target_link_libraries(button pico_stdlib hardware_gpio)
pico_enable_stdio_usb(button 1)
pico_enable_stdio_uart(button 1)
pico_add_extra_outputs(button)
target_link_libraries(button pico_stdlib)
さらに、pico-sdk¥externalディレクトリの中にあるpico_sdk_import.cmakeというファイルをコピーして保存します。
ビルド
プロジェクトディレクトリbuttonにbuildディレクトリを作成し、カレントディレクトリとします。そこで、パス設定をしていなければ、次のコマンドを実行します。
C:\prog\pico\DL\button\build>setx PICO_SDK_PATH "..\..\pico-sdk"
実行ファイルを生成するため、cmakeを実行します。
C:\prog\pico\DL\button\build>cmake -G "NMake Makefiles" ..
C:\prog\pico\DL\button\build>nmake
nmakeを実行するとビルドが開始され、正常に終了するとbuildディレクトリの中にbutton.uf2という実行ファイルが作成されます。
このファイルをRaspberry Pi Picoに書き込むことで、作成したプログラムが実行されます。
実行
buildディレクトリを確認するとbutton.uf2ファイルが生成されています。
このファイルをターゲットボードに書き込みます。
Raspberry Pi Picoのリセットボタンを押しながらRaspberry Pi PicoにつないだUSBケーブルをPCに接続します。
この環境では、DドライブとしてRPI-RP2が認識されたので、このDドライブ内にbutton.uf2ファイルをドラッグアンドドロップで入れ込みます。これで、書き込みは終了です。
書き込みが終わった時点で、プログラムが実行されます。
ボタンスイッチを押したときの出力値を確認するためにTera Termを起動します。
ここでボタンスイッチを押し続けます。
すると、Tera Termには、次のように7と9が出力されます。
その後、ボタンスイッチを離します。そうすると、7と9に続いて2と4が出力されます。
ボタンスイッチが押されたことにより、High状態が検知(状態7)され、その後も押し続けられているので、状態9の指定期間High状態を検知しているとなります。このプログラムでは、指定期間を10としていて、センサー処理を10msで回しているので100msの間High状態が続いたら状態9に遷移することになります。この期間は、プログラム上で変更できるようになっています。
続いてボタンスイッチを離した場合も同様にはじめに状態2のLowを検知して、その後、一定期間Low状態が続いているので状態4が出力されています。
まとめ
このブログでは、Raspberry Pi Picoを使って押しボタンスイッチの状態を取得してみました。
状態遷移設計をするとプログラムは長くなりますが、スイッチの状態を取得しやすいのでモーターをスイッチの状態によって制御するなど応用ができるかと思います。
また、ボタンスイッチではなく、様々なセンサーを2値で取り扱う場合にもこのプログラムを使うことができるかと思います。
コメント