如题
我想用NRF24l01模块发送 MPU6050陀螺仪接收到的数据
ax, ay, az, gx, gy, gz;
看教程说只能以byte字节形式发送, 可是字节是无符号的
然后我将数据转成十六进制再发送, 还是不成功。
本人c语言比较菜, 如有菜鸟错误请原谅!!
程序是根据别人的程序改的, 备注部分没有改过来。
望有能人帮我解决解决~
下面是发送端代码 - /*
- nRF24L01 Arduino发送端
-
- 引脚接法:
- nRF24L01 Arduino UNO
- VCC <-> 3.3V
- GND <-> GND
- CE <-> D9
- CSN <-> D10
- MOSI<-> D11
- MISO<-> D12
- SCK <-> D13
- IRQ <-> 不接
- */
-
- #include "Wire.h"
- #include "I2Cdev.h"
- #include "MPU6050.h"
- MPU6050 accelgyro;
-
- int16_t ax, ay, az;
- int16_t gx, gy, gz;
- char adata[] = {0,0,0,0,0,0};
- #include <SPI.h>
- #include <Mirf.h>
- #include <nRF24L01.h>
- #include <MirfHardwareSpiDriver.h>
- void setup()
- {
- Wire.begin();
- Serial.begin(9600);
- accelgyro.initialize();
-
- Mirf.cePin = 9; //设置CE引脚为D9
- Mirf.csnPin = 10; //设置CE引脚为D10
- Mirf.spi = &MirfHardwareSpi;
- Mirf.init(); //初始化nRF24L01
-
- //设置接收标识符"Sen01"
- Mirf.setRADDR((byte *)"Sen01");
- //设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
- Mirf.payload = sizeof(char);
- //发送通道,可以填0~128,收发必须一致。
- Mirf.channel = 5;
- Mirf.config();
-
- //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
- //这里标识写入了Sender.ino
- Serial.println("I'm Sender...");
- }
- //int adata = 0;
- void loop()
- {
- //读取A0值到adata
- //adata = analogRead(A0);
- accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
- /*ax= ax/16384;
- ay= ay/16384;
- az= az/16384;
- gx= gx/131;
- gy= gy/131;
- gz= gz/131; */
- /*adata[0] = ax/16384;
- adata[1] = ay/16384;
- adata[2] = az/16384;
- adata[3] = gx/131;
- adata[4] = gy/131;
- adata[5] = gz/131; */
- adata[0] = (ax/16384,HEX);
- adata[1] = (ay/16384,HEX);
- adata[2] = (az/16384,HEX);
- adata[3] = (gx/131,HEX);
- adata[4] = (gy/131,HEX);
- adata[5] = (gz/131,HEX);
-
- //由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
- //所以必须将所有需要传输的数据拆成byte。
- //下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
- //实际下面等于byte data[2];
- byte data0[Mirf.payload];
- byte data1[Mirf.payload];
- byte data2[Mirf.payload];
- byte data3[Mirf.payload];
- byte data4[Mirf.payload];
- byte data5[Mirf.payload];
-
- //adata是unsigned int双字节数据,必须拆开。
- //将adata高低八位拆分:
- data0[0] = adata[0] & 0xFF; //低八位给data[0],
- data0[1] = adata[0] >> 8; //高八位给data[1]。
- data1[0] = adata[1] & 0xFF;
- data1[1] = adata[1] >> 8;
- data2[0] = adata[2] & 0xFF;
- data2[1] = adata[2] >> 8;
- data3[0] = adata[3] & 0xFF;
- data3[1] = adata[3] >> 8;
- data4[0] = adata[4] & 0xFF;
- data4[1] = adata[4] >> 8;
- data5[0] = adata[5] & 0xFF;
- data5[1] = adata[5] >> 8;
-
- //data
-
- //设置向"serv1"发送数据
- Mirf.setTADDR((byte *)"Rec01");
- Mirf.send(data0);
- Mirf.send(data1);
- Mirf.send(data2);
- Mirf.send(data3);
- Mirf.send(data4);
- Mirf.send(data5);
-
- /*Serial.print(adata[0]); Serial.print("\t");
- Serial.print(adata[1]); Serial.print("\t");
- Serial.print(adata[2]); Serial.print("\t");
- Serial.print(adata[3]); Serial.print("\t");
- Serial.print(adata[4]); Serial.print("\t");
- Serial.println(adata[5]); */
- //while死循环等待发送完毕,才能进行下一步操作。
- while(Mirf.isSending()) {}
- delay(20);
- }
复制代码
下面是接收端代码: - /*
- nRF24L01 Arduino Receiver接收端
- 引脚接法:
- nRF24L01 Arduino UNO
- VCC <-> 3.3V
- GND <-> GND
- CE <-> D9
- CSN <-> D10
- MOSI<-> D11
- MISO<-> D12
- SCK <-> D13
- IRQ <-> 不接
- */
-
- #include <SPI.h>
- #include <Mirf.h>
- #include <nRF24L01.h>
- #include <MirfHardwareSpiDriver.h>
-
- //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
- int adata[]= {0,0,0,0,0,0};
- int olddata[] = {0,0,0,0,0,0};
- int adata0 =0, adata1 = 0, adata2 =0, adata3 = 0, adata4= 0, adata5 =0;
-
- void setup()
- {
- Serial.begin(9600);
-
- //---------初始化部分,不可随时修改---------
- Mirf.cePin = 9; //设置CE引脚为D9
- Mirf.csnPin = 10; //设置CE引脚为D10
- Mirf.spi = &MirfHardwareSpi;
- Mirf.init(); //初始化nRF24L01
-
- //---------配置部分,可以随时修改---------
- //设置接收标识符"Rev01"
- Mirf.setRADDR((byte *)"Rec01");
- //设置一次收发的字节数,这里发一个整数,
- //写sizeof(unsigned int),实际等于2字节
- Mirf.payload = sizeof(char);
- //发送通道,可以填0~128,收发必须一致。
- Mirf.channel = 5;
- Mirf.config();
-
- //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
- //这里用来辨别写入了Receiver.ino程序
- Serial.println("I'm Receiver...");
- }
-
- void loop()
- {
- //定义一个暂存数组,大小为Mirf.payload。
- byte data0[Mirf.payload];
- byte data1[Mirf.payload];
- byte data2[Mirf.payload];
- byte data3[Mirf.payload];
- byte data4[Mirf.payload];
- byte data5[Mirf.payload];
- if(Mirf.dataReady()) //等待接收数据准备好
- {
- Mirf.getData(data0); //接收数据到data数组
- Mirf.getData(data1);
- Mirf.getData(data2);
- Mirf.getData(data3);
- Mirf.getData(data4);
- Mirf.getData(data5);
-
- //data[1]<左移8位与data[0]并,重组数据。
- // adata = (unsigned int)((data[1] << 8) | data[0]);
- //int("adata");
- adata0 = (unsigned int)((data0[1] << 8) | data0[0]);
- adata1 = (unsigned int)((data1[1] << 8) | data1[0]);
- adata2 = (unsigned int)((data2[1] << 8) | data2[0]);
- adata3 = (unsigned int)((data3[1] << 8) | data3[0]);
- adata4 = (unsigned int)((data4[1] << 8) | data4[0]);
- adata5 = (unsigned int)((data5[1] << 8) | data5[0]);
- /*adata[0] = adata0;
- adata[1] = adata1;
- adata[2] = adata2;
- adata[3] = adata3;
- adata[4] = adata4;
- adata[5] = adata5; */
- adata[0] = (adata0,DEC);
- adata[1] = (adata1,DEC);
- adata[2] = (adata2,DEC);
- adata[3] = (adata3,DEC);
- adata[4] = (adata4,DEC);
- adata[5] = (adata5,DEC);
-
-
-
- //与上一次结果比较,避免相同结果刷屏,降低串口流量
- if(adata != olddata)
- {
- olddata[0] = adata[0]; //本次结果作为历史结果。
- olddata[1] = adata[1];
- olddata[2] = adata[2];
- olddata[3] = adata[3];
- olddata[4] = adata[4];
- olddata[5] = adata[5];
-
- //Serial.print输出数据
- //Serial.print("A0=");
- //Serial.println(adata);
- //也可以输出双字节数据
- Serial.print(adata[0]); Serial.print("\t");
- Serial.print(adata[1]); Serial.print("\t");
- Serial.print(adata[2]); Serial.print("\t");
- Serial.print(adata[3]); Serial.print("\t");
- Serial.print(adata[4]); Serial.print("\t");
- Serial.println(adata[5]);
- //Serial.write(data[1]);
- //Serial.write(data[0]);
- }
-
- }
- }
复制代码 |