みなさん、micro:bit使ってますか?
オフィシャルではMakeCodeエディターでブロックとJavaScript、PythonエディターでMicroPythonを使ってプログラミングができますよね。
どちらの環境も非常に良くできていると思うのですが、次のようなちょっとした不満な点もあるんです。
Arduinoだと上の問題は解決するんですが、単にmicro:bitをArduinoで使えるようにしただけでは、オフィシャルが用意しているmicro:bitに特化した便利なライブラリを使うことができなくなるため、写真のようなハートをLEDで描くのにも大変な労力を必要としてしまします。
で、ちょっと探してみました。便利なものがないか。
そうしたらあったんです。便利なものが!
はい、いつもいろんなセンサーのライブラリを使わせていただいている、Adafruitです!(写真をクリックすると該当サイトに飛ぶはず!)
このサイトはmicro:bitでArdunoを使う方法が書かれているのですが、Adafruitが用意した便利なライブラリやスマホアプリについても書いてあるんです!
これから少しづつこのサイトで紹介されている内容とBlynkで使えるようにする方法を書いていきますね!
micro:bitをArduino IDEで使えるようにする
SoftDevice(Bluetooth protocol stack)をmicro:bitに戻す
オフィシャルのMakeCodeエディターやPythonエディターは非常に便利にできていますが肥大化していて、それが、micro:bitをArduinoで使おうとするときに問題になります。
Adafruitの説明ではMicroPythonを使うと無線機能の「SoftDevice」が消去されると書かれていて、確かにBBC micro:bit MicroPythonのドキュメントの「Bluetooth」の項目には「MicroPythonがBluetoothをサポートするのに十分なメモリがありません。」と書いてあります。
しかし、MakeCodeもデフォルトの状態では「Bluetooth」が使えず、拡張機能で追加する必要があるんです!
拡張機能で「Bluetooth」を追加しようとするとこんな画面が表示されます。
「SoftDevice」をmicro:bitに戻すには、次の画像リンクから緑のボタンをクリックして、ダウンロードされたhexファイルをMICROBITドライブにコピーします。
この英語の説明に、緑のボタンでダウンロードされるのは「MakeCodeで作られたBluetoothアドバタイズサンプルプログラム」と書かれているので、MakeCodeで「Bluetooth」を追加後に適当なBlutoothを使うプログラムを書いて「ダウンロード」ボタンを押せばいい気がしています。
micro:bitにはNordic SemiconductorのnRF51822というSoCが使われています。Arduino IDEはデフォルトではnRF51822に対応していないので、このSoCが使えるようにします。
Arduino IDEの環境設定画面を開いて、「追加のボードマネージャのURL:」に「https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json」と記入します。
その後、Arduino IDEのメニューからツール>ボード>ボードマネージャ選んでボーマネージャを表示し、検索をフィルタと書かれた入力欄に「nordic」と入力して「Nordic Semiconductor nRF5 Boards」をインストールします。(インストールにちょっと時間がかかります)
ボードのインストールが終わったら、メニューのツール>ボードから「BBC micro:bit」を選びます。
ボードを選択してツールの表示内容が変わったら、Softdeviceに「S110」をセットして、
micro:bitをPCにつないで、シリアルポートに「COMx(BBC micro:bit)」をセットします。(xの数字は環境によって変化します。また、Macだと違う表示になります。)
最後に、Adafruitの説明には明記されていませんが、書込装置を「USBtinyISP」にセットしておきましょう。
Arduino IDEにAdafruitとBlynkのライブラリを追加する
プログラムを便利にするライブラリを幾つか入れていきます。
メニューからスケッチ>ライブラリをインクルード>ライブラリを管理を選んでライブラリマネージャを表示します。
検索をフィルタにblepと入力してBLEPeripheralライブラリをインストールします。
検索をフィルタにgfxと入力してAdafruit GFX Libraryライブラリをインストールします。
検索をフィルタにmicrobitと入力してAdafruit microbit Libraryライブラリをインストールします。
検索をフィルタにstm lsmと入力してSTM32duino LSM303AGRライブラリをインストールします。(古いmicro:bitには違うセンサーが付いていたそうなんですが、日本で売られているものはこのセンサーです。)
検索をフィルタにblynkと入力してBlynkライブラリをインストールします。
で、この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ウイジット」を追加して、
BLEの設定画面を出し「Connect BLE device」をタップして
Arduinoで設定した名前(ここではBlynk)を選んで「OK」をタップします。
micro:bitに繋がるとこのように表示されます。
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のサンプルコードの出し方
LSM303AGR(加速度・磁気・温度センサー)のサンプルコードの出し方
(互換性なしカテゴリに入っていますが気にしたら負けです)
おわり