NRF24L01 2.4G摇控收发纯数字2通道PWM(可以转为4,8...N个双向通道)
之前发的24L01 控制LED灯明暗,弄好了可以增加用 map 更改数字范围实现更多通道
在arduino1.01 编译通过,10米内没压力,(注:通道多了,会有延时)
-------------------------发送端--------------------------------//MISO -> D12
// * MOSI ->D11
// * SCK ->D13
//* CE ->D8
//* CSN ->D7
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
int aaa;
int aaaa;
int bbb;
int bbbb;
void setup(){
Mirf.spi = &MirfHardwareSpi;//加载24L01SPI
Mirf.init(); //开始
Mirf.setTADDR((byte *)"serv1");//发送到"接收地址"
Mirf.payload = sizeof(int); //数据类型(整数)
Mirf.config();//发送通道??
}
void loop(){
aaa=analogRead(A4)+1; //读取 X 向电平PWM(1至1024)
bbb= -analogRead(A5)-1; //读取 Y向电平PWM(-1至-1024)
if (aaa !=aaaa) //如果 X 向电平与之前电平不一样则执行
{
Mirf.send((byte *)&aaa); //发送X向电平
aaaa=aaa; //保存X 向当前电平
while(Mirf.isSending()){ //等待或继续发送??
}
}
if (bbb !=bbbb) //如果 Y 向电平与之前电平不一样则执行
{
Mirf.send((byte *)&bbb);//发送Y向电平
bbbb=bbb; //保存Y 向当前电平
while(Mirf.isSending()){ //等待或继续发送?
}
}
delay(10); // 等待0.01秒
}
---------------------接收端--------------------------------
//MISO -> D12
// * MOSI ->D11
// * SCK ->D13
//* CE ->D8
//* CSN ->D7
//LCD 1602 IIC SDA---A4328
//LCD 1602 IIC SCL---A5 328
#include "Wire.h" //LCD1602 IIC 库文件
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27,16,2);
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
int data;
int aaa;
int bbb;
void setup(){
lcd.init(); //加载LCD1602 IIC
lcd.backlight();
//lcd.setBacklight(120); //设置LCD背光亮度,好象没作用
delay(20);
Mirf.spi = &MirfHardwareSpi; //加载24L01SPI
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); //接收地址" "
Mirf.payload = sizeof(int); //数据类型(整数)
Mirf.config();
}
void loop(){
if(Mirf.dataReady()){ //如果接收到数据则执行
Mirf.getData((byte *)&data); //接收数据
if (data>=1) //如果大于或等于1为X向 (如果设为 >=0就会 X,Y通道冲突,所以设为1开始)
{
aaa=data-1;
}
if (data<=-1) //如果小于或等于-1为Y向(............)
{
bbb=data+1;
}
Mirf.rxFifoEmpty(); //清理24L01援存??
}
lcd.clear(); //清屏
lcd.setCursor(0, 0);
lcd.print(aaa); //显示X向 1至1024
lcd.setCursor(6, 0);
lcd.print(0-bbb); //显示Y向,并将负数变为正数 1至1024
delay(10);
} ................................... 有一点不明: if(Mirf.dataReady()){//如果接收到数据则执行 这一句
是一接受到数据(不管多少个数据)就置位还是说达到了payload数量后才置位的? 本帖最后由 pww999 于 2012-6-22 14:21 编辑
Mirf.payload = sizeof(int); //数据类型(整数)
if(Mirf.dataReady()){
应该指的是从机接收到 主机发来的任何信号 就开始执行下面语句吧
之前定义类型为整数,所以每收到一条整数就开始.因为要快速响应~
有了库文件,程序也简单了 本帖最后由 Loney佬 于 2012-7-26 23:55 编辑
我按你的接,显示有较小的滞后, 怎样接为双向通道? 顶个
搞估了几天,可以双向通信了
这个不是占用串口了。。。。那串口就不能用了吧 可以用蓝牙,TX,RX, 额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?:Q {:soso__5663373028670280397_3:} 收到,经修改测试成功,不过找了半天不知道如何设置发射功率,速率。
另外,我使用一个带天线的距离1000m的24l01和一个pcb天线传输距离50米的24l01,可以连接吗,我想得到更远的控制距离。 zhangdeyue1 发表于 2012-10-16 15:02 static/image/common/back.gif
额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?
spi通讯可以接多个器件,有3个口是共用的即mosi miso sck,cs每个器件不同,不同就可以了,mcu是通过拉低(?高,记不清了)某个器件对应的cs口与该器件通讯。 nengcai0313 发表于 2012-8-26 21:20 static/image/common/back.gif
这个不是占用串口了。。。。那串口就不能用了吧
这个是spi接口通讯,不占用串口的 不用接电源和地?