- 所需组件
- 433Mhz射频发射器和接收器模块)
- STM32F103C8的射频发送器电路图
- Arduino Uno的RF接收器电路图
- 为无线射频传输编程STM32F103C8
- 将Arduino UNO编程为RF接收器
- 测试基于STM 32的RF发送器和接收器
在嵌入式电子产品中进行无线项目变得非常重要和有益,因为到处都没有乱七八糟的电线,这使得该设备更加方便携带。有各种无线技术,例如蓝牙,WiFi,433 MHz RF(射频)等。每种技术都有其自身的优点和缺点,例如成本,距离或范围传输,速度或吞吐量等。今天,我们将使用带有STM32的RF模块无线发送和接收数据。如果您不熟悉STM32微控制器,则可以使用Arduino IDE从STM32的LED闪烁开始,并在此处检查所有其他STM32项目。
除此之外,我们还将RF 433Mhz无线模块与其他微控制器一起使用,以构建一些无线控制项目,例如:
- 射频控制家用电器
- 使用Raspberry Pi的RF远程控制LED
- 射频控制机器人
- 将RF模块与Arduino接口
- 使用RF模块的PIC到PIC通讯
在这里,我们将把433MHz RF无线模块与STM32F103C8微控制器接口。该项目分为两个部分。所述发送器将与STM32被接口和所述接收器将与Arduino的UNO进行接口。会有不同电路图和草图两个发送以及接收部。
在本教程中,RF发送器将两个值发送到接收器端:使用超声波传感器测量的距离和电位计ADC值(0到4096),该值映射为从0到100的数字。Arduino的RF接收器同时接收这两个值,并将这些距离和数字值无线打印在16x2 LCD显示屏中。
所需组件
- STM32F103C8微控制器
- Arduino UNO
- 433Mhz射频发射器和接收器
- 超声波传感器(HC-SR04)
- 16x2 LCD显示屏
- 10k电位器
- 面包板
- 连接线
433Mhz射频发射器和接收器模块)
射频发射器引脚排列:
433Mhz射频发射器 |
引脚说明 |
蚂蚁 |
用于连接天线 |
地线 |
地线 |
VDD |
3.3至5V |
数据 |
这里给出了要发送到接收器的数据 |
射频接收器引脚排列:
433Mhz射频接收器 |
采用 |
蚂蚁 |
用于连接天线 |
地线 |
地线 |
VDD |
3.3至5V |
数据 |
要从发送器接收的数据 |
CE / DO |
也是数据引脚 |
433 MHz模块规格:
- 接收器工作电压:3V至5V
- 发射器工作电压:3V至5V
- 工作频率:433 MHz
- 传输距离:3米(无天线)至100米(最大)
- 调制技术:ASK(幅移键控)
- 数据传输速度:10Kbps
STM32F103C8的射频发送器电路图
射频发射器与STM32F103C8之间的电路连接:
STM32F103C8 |
射频发射器 |
5伏 |
VDD |
地线 |
地线 |
PA10 |
数据 |
数控 |
蚂蚁 |
超声波传感器与STM32F103C8之间的电路连接:
STM32F103C8 |
超声波传感器(HC-SR04) |
5伏 |
VCC |
PB1 |
触发 |
PB0 |
回声 |
地线 |
地线 |
一个10k电位器与STM32F103C8连接,以向STM32的ADC引脚PA0提供输入模拟值(0至3.3V)。
Arduino Uno的RF接收器电路图
射频接收器和Arduino UNO之间的电路连接:
Arduino UNO |
射频接收器 |
5伏 |
VDD |
地线 |
地线 |
11 |
数据 |
数控 |
蚂蚁 |
16x2 LCD和Arduino UNO之间的电路连接:
LCD引脚名称 |
Arduino UNO引脚名称 |
地面(地) |
地线(G) |
VCC |
5伏 |
VEE |
电位器中心的对比针 |
寄存器选择(RS) |
2 |
读/写(RW) |
地线(G) |
启用(EN) |
3 |
数据位4(DB4) |
4 |
数据位5(DB5) |
5 |
数据位6(DB6) |
6 |
数据位7(DB7) |
7 |
LED正极 |
5伏 |
LED负极 |
地线(G) |
编码将在下面简要说明。草图将分为两部分,第一部分是发送器部分,另一部分是接收器部分。本教程的结尾将提供所有草图文件和工作视频。要了解有关将RF模块与Arduino Uno接口的更多信息,请单击链接。
为无线射频传输编程STM32F103C8
STM32F103C8可以使用Arduino IDE进行编程。一个FTDI程序员或ST-Link的不需要的代码上传到STM32F103C8。只需通过STM32的USB端口连接到PC并开始使用ARDUINO IDE进行编程。您可以通过以下链接学习在Arduino IDE中对STM32编程。
在发射器部分,使用超声波传感器测量物体的距离(以“ cm”为单位),并使用电位计设置从(0到100)的数值,该数值通过与STM32接口的RF发射器进行发射。
首先包含Radiohead库,可以从此处下载。由于该库使用ASK(幅移键控技术)来发送和接收数据。这使得编程非常容易。您可以通过进入Sketch-> include library-> Add.zip库在素描中 包含库。
#包括
像本教程中的发射器端一样,超声波传感器用于测量距离,因此定义了触发和回波引脚。
#define trigPin PB1 #define echoPin PB0
接下来,使用诸如速度(2000),RX引脚(PA9)和TX引脚(PA10)之类的参数将RH_ASK库的对象名称设置为rf_driver。
RH_ASK rf_driver(2000,PA9,PA10);
接下来,声明该程序所需的Strings变量。
字符串send_number; 字符串send_distance; 字符串传输;
接下来在void setup()中,初始化RH_ASK rf_driver的对象。
rf_driver.init();
之后,将触发引脚设置为OUTPUT引脚,并将PA0(连接到电位计)和回波引脚设置为INPUT引脚。串行通信以9600的波特率开始。
Serial.begin(9600); pinMode(PA0,INPUT); pinMode(echoPin,INPUT); pinMode(trigPin,OUTPUT);
接下来在void loop()中,首先将作为输入模拟电压的电位器值转换为数字值(找到ADC值)。由于STM32的ADC具有12位分辨率。因此,数字值从(0到4096)变化,映射到(0到100)。
int模拟输入= AnalogRead(PA0); int pwmvalue = map(模拟输入,0,4095,0,100);
接下来,使用超声波传感器通过将触发器设置为高和低(延迟2微秒)来测量距离。
digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW);
回波针感应到反射的波,即触发波被反射回的持续时间用于使用公式计算物体的距离。通过以下链接了解更多超声传感器如何计算距离。
长持续时间= pulseIn(echoPin,HIGH); 浮动距离=持续时间* 0.034 / 2;
现在,将测量的数据编号和距离都转换为字符串数据,并存储在相应的字符串变量中。
send_number =字符串(pwmvalue); send_distance =字符串(距离);
这两个字符串都作为一行添加,并存储在称为传输和逗号“,”的字符串中,用于分隔两个字符串。
传输=传输_pwm +“,” +传输_距离;
传输字符串将转换为字符数组。
const char * msg = send.c_str();
数据已发送并等待发送。
rf_driver.send((uint8_t *)msg,strlen(msg)); rf_driver.waitPacketSent();
发送的字符串数据也显示在串行监视器中。
Serial.println(msg);
将Arduino UNO编程为RF接收器
Arduino UNO使用Arduino IDE进行编程。在接收器部分中,将从发射器部分发送并由RF接收器模块接收的数据和接收到的字符串数据分为各自的数据(距离和数字),并显示在16x2 LCD显示屏中。
让我们简单地看一下接收器编码:
像在发送器部分中一样,首先包含RadiohHead库。由于该库使用ASK(幅移键控技术)来发送和接收数据。这使得编程非常容易。
#包括
由于此处使用LCD显示屏,因此也包括液晶库。
#包括
并使用lcd作为对象指定并声明了与Arduino UNO连接的16x2 LCD显示引脚。
液晶(2,3,4,5,6,7);
接下来,声明用于存储字符串数据的String数据变量。
字符串str_receive; 字符串str_number; 字符串str_distance;
声明了Radiohead库的对象。
RH_ASK rf;
现在在 void setup()中, 将LCD显示屏设置为16x2模式,并显示并清除欢迎消息。
lcd.begin(16,2); lcd.print(“电路图摘要”); lcd.setCursor(0,1); lcd.print(“ RF with STM32”); 延迟(5000); lcd.clear();
之后, rf 对象被初始化。
rf.init();
现在在 void loop()中, 将数组buf声明为7。因为从发送器发送的数据有7个,包括“,”。因此,请根据要传输的数据进行更改。
uint8_t buf; uint8_t buflen = sizeof(buf);
如果该字符串在rf接收器模块上可用,则if函数检查大小并执行。所述 rf.recv() 是用来接收数据。
如果(rf.recv(buf,&buflen))
的 BUF 具有将接收到的字符串,以便随后接受字符串存储在一个 str_receive 字符串变量。
str_receive =字符串((char *)buf);
如果检测到两个字符串之间的',',则此 for 循环用于将接收到的字符串拆分为两个。
for(int i = 0; i <str_receive.length(); i ++) { if(str_receive.substring(i,i + 1)==“,”) { str_number = str_receive.substring(0,i); str_distance = str_receive.substring(i + 1); 打破; }
声明两个用于两个值的char数组,并通过将字符串转换为字符数组将拆分为两个的String存储在受尊重的数组中。
字符数字符串; 字符距离字符串; str_distance.toCharArray(distancestring,3); str_number.toCharArray(numberstring,3);
之后,使用atoi()将字符数组转换为整数
int distance = atoi(distancestring); int number = atoi(numberstring);
转换为整数值后,距离和数字值将显示在16x2 LCD显示屏中
lcd.setCursor(0,0); lcd.print(“ Number:”); lcd.print(number); lcd.setCursor(0,1); lcd.print(“ Distance:”); lcd.print(距离); lcd.print(“ cm”);
在分别在STM32和Arduino UNO中上载了代码(即发送器和接收器)后,使用STM32测量的数据(例如数量和物距)将通过RF发送器发送到RF接收器,并且所接收的值会无线显示在LCD显示屏上。
测试基于STM 32的RF发送器和接收器
1.当数字为0且物体距离为6cm时。
2.当数字47与物体的距离为3厘米时。