以前、「iPhoneからmbedをBluetooth LE (BTLE)で制御する」という記事を書いたのですが、今回はその続編です。前回は、RunningElectronicsさんのSBDBTで使われているファームウェア(btstack)をmbedに移植して、iPhoneから、mbedにつないだLEDをBLEで制御できるようにしました。mbedのGPIOへの出力はうまく行ったのですが、GPIOの読み取りをNotificationベースでリアルタイムに飛ばす処理はどうしても動かせませんでした。
最新ファームではNotificationも使えると教えていただき、この際なので、SBDBT本体を購入して試してみました。
出荷時ファームウェアの動作確認
出荷時はBluetooth SPPプロファイルで動くファームウェアが搭載されています。ですので、シリアルデータをBluetoothでPCなどに飛ばすことができます。試験では、RaspBerry Piのシリアル出力をMacに飛ばす実験を行いました。無線による遅延もなく、軽快にコンソール操作ができました。
SBBLEファームの使用
PICkitを使って、ファームをBLE用のSBBLEに書き換えます。版数は、”sbble_131224.hex”を使用しています。
この状態で、SBDBTにLEDとSWをつないで、Micono UtilitiesさんのiOSアプリを入れれば、LEDの制御・SWの読み取り(Notificationベース)が簡単にできてしまいます。ここまで環境が整備されていると、もう、自分でやることもないくらいです。
せっかく、iOS Developperの更新もしたことだし、気を取り直して、自作の簡単なiOSアプリを作ってみました。SBBLEはATT/GATTの割り当てがKonashiと同一にしてあるため、KonashiのSDKが使えます。CoreBluetoothのAPIをゴリゴリたたくより簡単で、Arduinoやmbedライクなスタイルでプログラミングが出来そうなので、Konashi SDKを使いました。iOSは7.1で、XCodeは5.1を使っています。作成したアプリのデモ画像を以下に示します。
ソースは以下の通りです。
// // ViewController.h // SBBLE // // Created by Todotani on 2014/03/25. // Copyright (c) 2014年 Todotani. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIButton *finedButton; @property (weak, nonatomic) IBOutlet UIButton *disconnectButton; @property (weak, nonatomic) IBOutlet UISwitch *ledSwitch; @property (weak, nonatomic) IBOutlet UILabel *switchLable; @end
// // ViewController.m// SBBLE // // Created by Todotani on 2014/03/25. // Copyright (c) 2014年 Todotani. All rights reserved. // #import "ViewController.h" #import "Konashi.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [Konashi initialize]; [Konashi addObserver:self selector:@selector(ready) name:KONASHI_EVENT_READY]; [Konashi addObserver:self selector:@selector(input) name:KONASHI_EVENT_UPDATE_PIO_INPUT]; self.finedButton.backgroundColor = [UIColor grayColor]; self.switchLable.backgroundColor = [UIColor grayColor]; } - (IBAction)find:(id)sender { [Konashi find]; } - (IBAction)disconnect:(id)sender { [Konashi disconnect]; self.finedButton.backgroundColor = [UIColor grayColor]; } - (IBAction)switchChanged:(id)sender { [self ledControl]; } - (void)ready { [Konashi pinMode:PIO1 mode:INPUT]; [Konashi pinMode:PIO2 mode:OUTPUT]; [Konashi pinPullup:PIO1 mode:PULLUP]; [self ledControl]; self.finedButton.backgroundColor = [UIColor greenColor]; } - (void)input { if ([Konashi digitalRead:PIO1] == LOW) { self.switchLable.backgroundColor = [UIColor redColor]; } else { self.switchLable.backgroundColor = [UIColor grayColor]; } } - (void)ledControl { if (self.ledSwitch.on == YES) { [Konashi digitalWrite:PIO2 value:HIGH]; } else { [Konashi digitalWrite:PIO2 value:LOW]; } } - (BOOL)shouldAutorotate { return NO; // YES:自動回転する NO:自動回転しない } @end
終わりに
Konashi SDKを使ったおかげで、非常に簡潔なプログラムとなりました。Konashiと比べてSBDBTは価格が安くできることはほぼ同じなので大変お得感があります。(PICkitが必要ですが、こちらは他の用途にも使いまわせますし・・)。最新ファームを使うことで、懸案だったNotification送信も簡単にできてしまい(というか、SBDBT/SBBLEのファームは何も触っていない)、非常に充実した環境だと思いました。