风筝
发表于: 2020-2-5 11:58:19 | 显示全部楼层

我们生活在5G和支持5G的设备时代。但是,在需要远程、短距离、廉价和低成本通信的情况下,诸如对讲机系统和RF通信系统之类的旧技术仍然是最重要的。例如,如果您有建筑公司或重型轴承建筑公司,则您的工人需要相互沟通以进行协调工作。在对讲机的帮助下,他们可以相互交流并通过按“ PTT”按钮广播简短的指示,以向其他工人传送声音。另一个应用可能是在智能头盔中进行长途驾驶时在一组骑手之间进行通信,此处建议的模型可以一次在六个人之间进行通信。


使用nRF24L01射频模块的对讲机

该项目的主要组件是NRF24L01 RF模块和Arduino Uno,后者是主控。本文选择NRF24L01 RF模块是因为它比数字通信介质具有多个优势。它具有2.4 GHz高频ISM频段,数据速率可以为250kbps、1Mbps、2 Mbps。它在1Mhz间隔之间有125个通道,因此该模块可以使用125个不同的通道,这使得在一个地方拥有125个独立工作的调制解调器网络成为可能。


最重要的是,NRF24L01信号不会与其他对讲机系统重叠或交叉,例如警察对讲机和铁路对讲机,并且不会干扰其他对讲机。一个nrf24l01模块可以在其他6个nrf24l01模块处于接收状态时与它们进行通信。而且,它是一个低功耗模块,这是一个额外的优势。 NRF24L01模块有两种类型,它们是广泛使用和常用的,一种是NRF24L01 +,另一种是带有内置天线的NRF24L01 + PA + LNA(如下所示)。

nRF24L01-RF-Module-with-Antenna.jpg


NRF24L01 +带有一个内置天线,射程只有100米。仅适用于室内使用,不适用于室外长途通信。而且,如果在发射器和接收器之间存在隔离墙,则信号传输非常差。带有外部天线的NRF24L01 + PA + LNA具有一个PA,可以在传输之前增强信号的功率。 LNA代表低噪声放大器。显然,可以滤除噪声并增强从天线接收到的信号的极弱和不确定的低电平。它有助于产生有用的信号电平,并具有2dB的外部天线,通过它可以传输1000米的空中覆盖范围,因此非常适合我们的户外对讲机通信项目。


基于Arduino的对讲机所需的组件

●     NRF24L01 + PA + LNA带有外部2DB天线

●     Arduino UNO开发板

●     音频放大器

●     麦克风电路:您可以自己制作或购买声音传感器模块。

●     DC至DC升压升压模块

●     3.3V AMS1117稳压器模块

●     电源指示灯LED

●     470欧姆电阻

●     4英寸扬声器

●     按钮

●     锂离子电池

●     锂离子电池充电和电池保护模块


Arduino对讲机电路图

下图显示了Arduino对讲机的完整电路图。电路图显示了所有连接,包括PTT按钮、麦克风电路和立体声音频输出。

Arduino-Walkie-Talkie-Circuit-Diagram.png


第1步:首先定制PCB和Arduino Atmega328开发板。我已将IC Atmega328p放在编程器上并对其进行了编程,然后上传了代码。然后,我在(PB6、PB7)引脚9和10的Atmega328p IC上添加了16 MHz晶振。定制PCB和组装电路板的图片如下所示。

Atmega328p-Arduino-Board.jpg


第2步:按照电路图所示的顺序连接NRF24L01模块。 CE到数字引脚7,CSN到引脚8,SCK到数字引脚13,MOSI到数字引脚11,MISO到数字引脚12,IRQ到数字引脚2。

NRF24L01-Module.jpg


电源部分,我们需要先将电压从5伏降至3.3v,同时保持良好的电流稳定性。另外,您必须在nrf24l01模块的VCC和接地上放置一个100nF电容器。因此,我使用了3.3伏电压调节器AMS1117,该模块还可以减小您的项目规模。

AMS1117-Voltage-Regulator.jpg

如果您想自己制作该稳压器板,则只需购买3.3伏稳压器IC,并且可以通过添加一些电容、输入和输出电阻,因为这对RF模块来说非常重要,因为它是敏感器件。


第3步:您可以购买声音传感器或制作简单的麦克风电路,如电路图所示。它仅由一个晶体管2n3904 NPN晶体管组成。下图显示了自制麦克风电路。

2n3904-NPN-Transistor.jpg


为了更好地理解,我用组件值对整个连接进行了另一种表示,如下所示

Arduino-Walkie-Talkie-Circuit-Connection-Schematic.png


第4步:对于从您的微控制器数字引脚9和10到音频放大器的连接,我使用了PAM8403立体声音频放大器,因为默认情况下Arduino音频输出非常低,因此我们需要一个放大器。该模块可以轻松驱动两个笔记本电脑扬声器,并且价格非常低廉。此外,它还带有SMD封装的功能非常强大的音频放大器,所需空间很小。 PAM8403音频放大器模块如下所示。

PAM8403-Stereo-Audio-Amplifier-Module_0.jpg


连接非常简单,需要使用3.7V至5V电源为音频放大器供电。Arduino引脚9和10的左声道和右声道音频输入以及接地引脚应作为此放大器模块的输入,如电路图所示。本文只使用了一个4英寸8欧姆扬声器,只使用了右声道输出。


第5步:接下来,我使用一个简单的按钮构建了PTT开关。我添加了一个104PF或0.1uf电容器来防止按下开关时开关弹跳。代码中将中断的引脚分配给引脚4,因此引脚4现在直接与Arduino数字引脚D3连接。


NRF24L01 + PA + LNA在传输音频信号或DATA数据包时会消耗更多功率,因此会消耗更多电流。突然按下PTT按钮时,功耗会增加。要处理突然增加的负载,必须在+ vcc和地上使用100nF电容器,以确保NRF24L01 + PA + LNA模块的传输稳定性。


当按下开关时,Arduino板在其引脚D3上收到一个Arduino中断。在程序中,我们将声明Arduino的数字引脚3不断检查其输入电压。如果输入电压低,则将对讲机保持在接收模式;如果数字引脚号3高,则将对讲机切换到发送模式,以通过微控制器发送麦克风过程拾取的语音信号,然后通过NRF24L01 + PA + LNA带有外部天线发送。


第6步:电源部分,本文选择了这款锂离子电池。为了给所有组件供电,例如Arduino IC Atmega328p、NRF24L01 + PA + LNA、音频放大器,本文使用了两组锂离子电池,如下所示。

Li-ion-Battery.jpg


优质电池的电压电平为3.8v至4.2伏,充电电压仅为4v至4.2伏。这些电池非常普遍地用于便携式电子设备和电动车辆中。但是,锂离子电池单体不如其他电池那样坚固,它们需要防止过充电和过快放电的保护,这意味着充电/放电电流和电压应保持在安全范围内。因此,我使用了最新的锂离子电池充电模块-TP4056。


第7步:本文使用了2A直流到直流升压升压器模块,因为麦克风电路等电路需要5V供电,但电池只能提供3.7V至4.2V,所以需要一个升压转换器在超过1 A的稳定电源输出时达到5V。

DC-to-DC-Step-Up-Booster-Module.jpg

搭建好电路后,您可以将其组装在一个小机箱中。用一个塑料盒放置电路,如下图所示

Arduino-Walkie-Talkie.jpg


Arduino-Walkie-Talkie-Internal-Setup.jpg


对讲机的Arduino代码

本文末尾处给出了Arduino对讲机的完整代码。在本节中,我们讨论程序的工作方式。首先需要包含下面列出的一些库。

●    nRF24库

●    nRF24音频库

●    Maniaxbug RF24库


首先在代码中包含Radio和Audio库的头文件,如下所示

  1. #include <RF24.h>
  2. #include <SPI.h>
  3. #include <RF24Audio.h>
  4. #include "printf.h"    // General includes for radio and audio lib
复制代码

初始化引脚7和8上的RF Radio,并将音频无线电编号设置为0。此外,初始化引脚3上的ppt按钮。

  1. RF24 radio(7,8);    // Set radio up using pins 7 (CE) 8 (CS)
  2. RF24Audio rfAudio(radio,0); // Set up the audio using the radio, and set to radio number 0
  3. int talkButton = 3;
复制代码

在setup函数中,以115200波特率开始串口监控以进行调试。然后初始化连接到引脚3的ppt按钮作为中断引脚。

  1. void setup() {     
  2.   Serial.begin(115200);
  3.   printf_begin();
  4.   radio.begin();
  5.   radio.printDetails();
  6.   rfAudio.begin();
  7.   pinMode(talkButton, INPUT);//sets interrupt to check for button talk abutton press
  8.   attachInterrupt(digitalPinToInterrupt(talkButton), talk, CHANGE);  //sets the default state for each module to receive
  9.   rfAudio.receive();
  10. }
复制代码

接下来,我们定义了talk()函数,该函数将响应中断。如果按住按钮,程序会检查按钮的状态,然后进入发送模式发送音频。如果释放按钮,它将进入接收模式。

  1. void talk()
  2. {
  3.   if (digitalRead(talkButton)) rfAudio.transmit();
  4.   else rfAudio.receive();
  5. }
  6. void loop()
  7. {
  8. }
复制代码

对讲机在操作过程中会产生一些噪声,这是来自nRF24L01模块载波频率的噪声。可以通过使用优质的声音传感器或麦克风模块来降低噪声。如果您对此项目有任何问题,请在本帖下面进行回复。


代码

以下是本文使用的完整代码: main.rar (588 Bytes, 下载次数: 126)

PTT-Switch.jpg
跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-24 15:16 , Processed in 0.041013 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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