blog.kur.jp

バイオリンと山、自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

RN4020をArduinoで使う

とあるプロジェクトでBluetooth Low Energyを使う事になり、そのプロトタイピングというか特性を把握する事を兼ねて諸々触ってみたのでメモ。

国内で流通している(つまり技適の問題がクリアされている)BLEモジュールはいくつかあるのだけれど秋月電子等で入手容易なもののひとつがmicrochip社製のRN4020を実装した物である。

akizukidenshi.com

他の候補だとNordic SemiconductorのRF51822などに代表されるnRF5Xシリーズもあるが、とりあえず今回はRN4020を使ってみることに。

RN4020はシリアル通信で各種コマンド(セットアップや、データの送信など)を実行できるし、RN4020 Arduinoで検索すると、やってみたブログが多く出てくるので、それらを参考にすれば良いだろうと思っていたのだけれど、何故かうまくいかない。

とりあえず、Mac -> Arduino -> RN4020と接続して、Arduinoからシリアルコマンドを自動的に発行させてRN4020を制御するのは一旦諦めて、Macから直接シリアルで RN4020を制御する事にする。

シリアル接続で直接制御する

とは言え、手元にUSBシリアル変換器のような便利なものは無いので、Arduinoに空のスケッチ(つまりsetupとloopのみ)を書き込み、0ピンと1ピンをRN4020に接続する。とりあえずはMacでターミナルを立ち上げて下記コマンドでRN4020に接続。

sudo cu -l /dev/tty.usbmodem1451 -s 115200

このまま接続しても良いのだけれどEchoがあったほうがわかりやすいので、+を入力してエンターすることでEchoを有効にできる。

+

その後、とりあえず工場出荷時の状態にリセットをかけておく。SF,1を送信するとAOKが返ってくる。

SF,1 // 初期化

これで準備がOK。BLEは仕様として、バッテリ情報や心拍数、体温計、サイクリングケイデンス等、いくつかの典型的なサービスが定義されているのだけれど今回は独自サービスを定義したいので、下記のようなコマンドで独自サービスかつ子機(ペリフェラル)として動作するように設定する。

SS,00000001       // 独自サービスを選択
SR,36000000 // 再起動、起動時、切断時に自動的にアドバイス実施
// かつNo Direct Advertisement
PZ // 独自サービスに紐づく独自キャラクタリスティックの初期化
PS,<UUID 1> // 独自サービスのUUIDを設定する
PC,<UUID 2>,1A,0A // 読み書き可能な10 byteのキャラクタリスティックを定義
R,1 // 再起動

なお、上記で設定した内容は下記コマンドで確認出来る。

LS

ここで設定した内容通りに設定が出来ているかはスマホやPCからBLEで接続してみるのが早い。私はとりあえずAndroidのB-BLEを使用したが、iPhone用でもAndroidでもアプリストアを見るといくつかの種類のアプリがあるので適当なものを使用すると良いと思う。

ちなみに上記設定したキャラクタリスティックに値を書き込むには下記のようにしてやる。

SHW,<書込み対象のハンドル>,<任意のデータ>

書込み対象のハンドルはLSで取得出来る。非常に簡単である。ここまで確認出来たのでArduinoから同様にRN4020でコマンドを発行してやれば良い。

とここまで書いて気がついたのだけれど、多くのネット上のサンプルではArduinoでSoftware Serialを使用しているのだけれど、このボーレートが高すぎたのがうまくいかない原因では?ということ。ArduinoにはUno以外にも多くの種類があり、そもそもハードウェアシリアルが複数ついているボードもあるし、ソフトウェアシリアルでも115200bpsが余裕で出る機種もあるのだろうけれど、少なくとも私の経験上Arduino Unoは9600bpsぐらいが無難です。

と言うことで、RN4020を初期化及びボーレートを9600bpsに落とす部分などは上記のように直接シリアル接続で行い、その後、ArduinoのSoftwareSerialで制御する事にした。

そうすると、Arduino側のコードは大変シンプルになる。参考までに極限までシンプルにしたサンプルコードはこんな感じ。通信自体はこれで出来るので、エラー処理をどうするかとか、そもそもアプリケーション的なコードは追加しなければならないのだけれど。 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);

void setup() {
  mySerial.begin(9600);
}

void loop() {
  mySerial.println("SHW,000B,ABCD");
  delay(1000);
}

参考にさせて頂いたページ

RN4020 Bluetooth® Low Energy モジュール ユーザガイド

http://akizukidenshi.com/download/ds/microchip/70005191A_JP.pdf

RN-4020搭載mikroBUS Clickボード

http://www.microtechnica.tv/support/manual/clickble_man.pdf