知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

micro:bitをArduino IDEでも使いやすくして、ついでにBlynkでも使えるようにする

みなさん、micro:bit使ってますか?

f:id:IntellectualCuriosity:20200420170254j:plain

オフィシャルではMakeCodeエディターでブロックとJavaScriptPythonエディターでMicroPythonを使ってプログラミングができますよね。

どちらの環境も非常に良くできていると思うのですが、次のようなちょっとした不満な点もあるんです。

  • シリアルモニタのようなログ表示環境がないので、デバッグしづらい
    (Pythonの方はありますね)
  • ファームウェアーが重い(容量が大きい)
  • Arduinoの膨大なライブラリが使えない!

Arduinoだと上の問題は解決するんですが、単にmicro:bitArduinoで使えるようにしただけでは、オフィシャルが用意しているmicro:bitに特化した便利なライブラリを使うことができなくなるため、写真のようなハートをLEDで描くのにも大変な労力を必要としてしまします。

で、ちょっと探してみました。便利なものがないか。

そうしたらあったんです。便利なものが!

f:id:IntellectualCuriosity:20200420181338p:plain

はい、いつもいろんなセンサーのライブラリを使わせていただいている、Adafruitです!(写真をクリックすると該当サイトに飛ぶはず!)

 

このサイトはmicro:bitでArdunoを使う方法が書かれているのですが、Adafruitが用意した便利なライブラリやスマホアプリについても書いてあるんです!

 

これから少しづつこのサイトで紹介されている内容とBlynkで使えるようにする方法を書いていきますね!

 

micro:bitをArduino IDEで使えるようにする

SoftDevice(Bluetooth protocol stack)をmicro:bitに戻す

オフィシャルのMakeCodeエディターやPythonエディターは非常に便利にできていますが肥大化していて、それが、micro:bitArduinoで使おうとするときに問題になります。

Adafruitの説明ではMicroPythonを使うと無線機能の「SoftDevice」が消去されると書かれていて、確かにBBC micro:bit MicroPythonのドキュメントの「Bluetooth」の項目には「MicroPythonがBluetoothをサポートするのに十分なメモリがありません。」と書いてあります。

しかし、MakeCodeもデフォルトの状態では「Bluetooth」が使えず、拡張機能で追加する必要があるんです!

拡張機能で「Bluetooth」を追加しようとするとこんな画面が表示されます。

f:id:IntellectualCuriosity:20200422000228p:plain

「SoftDevice」をmicro:bitに戻すには、次の画像リンクから緑のボタンをクリックして、ダウンロードされたhexファイルをMICROBITドライブにコピーします。

f:id:IntellectualCuriosity:20200422001113p:plain

この英語の説明に、緑のボタンでダウンロードされるのは「MakeCodeで作られたBluetoothアドバタイズサンプルプログラム」と書かれているので、MakeCodeで「Bluetooth」を追加後に適当なBlutoothを使うプログラムを書いて「ダウンロード」ボタンを押せばいい気がしています。

 

Arduino IDEにNRF5xボードサポートを追加する

micro:bitにはNordic SemiconductorのnRF51822というSoCが使われています。Arduino IDEはデフォルトではnRF51822に対応していないので、このSoCが使えるようにします。

Arduino IDEの環境設定画面を開いて、「追加のボードマネージャのURL:」に「https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json」と記入します。

f:id:IntellectualCuriosity:20200422152934p:plain

その後、Arduino IDEのメニューからツール>ボード>ボードマネージャ選んでボーマネージャを表示し、検索をフィルタと書かれた入力欄に「nordic」と入力して「Nordic Semiconductor nRF5 Boards」をインストールします。(インストールにちょっと時間がかかります)

f:id:IntellectualCuriosity:20200423005400p:plain

ボードのインストールが終わったら、メニューのツール>ボードから「BBC micro:bit」を選びます。

f:id:IntellectualCuriosity:20200423010645p:plain

ボードを選択してツールの表示内容が変わったら、Softdeviceに「S110」をセットして、

f:id:IntellectualCuriosity:20200423010958p:plain

micro:bitをPCにつないで、シリアルポートに「COMx(BBC micro:bit)」をセットします。(xの数字は環境によって変化します。また、Macだと違う表示になります。)

f:id:IntellectualCuriosity:20200423011619p:plain

最後に、Adafruitの説明には明記されていませんが、書込装置を「USBtinyISP」にセットしておきましょう。

f:id:IntellectualCuriosity:20200423012914p:plain

 

Arduino IDEにAdafruitとBlynkのライブラリを追加する

プログラムを便利にするライブラリを幾つか入れていきます。

メニューからスケッチ>ライブラリをインクルード>ライブラリを管理を選んでライブラリマネージャを表示します。

f:id:IntellectualCuriosity:20200423150551p:plain

検索をフィルタにblepと入力してBLEPeripheralライブラリをインストールします。

f:id:IntellectualCuriosity:20200423151032p:plain

検索をフィルタにgfxと入力してAdafruit GFX Libraryライブラリをインストールします。

f:id:IntellectualCuriosity:20200423151746p:plain

検索をフィルタにmicrobitと入力してAdafruit microbit Libraryライブラリをインストールします。

f:id:IntellectualCuriosity:20200423152054p:plain

検索をフィルタにstm lsmと入力してSTM32duino LSM303AGRライブラリをインストールします。(古いmicro:bitには違うセンサーが付いていたそうなんですが、日本で売られているものはこのセンサーです。)

f:id:IntellectualCuriosity:20200423195404p:plain
検索をフィルタにblynkと入力してBlynkライブラリをインストールします。

f:id:IntellectualCuriosity:20200423152422p:plain

で、このBlynkライブラリなんですが、そのままだとスマホからBLEで繋ごうとするとエラーが出るんですよ。

で、ソースコードのヘッダーファイルを修正します!ですが心配は要りません!BlynkのFAQに書いてあった作業です!

修正するヘッダーファイルは、Arduino IDEの環境設定のスケッチブックの保存場所のフォルダを起点としてlibraries>Blynk>src>Adapters>BlynkBLEPeripheralSerial.hです。

30行目をコメントアウトして、31行目を追加します。

30    //uint8_t _rxBuffer[BLE_ATTRIBUTE_MAX_VALUE_LENGTH];
31    uint8_t _rxBuffer[BLYNK_MAX_READBYTES*2];

 

BlynkアプリでBLE接続

BlynkアプリでBLE接続するにはプロジェクトに「BLEウイジット」を追加して、

f:id:IntellectualCuriosity:20200424034512p:plain

BLEの設定画面を出し「Connect BLE device」をタップして

f:id:IntellectualCuriosity:20200424035429p:plain

Arduinoで設定した名前(ここではBlynk)を選んで「OK」をタップします。

f:id:IntellectualCuriosity:20200424040448p:plain

micro:bitに繋がるとこのように表示されます。

f:id:IntellectualCuriosity:20200424041028p:plain

 

Blynkプロジェクトのスケッチ(ソースコード

micro:bitの温度のゲージとグラフ表示、ハートと×をLED表示するボタンを配置したプロジェクトのスケッチです。

ハマるところはSerialBLE.begin()の後にLED表示を初期化するmicrobit.begin()を実行する必要があるところでしょうか。

#define BLYNK_USE_DIRECT_CONNECT
#define BLYNK_PRINT Serial
#include <BlynkSimpleBLEPeripheral.h>
#include <BLEPeripheral.h>
#include <Adafruit_Microbit.h>
#include <LSM303AGR_ACC_Sensor.h>

char auth[] = "自分のプロジェクトのAUTH TOKENで置き換えます";
BLESerial SerialBLE(0, 0, 0);
Adafruit_Microbit_Matrix microbit;
LSM303AGR_ACC_Sensor *Acc;
BlynkTimer timer;

BLYNK_WRITE(V2) {
  if (param.asInt()) {
    microbit.show(microbit.HEART);
  }
}

BLYNK_WRITE(V3) {
  if (param.asInt()) {
    microbit.show(microbit.NO);
  }
}

BLYNK_WRITE(V4) {
  if (param.asInt()) {
    microbit.show(microbit.YES);
  }
}

void sendSensor() {
  // Read temperature LSM303AGR.
  float temperature;
  Acc->GetTemperature(&temperature);
  Blynk.virtualWrite(V1, temperature);
  Serial.print("Temp[C]: ");
  Serial.println(temperature, 2);
}

void setup() {
  Serial.begin(9600);

  Wire.begin();
  Acc = new LSM303AGR_ACC_Sensor(&Wire);
  Acc->Enable();
  Acc->EnableTemperatureSensor();

  SerialBLE.setLocalName("Blynk");
  SerialBLE.setDeviceName("Blynk");
  SerialBLE.setAppearance(0x0080);
  SerialBLE.begin();
  Serial.println("Waiting for connections...");
  Blynk.begin(SerialBLE, auth);
  timer.setInterval(1000, sendSensor);

  microbit.begin(); // SerialBLE.beginの後に実行する必要あり
}

void loop() {
  SerialBLE.poll();
  Blynk.run();
  timer.run();
}

今回、ソースコードの説明についてはオマケ要素なので塩対応で行きます!

ライブラリのサンプルコードがArduinoから見れるようになっているので、実際に動かして使い方を覚えましょう!

Adafruit microbit Libraryのサンプルコードの出し方

f:id:IntellectualCuriosity:20200424205433p:plain

LSM303AGR(加速度・磁気・温度センサー)のサンプルコードの出し方

互換性なしカテゴリに入っていますが気にしたら負けです)

f:id:IntellectualCuriosity:20200424205753p:plain


おわり