プロメモグラム

誰が見てもわかるような文章を目指す

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のほうで一部動かないところがあった。

ArduinoiPhoneでコネクションは確立できる。

iPhoneからArduinoBluetoothでデータを送り、さらにシリアル接続でPCに表示させることは成功した。

しかしArduinoからPC経由でBluetoothiPhoneに送ることができない。

より具体的にいうと、デリゲートの一つである 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;