IM920cを使った920MHz通信の実験2(受信装置側に表示機を付けてみた)


JUGEMテーマ:電子工作
 


前の記事で

次は電波の飛びを測定します。と書いたんですが、
パソコンとシリアル接続してモニターしながら家の周りをうろうろするのも結構厳しいなーと言う訳で、
受信機側に表示機を付けて送信機の位置を固定して受信機だけを持ってうろうろする作戦にしてみました。
それで部品箱に余っていたACM1602NI-FLW-FBW-M01

http://akizukidenshi.com/catalog/g/gP-05693/
を接続して受信データを表示してみました。
 
■回路図
 

 
■完成図
 

左が送信機。右が受信機
 
■受信機をZiplockに投入
 

表示機が光っているので透けて見える
 
■結果
 
□直線道路でのテスト。
 

間に電柱などの障害物はあるが 

ゴール地点まで平坦で見通せていた

実用的な通信が可能な距離は511m。

 

そこから先に行くと地面が下がっており、

そのせいで見通せなくなってしまった可能性があるが、その場合の限界到達点は782m。

 

□建物が障害物になるケース

 

他の実験としては我が家はマンションの5階なんですが、

自宅マンションのベランダに送信機を置いてテストを行った。

その場合、ベランダの反対側の1階でも安定して通信が可能でした。

 

□建物を突き抜けて通信できるか?

 

自宅マンションは電波が通過したようなんで、

周辺のマンションを障害物に見立ててテストした。

障害物の量にもよるが

わりと障害物が有る方角で100m程度は通信可能。

 

□田舎の山の上に送信機を付けた場合に

 

結構遠くまで電波が飛びそうですが

どうなんでしょうねー。

 

■プログラム

 

□送信側
IM920_Sender.ino

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  Serial.begin(9600); 
  Serial.println("setup soft serial send count version0.01");
  mySerial.begin(19200); 
}

 

int nCount = 0;
void loop() {
    char szBuf[256];
    sprintf(szBuf, "TXDA %014d", nCount);
    mySerial.println(szBuf);
    Serial.println(szBuf);
    nCount++;
    delay(1000);
}

 

□受信側

 

IM920_Receiver.ino

#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  Serial.begin(9600); // ハードウェアシリアルを準備
  Serial.println("Ready version0.01");
  mySerial.begin(19200); // ソフトウェアシリアルの初期化

  Wire.begin();       // I2C初期化
  LCD_begin();
}

char nCount = 0;
char szBuf[256];

void loop() {
  
  if (mySerial.available()){
      char c = mySerial.read();
      Serial.write(c);
      if(c==0x0d){
        strcat(szBuf, "                                ");
        LCD_disp(szBuf);
        memset(szBuf, 0, sizeof(szBuf));
        nCount = 0;
      }
      else{
        if(c!=0x0a){
          szBuf[nCount] = c;
          nCount++;
          if(nCount>=255){
            nCount=0;
          }
        }
      }
      delay(1);
  }
  if (Serial.available()){
    char c = Serial.read();
    mySerial.write(c);
    delay(1);
  }
}

void LCD_disp(char *str)
{
  byte i;

  writeCmd(0x80);//1行目
  delay(5);
  for(i=0;i<16;i++)
  {
    writeData(str[i]);
    delay(1);
  }
  writeCmd(0xC0);//2行目
  delay(1);
  for(i=16;i<32;i++)
  {
    writeData(str[i]);
    delay(1);
  }
}

void LCD_begin(void)
{
  // LCD初期化
  delay(15);
  writeCmd(0x01);//クリア ディスプレイ
  delay(5);
  writeCmd(0x38);//8ビットモード、2ライン、5x8ドット
  delay(5);
  writeCmd(0x0f);//ディスプレイON、CURSOR-ON、blinking-ON
  delay(5);
  writeCmd(0x06);//CURSOR移動、スクロールOFF
  delay(5);
  writeCmd(0x80);//ディスプレイON、CURSOR-OFF、blinking-OFF
}

void writeCmd(uint8_t cmd) 
{
  uint8_t rs_flg;
  Wire.beginTransmission(0x50);
  rs_flg = 0x00;
  Wire.write(rs_flg);
  Wire.write(cmd);
  Wire.endTransmission();
}

void writeData(uint8_t dat) 
{
  Wire.beginTransmission(0x50);
  Wire.write(0x80);
  Wire.write(dat);
  Wire.endTransmission();
}