在本文中,我们将构建一个可以在2.4 GHz通信链路上无线控制6台伺服电机的无线伺服电机电路。
介绍
该项目分为两部分:一个带有6个电位计的发射器和一个带有6个电位计的接收器电路伺服电机.
遥控器有6个电位计,在接收器上独立控制6个单独的伺服电机。通过旋转电位计,可以调整伺服电机可控制.
所提出的电路可用于需要控制运动的地方,例如机器人的手臂或RC汽车的前轮方向控制。
电路的核心是NRF24L01模块,它是一个收发器;它在ISM频段(工业、科学和医疗频段)上工作,与您的WI-FI工作的频段相同。
NRF24L01模块的图示:
它有125个通道,最大数据速率为2MBps,理论最大射程为100米。您将需要两个这样的模块来建立通信链接。
销配置:
它基于SPI通信协议工作。你需要将8个引脚中的7个连接到Arduino才能使这个模块工作。
它工作在3.3 V和5V杀死模块,所以在供电时必须小心。幸运的是,我们在Arduino上安装了3.3V调压器,必须从Arduino的3.3V插座供电。
现在让我们转到发射机电路。
发射机电路:
电路由6个10K欧姆的电位器组成。6个电位器的中间端接A0到A5模拟输入引脚。
NRF24L01至Arduino连接示意图旁边给出了表格;如果您对电路图有任何混淆,可以参考。
该电路可以通过USB或9V电池通过直流插座供电。
请在这里下载图书馆文件:github.com/nRF24/
变送器程序:
//---------------------- 项目由R.Girish ------------------------//
#包括
# include < RF24.h >
#包括
RF24电台(9、10);
Const字节地址[6]= "00001";
#定义pot1 A0
#定义pot2 A1
#定义pot3 A2
#定义pot4 A3
#定义pot5 A4
#定义pot6 A5
常数int阈值=20;
int potValue1 = 0;
int-potValue2=0;
int potValue3 = 0;
int-potValue4=0;
int potValue5 = 0;
int-potValue6=0;
int angleValue1 = 0;
int angleValue2=0;
int angleValue3 = 0;
int angleValue4 = 0;
int angleValue5 = 0;
int angleValue6 = 0;
int check1=0;
int check2=0;
Int check3 = 0;
int check4=0;
Int check5 = 0;
int check6=0;
const char var1[32]=“Servo1”;
const char var2[32] = "Servo2";
const char var3[32] = " serv3 ";
const char var4[32] = "Servo4";
const char var5[32] = "Servo5";
const char var6[32] = "Servo6";
无效设置()
{
Serial.begin (9600);
radio.begin ();
radio.openWritingPipe(地址);
radio.setChannel (100);
无线电设置数据速率(RF24_250KBPS);
radio.setPALevel (RF24_PA_MAX);
停止收听;
}
无效循环()
{
potValue1 = analogRead (pot1);
if(potValue1 > check1 + threshold || potValue1 < check1 - threshold)
{
收音机。写(var1 sizeof (var1));
mapobjects = mapobjects (0, 0, 0, 0);
收音机。写(&angleValue1 sizeof (angleValue1));
check1 = potValue1;
以“输入:1”);
并同时“角度:”);
Serial.println(angleValue1);
系列。打印(“电压水平:”);
以potValue1);
以 ("----------------------------------");
}
potValue2=模拟读取(pot2);
if(potValue2 > check2 + threshold || potValue2 < check2 - threshold)
{
radio.write(&var2,sizeof(var2));
mapreduce = mapreduce (0, 0, 0, 0);
收音机。写(&angleValue2 sizeof (angleValue2));
check2 = potValue2;
以“输入:2”);
并同时“角度:”);
以angleValue2);
系列。打印(“电压水平:”);
以potValue2);
以 ("----------------------------------");
}
potValue3 = analogRead (pot3);
if(potValue3 > check3 + threshold || potValue3 < check3 - threshold)
{
收音机。写(&var3 sizeof (var3));
angleValue3=地图(potValue3,01023,0180);
收音机。写(&angleValue3 sizeof (angleValue3));
check3 = potValue3;
以“输入:3”);
并同时“角度:”);
以angleValue3);
系列。打印(“电压水平:”);
以potValue3);
以 ("----------------------------------");
}
potValue4=模拟读取(pot4);
if(potValue4 > check4 + threshold || potValue4 < check4 - threshold)
{
收音机。写(&var4 sizeof (var4));
mapobjects = mapobjects (0, 0, 0, 0);
radio.write(&angleValue4,sizeof(angleValue4));
check4=potValue4;
以“输入:4”);
并同时“角度:”);
以angleValue4);
系列。打印(“电压水平:”);
以potValue4);
以 ("----------------------------------");
}
potValue5 = analogRead (pot5);
if(potValue5 > check5 + threshold || potValue5 < check5 - threshold)
{
收音机。写(&var5 sizeof (var5));
mapobjects = mapobjects (0, 0, 0, 0);
收音机。写(&angleValue5 sizeof (angleValue5));
check5=potValue5;
以“输入:5”);
并同时“角度:”);
以angleValue5);
系列。打印(“电压水平:”);
以potValue5);
以 ("----------------------------------");
}
potValue6 = analogRead (pot6);
if(potValue6 > check6 + threshold || potValue6 < check6 - threshold)
{
radio.write(&var6,sizeof(var6));
angleValue6=映射(potValue6,01023,0180);
收音机。写(&angleValue6 sizeof (angleValue6));
check6=potValue6;
以“输入:6”);
并同时“角度:”);
以angleValue6);
系列。打印(“电压水平:”);
以potValue6);
以 ("----------------------------------");
}
}
//---------------------- 项目由R.Girish ------------------------//
发射机到此结束。
接收方:
接收器电路由6个伺服电机、1个Arduino和2个独立电源组成。
的伺服电机需要更高的电流才能运行,因此不得由arduino供电. 这就是为什么我们需要两个独立的电源。
请适当地给伺服施加电压;对于微型伺服电机4.8V就足够了,如果要给体积较大的伺服电机供电,请根据伺服电机的额定电压匹配。
请记住,伺服电机即使在没有时刻也会消耗一些功率,那是因为伺服电机的手臂总是在它的评论位置对抗任何变化。
接收机方案。
//---------------------- 项目由R.Girish ------------------------//
#包括
# include < RF24.h >
#包括
# include < Servo.h >
RF24电台(9、10);
Const字节地址[6]= "00001";
伺服servo1;
伺服servo2;
伺服servo3;
伺服servo4;
伺服servo5;
伺服servo6;
Int angle1 = 0;
内角2=0;
Int angle = 0;
Int angle = 0;
Int angle = 0;
Int angle = 0;
字符输入[32]=“”;
const char var1[32]=“Servo1”;
const char var2[32] = "Servo2";
const char var3[32] = " serv3 ";
const char var4[32] = "Servo4";
const char var5[32] = "Servo5";
const char var6[32] = "Servo6";
无效设置()
{
Serial.begin (9600);
servo1.attach (2);
servo2.attach (3);
servo3.attach (4);
4.连接(5);
servo5.attach (6);
servo6.attach (7);
radio.begin ();
收音机。openReadingPipe(0,地址);
radio.setChannel (100);
无线电设置数据速率(RF24_250KBPS);
radio.setPALevel (RF24_PA_MAX);
收音机;
}
无效循环()
{
延迟(5);
而(! radio.available ());
radio.read(&input,sizeof(input));
如果((strcmp(输入、var1) = = 0))
{
而(! radio.available ());
收音机。读(&angle1 sizeof (angle1));
servo1.write (angle1);
Serial.println(输入);
并同时“角度:”);
以angle1);
以 ("--------------------------------");
}
否则如果((strcmp(输入,var2)==0))
{
而(! radio.available ());
收音机。读(&angle2 sizeof (angle2));
servo2.write (angle2);
Serial.println(输入);
并同时“角度:”);
序列号println(angle2);
以 ("--------------------------------");
}
否则如果((strcmp(输入,var3)==0))
{
而(! radio.available ());
收音机。读(&angle3 sizeof (angle3));
servo3.write (angle3);
Serial.println(输入);
并同时“角度:”);
序列号:println(angle3);
以 ("--------------------------------");
}
Else if((strcmp(input,var4) == 0))
{
而(! radio.available ());
收音机。读(&angle4 sizeof (angle4));
servo4.write (angle4);
Serial.println(输入);
并同时“角度:”);
序列号println(angle4);
以 ("--------------------------------");
}
Else if((strcmp(input,var5) == 0))
{
而(! radio.available ());
收音机。读(&angle5 sizeof (angle5));
servo5.write (angle5);
Serial.println(输入);
并同时“角度:”);
序列号。打印号(5);
以 ("--------------------------------");
}
Else if((strcmp(input,var6) == 0))
{
而(! radio.available ());
收音机。读(&angle6 sizeof (angle6));
servo6.write (angle6);
Serial.println(输入);
并同时“角度:”);
序列号。打印号(6);
以 ("--------------------------------");
}
}
//---------------------- 项目由R.Girish ------------------------//
这就是接收者的结论。
该项目如何运作:
•为两个电路供电。
现在旋转电位器的任何一个旋钮。
•例如第三位电位器,接收器上相应的伺服器会旋转。
适用于所有伺服电机和电位器。
注:您可以将变送器连接到计算机上,打开串行监视器来查看伺服电机的角度,模拟引脚的电压水平,以及哪个电位器正在运行。
如果您对这个基于Arduino的无线伺服电机项目有任何具体的问题,请在评论区表达,您可能会得到快速的回复。
Arso说
感谢您的项目…但为什么伺服电机移动缓慢…不与电位计一起移动
赃物说
抱歉,我无法排除Arduino故障,因为我不是Arduino的专家
Arso说
请. .你能检查一下我的代码吗?openReadingPipe(0,地址))不工作与我的旧版本arduino程序…我更改为这个(radio.openReadingPipe(0,0xF0F0F0F0);)但当工作伺服电机移动缓慢…不与电位器移动..它有任何解决?
赃物说
不好意思,我无法检查,但是你可以参考这个链接到Arduino。Cc论坛和问他们关于这个问题,他们肯定会帮助你解决
刘说
你好
我有一个关于Arduino项目的问题。
我可以用flex传感器更换电位计并添加加速计吗?
赃物说
嗨,你也许可以在下面文章提供的指导下尝试一下:
//www.addme-blog.com/how-flex-resistors-work/
Wero说
非常感谢。
wero说
嗨
下午好,白天好
我想问一下在哪里可以下载合适的nRF24L01收发器库?
赃物说
你好,请尝试下面的链接,让我知道它是否OK
//www.addme-blog.com/rf24/
红豆杉说
嗨,只是想跟你确认一下。
是否可以再增加3台伺服电机?
因为我的项目需要8台伺服电机。
赃物说
我会把你的问题转给Mr. GR,他会尽快回复你
GR说
嗨,紫杉,
是的,8伺服是可能的,但Arduino Uno不行。你需要Arduino Mega和必要的更改的代码。
问候
红豆杉说
嗨
很抱歉再次询问,因为之前我的项目条件没有提到。
我使用Arduino Mega通过nRF24L01收发器独立控制8个带有8个模拟传感器的伺服电机。
使用一个地址是否可以达到这种情况?
GR说
嗨,紫杉,
是的,这是可能的。
我们将尝试更新代码。
问候
Naseef说
它的值域是多少?
Naseef说
我可以使用arduino nano吗?
赃物说
对不起,我不太确定,也许你可以用它。
Naseef说
我想在一个通道中使用马达。我可以吗?
赃物说
是的,那是可能的…
Naseef说
我对它很感兴趣。它会起作用的。你测试过吗。
毗湿奴说
这条线路可以像四架直升机一样工作
赃物说
由于重量比问题,伺服电机不能用于四旋翼直升机,它必须是无刷直流电机
毗湿奴说
请给我推荐一个低成本的四旋翼直升机电路
赃物说
您可以浏览此页面
//www.addme-blog.com/?s=quadcopter
詹姆斯说
这篇文章非常有帮助,但是您的代码永远不会工作。伺服需要PWM引脚,只有引脚3,5,6,9,10和11可以用于伺服。
GR说
你好,詹姆斯,
伺服电机将工作在任何引脚,如果你使用“Servo .h”库。
提议的项目是经过充分检验的。
问候
GR说
你好
我没有ATTiny85的经验,所以我不能给你一个解决方案。
问候