我第一次使用Arduino,我的项目包括与arduino UNO连接的RF发射器和连接到Arduino Mega的RF接收器。 我尝试从发射器发送数据并使用VirtualWire库在接收器序列上打印,并且每个东西都是这个接收器代码的关键:
#include <VirtualWire.h>
int x=9;
int y=8;
int z=10;
int r=7;
void setup()
{
Serial.begin(9600);
pinMode(x,OUTPUT);
pinMode(y,OUTPUT);
pinMode(z,OUTPUT);
pinMode(r,OUTPUT);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
// Message with a good checksum received, print it.
Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(' ');
}
Serial.println();
}
}
然后我根据重新编写的值添加一些if语句来运行2个电机(连接到x,y,z,r引脚):
#include <VirtualWire.h>
int x=9;
int y=8;
int z=10;
int r=7;
void setup()
{
Serial.begin(9600);
pinMode(x,OUTPUT);
pinMode(y,OUTPUT);
pinMode(z,OUTPUT);
pinMode(r,OUTPUT);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
// Message with a good checksum received, print it.
Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
if (buf[i]==0x77)//Stop motors
{
digitalWrite(x,LOW);
digitalWrite(y,LOW);
digitalWrite(z,LOW);
digitalWrite(r,LOW);
}
else
{
if(buf[i]==0x80)//2 motors clockwise
{
digitalWrite(x,LOW);
digitalWrite(y,HIGH);
digitalWrite(z,HIGH);
digitalWrite(r,LOW);
}
if (buf[i]==0x90)//counter clockwise
{
digitalWrite(x,HIGH);
digitalWrite(y,LOW);
digitalWrite(z,LOW);
digitalWrite(r,HIGH);
}
}
}
现在的问题是,当电机停止工作时,我发送的值会以或逆时针方向运行,电机正常工作,但不会响应发送的任何数据。
简而言之,当电机停止工作并且我发送数据时,接收器接收值并运行电动小提琴是必需的,但是例如,如果电机顺时针工作并发送逆时针运行的命令甚至停止工作,它没有回应并继续移动它是。
我注意到,当电机运行此函数时,这会导致错误 vw_get_message(buf,&amp; buflen)
但我不是没有原因!
答案 0 :(得分:0)
在VirtualWire库中,每次发送新字符或一组字符时,缓冲区都将被覆盖。所以这个程序的问题在于你的for循环检查。如果您只使用以下
,它将正常工作例如,如果您要发送“A”,“B”等字符,那么
if(vw_get_message(buf,&amp; buflen)) {
if(buf[0]=='A')
{
//move forward
}
if(buf[0]=='B')
{
//move backward
}
....等等
希望这有帮助