使用433Mhz发射器实时发送PWM值

Realtime sending PWM values using 433Mhz transmitter

本文关键字:PWM 实时 433Mhz 发射器 使用      更新时间:2023-10-16

我尝试使用433Mhz发射器模块创建无线PWM传输。我找到了这个用于传输 https://github.com/zeitgeist87/RFTransmitter 的库和用于读取某些引脚 https://github.com/xkam1x/Arduino-PWM-Reader 上的PWM值的库。

我编写了用于发送PWM值的代码:


#include "PWM.hpp"
#include <RFTransmitter.h>
#define NODE_ID          1
#define OUTPUT_PIN       11
RFTransmitter transmitter(OUTPUT_PIN, NODE_ID);
PWM my_pwm(2);
// the setup function runs once when you press reset or power the board
void setup() {
my_pwm.begin(true);
}
// the loop function runs over and over again forever
void loop() {
int pwmValue = my_pwm.getValue();
char stringValue[4];
itoa(pwmValue, stringValue, 10);
transmitter.send(stringValue, strlen(stringValue) + 1);
}

和类似的接收代码

#include <Servo.h>
#include <PinChangeInterruptHandler.h>
#include <RFReceiver.h>
int PWM_out_pin = 9;
Servo servo;
// Listen on digital pin 2
RFReceiver receiver(2);
void setup() {
servo.attach(PWM_out_pin);
receiver.begin();
}
void loop() {
char msg[MAX_PACKAGE_SIZE];
byte senderId = 0;
byte packageId = 0;
byte len = receiver.recvPackage((byte *)msg, &senderId, &packageId);
String *stringObject = new String(msg);
servo.writeMicroseconds(stringObject->toInt());
}

它有效,但问题很少。 首先,这不是最佳的。我把所有的东西都变成字符串。如何直接从 PWM 发送 int 值? 第二个问题是它有大约 1 秒的延迟。有可能让它更快吗?我需要它来实时控制伺服。

谢谢。

如何直接从 PWM 发送 int 值?

transmitter.send((char*)pwmValue, sizeof(int));

然后在接收端,您无需将数据转换为字符串。

servo.writeMicroseconds((int) *msg);

(int) 和 (char*) 是 C 样式的类型转换。实质上是告诉编译器您希望将数据解释为不同的变量类型。

警告:小心使用"new"关键字,您正在动态分配内存。C/C++中的经验法则:无论你在哪里使用"new"关键字,都应该有一个相应的"删除"调用来清理内存。

在使其更快方面,此处的 C/C++ 代码不是导致从命令到操作的 1 秒延迟的限制因素。RF发射器发射/接收堆栈中很可能有一个参数需要调整。在发送PWM值之前,我会对发送和打印简单字符串的延迟进行基准测试。