やりたかったこと
「ESP-WROOM-02を使って,定期的に加速度センサから値を得る」という機能を実装しようと思い,タイマーについて調べてみました.
実装(msecタイマー)
msecタイマーの実装に必要最低限なものは以下の通りです.
#include <Arduino.h>
extern "C" {
#include "user_interface.h"
}
ETSTimer timer;
int Interval = 5;//タイマーの周期.単位はmsec.
void setup(){
system_timer_reinit();
os_timer_setfn(&timer, sample, NULL);
os_timer_arm(&timer,Interval, true);
}
void loop(){
yield();
}
void sample(void*){
//割り込み処理をしたい内容を記述
}
上記のようなコードで,msec単位のタイマー割り込みが可能です.
実装(μsecタイマー)
ESP-WROOM-02ではμsecタイマーも実装されています.
#define USE_US_TIMER
#include <Arduino.h>
extern "C" {
#include "user_interface.h"
#include "osapi.h"
}
ETSTimer timer;
int Interval = 1000;//タイマーの周期.単位はμsec.
void setup(){
system_timer_reinit();
os_timer_setfn(&timer, sample, NULL);
os_timer_arm_us(&timer,Interval, true);
}
void loop(){
yield();
}
void sample(void*){
//割り込み処理をしたい内容を記述
}
Espressif Systems社の仕様書によると,最高でも精度は500μsecと記載されています.msecがESP-WROOM-02タイマーの限界と言ってもいいでしょう.
注意点
system_timer_reinit();
必ず初期化を行いましょう.当初はこの行をすっ飛ばして実装していたのですが,微小なラグが蓄積されていってしまいます.
更にμsecでのタイマーを実装する際にこの初期化を忘れると,μsecではなくmsecでタイマー処理されてしまいます.気をつけて下さい.
まとめ
とりあえずタイマーの実装を行いました.あとは個々人でsample関数の中身を書いてみてください.