sea side she side

写真と山、資格が好きなアラフォーエンジニアのブログ

XBee同士の通信(UART)と温度センサ

      2019/01/14

前回はXBeeを使ってArduino - PC間でLチカをやってみました。今回はArduino - Arduino間でのデータのやりとりを試してみます。

XBeeにはATとAPI(Application Programming Interface)の2種類の動作方法があり、通信やコントロールの仕方が違います。

ATモードは透過モードともよばれ、UARTに流したデータがそのまま無線送信されます。またXBeeに対してATコマンドによる操作が可能です。

APIモードはAPIフレームというフォーマットで通信を行います。

まずは愚直にシリアルの置き換えとしてATモードで動かします。

イメージはこんな感じ。

温度センサーLM61CIZを接続したArduino(Client)からXBeeを使ってもう一方のArduino(Host)へデータを送信します。

Arduino(Host)で受け取ったデータを表示させたかったのですが、オンボードのシリアルはXBeeに奪われているため何かしら別の手段を用意しなければなりません。

普通に考えればLCDだと思うのですが今回はAE-UM232Rを接続してPCにシリアル出力するというちょっと力業?で対応します。

回路図描こうと思ったのですがシールドスタックってとても描きにくいですね…。

まずはセンサーを接続したClient側から。センサー部分については前回百葉箱で使ったところから引っ張ってきました。

/*
  Client
*/

/*----------------------------------------------
 * クラス: TemperatureSensor
 * 概  要: 温度計測
 * ---------------------------------------------*/
class TemperatureSensor {
public:
  TemperatureSensor();
  float Get();
  void CulculateValue(unsigned int);
 private:
   volatile float value_;
 };
  
TemperatureSensor::TemperatureSensor() {
  value_ = 0;
 }
 
float TemperatureSensor::Get(void) {
  return value_;
 }
 
void TemperatureSensor::CulculateValue(unsigned int p) {
  value_ = 0;
  for (unsigned int i = 0; i < 10; ++i) {
    value_ += analogRead(p);
  }
  
  value_ /= 10;
  value_ = map(value_, 0, 1023, 0, 5000);
  value_ = fmap(value_, 300.0, 1600.0, -30.0, 100.0);
}

float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

/*----------------------------------------------
 initialize
 ----------------------------------------------*/
TemperatureSensor LM61CIZ;

void setup(){
  Serial.begin(9600);
}

void loop(){
  LM61CIZ.CulculateValue(0);
  Serial.println(LM61CIZ.Get());
  delay(1000);
}

ホスト側も設定します。通常のSerialはXBeeに使っているためそのままでは出力ができません。SoftwareSerialを使います。

/*
  Host
*/

#include <SoftwareSerial.h>
SoftwareSerial um232r(4,3);

void setup(){
  Serial.begin(9600);
  um232r.begin(9600);
}

void loop(){
  char str[20];
  
  recvStr(str);
  float aa = atof(str);
  um232r.println(aa);
}

void recvStr(char *buf) {
  int i = 0;
  char c;
  while(1) {
    if(Serial.available()){
      c = Serial.read();
      buf[i] = c;
      if(c == '\n') break;
      i++;
    }
  }
}

これで準備は整いました。

スケッチを各Arduinoへアップロードし、SERIAL SELECTスイッチをMICROへ変更します。そしてPCでTeraTerm等シリアル通信が使えるソフトを起動し、AE-UM232Rのポートを指定します。そうするとClientからXBee経由でHostに到達した温度情報がAE-UM232R経由で表示されるはずです。

たったこれだけのことですができると嬉しい物ですね。

<<参考>>
・blog

 - Make , , , ,