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伺服和红外遥控器的主要内容,如果未能解决你的问题,请参考以下文章