読者です 読者をやめる 読者になる 読者になる

自由課題

学んだり、考えたり、試したりしたこと。

イベント駆動っぽくmbedのLチカをやってみた

すみません。タイトルはほぼ釣りです。
何周遅れかわかりませんが、mbed NXP LPC1768を買ったのでLEDチカチカ(Lチカ)のコードを書いてみました。

このボードにはLEDが組み込まれており、開発環境(IDEクラウドで提供されている!)やサンプルコードも整備されているので、取り出して10分くらいでLチカの儀式ができるのですが、サンプルコードを単にコピペするのも面白くないのでちょっとひねってみました。

ということで以下がコードです。(mbedのリポジトリでも公開していますのでmbed持ってる方はImport可能です)

#include "mbed.h"
 
class Flicker
{
public:
    Flicker(PinName pin, float interval)
        :_out(pin),_interval(interval) {
        _out = 1;
        registerNextFlick();
    }
 
    void flick() {
        _out = !_out;
        registerNextFlick();
    }
 
    void registerNextFlick() {
        _timer.attach(this, &Flicker::flick, _interval);
    }
 
private:
    DigitalOut _out;
    float _interval;
    Timeout _timer;
};
 
int main()
{
    Flicker f1(LED1, 0.5);
    
    while(true){}
}

Flicker::registerNextFlick()がミソで、Flicker自身のメソッド(Fliker::flick())をワンショットタイマの割り込みイベントに関連付けてコールバック登録するようにします。そしてflick()内でLEDの点灯状態を反転させることによってLチカを実現しています。
Flickerクラスのコンストラクタには、点滅させるピンの名前と点滅間隔を渡します。

たかがLチカでここまですることないだろう、と思うかもしれませんが、一応ここまでするメリットはあって、例えばmain()で以下のようなコードが書けます。(mbed NXP LPC1768には、USBのアクセスランプ以外にLEDが4つ付いています)

int main()
{
    Flicker f1(LED1, 0.5);
    Flicker f2(LED2, 1.0);
    Flicker f3(LED3, 2.0);
    Flicker f4(LED4, 4.0);

    while(true){}
}

普通のLチカのコード(無限ループ内でsleep()しながらLEDを点滅させる)では、複数のLEDを異なるタイミングで点滅させるのは(タイミングそのものにもよりますが)難しいですが、Flickerクラスを使うと簡単にできます。

Flickerクラスが若干ごちゃっとしておりイベント駆動というにはかなり微妙なコードですが、とにかくmbedは簡単にコードが書いて動かせることがわかったので、部品を少しずつ買いながら遊んでみようと思います。