狗趴(GodPub),开源硬件学习与实践

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 16058|回复: 3
打印 上一主题 下一主题

[arduino][Mirf库]菜鸟玩 NRF24L01

[复制链接]

5

主题

36

帖子

141

积分

QQ群用户

积分
141
跳转到指定楼层
楼主
发表于 2015-2-23 17:21:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
蓝牙成本高、wifi不会玩,就先看看NRF24L01吧




Mirf.zip (12.75 KB, 下载次数: 19)

来自贴吧的教程:
http://tieba.baidu.com/p/3092150056


IRQ –悬空 @@@@ MISO – D12,
MOSI – D11 @@@ SCK – D13,
CSN – D7, @@@@ CS – D8,
VCC - 3.3V @@@@ GND - GND

发送代码: 00000——00999 循环

  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>

  5. char tempx[6]="00000";
  6. int x=0;

  7. void setup(){
  8. Serial.begin(9600);
  9. Mirf.spi = &MirfHardwareSpi;
  10. Mirf.init();

  11. Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
  12. Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
  13. Mirf.channel = 3; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制

  14. Mirf.config();
  15. }
  16. void loop(){
  17. unsigned long time = millis();

  18. Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
  19. //Sends("hello"); //发送了一个5字节的hello


  20. if(x<10)tempx[4]=x+48;
  21. else if(x>9 && x<100){
  22.   tempx[4]=x%10+48;
  23.   tempx[3]=x/10+48;
  24. }else if(x>99 && x<999){
  25.   tempx[4]=x%10+48;
  26.   tempx[3]=(x/10)%10+48;
  27.   tempx[2]=x/100+48;
  28. }

  29. Sends(tempx);
  30. x++;
  31. if(x==1000){
  32.   x=0;
  33.    for(int col=0;col<5;col++)tempx[col]=48;
  34. }

  35. delay(100);
  36. }


  37. void Sends(char *str)
  38. {
  39. int lens;
  40. lens=strlen(str);

  41. char msg[lens];
  42. int i;
  43. for (i=0;i<lens;i++)
  44. {
  45. msg[i]= int(str[i]);
  46. }
  47. Mirf.send((byte *)&msg);

  48. while(Mirf.isSending()){}



  49. }
复制代码


接收代码


  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>
  5. void setup(){
  6. Serial.begin(9600);

  7. Mirf.spi = &MirfHardwareSpi;
  8. Mirf.init();

  9. Mirf.setRADDR((byte *)"serv1"); // 本地名
  10. Mirf.payload = 5; // 长度
  11. Mirf.channel = 3; // 信道

  12. Mirf.config();

  13. }
  14. void loop(){

  15. byte data[Mirf.payload];
  16. if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据

  17. Mirf.getData(data);


  18. int i;
  19. String Temp;
  20. for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
  21. {
  22. Temp += char(data[i]);
  23. }
  24. Serial.print("Get:");
  25. Serial.print(Mirf.payload);
  26. Serial.print(" ");
  27. Serial.println(Temp);

  28. /**
  29. Mirf.setTADDR((byte *)"clie1");
  30. Mirf.send(data);
  31. **/
  32. }
  33. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏

84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
沙发
发表于 2015-2-23 17:48:01 | 只看该作者
不错,感谢囧囧大神的分享

PS:
官网上NRF24l01的链接
http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
板凳
 楼主| 发表于 2015-2-23 19:32:20 | 只看该作者
卓泰科技 发表于 2015-2-23 17:48
不错,感谢囧囧大神的分享

PS:

@机器翻译

  1. 文档

  2. 引脚:

  3. MISO -> 12
  4. MOSI -> 11
  5. SCK -> 13
  6. Configurable:

  7. CE -> 8
  8. CSN -> 7

  9. 可配置的:

  10. byte cePin
  11. CE Pin 控制 RX / TX, 默认 8.
  12. byte csnPin
  13. CSN Pin (片选), 默认 7.
  14. byte channel
  15. RF 信道 0 - 127 or 0 - 84 in the US, 默认 0.
  16. byte payload
  17. 字节数, 默认 16, max 32.
  18. NB: 信道和载荷必须所有节点相同的.

  19. 方法:

  20. void init(void)
  21. 初始化模块,用于设置引脚模式
  22. 可配置引脚和初始化SPI模块。

  23. Example:
  24. Mirf.csnPin = 9;
  25. Mirf.cePin = 7;

  26. Mirf.spi = &MirfHardwareSpi; // 设置驱动程序

  27. Mirf.init();
  28. void setRADDR(byte *addr)
  29. 设置接收地址。地址是5字节长。
  30. Example:
  31. Mirf.setRADDR((byte *)"addr1");
  32. void setTADDR(byte *addr)
  33. 设置发送地址。
  34. Example:
  35. Mirf.setTADDR((byte *)"addr1");
  36. void config(void)
  37. 信道和有效载荷的宽度设置。上电 in RX mode and flush RX fifo.
  38. Example:
  39. Mirf.payload = 32;
  40. Mirf.信道 = 2;
  41. Mirf.config();
  42. bool dataReady(void)
  43. 有数据可以收到了吗?。
  44. Example:
  45. if(Mirf.dataReady()){
  46.   //获取数据
  47. }
  48. void getData(byte *data)
  49. 把接收到的数据。
  50. “数据”应该是一个数组
  51. mirf.payload字节长。
  52. Example:
  53. byte data[Mirf.payload]
  54. Mirf.getData(data);
  55. void send(byte *data)
  56. 发送数据。
  57. “数据”应该是
  58. mirf.payload字节长。
  59. bool isSending(void)
  60. 返回true
  61. 如果仍在试图送。
  62. 如果芯片仍在发射模式中此方法将返回芯片接收模式。
  63. Example:
  64. Mirf.send(data);

  65. while(Mirf.isSending()){
  66. //等待.
  67. }

  68. //芯片现在是在接收模式
  69. 注:更多的信息可从状态寄存器对于acknolagement或故障状态。. See Mirf.cpp:218.

  70. bool rxFifoEmpty(void)
  71. 清空 RX Fifo
  72. bool txFifoEmpty(void)
  73. 清空  TX Fifo
  74. byte getStatus(void)
  75. 返回状态寄存器。
  76. void powerUpRx(void)
  77. Power up chip and set to receive mode. Also clear sending interrupts.
  78. void powerUpTx(void)
  79. Power up tx mode.
复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
地板
 楼主| 发表于 2015-2-24 11:55:25 | 只看该作者
5字节,串口转NRF24L01,要想一次性发送更多,就增加 tempx、Mirf.payload的长度就可以了


  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>

  5. char tempx[6];
  6. int jsq1=0;
  7. boolean NRF=0;


  8. void setup(){
  9. Serial.begin(9600);
  10. Mirf.spi = &MirfHardwareSpi;
  11. Mirf.init();

  12. Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
  13. Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
  14. Mirf.channel = 3; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制

  15. Mirf.config();
  16. }


  17. void loop(){


  18. Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
  19. //Sends("hello"); //发送了一个5字节的hello


  20. while (Serial.available() > 0) {
  21.     NRF=1;

  22.    if(jsq1<5){ //只接受前5个字节

  23.   tempx[jsq1]=Serial.read();  
  24.   jsq1++;
  25.    }else Serial.read(); //超过5字节的都丢弃

  26. delayMicroseconds(1200);

  27.   }

  28. if(NRF){
  29.          NRF=0; //nrf发送数据次数与串口接收数据次数一对一
  30.          for(int col=jsq1;col<5;col++)tempx[col]=32; //不足5字节的补上空格,算是一种视觉上的清空
  31.          jsq1=0;
  32.          Sends(tempx);
  33.      //for(int col=0;col<5;col++)tempx[col]=0;//不需要清空,因为新的填充会自然清空

  34. }


  35. }


  36. void Sends(char *str)
  37. {
  38. int lens;
  39. lens=strlen(str);

  40. char msg[lens];
  41. int i;
  42. for (i=0;i<lens;i++)
  43. {
  44. msg[i]= int(str[i]);
  45. }
  46. Mirf.send((byte *)&msg);

  47. while(Mirf.isSending()){}



  48. }
复制代码


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

本版积分规则

QQ|Archiver|手机版|狗趴(GodPub) Arduino&Raspberry Pi开源硬件学习与实践[QQ群:20085629]  

GMT+8, 2024-4-28 13:41 , Processed in 0.041039 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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