micro:bitのmbedでカスタムのMicrobitEventを実装する

micro:bitのmbed、MicrobitEventなるものでメッセージをオブジェクト間で送り合うように設計されている。例えば、ボタンが押された時のコールバック、シリアル通信が来た時のコールバック、センサーの値が一定以上になった時のコールバックなどなど。そうすると、カスタムでMicrbitEventを実装したくなるのだが、公式リファレンスにはなぜかそれに関する言及が無かったので調べて実装した。

MicrobitEventの仕様

Eventの発行元ID、Valueの2つがあればよい。Eventの発行元IDは9000番台以降ならデフォルトのID(Buttonなど)と被らない模様*1Valueはuint16_tで自由に使って良い。下記一行だけですぐEventは発行される。

MicroBitEvent evt(uint16_t 発行元ID, uint16_t value);

Eventのコールバック先の指定もボタンなどと一緒。Valueに0をいれると、その発行元からのすべてのEventを受け取る。今回は数字を送るのに利用してみた。

uBit.messageBus.listen(uint16_t 発行元ID, uint16_t value, コールバック先の関数名);

サンプル

Aボタンを押すとランダムで0-9までの数字を表示する。Aボタンを押した時にランダムで数字を生成し、EventのValueにして発行、イベントハンドラーで受け取って表示。

#include "MicroBit.h"

MicroBit uBit;

const int CUSTOM_EVENT_HANDLER = 9001;

void onCustomEvent(MicroBitEvent e)
{
    uBit.display.printAsync(e.value);
}

void onButtonA(MicroBitEvent)
{
    uint16_t ev = uBit.random(9);
    MicroBitEvent evt(CUSTOM_EVENT_HANDLER, ev);
}

void onButtonB(MicroBitEvent)
{
    uBit.display.clear();
}

int main()
{
    uBit.init();
    
    uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA);
    uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB);
    uBit.messageBus.listen(CUSTOM_EVENT_HANDLER, 0, onCustomEvent);

    uBit.display.printAsync("Q");
    release_fiber();
}

micro:bit(マイクロビット)

micro:bit(マイクロビット)

*1:詳しく調べてはないです

micro:bitのBluetoothペアリングモードに入る方法

公式の方法はABボタンを同時押ししながらリセットボタン。

しかし実際の実装は「起動時にABボタンを一定時間同時押しされている」と入るようになっている。リセットボタンは必須ではないので、電池の出し入れやその他電源供給側のスイッチ等で電源のオンオフができるなら、それらの方法でもペアリングモードに入ることが可能だ。

ケースによってリセットボタンが押せないので試行錯誤してたら発見した。

micro:bit(マイクロビット)

micro:bit(マイクロビット)

Adafruitで売っているNFCタグの反応距離まとめ

f:id:miso_engine:20180907173921j:plain
RFID / NFC : Adafruit
Adafruit、いくつかNFCタグを売っていて、それぞれのサイズは分かるんだけど反応距離が分からないのでまとめた。リーダーはAdafruitの"PN532 NFC/RFID controller breakout board - v1.6"。USBシリアル変換を刺したらPCからnfcpyで直接扱えます。どうぞご査収ください。
PN532 NFC/RFID controller breakout board / Adafruit