SSブログ

Lazurite 920Jを立ち上げてみる 其の5 #LAZURITE920J #ラピスセミコンダクタ [Lazurite]

2016-10-27 11.23.34.jpg

どんくらい転送できるんだろう?

気になるのは「らずらいと姫」の解説ページに、送信時間は1時間当たり360秒(10%)に制限されるって書いてある点。
http://www.lapis-semi.com/lazurite-jp/lazurite/2473.html

そこで写真の様に2つのLazurite 920Jを並べています。ラベルを見て判るように、左が送信、右が受信ですね!
lazuriteImage_017.png lazuriteImage_018.png

ええっと、送信データサイズが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しか受けていない。
なんで???
lazuriteImage_016.png



※試験やり直し
無線モジュール同士の距離とか、アンテナの向きを調整して比較的安定している状態にして再度約1時間の転送レートを求めてみた。
lazuriteImage_019.png lazuriteImage_020.png

約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 );
  }
}


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。