
前回が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回押すとその間(フォーリングエッジからフォーリングエッジまで)の時間を表示します。「感覚」的に時間を長くしていくとこんな感じ。ま、いい加減ですが、測定はしているみたい。
タイマでインターバルが測れることも一応確認できた、と。もっとシビアな制御をしないとそれらしくないけれども。


