ラズベリーパイのGPIO応答速度を測定(Python & GUI編)

ラズペリーパイのGPIO応答速度測定をGUIプログラムでやってみたいと思います。

                                         

最初はC言語でやってみようとしたのですがあまりうまくいかないので、おとなしくPythonでやることにしました。

PythonでGUIアプリを作るにはtkinterを使えばいいようです。そしてそのtkinterはPython3では標準でインストールされているようです。

tkinter version
tkinter インストール(バージョン)確認

いくつかのブログなどを参考に以下のようなコードでGUIアプリを作りました。

これをラズベリーパイのXWindow上で実行するとGUIアプリが起動します。

GUI application

ボタンをクリックするとボタンが”On”表示になり、もう1回クリックすると”Off”表示に戻ります。

ここにラズベリーパイのGPIO応答速度を測定(Python編)で使用したRPi.GPIOパッケージを使ってボタンをクリックするとGPIO出力に反映される様にします。今回はそのGPIO出力をGPIO27に割り当てました。

ラズベリーパイのGPIO応答速度を測定(Python編)ではGPIO18(swIn)にはNucleo側からスイッチ信号が入力されていましたが今回はGUIアプリボタンに連動したGPIO27(buttonOut)出力から入力されます。その信号をそのままGPIO17(ledOut)に出力するところはラズベリーパイのGPIO応答速度を測定(Python編)と同じです。

つまるところ配線は以下のようになります。

Nucleo F411Raspberry Pi
GUIアプリのボタンクリック
PA0(RPiIn / インプットキャプチャー Timer2 Channel1)GPIO27(buttonOut)
GPIO18(swIn)
↓(ラズベリーパイ Pythonプログラムで折り返し)
PA1(RpiIn / インプットキャプチャー Timer2 Channel2)GPIO17(ledOut)
配線表

(絵のLEDはOn/Off動作確認用です)

ラズベリーパイのGPIO応答速度を測定(Python編)ではGPIO18(swIn)信号をポーリングでモニターしていてGPIO17(ledOut)に出力していましたが、tkinterを使ったGUIアプリでは上記のPythonコードのmainloop()でどこかのループに飛びイベント待ちになっているのでGPIOもエッジイベントを登録してコールバック関数でGPIO17(ledOut)をHigh/Lowするようにします。

すなわちGUIアプリのボタンクリックでGPIO27(buttonOut)出力もHigh/Lowさせて、GPIO18(swIn)入力のエッジイベントのコールバック関数(swIn_edge_event_callback)でGPIO17(ledOut)出力をHigh/Lowさせています。

Nucleo側のファームウェアはラズベリーパイのGPIO応答速度を測定(Python編)と同じものでいいのですがバラツキが大きいので標準偏差も計算するようにしました。

結果は以下のとおりです。

GPIO response test result by gui

レスポンス時間は約412usとCLI版と比べて50倍くらい遅くなっています。

標準偏差は約75usなので結構大きいですね。3σが75usx3=225usなので412us±225usの範囲に95%の値が入ることになります(バラツキが正規分布なら)。

Nucleoのファームウェアはここにあります。

またラズベリーパイ側Pythonプログラム全体は以下のとおりです。

終わり

コメントを残す

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