Raspberry Pi Picoで押しボタンスイッチの状態を取得する

Raspberry Pi Pico

はじめに

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 定義名状態
0DF_SNS_STATUS_UDL初期状態からLowを検知
1DF_SNS_STATUS_UDH 初期状態からHighを検知
2DF_SNS_STATUS_LLLow状態でLowを検知
3DF_SNS_STATUS_LHLow状態でHighを検知
4DF_SNS_STATUS_EL指定期間Lowを検知した状態(Empty)でLowを検知
5DF_SNS_STATUS_EH指定期間Lowを検知した状態(Empty)でHighを検知
6DF_SNS_STATUS_HLHigh状態でLowを検知
7DF_SNS_STATUS_HHHigh状態でHighを検知
8DF_SNS_STATUS_FL指定期間Highを検知した状態(Full)でLowを検知
9DF_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値で取り扱う場合にもこのプログラムを使うことができるかと思います。

コメント

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