极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 89556|回复: 54

NRF24L01 2.4G摇控收发纯数字2通道PWM(可以转为4,8...N个双向通道)

  [复制链接]
发表于 2012-6-20 21:03:24 | 显示全部楼层 |阅读模式
之前发的24L01 控制LED灯明暗,弄好了  

可以增加用 map 更改数字范围实现更多通道

在arduino1.01 编译通过,10米内没压力,(注:通道多了,会有延时)
-------------------------发送端--------------------------------
  1. //MISO -> D12  
  2. // * MOSI ->D11  
  3. // * SCK ->D13

  4. //* CE ->D8
  5. //* CSN ->D7

  6. #include "SPI.h"      //24L01库文件
  7. #include "Mirf.h"
  8. #include "nRF24L01.h"
  9. #include "MirfHardwareSpiDriver.h"

  10. int aaa;
  11. int aaaa;
  12. int bbb;
  13. int bbbb;

  14. void setup(){
  15.   Mirf.spi = &MirfHardwareSpi;  //加载24L01  SPI
  16.   Mirf.init();                                 //开始
  17.    Mirf.setTADDR((byte *)"serv1");//发送到"接收地址"
  18.   Mirf.payload = sizeof(int);          //数据类型(整数)
  19.    Mirf.config();  //发送通道??
  20. }
  21. void loop(){
  22.   aaa=analogRead(A4)+1;            //读取 X 向电平PWM(1至1024)
  23.   bbb= -analogRead(A5)-1;      //读取 Y向电平PWM(-1至-1024)
  24.    if (aaa !=aaaa)                    //如果 X 向电平与之前电平不一样则执行
  25.    {
  26.       Mirf.send((byte *)&aaa); //发送X向电平
  27.      aaaa=aaa;                       //保存X 向当前电平
  28.      while(Mirf.isSending()){     //等待或继续发送??
  29.   }
  30.     }
  31. if (bbb !=bbbb)                    //如果 Y 向电平与之前电平不一样则执行
  32. {
  33.    Mirf.send((byte *)&bbb);  //发送Y向电平
  34.   bbbb=bbb;                      //保存Y 向当前电平
  35.   while(Mirf.isSending()){    //等待或继续发送?
  36.   }
  37. }
  38. delay(10);                        // 等待0.01秒
  39. }  
复制代码


---------------------接收端--------------------------------

  1. //MISO -> D12  
  2. // * MOSI ->D11  
  3. // * SCK ->D13

  4. //* CE ->D8
  5. //* CSN ->D7
  6. //LCD 1602 IIC SDA---A4  328
  7. //LCD 1602 IIC SCL---A5 328


  8. #include "Wire.h"                                //LCD1602 IIC 库文件
  9. #include <LiquidCrystal_I2C.h>;
  10. LiquidCrystal_I2C lcd(0x27,16,2);

  11. #include "SPI.h"                              //24L01库文件
  12. #include "Mirf.h"
  13. #include "nRF24L01.h"
  14. #include "MirfHardwareSpiDriver.h"

  15. int data;
  16. int aaa;
  17. int bbb;

  18. void setup(){   
  19.    lcd.init();                                        //加载LCD1602 IIC
  20.     lcd.backlight();
  21.     //lcd.setBacklight(120);               //设置LCD背光亮度,好象没作用
  22.         delay(20);
  23.   Mirf.spi = &MirfHardwareSpi;          //加载24L01  SPI
  24.   Mirf.init();
  25.   Mirf.setRADDR((byte *)"serv1"); //接收地址" "
  26.   Mirf.payload = sizeof(int);            //数据类型(整数)
  27.       Mirf.config();
  28. }

  29. void loop(){

  30.   if(Mirf.dataReady()){                          //如果接收到数据则执行
  31.      
  32.       Mirf.getData((byte *)&data);   //接收数据
  33.       
  34.       if (data>=1)               //如果大于或等于1为X向 (如果设为 >=0就会 X,Y通道冲突,所以设为1开始)
  35.       {
  36. aaa=data-1;
  37.       }
  38.          if (data<=-1)         //如果小于或等于-1为Y向(............)
  39.          {
  40.     bbb=data+1;
  41.       }
  42.    
  43.     Mirf.rxFifoEmpty();            //清理24L01援存??
  44.   }
  45.      lcd.clear();                     //清屏
  46.       lcd.setCursor(0, 0);
  47.       lcd.print(aaa);                  //显示X向 1至1024
  48.       lcd.setCursor(6, 0);
  49.       lcd.print(0-bbb);             //显示Y向,并将负数变为正数 1至1024
  50.   delay(10);
  51. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +2 收起 理由
幻生幻灭 + 2 测试通过 ^_^

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-6-22 00:55:24 | 显示全部楼层
...................................
回复 支持 反对

使用道具 举报

发表于 2012-6-22 13:22:40 | 显示全部楼层
有一点不明: if(Mirf.dataReady()){  //如果接收到数据则执行 这一句
是一接受到数据(不管多少个数据)就置位还是说达到了payload数量后才置位的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-22 14:14:54 | 显示全部楼层
本帖最后由 pww999 于 2012-6-22 14:21 编辑

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

if(Mirf.dataReady()){

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

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

使用道具 举报

 楼主| 发表于 2012-7-13 10:33:01 | 显示全部楼层
有了库文件,程序也简单了
回复 支持 反对

使用道具 举报

发表于 2012-7-26 23:07:34 | 显示全部楼层
本帖最后由 Loney佬 于 2012-7-26 23:55 编辑

我按你的接,显示有较小的滞后, 怎样接为双向通道?
回复 支持 反对

使用道具 举报

发表于 2012-7-31 21:45:04 | 显示全部楼层
顶个
搞估了几天,可以双向通信了

回复 支持 反对

使用道具 举报

发表于 2012-8-26 21:20:25 | 显示全部楼层
这个不是占用串口了。。。。那串口就不能用了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-30 19:25:08 | 显示全部楼层
可以用蓝牙,TX,RX,
回复 支持 反对

使用道具 举报

发表于 2012-10-16 15:02:10 | 显示全部楼层
额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2012-10-27 11:21:48 | 显示全部楼层
{:soso__5663373028670280397_3:}
回复 支持 反对

使用道具 举报

发表于 2013-3-12 11:37:58 | 显示全部楼层
收到,经修改测试成功,不过找了半天不知道如何设置发射功率,速率。
另外,我使用一个带天线的距离1000m的24l01和一个pcb天线传输距离50米的24l01,可以连接吗,我想得到更远的控制距离。
回复 支持 反对

使用道具 举报

发表于 2013-3-12 20:51:09 | 显示全部楼层
zhangdeyue1 发表于 2012-10-16 15:02
额~!
我另外一个设备也占用SPI口的时候应该怎么办呢?

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

使用道具 举报

发表于 2013-3-12 20:51:45 | 显示全部楼层
nengcai0313 发表于 2012-8-26 21:20
这个不是占用串口了。。。。那串口就不能用了吧

这个是spi接口通讯,不占用串口的
回复 支持 反对

使用道具 举报

发表于 2013-3-21 22:38:34 | 显示全部楼层
不用接电源和地?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 06:43 , Processed in 0.053792 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表