GPSから経度と緯度を取得したい、Arduinoの究極のGPSブレークアウトを試しています。それから私はこれらの2つの変数をRFで無線で送りたいです。下の画像のように:

以下のコードのように、Arduino 1から経度と緯度を送信し、Arduino 2で受信するためにpanstampという名前のRFモジュール用のライブラリを使用します。
送信中:
void send_data() {
CCPACKET data;
data.length=2;
float lon=26.533255;
float lat=27.533463;
data.data[0]=lon;
data.data[1]=lat;
if(cc1101.sendData(data)){
Serial.println(data.data[0]);
Serial.println(data.data[1]);
Serial.println(" sent ok ");
return true;
}else{
Serial.println("sent failed ");
return false;
}
}
受け取り:
void loop(){
float j = 0;
lon = packet.data[j];
Serial.print(lon);
Serial.print(" ");
float k = 1;
lat = packet.data[k];
Serial.print(lat);
Serial.println(".");
}
送受信時には完璧に動作します:)
問題は、 lon 26.00とlat 27.00 で、 lon 26.533255 lat 27.533463 期待通り。
私が想定しているデータ型にはいくつかのバグがあります。私はpanstampライブラリを調べて、タイプを変更するための何かを見つけましたが、成功しませんでした。
これがCCPACKETのヘッダファイルです。
#ifndef _CCPACKET_H
#define _CCPACKET_H
#include "Arduino.h"
/**
* Buffer and data lengths
*/
#define CC1101_BUFFER_LEN 64
#define CC1101_DATA_LEN CC1101_BUFFER_LEN - 3
/**
* Class: CCPACKET
*
* Description:
* CC1101 data packet class
*/
class CCPACKET
{
public:
/**
* Data length
*/
byte length;
/**
* Data buffer
*/
byte data[CC1101_DATA_LEN];
/**
* CRC OK flag
*/
boolean crc_ok;
/**
* Received Strength Signal Indication
*/
byte rssi;
/**
* Link Quality Index
*/
byte lqi;
};
#endif
送信データ/受信データのソースコード
boolean CC1101::sendData(CCPACKET packet)
{
byte marcState;
bool res = false;
//Declare to be in Tx state. This will avoid receiving packets whilst
//transmitting
rfState = RFSTATE_TX;
//Enter RX state
setRxState();
//Check that the RX state has been entered
while (((marcState = readStatusReg(CC1101_MARCSTATE)) & 0x1F) != 0x0D)
{
if (marcState == 0x11) //RX_OVERFLOW
flushRxFifo(); //flush receive queue
}
delayMicroseconds(500);
//Set data length at the first position of the TX FIFO
writeReg(CC1101_TXFIFO, packet.length);
//Write data into the TX FIFO
writeBurstReg(CC1101_TXFIFO, packet.data, packet.length);
//CCA enabled: will enter TX state only if the channel is clear
setTxState();
//Check that TX state is being entered (state = RXTX_SETTLING)
marcState = readStatusReg(CC1101_MARCSTATE) & 0x1F;
if((marcState != 0x13) && (marcState != 0x14) && (marcState != 0x15))
{
setIdleState(); //Enter IDLE state
flushTxFifo(); //Flush Tx FIFO
setRxState(); //Back to RX state
//Declare to be in Rx state
rfState = RFSTATE_RX;
return false;
}
//Wait for the sync word to be transmitted
wait_GDO0_high();
//Wait until the end of the packet transmission
wait_GDO0_low();
//Check that the TX FIFO is empty
if((readStatusReg(CC1101_TXBYTES) & 0x7F) == 0)
res = true;
setIdleState(); //Enter IDLE state
flushTxFifo(); //Flush Tx FIFO
//Enter back into RX state
setRxState();
//Declare to be in Rx state
rfState = RFSTATE_RX;
return res;
}
byte CC1101::receiveData(CCPACKET * packet)
{
byte val;
byte rxBytes = readStatusReg(CC1101_RXBYTES);
//Any byte waiting to be read and no overflow?
if (rxBytes & 0x7F && !(rxBytes & 0x80))
{
//Read data length
packet->length = readConfigReg(CC1101_RXFIFO);
//If packet is too long
if (packet->length > CC1101_DATA_LEN)
packet->length = 0; //Discard packet
else
{
//Read data packet
readBurstReg(packet->data, CC1101_RXFIFO, packet->length);
//Read RSSI
packet->rssi = readConfigReg(CC1101_RXFIFO);
//Read LQI and CRC_OK
val = readConfigReg(CC1101_RXFIFO);
packet->lqi = val & 0x7F;
packet->crc_ok = bitRead(val, 7);
}
}
else
packet->length = 0;
setIdleState(); //Enter IDLE state
flushRxFifo(); //Flush Rx FIFO
//cmdStrobe(CC1101_SCAL);
//Back to RX state
setRxState();
return packet->length;
}
誰かが私を助けてください:)
The link to the Panstamp library: PanStamp Library