pww999 发表于 2012-6-20 21:03:24

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);
}

pww999 发表于 2012-6-22 00:55:24

...................................

飞翔的红猪 发表于 2012-6-22 13:22:40

有一点不明: if(Mirf.dataReady()){//如果接收到数据则执行 这一句
是一接受到数据(不管多少个数据)就置位还是说达到了payload数量后才置位的?

pww999 发表于 2012-6-22 14:14:54

本帖最后由 pww999 于 2012-6-22 14:21 编辑

Mirf.payload = sizeof(int);            //数据类型(整数)

if(Mirf.dataReady()){

应该指的是从机接收到   主机发来的任何信号 就开始执行下面语句吧

之前定义类型为整数,所以每收到一条整数就开始.因为要快速响应~

pww999 发表于 2012-7-13 10:33:01

有了库文件,程序也简单了

Loney佬 发表于 2012-7-26 23:07:34

本帖最后由 Loney佬 于 2012-7-26 23:55 编辑

我按你的接,显示有较小的滞后, 怎样接为双向通道?

Loney佬 发表于 2012-7-31 21:45:04

顶个
搞估了几天,可以双向通信了

nengcai0313 发表于 2012-8-26 21:20:25

这个不是占用串口了。。。。那串口就不能用了吧

pww999 发表于 2012-8-30 19:25:08

可以用蓝牙,TX,RX,

zhangdeyue1 发表于 2012-10-16 15:02:10

额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?:Q

heiketiguo 发表于 2012-10-27 11:21:48

{:soso__5663373028670280397_3:}

openmmoo 发表于 2013-3-12 11:37:58

收到,经修改测试成功,不过找了半天不知道如何设置发射功率,速率。
另外,我使用一个带天线的距离1000m的24l01和一个pcb天线传输距离50米的24l01,可以连接吗,我想得到更远的控制距离。

zcbzjx 发表于 2013-3-12 20:51:09

zhangdeyue1 发表于 2012-10-16 15:02 static/image/common/back.gif
额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?

spi通讯可以接多个器件,有3个口是共用的即mosi miso sck,cs每个器件不同,不同就可以了,mcu是通过拉低(?高,记不清了)某个器件对应的cs口与该器件通讯。

zcbzjx 发表于 2013-3-12 20:51:45

nengcai0313 发表于 2012-8-26 21:20 static/image/common/back.gif
这个不是占用串口了。。。。那串口就不能用了吧

这个是spi接口通讯,不占用串口的

raiseyu 发表于 2013-3-21 22:38:34

不用接电源和地?
页: [1] 2 3 4
查看完整版本: NRF24L01 2.4G摇控收发纯数字2通道PWM(可以转为4,8...N个双向通道)