Lazurite 920Jを立ち上げてみる 其の5 #LAZURITE920J #ラピスセミコンダクタ [Lazurite]
どんくらい転送できるんだろう?
気になるのは「らずらいと姫」の解説ページに、送信時間は1時間当たり360秒(10%)に制限されるって書いてある点。
http://www.lapis-semi.com/lazurite-jp/lazurite/2473.html
そこで写真の様に2つのLazurite 920Jを並べています。ラベルを見て判るように、左が送信、右が受信ですね!
ええっと、送信データサイズが839543byte、送信時間合計が1452933ms、1048回エラー、送信数40279回。
受信データ数が8586536byte、受信数40124回。
あ、合わない、、、
1回のペイロードサイズが214byte、ヘッダーの11byteを考慮すると839543byteの全体サイズは882697byte。
ビットに直して1秒辺りのレートに換算すると、約4860bps。
無線の設定では100kbpsなので10%にも達していない結果。
※流れる時はやけに流れる(50kbpsとか60kbps)、流れない時はまったく流れない!ムラっけのある通信。
※あれぇ?これ、アンテナの向きとか距離(近過ぎる)とか影響されている感じがする。マルチパスとかも!
SubGHz.sendのマニュアルを読む限り、
http://www.lapis-semi.com/lazurite-jp/contents/reference/subghz_send.html
標準で250-11=239byteがデータのペイロードサイズに思えるが、実際にそのサイズを送信すると受信側は214byteしか受けていない。
なんで???
※試験やり直し
無線モジュール同士の距離とか、アンテナの向きを調整して比較的安定している状態にして再度約1時間の転送レートを求めてみた。
約50kbps以上は出ている計算になった。じゃあ「らずらいと姫」のあの解説は一体なんだったんだろう?
送信のデータ数と受信のデータ数とかカウントが一致しないのは、もう無線だからとしか言いようがないなぁ。
なので、過信せずに自分で上位プロトコルを実装した方がいいでしょう。少なくともシーケンス番号のチェックは必要に思える。
送信側プログラム
#define SUBGHZ_CH 36 #define SUBGHZ_PANID 0xABCD #define CLIENT_ID 0x405D #define SERVER_ID 0x406A #define BLUE_LED 26 #define TEST_PERIOD (60UL * 60UL * 1000UL) //#define TEST_PERIOD (10UL * 60UL * 1000UL) uint8_t tx_data[ 200 ]; unsigned long totalTime = 0; unsigned long startTime = 0; unsigned long totalBytes = 0; unsigned long totalCount = 0; unsigned long totalError = 0; void setup(void) { int i; SUBGHZ_MSG msg; Serial.begin(115200); msg = SubGHz.init(); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1) {} } msg = SubGHz.begin( SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW ); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1) {} } msg = SubGHz.rxEnable(NULL); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1){ } } //dummy data for( i = 0; i < sizeof(tx_data); i++ ) { tx_data[ i ] = (uint8_t)i; } Serial.println("transmit rate test SEME!"); delay( 10000UL ); startTime = millis(); pinMode( BLUE_LED, OUTPUT ); digitalWrite( BLUE_LED, HIGH ); } void loop(void) { unsigned long baseTim,diffTime; SUBGHZ_MSG msg; if( (millis() - startTime) >= TEST_PERIOD ) { Serial.print( "transmit end:" ); Serial.print_long( totalBytes, DEC ); Serial.print( "bytes / " ); Serial.print_long( totalTime / 1000UL, DEC ); Serial.print( "ms " ); Serial.print_long( totalError, DEC ); Serial.print( "errors / " ); Serial.print_long( totalCount, DEC ); Serial.println( "counts" ); while( 1 ) {} } //transmit message digitalWrite( BLUE_LED, LOW ); baseTim = micros(); msg = SubGHz.send( SUBGHZ_PANID, SERVER_ID, tx_data, sizeof(tx_data), NULL ); // send data diffTime = micros() - baseTim; digitalWrite( BLUE_LED, HIGH ); if( msg == SUBGHZ_OK ) { totalTime += diffTime; totalBytes += sizeof(tx_data); } else { totalError++; SubGHz.msgOut(msg); } totalCount++; }
受信側プログラム
#define SUBGHZ_CH 36 #define SUBGHZ_PANID 0xABCD #define CLIENT_ID 0x405D #define SERVER_ID 0x406A #define BLUE_LED 26 uint8_t rx_data[ 512 ]; uint32_t last_recv_time = 0; unsigned long startTime = 0; unsigned long totalCount = 0; SUBGHZ_STATUS rx; void setup(void) { SUBGHZ_MSG msg; Serial.begin(115200); msg = SubGHz.init(); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1) {} } msg = SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1) {} } msg = SubGHz.rxEnable(NULL); if(msg != SUBGHZ_OK) { SubGHz.msgOut(msg); while(1){ } } pinMode(BLUE_LED,OUTPUT); digitalWrite(BLUE_LED,HIGH); Serial.println("transmit rate test UKE!"); } void loop(void) { static unsigned long tolatLength = 0; short rx_len; rx_len = SubGHz.readData(rx_data,sizeof(rx_data)); if( rx_len > 0 ) { totalCount++; digitalWrite( BLUE_LED, LOW ); tolatLength += rx_len - 9; Serial.print( "recieve size:" ); Serial.print_long( tolatLength, DEC ); Serial.print( " count:" ); Serial.println_long( totalCount, DEC ); digitalWrite( BLUE_LED, HIGH ); } }
2016-10-26 18:31
nice!(0)
コメント(0)
トラックバック(0)
コメント 0