Arduinoで送信した整数をiPhoneで読み込む
BLE shieldのble_writeは1バイトづつデータを送ることになる
送られたデータは1バイトであるchar型の配列となり、lengthで何個のデータが送られたかわかるようになっている。
文字であれば1バイト文字であればその値そのものが文字コードであるのでまったく問題ない。しかし数字であれば1バイトづつ分かれているので合体する必要がある。
以下のコードはサンプルであるSampleControlsからほぼ引用したものである。
for (int i = 0; i < length; i+=2)
{
UInt16 Value;
Value = data[i+1] | data[i] << 8;
NSString str = [NSString stringWithFormat:@“%d”, Value];
}
}
16ビットのint型を作りそこに上位4ビット、下位4ビットをor演算子で結合するだけの簡単なコードである。わざわざ記事にする必要があったのか。
for文でまわしているので複数の数字にも対応している。
また16ビットじゃあ何もできないじゃないかと思うかもしれないがarduinoで扱う数値はだいたい電圧であり、その電圧も0~1023で表現しているので全く問題ない、もし計算をしたいのであれば、iPhone側で計算した方が速いだろうし。
ble_writeとble_do_events
やっていて疑問に思ったのはble_write
このデータはどのようにして送っているのかメモ
ble_writeは送信すると、SDKのReadmeには書いてあったのだが
実際は送信せずに送信するバッファに溜め込んでいるようだ
確証はできないがソースコードをみる限り一つのble_writeには1バイトしか使えない模様(16ビットのunsigned intをわざわざ2回のble_writeを使っているところより)
そうしておいてble_do_eventsで一気に送信している。
iPhone側にはバッファにためられたデータを受信するのである程度の操作が必要である。
1文字のcharならNSStringの何らかのメソッドによりエンコードして代入するだけだが、int型なんかだと少々厄介そうだ。
BLE ShieldのサンプルコードChatでBLE ShieldからiPhoneへデータが送れない
BLE Shieldのサンプルコードをいろいろ試していた
SampleControlsは何の問題もなく動いた。
しかしChatのほうで一部動かないところがあった。
iPhoneからArduinoにBluetoothでデータを送り、さらにシリアル接続でPCに表示させることは成功した。
しかしArduinoからPC経由でBluetoothをiPhoneに送ることができない。
より具体的にいうと、デリゲートの一つである bleDidReceiveDataが呼び出されない。
・・・・
7/8 19:34
検証していると、while文の中のble_write関数が実行されていないようだ。
while中のble_availableがfalseになっているのだろうか
19:50
そもそもble_availableの中身がよくわかってなかったようだ
ble_availableはble側にデータが何バイト送られているか返す関数のようだ
今回は使わないので無視してble_writeを使うことにしよう
BLE Shield の関数群(iOS側)
公式のSDKに書かれている関数を日本語にしてみる(自分用)。
デリゲート(4つ)
1.フレームワークがBLEShieldの接続に成功したとき
-(void) bleDidConnect;
2.フレームワークからBLEShieldが外されたとき
-(void) bleDidDisconnect;
3.RSSIの値が変更されたとき
rssiを引数にいれてくれるので自由に使いましょう。
(RSSIとはReceived Signal Strength Indicator:受信信号強度)
-(void) bleDidUpdateRSSI:(NSNumber *)rssi;
4.BLEShieldからデータがiOSデバイス側に送られたとき
-(void) bleDidReceiveData ( unsigned char *) data length : (int) length;
その他よく使われる関数
BLEにデータを送信する(19 バイト/秒で送信される)。
-(void) write : (NSData *) d;
Arduino側のライブラリのバージョンを返す関数
-(UInt16) readLibVer;
フレームワークのバージョンを返す関数
-(UInt16) readFrameworkVersion;
Arduinoのベンダーの名前を返す関数
-(NSString *) readVendorName;
BLEShieldに接続されているか確認する関数(BOOL値で返される)
-(BOOL) isConnected;
BLEShieldを探す関数(引数にタイムアウトする時間をいれ、戻り値に検出した時間を返す。)
-(int) findBLEPeripherals : (int) timeout;
BLEShieldに接続する関数
-(void) connectPeripheral : (CBPeripheral *) peripheral;