俺言語。

自分にしか理解できない言語で書かれた備忘録

【Arduino】【XBee】【I2C】ArduinoでXBeeAPIとI2Cを使ってデータを送信するプログラム

特にはまったところ。

①送信メソッドの引数につかうZBTxRequest
 この引数であるデータは2個以上ないと何故かエラーになる・・・。

②送信データの引数の型は"uint8_t"のみ。
 同じ意味のunsigned int ではダメだった。
 "const"をつけて宣言してもダメ。

③送信データは1バイトずつ(uint8_tしか受け付けないから当然だが)
  の配列。
  文字列を送りたい場合は {’t’,’e’,’s’,’t’}とすること。

以下プログラム本文(Arduino)
********************************************************************
//PostrigTool005


#include <XBee.h> ←ヘッダーのインクルード
#include <Wire.h>  ヘッダーのインクルード
//XBee用の定数定義

#define ADD_PCXBEE_HI  0x0013A200
#define ADD_PCXBEE_LOW  0x408B4410

//カラーセンサのレジスタアドレス
#define REG_CAP_RED       0x06
#define REG_CAP_GREEN     0x07
#define REG_CAP_BLUE      0x08
#define REG_CAP_CLEAR     0x09

#define REG_INT_RED_LO    0x0A
#define REG_INT_RED_HI    0x0B
#define REG_INT_GREEN_LO  0x0C
#define REG_INT_GREEN_HI  0x0D
#define REG_INT_BLUE_LO   0x0E
#define REG_INT_BLUE_HI   0x0F
#define REG_INT_CLEAR_LO  0x10
#define REG_INT_CLEAR_HI  0x11

#define REG_DATA_RED_LO   0x40
#define REG_DATA_RED_HI   0x41
#define REG_DATA_GREEN_LO 0x42
#define REG_DATA_GREEN_HI 0x43
#define REG_DATA_BLUE_LO  0x44
#define REG_DATA_BLUE_HI  0x45
#define REG_DATA_CLEAR_LO 0x46
#define REG_DATA_CLEAR_HI 0x47

//XBeeクラス
XBee xbee;
//XBeeアドレスクラス
XBeeAddress64 xbeeAd_PC;
//カラーセンサのI2Cアドレス(7bit)

int I2C_ADDRESS = 0x74; ←I2Cは相手に固有アドレスを持つものが多い。
                   Arduinoは7bitなので必要に応じてビットシフトする。

/************************************************************************/
/*setup(),mainloop
/************************************************************************/
void setup()
{
  delay(1000);
  /*Serial***********************/
  Serial.begin(9600);
  /*XBEE**********************/
  //xbeeインスタンス
 
xbee = XBee();
  //xbeeの通信速度を設定
 
xbee.begin(9600);
  //相手アドレスを指定
 
XBeeAddress64 xbeeAd_PC = XBeeAddress64(ADD_PCXBEE_HI,ADD_PCXBEE_LOW);
  /*I2C***********************/
 
Wire.begin();
  // sensor gain setting (Avago app note 5330)
  // CAPs are 4bit (higher value will result in lower output)
  //(0-15)
  set_register(REG_CAP_RED, 0x03);   //3
  set_register(REG_CAP_GREEN, 0x03); //3
  set_register(REG_CAP_BLUE, 0x03);  //3
  set_register(REG_CAP_CLEAR, 0x08); //8
  // INTs are 12bit (higher value will result in higher sensor value)
  //(0-4095)
  set_register(REG_INT_RED_LO, 0xC4);  //2500
  set_register(REG_INT_RED_HI, 0x09); 
  set_register(REG_INT_GREEN_LO, 0xC4);//2500
  set_register(REG_INT_GREEN_HI, 0x09);
  set_register(REG_INT_BLUE_LO, 0xC4); //2500
  set_register(REG_INT_BLUE_HI, 0x09);
  set_register(REG_INT_CLEAR_LO, 0xC4);//2500
  set_register(REG_INT_CLEAR_HI, 0x09);
 
}

void loop()
{
  //uint8_t r_Hi,r_Low, g_Hi, g_Low, b_Hi, b_Low, c_Hi, c_Low;
 
 
if(xbee.getResponse().isAvailable() == true){ 
   
ここにXBee経由でデータ受信したときの処理を書く
  }

  set_register(0x00,0x01); // start sensing

  while(read_register(0x00) != 0) {
    // waiting for a result
    Serial.println("waiting for a result");
  }
  // 10bit results
  /*
  c_Hi  = read_register(REG_DATA_CLEAR_HI);
  c_Low = read_register(REG_DATA_CLEAR_LO);
  */
 
uint8_t red=  {read_register(REG_DATA_RED_HI),read_register(REG_DATA_RED_LO)};
 
 ↑特にはまったところ。uint8_t型(0~255)しか受け付けず,
    更に2つ以上データが必要。


  //uint8_t r_Low = read_register(REG_DATA_RED_LO);
  /*
  g_Hi =  read_register(REG_DATA_GREEN_HI);
  g_Low = read_register(REG_DATA_GREEN_LO);
  b_Hi =  read_register(REG_DATA_BLUE_HI);
  b_Low = read_register(REG_DATA_BLUE_LO);
  */
 
  //データを送信
 
xbeeSend(xbeeAd_PC,red);
 
  delay(100);
 
}

/************************************************************************/
/*メソッド
/************************************************************************/
//カラーセンサのレジスタにセットするメソッド
void set_register(unsigned char r, unsigned char v)
{
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(r);
  Wire.write(v);
  Wire.endTransmission();
  Serial.println("set_register OK!");
}

//カラーセンサのレジスタを読み取るメソッド
uint8_t read_register(unsigned char r)
{
  uint8_t v;
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(r);  // register to read
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
  while(!Wire.available()) {
    // waiting
    Serial.println("read register waiting");
  }
  v = Wire.read();
  return v;
}

//XBeeにデータ送信
void xbeeSend(XBeeAddress64 address, uint8_t data[])
{
   
ZBTxRequest zbTx = ZBTxRequest(address,data,sizeof(data)); 
  ↑sendの引数のZBTxRequest,その引数はアドレス,送信データ,チェックサム
   送信データは2つ以上必要っぽい。
   

   ZBTxRequest (XBeeAddress64 &addr64, uint8_t *payload, uint8_t payloadLength)
                                                           ↑複数個という意味だと解釈。

  xbee.send(zbTx); ←sendの引数はZBTxRequest
}