在本教程中,我们将学习如何制作一个基于Arduino的RC接收器。自从我在之前的一个视频中制作了我的DIY Arduino RC发射器,我收到了很多来自你们的请求,为它制作一个专用接收器,所以这就是。
作为第三个例子,我将向你展示我如何修改和使用这个基于Arduino的RC系统来控制一辆商用RC车。
Arduino RC接收器电路图
首先,让我们看一下这个系统的电路图。无线电通信是基于NRF24L01收发模块。
发射器不断地从它的控制器、操纵杆、按钮、电位器和拨动开关发送数据,我们用接收器接收这些数据。为更多的细节这个Arduino发射器如何工作你可以查看我的其他详细教程。
我们还可以在此处注意到,此RC接收器不一定仅使用我构建的此特定发射机。它可以使用由Arduino板和NRF24L01模块组成的任何其他类似的设置。
尽管如此,该RC接收器的大脑是Arduino Pro Mini板。为了供电,我们可以使用我们可以连接5V的VCC引脚,或者我们可以从6到12V连接到的原始引脚。请注意,有两个版本的Arduino Pro Mini,就像我在此处使用的那样在5V下运行,另一个在3.3V下运行。另一方面,NRF24L01模块在3.3V下运行,因此我们需要一个电压调节器。这次我正在使用AMS1117电压稳压器,其从输入的输入输出3.3V,范围为5V至12V。
您可以从下面的链接获取此Arduino RC接收器所需的组件:
- NRF24L01收发器模块...... .........亚马逊/伯格多德/阿里巴巴全球速卖通
- nrf24l01 + pa + lna ...................... ......。亚马逊/伯格多德/阿里巴巴全球速卖通
- AMS1117 3.3V电压调节器...........亚马逊/伯格多德/阿里巴巴全球速卖通
- Pin Headers Male + Female ....................亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Pro Mini .................. ...... ..........亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Pro Mini就像我用的......易趣
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
为了与Arduino进行通信,NRF24L01模块使用SPI协议以及两个额外的数字引脚。这意味着我们留下了9个数字引脚,可以用作输出通道,其中两个是Rx和TX引脚。值得注意的是,在我们将草图上传到Arduino板时,这些引脚必须与任何内容断开连接,因此我可以通过单独的引脚标头连接或断开连接。实际上,我们还可以使用模拟输入作为数字输出,因此虽然这个arduino板很小,但我们得到了充足的输出或通道。
PCB设计
然而,为了保持这个电路的紧凑,我使用EasyEDA免费在线电路设计软件制作了一个定制的PCB。在这里,我把8个通道安排在一个5V和一个地轨旁边,这样我们就可以直接把伺服和ecs连接到它们上。通道编号9位于单独的位置,靠近Arduino的VCC引脚,所以我们可以使用一个ESC为Arduino供电,它的电池消除器电路功能提供5V。当然,我们可以使用任何其他通道的目的,因为VCC引脚是连接到那些5V轨道以及。
至于通道7和8,我们可以在这里看到这些引脚头是如何被中断的。如果我们想使用它们,我们只需要把两个引脚连接在一起。编程头位于右上角,100uF电容为电压调节器和NRF24L01模块提供服务。在PCB的左下角,我放置了模拟引脚。
在这里,我们可以注目更多的是,这就是一些Arduino Pro Mini板可能具有不同的针脚,因此我包含一个版本的PCB,因此您可以选择与Arduino Pro Mini Coard匹配的那个版本。
这是一个链接该PCB的项目文件.因此,一旦完成设计,我就生成了制造PCB所需的格柏文件。
格柏文件:
然后我从JLCPCB订购PCB他们也是本期视频的赞助商。
在这里,我们可以简单地拖放Gerber文件并一旦上传,我们可以在Gerber Viewer中查看我们的PCB。如果一切都正确,那么我们可以继续选择我们想要的PCB的属性。就是这样,现在我们可以以合理的价格简单地订购我们的PCB。请注意,如果它是jlcpcb的第一个订单,您只需2美元即可获得5个PCB即可。
印刷电路板组装
几天后pcb就到了。pcb的质量是伟大的,一切都是完全相同的设计。
现在我们可以继续组装PCB了。首先,我们需要焊接Arduino板的引脚头。一个方便的方法是用一个面包板把引脚钉在上面,这样板在焊接时就会牢牢地固定在那里。就像我之前说的,取决于你的板,引脚可能会有所不同,所以在焊接时要记住这一点。
此外,我们需要一些接地引脚,我们需要留下免费,因为它们在它们下面的PCB上运行了一些迹线。一旦我焊接了Arduino板,我就会切断销钉的过剩长度。
接下来,我将所有其他引脚标头放置在适当位置。我们需要雄性和女性PIN标头,或者实际上取决于您将选择使用的PIN标头。然而,使用用于数字频道的雄性别针作为伺服电机以及ESC连接是女性的,是好主意,因此我们可以轻松连接它们。
电压调节器是表面安装部件,所以我使用一些蓝色粘性粘合剂在焊接时将其固定到位。最后,一旦我们将两个电容焊接到位,我们就可以将NRF24L01模块安装到适当的PIN标头。
根据应用,或者我们需要的范围,我们可以使用普通的模块与机载天线,或者我们可以附加一个更大的天线,可以实现在开放空间高达700米的无线通信。好了,我们的Arduino RC Receiver现在已经准备好了,我们可以用它来做任何我们想要的事情。
为了对接收器进行编程,或将Arduino Pro Mini连接到计算机,我们可以使用USB到串行UART接口,该接口可以连接到编程标题。
在Arduino IDE工具菜单中,我们需要选择Arduino Pro或Pro Mini板,选择合适的处理器版本,选择端口,选择“USBasp”的编程方法。
所以现在我们能够将代码上传到Arduino。
示例1 - Arduino RC汽车
好的,现在我们可以继续前进并查看第一个例子。
这是一辆简单的汽车,由两个12V直流电机组成,在我之前的一些视频中,我已经向你展示了它的工作原理和如何建造它。betway
这次我们将使用我们新的Arduino RC接收器来控制它。为了驱动直流电机,我们使用了L298N电机驱动器,为了供电,我们使用了3个锂离子电池,提供大约12V的电压。
你可以从下面的链接中获得这个例子所需的组件:
- L298N司机....................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 12V高扭矩直流电机............ ..亚马逊/伯格多德/阿里巴巴全球速卖通
- 直流电动机W /塑料轮胎轮胎......亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳线............亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
因此,连接真的很简单,从电池中推出的12V在我们的接收器上转到12V引脚,驾驶员的六个控制销转到6个通道。我们需要注意的是,为了能够控制电机的速度,我们需要向启用A和使能驾驶员的B引脚提供PWM信号。在我们的接收器中,通道编号2,3,6和9可以输出PWM信号,因此在这种情况下,我将驱动器的使能引脚连接到通道数2和6。
我们现在看看Arduino代码。
/ * Arduino RC接收器 - Dejan的汽车示例,www.howtomechatronibet188官方网站cs.com库:tmrh20 / rf24,https://github.com/tmrh20/rf24/ * / #include#include #include #define ena 9 // Arduino Pin D9 - CH6在PCB板上 - PWM输出#define In1 8 // D8 - CH5 #define In2 7 // D7 - CH4 #define In3 6 // D6 -CH3 #define In4 // D4 - CH1 #define eNB 5 // D5 - CH2 - PWM输出RF24收音机(3,2);// nRF24L01 (CE, CSN) const byte address[6] = "00001";unsigned long lastReceiveTime = 0;unsigned long currentTime = 0;struct Data_Package {byte j1PotX; //该结构体的最大大小为32字节字节j1PotY;字节j1Button;字节j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure int steering, throttle; int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); //Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver resetData(); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Parse the data from the Joystic 1 to the throttle and steering variables throttle = data.j1PotY; steering = data.j1PotX; // Throttle used for forward and backward control // Joystick values: 0 to 255; down = 0; middle = 127; up = 255 if (throttle < 110) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(throttle, 110, 0, 0, 255); motorSpeedB = map(throttle, 110, 0, 0, 255); } else if (throttle > 140) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(throttle, 140, 255, 0, 255); motorSpeedB = map(throttle, 140, 255, 0, 255); } // If joystick stays in middle the motors are not moving else { motorSpeedA = 0; motorSpeedB = 0; } // Steering used for left and right control if (steering < 110) { // Convert the declining steering readings from 140 to 255 into increasing 0 to 255 value int xMapped = map(steering, 110, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (steering > 140) { // Convert the increasing steering readings from 110 to 0 into 0 to 255 value int xMapped = map(steering, 140, 255, 0, 255); // Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255 if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }
描述:因此,首先,我们需要包括SPI和RF24库,定义一些引脚,无线电对象和我们将从发射器存储传入数据的数据结构。在设置部分中,我们需要定义引脚输出并开始无线电通信。欲了解更多详细信息,这是如何运作的,并且每个这些线路所做的,您可以查看我的详细的NRF24L01教程.
在循环部分中,我们不断检查我们是否正在接收数据,如果我们这样做,我们读取了该传入数据。如果我们快速查看变送器代码,我们可以看到它发送到接收器的数据。它从所有控制器,操纵杆,电位器和按钮中读取数据,并将该数据作为单个包发送到接收器。
所以,一旦我们读到数据,我们就可以用它做任何我们想要的事情。在这种情况下,我们将使用操纵杆1y轴值来控制节气门和x轴值以控制转向。我将此数据放入单独的节流阀和转向变量。我们从操纵杆中获得的值是0到255.所以,如果我们向下移动操纵杆,我们将适当地设置驱动器控制引脚,以便汽车向后移动,并使用节气电值来控制运动速度。相同的原则适用于向前,向左和向右驱动。同样,我已经有详细的教程有关如何运行的工作方式,以便您能够检查出来以便更好地理解。在代码的底部,我们可以注意到resetData()自定义函数,它将所有值重置为初始默认值,以便在无线电通信丢失,汽车将点播。
例2 - Arduino RC接收器伺服和无刷电机控制
好吧,现在我们可以使用第二个例子,使用此Arduino RC接收器控制伺服和无刷电机。
对于控制无刷电机,我们需要ESC或电子速度控制器。Arduino只需单个引脚与ESC通信。为了控制ESC,Arduino将特定的PWM信号发送到ESC,并且ESC控制电动机速度。具有相同连接的ESC通过其电池消除器电路功能提供5V,因此我们也可以使用它为我们的接收器供电。
至于伺服电机,它们具有与ESC相同类型的连接,我们可以简单地将它们附加到可用的任何通道。
你可以从下面的链接中获得这个例子所需的组件:
- 无刷电机 .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- ESC 30 ................................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 李宝电池........................ ...... ...... ...... ...... ......亚马逊/伯格多德/阿里巴巴全球速卖通
- MG996R伺服电机........................亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
用ESCs控制伺服电机和无刷电机的输入信号几乎是相同的。他们使用特定的50Hz PWM信号,可以很容易地使用Arduino伺服库生成。
注意:使用此设置使用MG996R Servos时,它们可能会导致电路中的问题并刻录Arduino Pro Mini。可能绘制更高的电流,并且可能导致5V轨道的电压尖峰。Arduino Pro Mini应该在5V引脚处理高达5.5V,但当那些可能燃烧Arduino的尖峰时。在测试电路时,我有这个问题,评论部分中的某人也报告了相同的。对此的解决方案可能会在伺服伺服电容上放置更大的解耦电容,但我不太确定,我没有测试它。所以请注意这个问题。
另一方面,在这个例子中,我使用了另外两个没有烧毁Arduino的MG996R伺服,我猜是因为它们没有造成如此高的峰值。我还使用了这个例子与4个较小的S90伺服,它没有任何问题。
/ * DIY RC接收器 - 伺服和无刷电机由Dejan控制,www.www.mfxpo.com库:TMRH20 / RF2bet188官方网站4,HTTPS://github.com/tmrh20/rf24/ * / #include#include #include #include rf24收音机(3,2);// nRF24L01 (CE, CSN) const byte address[6] = "00001";unsigned long lastReceiveTime = 0;unsigned long currentTime = 0;伺服Esc;//创建伺服对象以控制ESC Servo Servo1;servo servo2;int escvalue,servo1value,servo2value;//此结构的最大大小为32字节 - NRF24L01缓冲区限制结构DATA_PACKAGE {BYTE J1POTX;字节j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver resetData(); esc.attach(10); // Arduino digital pin D10 - CH9 on PCB board servo1.attach(4); // D4 - CH1 servo2.attach(5); // D5 - CH2 } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Controlling servos servo1Value = map(data.j2PotX, 0, 255, 0, 180); // Map the receiving value form 0 to 255 to 0 to 180(degrees), values used for controlling servos servo2Value = map(data.j2PotY, 0, 255, 0, 180); servo1.write(servo1Value); servo2.write(servo2Value); // Controlling brushless motor with ESC escValue = map(data.j1PotY, 127, 255, 1000, 2000); // Map the receiving value form 127 to 255 to 1000 to 2000, values used for controlling ESCs esc.writeMicroseconds(escValue); // Send the PWM control singal to the ESC } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }
因此,在从发送器接收到数据后,我们将0到255的值转换为0到180的值,用于使用Write()函数来控制伺服单。我们将数据转换为从1000到2000的值控制ESC的数据。在此示例中,我们将此ESC从操纵杆编号1的中间点控制到UP位置,因此我们将值从中间转换,127至255分为1000至2000的值。使用伺服库编写iconicroseconds()函数我们将PWM信号发送到ESC,因此我们可以控制无刷电机的速度从最小到最大值。
所以,这就是我们如何RC控制飞机因为他们通常使用这种类型的电机,伺服电机和无刷电机。
示例3 - RC汽车模型控制
RC汽车带有自己的控制器,可以控制前轮向左和向右移动,以及向前移动车辆。
然而,因为它是一辆便宜的RC汽车,控制是数字的,或要么打开或关闭,以最大位置左和右和最大速度。尽管如此,我还是拆开了车,看看里面有什么,以及我如何实现Arduino RC接收器来控制它。
一旦我发现电子元件,我注意到这两个电机实际上是在5V处运行的简单直流电动机。即使是控制转向运动有限运动的前电机也是一个简单的连续旋转直流电动机。
显然,我们已经知道如何控制直流电机,所以用我们的DIY Arduino接收器替换电路板将是非常容易的。除了我们的接收器,我们只需要一个电机驱动器,能够同时驱动两个电机。有许多选项可用于此目的,甚至包括我们在第一个示例中使用的L298N驱动程序。
但是,这个应用程序对于这个应用程序来说太大了,因此我选择了MX1508电机驱动器。这是一个简单的双直流电机驱动器,其具有H-Bridge和PWM控制。它有4个控制输入引脚,电机4个引脚,以及2个用于供电的引脚。
我拆电机连接从RC汽车电路板和焊接他们的司机。在背面,我焊接了电源引脚,现在剩下的是连接这个驱动器和接收器。这款RC汽车的动力来自4.8V镍镉电池位于汽车底部。
因此,使用跳线I将这些引脚连接到Arduino的VCC引脚,并将驱动器的4个控制输入引脚连接到4个数字通道。正如我所说,该驱动器支持PWM控制,因此对于电机B,或后电机,我使用了PWM通道编号2和3。
你可以从下面的链接中获得这个例子所需的组件:
- MGRC RC汽车 .......................................亚马逊/伯格多德/阿里巴巴全球速卖通
- MX1508直流电机驱动..................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳线............亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
这个RC车的代码与第一个例子非常相似。
/ * Arduino RC接收机控制由德扬- RC模型,www.HowToMechatronics.com图书馆bet188官方网站:TMRh20 / RF24, https://github.com/tmrh20/RF24/ * / # include < SPI.h > # include < nRF24L01.h > # include < RF24.h > # define in3 5 / / D5 - CH2 - PWM输出# define in4 6 / / D6 - CH3 PWM输出# define in1 7 / / D7 - CH4 #定义in2 8 / / D8 - CH5 RF24电台(3 2);// nRF24L01 (CE, CSN) const byte address[6] = "00001";unsigned long lastReceiveTime = 0;unsigned long currentTime = 0;struct Data_Package {byte j1PotX; //该结构体的最大大小为32字节字节j1PotY;字节j1Button;字节j2PotX;字节j2PotY;字节j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure int steering, throttle; int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver resetData(); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Parse the data from the Joystic 1 to the steering and throttle variables steering = data.j2PotX; throttle = data.j1PotY; // Throttle used for forward and backward control if (throttle < 110) { // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedB = map(throttle, 110, 0, 0, 255); // Set Motor B backward analogWrite(in3, motorSpeedB); digitalWrite(in4, LOW); } else if (throttle > 140) { // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedB = map(throttle, 140, 255, 0, 255); // Set Motor B forward digitalWrite(in3, LOW); analogWrite(in4, motorSpeedB); } // If joystick stays in middle the motors are not moving else { digitalWrite(in3, HIGH); digitalWrite(in4, HIGH); } // steering used for left and right control if (steering < 110) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); } if (steering > 140) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } // If joystick stays in middle the motors are not moving else { digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); } } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }
我们使用来自操纵杆的数据来控制RC汽车的节流阀和转向。为了向后移动我们使用AnivalWwrite()函数在输入的销钉上向驱动器发送PWM信号,而我们将输入4引脚保持为低电平。向前发展,我们这样做相反的方式。如果操纵杆留在中间,我们将命令驾驶员刹车或停止电机。相同的原理用于转向电机,虽然这里我们不必使用模拟程序()函数,因为我们不需要控制该电机的速度。
把这张草图上传到Arduino后,我不得不重新组装赛车。我把小驱动器放在里面的外壳和固定的其余部分的螺钉。我重新连接了接收器和司机,并把它放在汽车的外壳下,有足够的地方可以容纳接收器。
所以,不仅我们修改了这种RC汽车通过DIY RC发射器控制,而且通过添加PWM控制,所以现在我们还可以控制汽车的速度。如果您要修改的RC型号具有伺服和无刷电机而不是DC电机,可以遵循第二个示例中解释的方法。
我希望你喜欢这个教程并学会了新的东西。随意询问以下意见部分中的任何问题,不要忘记检查我的收藏Arduino项bet188me目.
嗨Dejan,
我希望你们所有人都健康,
我的新项目,这正是我一直在寻找,我几乎完成了发射机,我只需要把两个别针A4和A5短电缆上的针板,因为我使用Arduino pro迷你(旧版本)中无处可寻。
你的新项目
正是正确的,因为我们应该在德国留在家里。
这是我的第二个项目,第一个是测距仪和数字精神水平仪,我复制了,它工作得很好。
谢谢你的新项目,保持健康。
来自德国的热烈问候
沃尔夫冈•拉普
嘿,谢谢,我很高兴听你这么说!有有趣的建筑!
HY,
我昨天晚上订购了带有Gerber文件的电路板:DIY Arduino RC Receiver PCB v2 - Gerber文件
和JLCPCB支持,
支持者今早给我回信了。
嗨,先生
很多你的订单很多,谢谢〜
很抱歉打扰你,但是有一个问题我们想在进行之前和你确认一下。
如下图所示,只有一个设计,但是你订购了5个不同的设计,请问gerber文件是否上传错了?
你能帮我吗?
GR.
沃尔夫冈•拉普
嘿,我刚检查了PCB和格柏文件,它们看起来很好。我不确定发生了什么。也许尝试取消该订单并制作一个新的订单。请告诉我您是否设法订购PCB。
你好,
谢谢你的快速帮助,
我今天早上联系了JLCPCB,重新发送了zip文件。我还在等答案......
这是我从JLCPCB的第三个订单,从你的项目RC Sender和测距仪和数字精神水平仪的Gerber文件也是完美的........
我会尽快给你写信给你
问候
沃尔夫冈•拉普
你好,德扬,
您是否可以将您的发射器和接收器pcb的gerber文件导出为stp.文件?
我会非常欣赏这一点,所以我可以为两者打印定制案例!
遗憾的是,我不能仅仅使用gerber文件和融合,一个尝试和错误的方法使用图片将是可能的,但将浪费灯丝,这是现在更好地用于面罩!
再次,如果你能帮助,我会非常感激。
来自德国的问候
嘿,我没有PCB的.STP文件,我不确定如何制作一个。Gerber文件就是我所拥有的,另外我猜你已经检查了Easyeda项目文件,我不确定这是否会有任何帮助,但也许它会。您可以使用在那里获得精确尺寸的测量工具,但这与用手测量物理PCB相同。如果您想到任何其他想法,请告诉我如何制作.STP文件进行3D打印。
嗨Dejan,
你猜错了,这很有帮助!
我完全错过了easyeda项目链接及其构建的可供选择性,我能够将其导出为.dxf文件,它将可用于Fusion360!
谢谢你的提醒,现在我可以设计一个适当的案例
谢谢你!
你好,德扬,
一切都按照jlcpcb的董事会的顺序调节,我订购了5个董事会,但订购过程变成了5个订单,不知道这可能发生了这个问题,但现在一切都没问题,董事会被命令,现在它说载有.......
我有一个关于新项目的问题,你用电位器控制RC平面上的舵,可以微调它,草图应该是什么样的?
非常感谢你的帮助,
沃尔夫冈·鲁普(德国)
嘿,太好了!
是的,我们可以用电位计细腻的rc平面方向舵。我还将包含第二个电位器的灵敏度控制。我的意思是,我们可以添加许多功能,这就是我们如何编程接收器。
请继续关注,这个项目将在一两周后推出。
嗨Dejan,
我希望你们都很好,………
发射机已经完成,工作完美,一旦从气垫船的草图,工作很好...........
仅针对Arduino Pro Mini,新版本我必须为发射机板上的引脚4和5留两个电线......
我急切地等待你的新接收器项目......bet188me
祝你复活节快乐,身体健康
问候
沃尔夫冈·鲁普,德国人
嗨dejan.just一个快速问题。PCB单层或双层?因为我不知道从JLPCB订购时选择多少层。非常感谢您的帮助。
嘿,这是一个两层的PCB。
能够使用PAN和Arduino RC发射器和Arduino RC接收器倾斜电动滑块相机是一个很好的活动。你能做到这一点吗?这将是你的杰作。你好,很多赞美你的页面。
嘿,谢谢你的评论。这是真的,控制电动摄像机滑块项目与DIY RC发射器将是真的很棒。但我恐怕,目前我没有时间修改那个项目。在这种情况下,必须修改PCB和代码。这并不是说它太难了,也不是说它有太多的工作要做,这是一个简单的老项目,我现在不想再回去做了。无论如何,如果你很好地了解发射机和接收机的工作原理,你应该能够自己实现它。
嗨。伟大的项目!我有一个问题:如果我们使用两套相同的收发机,我们是否可以在同一频率下同时独立控制两种型号?
嘿,谢谢!是的,您可以更改代码中的“地址”变量的频道或名称。
嗨,我有一个
问题,还将其他伺服连接到reciver或仅sg90?
如果我使用其他伺服,Arduino pro mini有问题....
因为负载/放大器?......
当我的伺服MG995与接收器连接有arduino mini pro故障
他的功能然后不更多.....
你能帮我吗?
问候
沃尔夫冈•拉普
嘿,我很遗憾听到这个消息。但是发生了同样的事情。我虽然我使用的特定MG996R电机是一个问题。他们也出现了我的arduino。
我试了其他两个MG996R伺服,它工作。在飞机的例子中,我也尝试了4 SG90,它工作。
然而,我猜这个问题是目前的MG996R绘制,它们以某种方式导致电压尖峰更高,燃烧Arduino Pro Mini。
不太确定,但如果你在伺服器上放置更大的去耦电容可能有助于解决这个问题。
或者您可以使用单独的5V电源,而不是从PCB板上的5V。
抱歉给您带来不便。我也会在文章中添加此注释,因此人们会意识到这一点。
你好,
一切都很好,你的项目非常好,ardubet188meino pro mini 5v每个出口只能40mA,我有然后伺服单独提供电力,并且工作完美,也没有干扰,MG 995伺服,也与我的干扰造成。
一旦我MG 995伺服带有Arduino Pro Mini Connect,打扰了一些东西
如果我的项目是
完成我会发送视频,
我很高兴你的下一个新项目,并说谢谢你的帮助bet188me
问候
沃尔夫冈•拉普
嘿,Dejan,它是强制性的使用0.1 uf电容或任何其他值是好的。
你可以使用任何类似或接近它的东西。
先生,在这个项目里,我们可以用l298作为马达控制器吗
是的,你可以使用L298电机控制器结合这个RC接收器。
嗨,德扬。非常感谢你这个伟大的项目。我发现Arduino Pro mini无法提供足够的能量给MG996R。是否有可能在pcb上添加一个小型直流转换器?MP1584EN或mini360就是一个很好的例子。再次感谢你。
这是真的,Arduino Pro Mini无法为MG996R伺服提供足够的电源,因此向PCB添加DC转换器是好主意。
使用第二个例子的代码,我们可以控制有刷escs驱动最大不。的汽车
首先,Dejan,非常感谢你的伟大项目。我还建立了一个发射机和接收机,它工作得相当好(我仍然有问题与MPU6050)。
嗨Mahargha,
当然你可以控制刷刷escs。接收器简单地产生信号来控制esc或伺服的速度。但是-如果你用一个BEC电路使用多个esc -请断开其他escs的+5V电线,以确保使用单个5V电压供应。
我使用所有六个电位器产生了一个生成六个PWM信号的版本。尽管如此,我在发射机的代码中增加了20ms的延迟,以获得良好的结果 - 就像一个旧的RC控制设备每例如发送数据。20ms。没有这种延迟,它不起作用。我想,伺服库有一些问题来处理大量的设定点。
我还使用一个“字节”而不是8个字节来组合数字通道(8个开关),以减少要传输和接收的数据的大小。
来自卡塞尔/德国的最佳问候,
lothar.
嗨dejna.
我真的很喜欢你的网站和你的工作。我会有一个问题:这个伺服可以用这个rc接收器使用2个伺服和6个直流电机(以相同的速度)吗?
谢谢,Gábor。
嘿,谢谢!它有9个通道,所以是的,它可以同时控制2个伺服器和6个直流电机。