0

blendmicro用 BLE terminal作った

今周囲にどんなBLEデバイスがあるか確認したり、ちょっと通信したりするのにシリアル通信みたいに使えるターミナルがあったら便利なので作った
BlendMicro/Arduino BLE Shield用なので他のデバイスでは使えない。汎用的にできる方法があったら教えて欲しい。


インストール

blendmicro npmに付いている

% npm install blendmicro -g

グローバルにインストールするとblendmicroというコマンドにパスが通る


使う


-listでデバイスリストを表示、-terminalで接続
% blendmicro --help
% blendmicro --list
% blendmicro --term [DEVICE_NAME]

echo.inoを書き込んだBlendMicroと喋っているところ

なお0x4c 0x00 0x02 0x15で始まるデバイスはiBeaconである

0

ble-firmata npmにBLEの自動再接続機能を付けた

node.jsからBluetooth Low EnergyでArduinoをリモートコントロールできるble-firmata npmに、v0.1.1から自動再接続機能がついた。

BLEは有線のシリアル通信よりも接続切断は頻繁におこる。
見通し20メートルぐらいまで問題なく通信できるけど、家のドアなど金属製の遮蔽物があると切断される。そういう場合でも自動再接続されて、回線を意識せずロジックのプログラミングに集中できるようにした。


https://www.npmjs.org/package/ble-firmata

インストール

% npm install ble-firmata


注意


on ‘connect’イベントはデバイスが再接続される毎に呼ばれるので、その中でsetIntervalとかすると良くない。

once ‘connect’を使うとかすると良い。


BLEの切断


切断を検知するとarduino.on ‘disconnect’をemitするようにしておいた。

切断は色々な要因で起こる。

  • BlendMicroの電源が落ちる
  • BlendMicroが遠く離れて、電波が届かなくなる
  • BlendMicro側からnRF8001を切断する
  • node側でarduino.close()する
  • Macのbluetoothメニューで、[デバイス名]→[接続解除]を選択する
  • Macのbluetoothメニューで、bluetoothを「切」にする

いずれの場合も自動再接続が働く。


自動再接続を無効にする


reconnect = falseすれば自動再接続しない。一瞬接続して、切断して、しばらくしたらまた接続するような用途の場合は無効にすればいい。

arduino = new BLEFirmata().connect()
arduino.reconnect = false

0

BlendMicro pin assign

基板の裏見ないとどれが何ピンかわからないのでピン配置表作った

0

ble-firmata npm作った

前:blendmicro npm 作った


作った

https://github.com/shokai/node-ble-firmata
https://www.npmjs.org/package/ble-firmata

node.jsからBLE上のfirmataプロトコルでarduinoを操作できるのを作った。
firmataはarduino側にあらかじめファームウェアを書き込んでおいて、PCからリモコンするというもの。プログラムがPC側だけで完結するのでシンプルになって良い。

既存のfirmata(Arduino IDEのスケッチ例に入ってるやつ)はシリアル通信だけど、BLEが使えるBlendMicroというArduinoMicro派生ボードと通信できるようになった。

あと試してないけど、同じRedBearLabが出してるBLE Shieldとも通信できると思う。

スクリプト言語でハードウェアやるのは、最近はnodeが一番色々と揃ってたり、やってる人が多かったりする感じある。


BlendMicro


インストール


node側
% npm install ble-firmata

arduino側
sketch exampleに入っているBLEFirmataSketchは動かないので、 firmwareディレクトリの下に置いておいたファームウェアを書き込む必要がある。

詳しくはInstallの項目を読むといいと思う。

一応プルリクだしておいたので、そのうち取り込まれるかもしれない。


使う


こんな感じで接続して使う。
digitalRead、servoWriteやanalogWrite、sysexもある。
BLEFirmata = require 'ble-firmata'

arduino = new BLEFirmata().connect()

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

digitalWrite 13, true
console.log analogRead 0


複数使う

arduinoに書き込むファームウェアの上の方に
#define BLE_NAME "BlendMicro"
というのがあって、これが名前になっている。最大10文字まで。

new BLEFirmata().connect(“shokai1”) みたいな感じで、指定したBlendMicroに接続できる。
デフォルト値は”BlendMicro”。

Macbook Airで試したところ、1つのnodeプロセス内で2つのBlendMicroに接続はできた。しかし2つnodeプロセスを立ててそれぞれでBLEを使おうとすると、BLEのラッパーがエラーだして落ちた。どうやらMacの中にハードウェア的に1つしかBluetoothモジュールが無いのが、複数プロセスで共有できないらしい。


socket.ioと一緒に使う

他にもサンプルにはsocket.ioでブラウザからarduino(サーバーとはBLEでつながっている)を操作できるのも入っているので、サンプル見るとだいたいわかると思う。

0

blendmicro npm 作った

前:Bluetoothが載ってるArduino派生ボード「BlendMicro」とNode.jsでBLEした


Bluetooth Low Energyが載ったArduinoMicroであるBlendMicroと、Node.jsで通信するためのライブラリを作った。
serialport npmと似たAPIで使えるようにしたので、けっこうわかりやすいと思う。

https://www.npmjs.org/package/blendmicro
https://github.com/shokai/blendmicro-node

動かん、意味不明、等の苦情要望はgithubかtwitterにお願いします。



ADCに接続した照度センサをBLEで読むのも簡単にできる



インストール


% npm install blendmicro


使う


基本的にREADMEやサンプルに書いたけど軽く紹介すると

arduino側で名前を宣言して、ble_begin()する。
#include <SPI.h>
#include <boards.h>
#include <RBL_nRF8001.h>

void setup(){
ble_set_name("BlendMicro"); // デバイスの名前を宣言、最大10文字
ble_begin();
}

node側から名前でデバイス探して接続できる。
var BlendMicro = require('blendmicro');
var bm = new BlendMicro("BlendMicro"); // 名前で接続

接続したら”open”イベントが発火するので、その後で”data”イベントで読んだり
bm.on('open', function(){
console.log("open!!");

bm.on("data", function(data){ // Bufferが返ってくる
console.log(data.toString());
});
});

文字列やBufferを書き込んだりできる
bm.write("hello");
bm.write( new Buffer([1,2,3]) );


このへんはserialport npmとほぼ同じだと思う。
bm.closeで閉じれる。
デバイス側から閉じられたらbm.on(“close”, callback)が発火する。