气缸是一个廉价而高效的执行元件,可以用它来轻松实现推拉动作。如何用Arduino控制它,甚至遥控它呢?接下来我们一起试验一下
最终装配图
原作者: JDSII 翻译整理:DIY百事
该项目的目标是通过射频传输远程控制连接到气缸的电磁阀。该系统依赖于两个 Arduino UNO,它们通过在 2.4GHz 范围内运行的 NRF24L01 无线模块进行无线通信。这些模块使用 Radiohead 库,可以充当发射器、接收器或收发器。在这个项目中,“客户端”Arduino 向“接收端”Arduino 发送信号,然后触发一个电磁阀将空气释放到双作用气缸中。代码可以很容易地操作,以获得各种不同的效果。
1 所需材料气动装置
- 带短行程、双作用活塞和 ⅛” NPT 连接的小型气缸
- 5 位2通,12v 电磁阀,带 1/8” NPT 端口
- ⅛” NPT 快速连接接头,用于 6 毫米管
- 用于 6 毫米管道的 ¼” NPT 快速连接接头
- 6 毫米管
- 气压调节阀
- 储气罐
- 黄铜球阀,带 ¼” NPT 端口 (2)
- 外螺纹和内螺纹 1/4" NPT 接头
- 铁氟龙胶带
Arduino 装置
- Arduino UNO (2) nrf24l01 2.4GHz 无线模块 (2)
- 用于 nrf24l01 模块的插座转接板(8 针)
- 轻触按钮
- 10kΩ 电阻 (2)
- TIP120 达林顿晶体管
- 整流二极管(1N4001)
- 跳线
- 面包板或 PCB (2)
- 9v 电池连接器和电池(为“客户端”Arduino 供电)
- 12v 可充电电池组(为“接收端”Arduino 和螺线管供电)添加提示问
气动元件
为了向气缸供气,我使用了 1个储气罐。一端装有灌装阀和公接头。另一端,它有一个调压阀和截止阀,用来对气缸供气。。
3 电磁阀
电磁阀
我选择使用 5 位2通、12v 电磁阀。因为它在 12v 上运行,所以它能够与 Arduino 共享电源并从 Arduino 的 VIN 引脚引出 12v 电源。我的电磁阀有 1/8" NPT 连接,但也有 1/4" 的品种可用。左侧的 3 个端口是进气口,位于两个排气口之间。我将排气口留空,但您可以通过添加消声器、流量控制阀或两者都要来获得更多功能。
第 4 步:Arduino #1“信号发送端”
Arduino #1“发送端”接线图
Arduino #1 发送端原理图
两个 Arduino 的代码都源自 Radiohead 库中包含的示例代码。Radiohead 库使得在两侧集成 nrf24l01 收发器模块变得更加容易。系统的“客户”端主要执行以下操作:
1) 使用“接收端”Arduino 设置匹配的发送/接收设置。
2) 初始化 RF 通信(如果通信失败,通过串口监视器发送错误消息)
3) 等待按钮按下(数字 I/O 引脚 2)
4)如果按下按钮,向“接收端”Arduino发送一条消息。
*不要忘记轻触按钮在接地端需要一个下拉电阻。我用了 10kΩ。
第 5 步:Arduino信息发送端代码
// nrf24_client<br>
/*
nrf24l01 Arduino
CE > D8
CSN > D10
SCK > D13
MO > D11
MI > D12
RO > Not used
GND > GND
VCC > 5V
*/
#include <SPI.h>
#include <RH_NRF24.h>
const int button = 2;
// Singleton instance of the radio driver
RH_NRF24 nrf24;
void setup()
{
Serial.begin(9600);
if (!nrf24.init())
Serial.println("init failed");
// Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
if (!nrf24.setChannel(125))
Serial.println("setChannel failed");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("setRF failed");
}
void loop()
{
if (digitalRead(button) == HIGH)
{
uint8_t data[] = "104";
nrf24.send(data, sizeof(data));
}
delay(50); //prevents data overflow when button is held (theoretically)
}
系统的“接收端”在 nrf24l01 的接线方式上与“发射端”相同。不同之处在于,这个 Arduino 旨在接收信号并执行操作。这是它在这种情况下的作用:
1) 使用“发射端”Arduino 设置匹配的发送/接收设置。
2) 初始化 RF 通信(如果通信失败,并通过串口监视器发送错误消息)
3) 定义对它将接收的消息类型
4)启动一个循环计数器(1000个循环)
5) 查找特定消息
6) 如果收到消息(“104”),启动电磁阀,然后将其收回(使用数字 I/O 引脚 3)。重置计数器
7) 否则,继续查找消息并同时保持电磁阀缩回。
此设置使用 TIP120 达林顿晶体管在引脚触发时向电磁阀发送 12v 电压。12v 锂离子电池组用于为 Arduino(通过桶形插头)和电磁阀(通过 VIN 引脚)供电。*小心不要将任何其他东西连接到 VIN 引脚,因为它带有 12v 电压并且会损坏大多数其他组件*
*还要记住在晶体管的“基极”引脚上放置一个电阻器(我使用了 10kΩ),以防止更高的电压通过控制线到引脚 3 流入 Arduino。
与所有电磁阀一样,该电磁阀需要一个缓冲二极管,以防止在电磁阀失电时瞬态电压流过系统。二极管是定向的,应该从线圈的负极到正极。
第 7 步:Arduino“接收端”代码
// nrf24_server
/*
NRF24L01 Arduino
CE > D8
CSN > D10
SCK > D13
MO > D11
MI > D12
RO > Not used
GND > GND
VCC > 5V
*/
#include <SPI.h>
#include <RH_NRF24.h>
const int FIRE = 3;
int timeOUT = 0;
RH_NRF24 nrf24;
void setup()
{
pinMode(FIRE, OUTPUT);
Serial.begin(9600);
if (!nrf24.init())
Serial.println("init failed");
if (!nrf24.setChannel(125)) //set channel to 125
Serial.println("setChannel failed");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("setRF failed");
}
void loop()
{
if (nrf24.available())
{
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (nrf24.recv(buf, &len)) //read message
{
Serial.print("got request: ");
Serial.println((char*)buf);
int sig = atoi((const char*) buf);
if (sig == 104)
{
digitalWrite(FIRE, HIGH); //fire solenoid
timeOUT = 0; //message received, reset counter
delay(150);
digitalWrite(FIRE, LOW);
}
}
else
{
if (timeOUT > 1000) //close solenoid if this loop has ran _ or more times
{
digitalWrite(FIRE, LOW); //close solenoid
}
timeOUT ; //increment counter
}
}
}
接好电子元件及气路,我们就可以工作了。截图如下
,