前回がPWM出力だったので、今回は逆に入力インターバルをタイマAPIで測定してみました。入力は割り込み受け、人間がボタンを押す想定なので精度的にはいい加減な方法です。まあ、とりあえずボタンを押す時間間隔は測れたと。また、前回と異なり今回はオブジェクトコードの作成にWebベースのMbed Compilerを使ってみます。
※「モダンOSのお砂場」投稿順Indexはこちら
前回まで WindowsPC上の、VScode+PlatformIOのローカル環境でビルドを行ってきましたが、今回は、Arm MbedのWebコンパイラ利用です。気まぐれですが、どちらも一長一端あり、両方使っておこうと。アイキャッチ画像はMbed Compilerの画面であります。
Web環境の良いところ一つが、常に最新版にアップデートされていることでしょうか。使用するMbed OSの履歴なども以下のように確認できます。
今回使用した Timer APIの説明ページは以下です。
ソースの作成
ソースはローカル環境にある前回のものをアップロードして修正して使い回しです。Web環境、ローカル環境で同じソースでほぼほぼ同様な作業が行えるところもMbedの良いところじゃないかと思います。
今回は、人間がUSERボタンを2回続けて押したら、USERボタンの割り込み時間間隔を標準出力に報告する、というものです。人間相手なので手抜きコードです。
#include "mbed.h" #include "platform/mbed_thread.h" #include <stdio.h> #define BLINKING_RATE_MS 1000 // B1 USER pin for Nucleo-64-boards InterruptIn B1_USER(PC_13, PullUp); DigitalOut LD2(LED1); volatile bool measureFlag = false; volatile bool endFlag = true; Timer sw; void b1UserHandler() { if (!endFlag) { if (measureFlag) { sw.start(); measureFlag = false; } else { sw.stop(); endFlag = true; } } } int main() { B1_USER.fall(b1UserHandler); measureFlag = true; endFlag = false; while (true) { if (endFlag) { printf("Elapsed Time: %d [msec]\r\n", sw.read_ms()); measureFlag = true; endFlag = false; } LD2 = !LD2; thread_sleep_for(BLINKING_RATE_MS); } }
ビルド
ビルドは、ST Microelectronics製 Nucleo-F401RE ボードをターゲットに行いました。標準的なMbed環境の場合、ビルド後自動でオブジェクトファイル(.bin)がダウンロードされるので、それをNucleo-F401REの「ドライブ」にコピーすれば書き込み完了です。
stdioがUSBシリアルに向いているので、適当な端末ソフト(当方では伝来のTeraTermであります)で接続すれば結果を見ることができます(ボーレートは9600ボーのまま。)
実機動作結果
実際にF401REボードにオブジェクトを書き込み、動作させてみたところが以下に。Nucleo-F401REボード上のUSERボタン(青色)をクリクリと2回押すとその間(フォーリングエッジからフォーリングエッジまで)の時間を表示します。「感覚」的に時間を長くしていくとこんな感じ。ま、いい加減ですが、測定はしているみたい。
タイマでインターバルが測れることも一応確認できた、と。もっとシビアな制御をしないとそれらしくないけれども。