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

标题: [arduino][Mirf库]菜鸟玩 NRF24L01 [打印本页]

作者: 囧囧-科技大神粉    时间: 2015-2-23 17:21
标题: [arduino][Mirf库]菜鸟玩 NRF24L01
蓝牙成本高、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. }
复制代码




作者: 卓泰科技    时间: 2015-2-23 17:48
不错,感谢囧囧大神的分享

PS:
官网上NRF24l01的链接
http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01

作者: 囧囧-科技大神粉    时间: 2015-2-23 19:32
卓泰科技 发表于 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.
复制代码



作者: 囧囧-科技大神粉    时间: 2015-2-24 11:55
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. }
复制代码







欢迎光临 狗趴(GodPub),开源硬件学习与实践 (http://forum.godpub.com/) Powered by Discuz! X3.2