在这篇文章中,我们将构建一个无线伺服电机电路,它可以在2.4GHz通信链路上无线控制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电压调节器上有3.3V电压调节器,它必须仅由Arduino的3.3V插座供电。
现在让我们转到发射机电路。
变送器电路:
该电路由6个10K欧姆值的电位计组成。6个电位计的中间端子连接至A0至A5模拟输入引脚。
NRF24L01至Arduino连接示意图旁边给出了表格;如果您对电路图有任何混淆,可以参考。
该电路可以通过DC插孔从USB或9V电池供电。
请在此处下载库文件:github.com/nrf24/
变送器程序:
// ----------------------由r.girish开发的计划------------------------ //
#包括
#include
#包括
RF24收音机(9,10);
const字节地址[6] =“00001”;
#定义pot1 A0
#定义pot2 A1
#定义pot3 A2
#定义pot4 A3
#define pot5 a4
#define 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] =“servo3”;
const char var4 [32] =“servo4”;
const char var5[32]=“Servo5”;
const char var6[32]=“Servo6”;
无效设置()
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(地址);
无线电.设置频道(100);
无线电设置数据速率(RF24_250KBPS);
radio.setpalevel(rf24_pa_max);
停止收听;
}
void循环()
{
Potvalue1 = Analogread(Pot1);
如果(potValue1>check1+阈值| | potValue1
radio.write(&var1,sizeof(var1));
AngleValue1 = Map(Potvalue1,0,1023,0,180);
电台.Write(&snightvalue1,sizeof(Anstanvalue1));
check1 = potvalue1;
Serial.println(“输入:1”);
serial.print(“角度:”);
Serial.println(angleValue1);
serial.print(“电压水平:”);
序列号.println(potValue1);
Serial.println(“-----------------------------------”);
}
potValue2=模拟读取(pot2);
如果(potValue2>check2+阈值| | potValue2
radio.write(&var2,sizeof(var2));
AngleValue2 = Map(Potvalue2,0,1023,0,180);
radio.write(&angleValue2,sizeof(angleValue2));
check2 = potvalue2;
Serial.println(“输入:2”);
serial.print(“角度:”);
serial.println(Alargevalue2);
serial.print(“电压水平:”);
序列号.println(potValue2);
Serial.println(“-----------------------------------”);
}
Potvalue3 = Analogread(Pot3);
如果(potValue3>check3+阈值| | potValue3
radio.write(&var3,sizeof(var3));
angleValue3=地图(potValue3,01023,0180);
radio.write(&angleValue3,sizeof(angleValue3));
check3 = Potvalue3;
serial.println(“输入:3”);
serial.print(“角度:”);
serial.println(Anglevalue3);
serial.print(“电压水平:”);
序列号.println(potValue3);
Serial.println(“-----------------------------------”);
}
potValue4=模拟读取(pot4);
if(potvalue4> check4 +阈值|| Potvalue4
Radio.Write(&var4,sizeof(var4));
AngleValue4 = Map(Potvalue4,0,1023,0,180);
radio.write(&angleValue4,sizeof(angleValue4));
check4=potValue4;
serial.println(“输入:4”);
serial.print(“角度:”);
serial.println(Alartvalue4);
serial.print(“电压水平:”);
序列号.println(potValue4);
Serial.println(“-----------------------------------”);
}
potValue5=模拟读取(pot5);
if(potvalue5> check5 +阈值|| potvalue5
radio.write(&var5,sizeof(var5));
angleValue5=地图(potValue5,01023,0180);
电台.write(&snightvalue5,sizeof(standvalue5));
check5=potValue5;
serial.println(“输入:5”);
serial.print(“角度:”);
serial.println(Anglevalue5);
serial.print(“电压水平:”);
serial.println(Potvalue5);
Serial.println(“-----------------------------------”);
}
potValue6=模拟读取(pot6);
if(potvalue6> check6 +阈值|| Potvalue6
radio.write(&var6,sizeof(var6));
angleValue6=映射(potValue6,01023,0180);
电台.write(&snightvalue6,sizeof(standvalue6));
check6=potValue6;
serial.println(“输入:6”);
serial.print(“角度:”);
Serial.println(angleValue6);
serial.print(“电压水平:”);
serial.println(Potvalue6);
Serial.println(“-----------------------------------”);
}
}
// ----------------------由r.girish开发的计划------------------------ //
发射机到此结束。
接收人:
接收器电路由6个伺服电机,一个Arduino和两个单独的电源组成。
这个伺服电机需要更高的电流才能运行,因此不得由arduino供电. 这就是为什么我们需要两个独立的电源。
请适当地对伺服施加电压;对于微型伺服电机,4.8V就足够了,如果您想为体积更大的伺服电机供电,请将电压与伺服电机的额定值相匹配。
请记住,即使没有时刻,伺服电机也会消耗一些功率,这是因为伺服电机的ARM始终与评论后的位置发生任何变化。
接收机程序:
// ----------------------由r.girish开发的计划------------------------ //
#包括
#include
#包括
#include
RF24收音机(9,10);
const字节地址[6] =“00001”;
伺服伺服1;
servo servo2;
伺服3;
伺服4;
伺服5;
伺服6;
int角度1 = 0;
内角2=0;
int角度3 = 0;
内角4=0;
内角5=0;
内角6=0;
字符输入[32]=“”;
const char var1[32]=“Servo1”;
const char var2[32]=“Servo2”;
const char var3 [32] =“servo3”;
const char var4 [32] =“servo4”;
const char var5[32]=“Servo5”;
const char var6[32]=“Servo6”;
无效设置()
{
Serial.begin(9600);
伺服1.连接(2);
servo2.attach(3);
3.连接(4);
4.连接(5);
servo5.attach(6);
Servo6.Attach(7);
radio.begin();
radio.openReadingPipe(0,地址);
无线电.设置频道(100);
无线电设置数据速率(RF24_250KBPS);
radio.setpalevel(rf24_pa_max);
收音机;
}
void循环()
{
延误(5);
而(!radio.available());
radio.read(&input,sizeof(input));
if((strcmp(输入,var1)==0))
{
而(!radio.available());
radio.read(&discle1,sizeof(Ansta1));
servo1.write(角度1);
Serial.println(输入);
serial.print(“角度:”);
序列号。打印号(1);
serial.println(“-----------------------------”);
}
否则如果((strcmp(输入,var2)==0))
{
而(!radio.available());
radio.read(&discle2,sizeof(aplate2));
servo2.write(角度2);
Serial.println(输入);
serial.print(“角度:”);
序列号println(angle2);
serial.println(“-----------------------------”);
}
否则如果((strcmp(输入,var3)==0))
{
而(!radio.available());
radio.read(&angle3,sizeof(angle3));
servo3.write(角度3);
Serial.println(输入);
serial.print(“角度:”);
序列号:println(angle3);
serial.println(“-----------------------------”);
}
否则如果((strcmp(输入,var4)==0))
{
而(!radio.available());
radio.read(&discle4,sizeof(Ansta4));
servo4.write(角度4);
Serial.println(输入);
serial.print(“角度:”);
序列号println(angle4);
serial.println(“-----------------------------”);
}
else if((strcmp(输入,var5)==0))
{
而(!radio.available());
radio.read(&angle5,sizeof(angle5));
servo5.write(角度5);
Serial.println(输入);
serial.print(“角度:”);
序列号。打印号(5);
serial.println(“-----------------------------”);
}
否则if((strcmp(输入,var6)== 0))
{
而(!radio.available());
radio.read(&angle6,sizeof(angle6));
servo6.write(角度6);
Serial.println(输入);
serial.print(“角度:”);
序列号。打印号(6);
serial.println(“-----------------------------”);
}
}
// ----------------------由r.girish开发的计划------------------------ //
这就是接收者的结论。
如何操作本项目:
•为两个电路供电。
•现在旋转任何一个电位计的旋钮。
•例如第3电位器,接收器处的相应伺服旋转。
•这适用于所有伺服电机和电位计。
注意:您可以将发射器连接到计算机,打开串行监视器,以查看伺服电机的角度,模拟引脚的电压电平以及当前运行哪些电位计。
如果您对这个基于Arduino的无线伺服电机项目有任何具体问题,请在评论部分说明,您可能会收到快速回复。
感谢您的项目…但为什么伺服电机移动缓慢…不与电位计一起移动
抱歉,我无法排除Arduino故障,因为我不是Arduino的专家
请......你能检查我的代码,因为这部分伺服电机慢慢移动,,,没有移动电位器..有任何解决方案吗?
很抱歉,我无法查看,但是您可以将此链接转到Arduino.cc论坛,并询问他们有关问题的信息,他们肯定会帮助您解决问题
你好
我有一个关于arduino项目的问题。
我可以用flex传感器更换电位计并添加加速计吗?
您好,您或许可以在以下文章中提供的说明的帮助下进行尝试:
//www.addme-blog.com/how-flex-resistors-work/
非常感谢。
你好
下午好,白天好
我想问我在哪里可以下载合适的NRF24L01收发器库?
您好,请尝试下面的链接,并让我知道是否可以
//www.addme-blog.com/rf24/
嗨,只想咨询你。
是否可以再增加3个伺服电机?
因为我的项目需要8个伺服电机。
我会把你的问题转发给Gr先生,他会尽快回复你
嗨,紫杉,
是8伺服是可能的,但不与Arduino Uno。您需要对代码进行Arduino Mega和必要的更改。
当做
你好
我很抱歉再次询问,因为我的项目条件之前没有适当提及。
我使用Arduino Mega通过nRF24L01收发器独立控制8个伺服电机和8个模拟传感器。
使用一个地址是否可以达到这种情况?
嗨,紫杉,
是的,这是可能的。
我们将尝试更新代码。
当做
它的范围呢?
我能用arduino nano吗?
对不起,我不确定它......最可能你可以使用它......
我想在其中一个频道使用马达。我可以吗?
是的,那是可能的…
我对它很感兴趣。它会起作用的。你测试过吗。
这条线路可以像四架直升机一样工作
由于重量比问题,伺服电机不能用于四旋翼直升机,它必须是无刷直流电机
请给我推荐一个低成本的四旋翼直升机电路
您可以探索此页面
https://www.homemade-circulay.com/?s=quadcopter.
这篇文章很有帮助,但是你的代码永远不会工作。伺服需要PWM引脚,只有引脚3、5、6、9、10和11可用于伺服。
嗨,詹姆斯,
如果您使用“伺服器”库,则伺服电机将在任何PIN上工作。
拟议的项目经过了充分的测试。
当做
你好
我没有Attiny85没有经验,所以我无法建议你解决方案。
当做