0

BLE NanoをArduino IDEで開発する

BlendMicro npmが自動再接続・複数接続できるようになった
で、BLE Nanoにも接続できるっぽいと書いた。今やってる

BLENano実機の開発環境が手に入ったのでセットアップしたメモを書いておく。

BLE Nano

写真の上の部分がBLE Nanoで、下はそれにUSBインタフェースを追加するMK20 USBボード。プログラムを書き込む時だけ下が必要で、デプロイする時は上の部分だけで良い。
なおBLE Nanoは12ピンでMK20は14ピン、1ピンずつ余るけど差し間違えると死ぬ可能性があるので注意。写真のようにUSBコネクタ側を余らせ、USBコネクタと反対側に白いアンテナとRedBearLabのクママークが来るようにする

BlendMicroとの違い

BLE Nanoと似たものにBlendMicroがあるが、これは普通のAVRマイコンを使ったArduinoにnRF8001というBLEチップを外付けして、その間の通信が簡単にできるArduinoライブラリとセットにしたボード。

それに対してBLE NanoはBLEの機能が内蔵されたnRF51822というARM CPUと、電源のレギュレータや無線アンテナなどを1枚の基板に載せたマイコンボード。

ワンチップに全て入っているので、外付けBLEモジュールと通信してるBlendMicroよりもBLEのより細かい機能を扱える。サンプルコードを見るとBLEのCentral(スマホやPC側の動作)として動かす例なんかもあって、だいたい何でもできそう。
またICが1つだけなので消費電力も低いらしく、ボタン電池で動く。

買う

スイッチサイエンスで売ってる

Amazonにもある
RedBearLab BLE Nanoキット
RedBearLab BLE Nanoキット
posted with amazlet at 15.12.03
スイッチサイエンス


開発方法

開発方法は2通りあって、mbedのオンラインコンパイラを使うか、Arduino IDE用のプラグインを入れてArduino風のAPIで開発もできる。

Arduino風に開発する方は、digitalWriteやanalogRead等のIO操作やdelay(msec)などのArduino互換の関数があるだけで、BLE操作の部分はふつうにmbedのC++のライブラリをincludeして行うのであまり関係ない気もする。
そして何より、ひとたびBLEを動かし始めたらmainループの中でble.waitForEvent()を呼んで、あとは全てイベント駆動で書かなければならないのでどれだけ既存のArduinoライブラリが動くかわからない。
イベント駆動についてはIntroduction to mbed BLEに書いてあるが、ようするに基本的にTickerという定期的に関数を呼び出してくれるタイマーか、BLEのデータ受信イベント等にコールバック関数を登録してアプリケーションを書く事になり、mainループは使わない。

そう考えるとArduino風に書けるメリットはあんまり無いような??気がしてきたけど、オンラインコンパイラなしで、ネットワークの無い所でも開発できるのでArduino IDE拡張の方が個人的には好きかも。(mbedオンラインコンパイラよりemacsで書いて+GitHubで管理したいし)


mbedオンラインコンパイラで開発する

web上にあるIDEで開発して、コンパイルするとhexバイナリをダウンロードできる。
BLENanoをMacにUSB接続すると /Volumes/MBED にマウントされるので、そこにhexファイルをコピーする。BLE Nanoが自動的に再起動して、hexが読み込まれ実行される。

たとえばURI BeaconのチュートリアルにあるBLE_URIBeaconというプログラムを書き込むと、PhysicalWebのURI Beaconが作れる。Androidアプリから見れるはず。
mbedオンラインコンパイラで公開されているプロジェクトは自分のアカウントにforkして読み込んで自由に編集できるので、試してみるとよい。


BLE NanoのArduino風開発環境セットアップ

2ステップ必要
  1. BLE NanoをArduino化して
  2. Arduino IDEにプラグインをインストールする
Getting Started – nRF51822 — RedBearLabの下の方にある説明よりも、
https://github.com/RedBearLab/nRF51822-Arduino
の説明の方が新しくて正しい。
とくに最近ArduinoはパッケージマネージャがついてBLENanoもそれに乗せて配布されるようになっているので、最新のインストール方法はgithubのREADMEを見たほうが良さそう。


BLE NanoにArduinoファームウェアをインストールする


https://github.com/RedBearLab/nRF51822-Arduino
をgit cloneしてきて、bootloaderをインストールする

% cp ./bootloader/bootloader.hex /Volumes/MBED/

Arduino IDEにプラグインをインストールする

https://github.com/RedBearLab/nRF51822-Arduinoに書いてあるバージョンのArduino IDEをダウンロードする。
現在は1.6.5が指定されている。最初1.6.6でやっていたんだけどExamplesが読み込めなかったので1.6.5に戻した。マイナーバージョンが違うだけで動かないなんて…

[Arduino]->[Preferences]から[Boards Manager URLs]にRedBearLabのjsonを追加してから、
[Tools]->[Board]->[Boards Manager]で「RedBearLab nRF51822 Boards」を追加する。

この手のArduino IDEをいじる系はBlendMicroやDigiSparkなど色々あるけど皆違うバージョンを指定しているので、俺は.appの名前を変えて複数保存している。


Arduino IDEでBLENanoを開発する

ToolsのBoardとPortをBLENanoに設定してから、とりあえずExamplesの[Basic]->[Blink]をそのまま書き込んだら、動いた。
基板裏面のLEDが13番ピンに接続されているらしい。


BLEの例は、SimpleChatを書き込んでからblendmicro npm付属のblendmicroコマンドで探したら見つかった。「TXRX」というのがそれ。


これでとりあえずプログラムが書き込める事が確認できた。

0

Arduino MicroをUSB MIDIデバイスにする

MIDIデバイスを自作し、ブラウザのWeb MIDI APIと通信した。
rkistner/arcoreを使ったら簡単にできた。

もともとLeonardo以降のATMega32U4を使っているArduinoはMPU内にUSB機能が内蔵されていて、その部分もプログラマブルなのでキーボードやマウスにしたりとかできる。

セットアップ


% git clone git@github.com:rkistner/arcore.git
% cd arcore/
% ./install.sh

~/Documents/Arduino/hardware/arcore にシンボリックリンクが貼られる。Arduino IDEを再起動するとターゲットボードが増えてるので選択する。



プログラムを書く


analogReadでセンサーを読んでMIDI channel1にコントロールメッセージを送る。analogReadは10bitだがMIDIデータは7bitなので下3bitを捨てる。
MIDIEventの0x0Bはコントロールメッセージという意味。0xB0は10110000で下4bitの1〜16でMIDIチャンネルを表すので論理和する。(0から始まるので、この場合チャンネル2になる)
3、4番目の引数は7bit(0~127)ならなんでもいい。
void setup() {
}

int an;

void loop() {
an = analogRead(0);
if(MIDIUSB.available()){
MIDIEvent e = {0x0B, 0xB0|1, 10, an>>3};
MIDIUSB.write(e);
}
}

ChromeのWeb MIDI APIがちょうどコントロールメッセージをonmessageイベントで受信できるので、ブラウザからMIDIデバイス化したArduinoのセンサーが読めるようになった。
http://shokai.github.io/WebMidiAPIStudy/dump/

関連:AndroidタブレットでWeb MIDI API


USBシリアル通信と併用もできる。ブラウザにMIDIデータが流れるし、同時にArduino等のシリアルコンソールを開くとそっちにも数値が流れてくる。
void setup() {
pinMode(13, true);
Serial.begin(9600);
}

int an;

void loop() {
an = analogRead(0);
if(MIDIUSB.available()){
MIDIEvent e = {0x0B, 0xB0|1, 10, an>>3};
MIDIUSB.write(e); // MIDI送信
}
Serial.println(an); // シリアル通信からもAD変換器の値を送ってみる

// 動作確認用にLEDを点滅させる
digitalWrite(13, true);
delay(100);
digitalWrite(13, false);
delay(100);
}

0

PlatformIOでArduino開発する

PlatformIOというArduino/mbed/MSP430などに対応したパッケージマネージャ兼ビルドツールをセットアップした。

PlatformIO


http://platformio.org
https://github.com/platformio/platformio

本体はPythonで書かれている。

たしか半年ほど前に気づいたんだけど、githubのArduino関係のリポジトリにlibrary.jsonというファイルを追加するプルリクが大量に送られていた。何だこりゃと思ったらplatformioの中の人が新しいパッケージマネージャ作ったから〜と送りまくっていた。library.jsonはNode.jsのpackage.jsonを参考にしているらしくてだいたい同じ仕様になっている。

地道な努力のおかげかすでに260個もライブラリが登録されている

そもそもArduinoにはパッケージマネージャなどという物は存在していなくてzipでダウンロードしてArduino.appの中に突っ込むという感じだった。ライブラリが簡単にインストールできるだけでもとてもありがたい。library.jsonには別ライブラリへの依存関係も書けるので、単一巨大でモノリシックではない小さなライブラリを作るのも楽になりそう。

ビルドツールとしても、inoと違ってArduino IDEを使わず、ビルド環境をプロジェクトルートのplatformio.iniに基いて自前でセットアップしてくれるので、GitHubにプルリクが来たらCIサービス上でビルドする、とかできるはず。便利そう。


インストール


参考:Installation — PlatformIO 2.2.0 documentation

環境はMac OSX Yosemiteで最初から入っているPython2.7.9を使っている。

% pip install platformio
% pip install --egg scons
これでplatformioコマンドが使えるようになった。
pipはPythonのパッケージマネージャでeasy_installの置き換えとして出来た物らしい。


プロジェクトを作る


その前にターゲットのマイコンボードを確認しておく。Arduino Microでやりたいので
% platformio boards | grep -i micro

たくさん出てきた。Blend Microもある。他にDigisparkやTIのMSP430等もあった。

micro atmega32u4 16Mhz 28Kb 2Kb Arduino Micro
168pa16m atmega168p 16Mhz 15Kb 1Kb Microduino Core (Atmega168PA@16M,5V)
168pa8m atmega168p 8Mhz 15Kb 1Kb Microduino Core (Atmega168PA@8M,3.3V)
328p16m atmega328p 16Mhz 31Kb 2Kb Microduino Core (Atmega328P@16M,5V)
328p8m atmega328p 8Mhz 31Kb 2Kb Microduino Core (Atmega328P@8M,3.3V)
32u416m atmega32u4 16Mhz 28Kb 2Kb Microduino Core USB (ATmega32U4@16M,5V)
1284p16m atmega1284p 16Mhz 127Kb 16Kb Microduino Core+ (ATmega1284P@16M,5V)
1284p8m atmega1284p 8Mhz 127Kb 16Kb Microduino Core+ (ATmega1284P@8M,3.3V)
644pa16m atmega644p 16Mhz 63Kb 4Kb Microduino Core+ (Atmega644PA@16M,5V)
644pa8m atmega644p 8Mhz 63Kb 4Kb Microduino Core+ (Atmega644PA@8M,3.3V)
blendmicro16 atmega32u4 16Mhz 28Kb 2Kb RedBearLab Blend Micro 3.3V/16MHz (overclock)
blendmicro8 atmega32u4 8Mhz 28Kb 2Kb RedBearLab Blend Micro 3.3V/8MHz
uview atmega328p 16Mhz 31Kb 2Kb SparkFun MicroView
sparkfun_promicro8 atmega32u4 8Mhz 28Kb 2Kb SparkFun Pro Micro 3.3V/8MHz
sparkfun_promicro16 atmega32u4 16Mhz 28Kb 2Kb SparkFun Pro Micro 5V/16MHz


ディレクトリを作ってinitする

% mkdir tmp
% cd tmp/
% platformio init --board micro
–boardオプションは複数指定できるらしい。
ビルド成功後に自動的にボードに書き込むか質問される。yesにしておいた。


コードを書く

src/にあればファイル名は何でもいいっぽい

src/main.ino
void setup(){
pinMode(13, true);
}

void loop(){
digitalWrite(13, true);
delay(500);
digitalWrite(13, false);
delay(500);
}


ビルド

% platformio run
最初にrunした時、Arduinoのビルド環境を自動でセットアップしはじめる。すぐ終わる。
~/.platformio/ に保存されていて、 .pioenvs/ にコピーされる。

ビルド成功すると自動的にArduino Microに書き込まれてプログラムが動き出す。この設定は platformio.ini に書かれている。

自動アップロードを無効にしている場合はtargetにupload指定でできる。
% platformio run --target upload

逆にアップロードしない場合は
% platformio run --target ./
もともと–targetはビルドするソースコードがあるディレクトリを指定するオプションみたいだけど、uploadが指定された時だけカレントディレクトリをビルドしてArduinoに書き込むらしい。あとclean指定で中間ファイル削除とか。なんか実装がやっつけっぽい?


ビルド環境


今使っているビルド環境の情報はplatformsコマンドで確認できる
% platformio platforms list
% platformio platforms show atmelavr


ライブラリのインストール


ArduinoをMIDIデバイス化してみたかったので、何か無いか探してみる
% platformio lib search midi
% platformio lib install 62
ライブラリは通し番号で管理されているらしい。名前が重複しても良いようにする為か?

これをインストールしてみた。
http://platformio.org/#!/lib/show/62/MIDI

いきなり src/main.ino 内で #include <MIDI.h> と書いて使えた。
でもこのライブラリはデジタルIOをMIDI化する物だったので、欲しかったのとちょっと違う。
まあとりあえずライブラリのインストールが一発でできて、すぐ使える事がわかった。


気になる事

ライブラリは ~/.platformio に保存されてグローバルに使われる。プロジェクト毎にどのライブラリのどのバージョンを使っているかを記録する仕組みが無いみたい。
プロジェクト毎に使用ライブラリのバージョンを固定して、別のマシンでも同じライブラリを一発でインストールできるようになってないと、あるプロジェクトでupdateをかけたら別のプロジェクトがビルドできなくなったりするので良くないと思う。
ライブラリ作者も、後方互換性が無いアップデートができないので実装速度が落ちる。

ライブラリを公開する時にメタデータを書くlibrary.jsonには別ライブラリをdependenciesプロパティで指定できるみたいなので、たぶんそのうちplatformio initで作ったプロジェクトにも依存解決機能が付くと思う。

まあ現状でもinoと同等の機能を持っていて、Arduino IDEに依存してない分だけinoより良さげ。

0

EdisonにArduinoをUSB接続する

EdisonのGPIOを使ってセンサーなどを接続するのもいいけど、USB接続でArduinoを追加するのもいいと思う。間に給電機能付きUSBハブを挟めば電気的に分離できるので難しい回路を作ってEdisonにいきなり接続してショートして全損という事態も避けられる。
もちろん超コンパクトに作るならEdisonのGPIOからI2Cとかで直接やった方がいい。


USBホスト

Edison Breakout Board KitのJ16 USBコネクタは、USBホストケーブルを接続してその先にUSBデバイスを接続できる。

Arduinoの他にもUSBハブ経由でkorgのUSB MIDIコントローラやMIDIキーボード、USBスピーカーも接続できた(lsusbにデバイス名は表示された)けど、alsaがデフォルトでは入っていないのでコントロールできなかった。

Edison+ArduinoMicro

J21から給電する

普通は給電用に使うJ16をUSBホストケーブル用に使うには、別の口から給電する必要がある。
J21に7〜15Vを入れればいい。J21の外側がGND、内側がVCCになっている。

Breakout Board Hardware Guideより

7〜15Vを用意するのが面倒くさいので、試しに5Vを入れてみたら問題なく動いた。
余っているUSBケーブルをむいて、赤白黒緑の4本の線を取り出すと赤が5V、黒が0Vになってるのでそれを使う。こういうケーブルを作っておくと持ち運びも便利だし、しょっちゅう役立つ。

念の為にテスターで調べるか、持っていなければいらないLEDに一瞬チョンとつけて光るか確かめた方がいい。

あと、裏面のJ22に面実装のDCジャックを追加して、ACアダプタから動かす事もできるらしい。


Arduino

手元にあったArduino Micro(Leonardoと同じATMega32U4内蔵のUSB機能を使用)とArduino UNO(FTDIのチップのUSB機能を使用)の両方とも、ドライバなしでEdisonの「/dev/ttyACM0」として認識された。


EdisonからArduinoを動かす

Arduinoにプログラム書いてEdisonと通信させるのは面倒なのでFirmataを使う。

去年作ったarduino-firmata npmとcoffeeで書く

ArduinoFirmata = require 'arduino-firmata'
arduino = new ArduinoFirmata().connect process.env.ARDUINO

arduino.on 'connect', ->
console.log "connect!"

led_stat = false
setInterval ->
arduino.digitalWrite 13, led_stat
led_stat = !led_stat
, 1000 # 1秒ごとに点滅

setInterval ->
console.log arduino.analogRead 0
, 500 # 0.5秒ごとにADC0読み取り

% ARDUINO=/dev/ttyACM0 coffee led_blink.coffee

0

ArduinoMicroからBlendMicroに乗り換える

Arduino側のプログラムは、同じATmega32u4を使っているのでSerial.writeをble_writeに書き換えるとか程度で済む。

パソコン側のプログラムは、blendmicro npmというserialport npmとほぼ同じインタフェースを持ったライブラリを使えばよい

firmataを使ってる場合は、ble-firmata npmを使えばこの程度の変更で済む


動作電圧が3.3Vになる