【问题标题】:How to use multiple IR signals for doing the same thing?如何使用多个红外信号做同样的事情?
【发布时间】:2019-01-13 21:22:57
【问题描述】:

我想使用来自不同红外遥控器的不同信号来控制轮式机器人。

该机器人是来自 Elegoo 的智能机器人车载套件 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();
    }
  }
} 

如您所见,我尝试了我在互联网上看到的 OR 运算符的不同方法。 其实,机器人一直在前进。

【问题讨论】:

    标签: c++ arduino logical-operators


    【解决方案1】:

    Serial.println(RED) 是否总是打印出预期值? 乍一看,您的 if-elseblock 本身似乎没有问题。使用||or 都没有关系。它们是等价的。 问题在于您检查值​​的方式:

    因此,您的 OR 语句周围有括号,您创建了一个布尔值。 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。这就是我在这部分代码中写//intentional fallthrough 的原因。体育当case A 被执行时,什么也没有发生。它只是落入case JVCFront 并在那里执行所有内容。

    【讨论】:

    • 我没有检查串口监视器是否打印了正确的按钮
    • 我会试试这个,我会尽快回复你
    • 现在不同的按钮工作正常,但机器人总是在半秒后停止。有什么办法可以让机器人连续运动?
    • 然后从default 块中删除_m_stop()。如果前面的语句都不能应用,则每次都会调用此块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2010-09-18
    • 2022-01-05
    • 2018-05-18
    相关资源
    最近更新 更多