极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 58908|回复: 23

arduino使用si4432模块进行无线通讯

[复制链接]
发表于 2013-3-29 22:47:15 | 显示全部楼层 |阅读模式
本帖最后由 histamine 于 2013-3-29 22:57 编辑

简单介绍下,详细信息及更高级的使用方法请自己阅读rf22库的文档

使用RF22库
http://www.airspayce.com/mikem/arduino/RF22/
(该库适用的Hope-RF RF22B模块其实就是si4432模块)

si4432与5v arduino通讯需要用一块cd4050进行电平转换

硬件连接原理图:


面包板连接示意图:


实际演示需要两块si4432模块和两块arduino uno开发板:




两块arduino uno分别烧入以下代码(即RF22库自带的client/server example中):
client:
  1. // rf22_client.pde
  2. // -*- mode: C++ -*-
  3. // Example sketch showing how to create a simple messageing client
  4. // with the RF22 class. RF22 class does not provide for addressing or reliability.
  5. // It is designed to work with the other example rf22_server

  6. #include <SPI.h>
  7. #include <RF22.h>

  8. // Singleton instance of the radio
  9. RF22 rf22;

  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   if (!rf22.init())
  14.     Serial.println("RF22 init failed");
  15.   // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
  16. }

  17. void loop()
  18. {
  19.   while (1)
  20.   {
  21.     Serial.println("Sending to rf22_server");
  22.     // Send a message to rf22_server
  23.     uint8_t data[] = "Hello World!";
  24.     rf22.send(data, sizeof(data));
  25.    
  26.     rf22.waitPacketSent();
  27.     // Now wait for a reply
  28.     uint8_t buf[RF22_MAX_MESSAGE_LEN];
  29.     uint8_t len = sizeof(buf);

  30.     if (rf22.waitAvailableTimeout(500))
  31.     {
  32.       // Should be a message for us now   
  33.       if (rf22.recv(buf, &len))
  34.       {
  35.         Serial.print("got reply: ");
  36.         Serial.println((char*)buf);
  37.       }
  38.       else
  39.       {
  40.         Serial.println("recv failed");
  41.       }
  42.     }
  43.     else
  44.     {
  45.       Serial.println("No reply, is rf22_server running?");
  46.     }
  47.   }
  48. }
复制代码
server:
  1. // rf22_server.pde
  2. // -*- mode: C++ -*-
  3. // Example sketch showing how to create a simple messageing server
  4. // with the RF22 class. RF22 class does not provide for addressing or reliability.
  5. // It is designed to work with the other example rf22_client

  6. #include <SPI.h>
  7. #include <RF22.h>

  8. // Singleton instance of the radio
  9. RF22 rf22;

  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   if (!rf22.init())
  14.     Serial.println("RF22 init failed");
  15.   // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
  16. }

  17. void loop()
  18. {
  19.   while (1)
  20.   {
  21.     rf22.waitAvailable();
  22.    
  23.     // Should be a message for us now   
  24.     uint8_t buf[RF22_MAX_MESSAGE_LEN];
  25.     uint8_t len = sizeof(buf);
  26.     if (rf22.recv(buf, &len))
  27.     {
  28.       Serial.print("got request: ");
  29.       Serial.println((char*)buf);
  30.       
  31.       // Send a reply
  32.       uint8_t data[] = "And hello back to you";
  33.       rf22.send(data, sizeof(data));
  34.       rf22.waitPacketSent();
  35.       Serial.println("Sent a reply");
  36.     }
  37.     else
  38.     {
  39.       Serial.println("recv failed");
  40.     }
  41.   }
  42. }
复制代码
通过串口输出,即可看到两块arduino uno正在通过si4432模块进行通讯:


再补充几句:
一块arduino uno其实可以同时接两块si4432模块,这两个模块的nSEL引脚要连接到arduino不同的引脚上,nIRQ引脚分别连接到arduino的D2(interrupt 0)和D3(interrupt 1),然后初始化RF22对象时需要手动指定slaveSelectPin和interrupt两个参数

RF22库还支持组网功能,见RF22Mesh和RF22Router两个类的文档

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-3-30 10:51:56 | 显示全部楼层
感谢楼主共享~~回头来试试看~
回复 支持 反对

使用道具 举报

发表于 2013-3-30 11:30:03 | 显示全部楼层
这个好。似乎si4432的arduino 范例或者文档挺少的
回复 支持 反对

使用道具 举报

发表于 2013-4-1 18:44:24 | 显示全部楼层
还要电平转换啊
回复 支持 反对

使用道具 举报

发表于 2013-4-2 11:09:07 | 显示全部楼层
请问楼主
si4432的SDN脚接到 CD4049 的 J=D 转 D 然后接到哪里了?
图上是接到了arduino的GND?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-2 14:01:25 | 显示全部楼层
本帖最后由 histamine 于 2013-4-2 14:04 编辑
gaotian 发表于 2013-4-2 11:09
请问楼主
si4432的SDN脚接到 CD4049 的 J=D 转 D 然后接到哪里了?
图上是接到了arduino的GND?


我是直接接到了gnd上面,如果接到arduino的io上面的话,输出高电平可以让si4432模块停止工作,进入关闭状态;输出低电平进入工作状态
通过控制sdn脚的电平,还可以对si4432模块进行复位
回复 支持 反对

使用道具 举报

发表于 2013-4-5 02:08:42 | 显示全部楼层
RF22这个库在哪里定义接收端和发送端的地址啊?
回复 支持 反对

使用道具 举报

发表于 2013-4-26 13:14:10 | 显示全部楼层
5V的SI4432模块还需要转换电平吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-26 14:13:09 | 显示全部楼层
ardyPro 发表于 2013-4-26 13:14
5V的SI4432模块还需要转换电平吗?

自带电平转换电路就不用了

如果只是自带一个5v电源转3v3稳压IC,还是要电平转换的
回复 支持 反对

使用道具 举报

发表于 2013-5-2 12:16:03 | 显示全部楼层
自发自收如何做?
同一arduino上的两块SI4432模块可以同时被选用吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-2 12:40:14 | 显示全部楼层
本帖最后由 histamine 于 2013-5-2 12:42 编辑
ardyPro 发表于 2013-5-2 12:16
自发自收如何做?
同一arduino上的两块SI4432模块可以同时被选用吗?


RF22 (uint8_t slaveSelectPin=SS, uint8_t interrupt=0, GenericSPIClass *spi=&Hardware_spi)

创建RF22对象实例的时候,分别指定一下slaveSelectPin和interrupt就行了

arduino uno只有两个外部中断,所以最多只能同时接两个si4432模块
回复 支持 反对

使用道具 举报

发表于 2013-7-20 14:32:37 | 显示全部楼层
SDO接口不需要转电平的吗?这个是不是说SDO是输出0或3.3V,对于Arduino来说3.3V也高电平,所以就不用转了?是这个意思吗?
回复 支持 反对

使用道具 举报

发表于 2014-5-7 16:31:54 | 显示全部楼层
没有4050程序上还以代替吗?
回复 支持 反对

使用道具 举报

发表于 2014-5-7 16:43:26 | 显示全部楼层
错咯!我给arduino供3.3V的电就可以不用4050了吧
回复 支持 反对

使用道具 举报

发表于 2014-5-7 17:01:36 | 显示全部楼层
怎么看引脚啊?有没有标示?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 16:59 , Processed in 0.042628 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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