Arduino伺服和红外遥控器

Posted

技术标签:

【中文标题】Arduino伺服和红外遥控器【英文标题】:Arduino servo and IR remote 【发布时间】:2017-06-22 13:48:20 【问题描述】:

当我按下遥控器中的一个按钮时,我试图从伺服器获得连续(180 到 0 和返回 0 到 180)运动,并且只有在我按下另一个按钮时才停止。到目前为止,我已经让它连续移动,但是当我按下“停止”按钮时它并没有停止。我知道这是因为 while 循环。但是,我已经尝试过 switch-case,if 语句,到目前为止没有任何效果。 请帮助,任何使它工作的建议表示赞赏。

#include <Servo.h>

#define code1 2534850111 //decimal value of button 1
#define code3 16724175   //decimal value of button 1
#define code 4294967295   //random value
#define code2 16738455   //decimal value of button 0
#define code4 3238126971   //decimal value of button 0

Servo myservo; // servo object
int RECV_PIN = 11; //receiveing pin IR remote

int pos = 0;

IRrecv irrecv(RECV_PIN); 

decode_results results;

void setup() 
  Serial.begin(9600);
  irrecv.enableIRIn();  //start the receiver
  myservo.attach(9);    //servo connect to pin 9
  pinMode(2, OUTPUT);   //LED connect to pin 2


void loop() 
  if(irrecv.decode(&results))
     // if(results.value == code1 || results.value == code3)
     while(results.value == code1 || results.value == code3)
        digitalWrite(2,HIGH); //turn the led on
        for(pos = 0; pos <= 180; pos += 1) //servo goes form 0 to 180             degrees in steps of 1 degree
    myservo.write(pos);
    delay(7);
    
    for(pos = 180; pos >= 0; pos -= 1) //servo goes back from 180 to 0 degrees with 1 degree step
    myservo.write(pos);
    delay(7);

    

 while(results.value == code2 || results.value == code4)
       digitalWrite(2, LOW);  // turn the led off
       myservo.write(pos);
       delay(15);
       break;
 

  Serial.println(results.value, DEC); //show the decimal value of the     pressed button
  irrecv.resume();  //receive the next value
    


【问题讨论】:

请编辑您的问题并向我们展示您当前拥有的代码。没有它(通常是接线图),我们真的无法为您提供帮助。 我的水晶球没有告诉我任何关于你的代码的信息... :( 抱歉,刚学这个领域。我认为除了每行中的 4 个空格之外,还有更好的方法来附加代码。不过,这不是问题,我希望你现在可以帮助我:) 如果您真正查看您正在写入的框,您会注意到一个带有有用工具的工具栏,例如用于在代码前面放置 4 个空格的按钮。 【参考方案1】:

解决问题的一种方法是检查loop() 内部是否存在“按钮按下”。检查按钮是否按下内部您的动作for 循环以立即捕捉更改。看起来您可能有两个起始码 (?),因此您可能需要更改下面的 if 语句,但希望我在下面的代码示例中演示如何检查条件以“继续”。

void loop()

    if(irrecv.decode(&results))
    
        // turn one way
        for(pos = 0; pos <= 180; pos += 1)
        
            // only continue if the start code(s) still active
            if(results.value == STARTCODE || results.value == OTHERSTARTCODE)
            
                myservo.write(pos);
                delay(7);
                irrecv.resume();  //receive the next value
            
        
        // turn the other way
        for(pos = 180; pos >= 0; pos -= 1)
        
            // only continue if the start code(s) still active
            if(results.value == STARTCODE || results.value == OTHERSTARTCODE)
            
                myservo.write(pos);
                delay(7);
                irrecv.resume();  //receive the next value
            
        
       

【讨论】:

谢谢。你的代码看起来比我的好,但并不完全符合我的要求;伺服系统仍然不会继续从 0 滚动到 180 并返回并继续这样做,直到我按下“endcode”。每次我按下 180 到 0 以及 0 到 180 的按钮时,它都会移动(这就是代码告诉它正确的操作)。我不确定我是否已经把问题说清楚了,但我希望是这样,如果我能以某种方式更清楚地说明问题,请告诉我。另外,是的,我有两个起始码和两个结束码。

以上是关于Arduino伺服和红外遥控器的主要内容,如果未能解决你的问题,请参考以下文章

基于Arduino的红外遥控

Arduino VS/HX1838红外遥控接收和发送DEMO

arduino 红外遥控器控制LED灯

用米思齐(mixly)或者Arduino制作红外线遥控灯

基于Arduino检测红外遥控编码(调用第三方库教程)

基于Arduino检测红外遥控编码(调用第三方库教程)