如何使用多个红外信号来做同样的事情?
How to use multiple IR signals for doing the same thing?
我想使用来自不同红外遥控器的不同信号来控制轮式机器人。
该机器人是Elegoo的Smart robot car kit v1.0。
我使用了光盘中的 infrared_remote_control_car.ino
文件。
我刚刚在末尾添加了 #define JVC
和运算符。
代码如下所示:
#include <IRremote.h>
int receiverpin = 12;
int in1=9;
int in2=8;
int in3=7;
int in4=6;
int ENA=10;
int ENB=5;
int ABS=130;
unsigned long RED;
#define A 16736925
#define B 16754775
#define X 16712445
#define C 16720605
#define D 16761405
#define JVCfront 49816
#define JVCback 49688
#define JVCright 49704
#define JVCleft 49832
#define JVCmenu 49900
#define JVC3ok 49724
#define JVCstop 49856
IRrecv irrecv(receiverpin);
decode_results results;
void _mForward()
{
digitalWrite(ENA,HIGH);
digitalWrite(ENB,HIGH);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
Serial.println("go forward!");
}
void _mBack()
{
digitalWrite(ENA,HIGH);
digitalWrite(ENB,HIGH);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
Serial.println("go back!");
}
void _mleft()
{
analogWrite(ENA,ABS);
analogWrite(ENB,ABS);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
Serial.println("go left!");
}
void _mright()
{
analogWrite(ENA,ABS);
analogWrite(ENB,ABS);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
Serial.println("go right!");
}
void _mStop()
{
digitalWrite(ENA,LOW);
digitalWrite(ENB,LOW);
Serial.println("STOP!");
}
void setup() {
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(receiverpin,INPUT);
Serial.begin(9600);
_mStop();
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results))
{
RED=results.value;
Serial.println(RED);
irrecv.resume();
delay(150);
if(RED==(A || JVCfront))
{
_mForward();
}
else if(RED==(B or JVCback))
{
_mBack();
}
else if(RED==(C or JVCleft))
{
_mleft();
}
else if(RED==(D or JVCright))
{
_mright();
}
else if(RED==(X or JVCstop or JVCmenu or JVC3ok))
{
_mStop();
}
}
}
如您所见,我尝试了在 Internet 上看到的不同 OR 运算符的方法。
其实机器人一直在前进
Serial.println(RED)
是否总是打印出期望值?
乍一看,您的 if-else
块本身似乎没有问题。使用 ||
或 or
都没有关系。它们是等价的。
问题是您检查值的方式:
因此,您在 OR 语句周围加上了括号,您创建了一个 bool 值。 if(RED==(A || JVCfront)
转换为:
- 已设置
A
或已设置JVCfront
;意思是,它们是 != 0(是的,它们都是,所以这个表达式是 true
- 是
RED == true
(不,不是,因为true
代表整数1
)
- 所以那个块中的代码没有被执行
如果你想用if-else来解决,你需要:
if(RED == A or RED == JVCfront)
{
_mForward();
}
无论如何,我建议使用 switch-case 语句:
switch(RED):
{
case A:
{
//intentional fallthrough
}
case JVCfront:
{
_mForward();
break;
}
case B:
{
//intentional fallthrough
}
case JVCback:
{
_mBack();
break;
}
case C:
{
//intentional fallthrough
}
case JVCleft:
{
_mleft();
break;
}
case D:
{
//intentional fallthrough
}
case JVCright:
{
_mright();
break;
}
case X:
{
//intentional fallthrough
}
case JVCstop:
{
//intentional fallthrough
}
case JVCmenu:
{
//intentional fallthrough
}
case JVC3ok:
{
_mStop();
break;
}
default:
{
_mStop();
}
}
我个人觉得这种代码更容易阅读,也更容易理解。
请注意:如果您不将 break
放入 case,它也会自动执行下一个 case
。这就是为什么我在这部分代码中写 //intentional fallthrough
的原因。 P.e。当执行 case A
时,什么也没有发生。它只是落入 case JVCFront
并执行那里的所有内容。
我想使用来自不同红外遥控器的不同信号来控制轮式机器人。
该机器人是Elegoo的Smart robot car kit v1.0。
我使用了光盘中的 infrared_remote_control_car.ino
文件。
我刚刚在末尾添加了 #define JVC
和运算符。
代码如下所示:
#include <IRremote.h>
int receiverpin = 12;
int in1=9;
int in2=8;
int in3=7;
int in4=6;
int ENA=10;
int ENB=5;
int ABS=130;
unsigned long RED;
#define A 16736925
#define B 16754775
#define X 16712445
#define C 16720605
#define D 16761405
#define JVCfront 49816
#define JVCback 49688
#define JVCright 49704
#define JVCleft 49832
#define JVCmenu 49900
#define JVC3ok 49724
#define JVCstop 49856
IRrecv irrecv(receiverpin);
decode_results results;
void _mForward()
{
digitalWrite(ENA,HIGH);
digitalWrite(ENB,HIGH);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
Serial.println("go forward!");
}
void _mBack()
{
digitalWrite(ENA,HIGH);
digitalWrite(ENB,HIGH);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
Serial.println("go back!");
}
void _mleft()
{
analogWrite(ENA,ABS);
analogWrite(ENB,ABS);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
Serial.println("go left!");
}
void _mright()
{
analogWrite(ENA,ABS);
analogWrite(ENB,ABS);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
Serial.println("go right!");
}
void _mStop()
{
digitalWrite(ENA,LOW);
digitalWrite(ENB,LOW);
Serial.println("STOP!");
}
void setup() {
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(receiverpin,INPUT);
Serial.begin(9600);
_mStop();
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results))
{
RED=results.value;
Serial.println(RED);
irrecv.resume();
delay(150);
if(RED==(A || JVCfront))
{
_mForward();
}
else if(RED==(B or JVCback))
{
_mBack();
}
else if(RED==(C or JVCleft))
{
_mleft();
}
else if(RED==(D or JVCright))
{
_mright();
}
else if(RED==(X or JVCstop or JVCmenu or JVC3ok))
{
_mStop();
}
}
}
如您所见,我尝试了在 Internet 上看到的不同 OR 运算符的方法。 其实机器人一直在前进
Serial.println(RED)
是否总是打印出期望值?
乍一看,您的 if-else
块本身似乎没有问题。使用 ||
或 or
都没有关系。它们是等价的。
问题是您检查值的方式:
因此,您在 OR 语句周围加上了括号,您创建了一个 bool 值。 if(RED==(A || JVCfront)
转换为:
- 已设置
A
或已设置JVCfront
;意思是,它们是 != 0(是的,它们都是,所以这个表达式是true
- 是
RED == true
(不,不是,因为true
代表整数1
) - 所以那个块中的代码没有被执行
如果你想用if-else来解决,你需要:
if(RED == A or RED == JVCfront)
{
_mForward();
}
无论如何,我建议使用 switch-case 语句:
switch(RED):
{
case A:
{
//intentional fallthrough
}
case JVCfront:
{
_mForward();
break;
}
case B:
{
//intentional fallthrough
}
case JVCback:
{
_mBack();
break;
}
case C:
{
//intentional fallthrough
}
case JVCleft:
{
_mleft();
break;
}
case D:
{
//intentional fallthrough
}
case JVCright:
{
_mright();
break;
}
case X:
{
//intentional fallthrough
}
case JVCstop:
{
//intentional fallthrough
}
case JVCmenu:
{
//intentional fallthrough
}
case JVC3ok:
{
_mStop();
break;
}
default:
{
_mStop();
}
}
我个人觉得这种代码更容易阅读,也更容易理解。
请注意:如果您不将 break
放入 case,它也会自动执行下一个 case
。这就是为什么我在这部分代码中写 //intentional fallthrough
的原因。 P.e。当执行 case A
时,什么也没有发生。它只是落入 case JVCFront
并执行那里的所有内容。