红外遥控器在使用的时候要不要进行消抖
我使用了红外遥控对小车的转动方向进行控制,自己定义了四个按键,分别来控制车的前后左右方向(行驶一小段时间),但是在使用过程中发现有时候按下了一个方向键,她是一直根据这个方向运动,挺都停不下来,是因为按键没有消抖而导致的持续运动吗?求大神解释 感觉不是这个问题,键盘抖动只会误操作。 本帖最后由 XXL 于 2015-9-21 19:19 编辑林定祥 发表于 2015-9-21 14:32 static/image/common/back.gif
感觉不是这个问题,键盘抖动只会误操作。
嗯,谢谢,但是我想不到是哪里出了问题!
好像很巧,我的名字跟你的名字就相差一个字:handshake 我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定的一致
通过串口打印日志到电脑,跟踪实际跑出来的流程是否和预定的一致
如果还有问题,把代码贴出来请大家帮你找找原因
1415926 发表于 2015-9-21 17:55 static/image/common/back.gif
我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定 ...
嗯 好的 谢谢
/**************************************************************************************
* @ Version:V1.0
* @ Date: 2015/9/21
*@ Author: XXL
* @ Function: This is a smart car , include ultraeonic,IR Remote,IR line follower
***************************************************************************************/
#include <IRremote.h>
//#include <Adafruit_NeoPixel.h>
#define PIN 13
#define SHOUDONG2
int mode = SHOUDONG;
volatile int i; //定义个全局变量,供调速电机使用
int length; //定义音乐数组长度
int tonePin = 8;
const int Trigpin = A0; //超声波发送引脚为12脚
const int Echopin = A1; //超声波接收引脚为11引脚
int RECV_PIN = 2; //定义红外接收引脚为2号引脚
int PWM2 = 5; //调速引脚分别为5、6号引脚
int PWM1 = 6;
char shoudong_back = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(4,OUTPUT); //定义电机驱动芯片引脚
pinMode(7,OUTPUT);
pinMode(3,OUTPUT);
pinMode(tonePin,OUTPUT); //定义蜂鸣器引脚
}
void beep() //蜂鸣器函数
{
digitalWrite(tonePin,HIGH);
delay(1); //延时1ms
digitalWrite(tonePin,LOW);
delay(1);
}
void forward() //直行
{
digitalWrite(4,HIGH);
digitalWrite(7,HIGH);
}
void back() //后退
{
digitalWrite(4,LOW);
digitalWrite(7,LOW);
}
void turn_left() //左转
{
digitalWrite(4,HIGH);
digitalWrite(7,LOW);
}
void turn_right() //右转
{
digitalWrite(4,LOW);
digitalWrite(7,HIGH);
}
void stop_all() //停止
{
analogWrite(PWM1,0);
analogWrite(PWM2,0);
}
void Up_Direction() //前进箭头按下,向前方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
forward();
delay(600);
stop_all();
}
void Down_Direction() //后退箭头按下,向后倒退
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
back();
delay(600);
stop_all();
}
void Left_Direction() //左箭头按下,向左方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
turn_left();
delay(600);
stop_all();
}
void Right_Direction() //右箭头按下,向右方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
turn_right();
delay(600);
stop_all();
}
void key_scan_1(unsigned long key_value)
{
shoudong_back = 0;
switch(key_value)
{
case 0XFFE01F: delay(10);
beep();
Left_Direction(); //按下左箭头,向左转
break;
case 0XFF906F: delay(10);
beep();
Right_Direction(); //按下右箭头,向右转
break;
case 0XFF02FD: delay(10);
beep();
Up_Direction(); //按下上箭头,向前走
break;
case 0XFF9867: delay(10);
beep();
Down_Direction(); //按下下箭头,向后走
break;
}
}
void key(unsigned long key_value) //手动按键操作函数
{
//analogWrite(PWM1,180);
//analogWrite(PWM2,180);
shoudong_back = 1;
switch(key_value)
{
/*数字键都是调速使用的*/
case 0XFF6897:beep();
delay(10);
i = 120;
break;//按下0键
case 0XFF30CF:beep();
delay(10);
i = 135;
break;//按下1键
case 0XFF18E7:beep();
i = 150;
break;//按下2键
case 0XFF7A85:beep();
delay(10);
i = 165;
break;//按下3键
case 0XFF10EF:beep();
i = 180;
break;//按下4键
case 0XFF38C7:beep();
i = 195;
break;//按下5键
case 0XFF5AA5:beep();
i = 210;
break;//按下6键
case 0xFF42BD:beep();
i = 225;
break;//按下7键
case 0XFF4AB5:beep();
i = 240;
break;//按下8键
case 0XFF52AD:beep();
i = 255;
delay(10);
break;//按下9键
}
}
void loop() {
// put your main code here, to run repeatedly:
if(irrecv.decode(&results))
{
Serial.println(results.value,HEX);
irrecv.resume(); //接收下一个编码
switch(results.value)
{
case 0XFFA25D: mode = SHOUDONG;break; //按下A键,进入手动模式
}
}
switch(mode)
{
case SHOUDONG:
if(!shoudong_back)
key(results.value);
else key_scan_1(results.value);
break;
}
}
然后用串口打印了下遥控器键值,结果发现有点乱
C:\Users\Administrator\Desktop
红色标记处是错误的编码,这个是遥控有时候失灵的原因,但是至于为什么轮子一直转,还是不知道,代码如上,求指正
红外接收有一定的角度的,考虑下是否会超出'视线' 林定祥 发表于 2015-9-22 06:04 static/image/common/back.gif
红外接收有一定的角度的,考虑下是否会超出'视线'
考虑过这个问题,然后我用串口去打印了红外键值的编码,是正常的。然后目前我觉得可能性最大的是程序没有处理好的问题,但是我还是没有查出程序的那个地方有问题,有空的话,麻烦你帮我看看代码,代码贴在上面了:) XXL 发表于 2015-9-21 19:39 static/image/common/back.gif
嗯 好的 谢谢
/***************************************************************************** ...
我感觉你的程序不应该会导致一直不停下来。这段程序每次设置速度后,都延时不到1秒就应该停止了。
只有key那个函数里你注释掉得2行可能导致电机一直转,其他不应该了。
你多打点日志查查看哪种情况会导致一直走吧
1415926 发表于 2015-9-22 09:08 static/image/common/back.gif
我感觉你的程序不应该会导致一直不停下来。这段程序每次设置速度后,都延时不到1秒就应该停止了。
只有k ...
嗯,谢谢你花了这么长时间看我的程序,我还想问下多打点日志是什么意思?是出打印信息,看程序运行到哪里了吗? XXL 发表于 2015-9-22 09:46 static/image/common/back.gif
嗯,谢谢你花了这么长时间看我的程序,我还想问下多打点日志是什么意思?是出打印信息,看程序运行到哪里 ...
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。 1415926 发表于 2015-9-22 10:42 static/image/common/back.gif
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。
严重了是因为我知道的太少了 谢谢哈 1415926 发表于 2015-9-22 10:42 static/image/common/back.gif
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。
言重了谢谢你 是我知道的太少了 Serial.println(results.value,HEX);
irrecv.resume(); //接收下一个编码
这两句位置换一下试试看,是否后一句影响了results.value
应该将后一句放在loop的最后,也即跳出loop前。 林定祥 发表于 2015-9-24 17:43 static/image/common/back.gif
Serial.println(results.value,HEX);
irrecv.resume(); //接收下一个编码
这两句位置换一 ...
谢谢,已经用另一种方法解决了
页:
[1]