【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
}