histamine 发表于 2013-3-29 22:47:15

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

本帖最后由 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:// rf22_client.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messageing client
// with the RF22 class. RF22 class does not provide for addressing or reliability.
// It is designed to work with the other example rf22_server

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

// Singleton instance of the radio
RF22 rf22;

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

void loop()
{
while (1)
{
    Serial.println("Sending to rf22_server");
    // Send a message to rf22_server
    uint8_t data[] = "Hello World!";
    rf22.send(data, sizeof(data));
   
    rf22.waitPacketSent();
    // Now wait for a reply
    uint8_t buf;
    uint8_t len = sizeof(buf);

    if (rf22.waitAvailableTimeout(500))
    {
      // Should be a message for us now   
      if (rf22.recv(buf, &len))
      {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
      }
      else
      {
      Serial.println("recv failed");
      }
    }
    else
    {
      Serial.println("No reply, is rf22_server running?");
    }
}
}server:// rf22_server.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messageing server
// with the RF22 class. RF22 class does not provide for addressing or reliability.
// It is designed to work with the other example rf22_client

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

// Singleton instance of the radio
RF22 rf22;

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

void loop()
{
while (1)
{
    rf22.waitAvailable();
   
    // Should be a message for us now   
    uint8_t buf;
    uint8_t len = sizeof(buf);
    if (rf22.recv(buf, &len))
    {
      Serial.print("got request: ");
      Serial.println((char*)buf);
      
      // Send a reply
      uint8_t data[] = "And hello back to you";
      rf22.send(data, sizeof(data));
      rf22.waitPacketSent();
      Serial.println("Sent a reply");
    }
    else
    {
      Serial.println("recv failed");
    }
}
}通过串口输出,即可看到两块arduino uno正在通过si4432模块进行通讯:


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

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

瘦网虫 发表于 2013-3-30 10:51:56

感谢楼主共享~~回头来试试看~

zhujunsan 发表于 2013-3-30 11:30:03

这个好。似乎si4432的arduino 范例或者文档挺少的

raiseyu 发表于 2013-4-1 18:44:24

还要电平转换啊

gaotian 发表于 2013-4-2 11:09:07

请问楼主
si4432的SDN脚接到 CD4049 的 J=D 转 D 然后接到哪里了?
图上是接到了arduino的GND?

histamine 发表于 2013-4-2 14:01:25

本帖最后由 histamine 于 2013-4-2 14:04 编辑

gaotian 发表于 2013-4-2 11:09 static/image/common/back.gif
请问楼主
si4432的SDN脚接到 CD4049 的 J=D 转 D 然后接到哪里了?
图上是接到了arduino的GND?

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

questfish 发表于 2013-4-5 02:08:42

RF22这个库在哪里定义接收端和发送端的地址啊?

ardyPro 发表于 2013-4-26 13:14:10

5V的SI4432模块还需要转换电平吗?

histamine 发表于 2013-4-26 14:13:09

ardyPro 发表于 2013-4-26 13:14 static/image/common/back.gif
5V的SI4432模块还需要转换电平吗?

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

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

ardyPro 发表于 2013-5-2 12:16:03

自发自收如何做?
同一arduino上的两块SI4432模块可以同时被选用吗?

histamine 发表于 2013-5-2 12:40:14

本帖最后由 histamine 于 2013-5-2 12:42 编辑

ardyPro 发表于 2013-5-2 12:16 static/image/common/back.gif
自发自收如何做?
同一arduino上的两块SI4432模块可以同时被选用吗?

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

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

arduino uno只有两个外部中断,所以最多只能同时接两个si4432模块

fengyunsnake 发表于 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

怎么看引脚啊?有没有标示?
页: [1] 2
查看完整版本: arduino使用si4432模块进行无线通讯