XXL 发表于 2015-9-21 14:26:59

红外遥控器在使用的时候要不要进行消抖

我使用了红外遥控对小车的转动方向进行控制,自己定义了四个按键,分别来控制车的前后左右方向(行驶一小段时间),但是在使用过程中发现有时候按下了一个方向键,她是一直根据这个方向运动,挺都停不下来,是因为按键没有消抖而导致的持续运动吗?求大神解释

林定祥 发表于 2015-9-21 14:32:02

感觉不是这个问题,键盘抖动只会误操作。

XXL 发表于 2015-9-21 16:23:41

本帖最后由 XXL 于 2015-9-21 19:19 编辑

林定祥 发表于 2015-9-21 14:32 static/image/common/back.gif
感觉不是这个问题,键盘抖动只会误操作。

嗯,谢谢,但是我想不到是哪里出了问题!
好像很巧,我的名字跟你的名字就相差一个字:handshake

1415926 发表于 2015-9-21 17:55:04

我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定的一致
通过串口打印日志到电脑,跟踪实际跑出来的流程是否和预定的一致

如果还有问题,把代码贴出来请大家帮你找找原因

XXL 发表于 2015-9-21 19:39:18

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:39

红外接收有一定的角度的,考虑下是否会超出'视线'

XXL 发表于 2015-9-22 08:40:17

林定祥 发表于 2015-9-22 06:04 static/image/common/back.gif
红外接收有一定的角度的,考虑下是否会超出'视线'

考虑过这个问题,然后我用串口去打印了红外键值的编码,是正常的。然后目前我觉得可能性最大的是程序没有处理好的问题,但是我还是没有查出程序的那个地方有问题,有空的话,麻烦你帮我看看代码,代码贴在上面了:)

1415926 发表于 2015-9-22 09:08:36

XXL 发表于 2015-9-21 19:39 static/image/common/back.gif
嗯   好的   谢谢

/***************************************************************************** ...

我感觉你的程序不应该会导致一直不停下来。这段程序每次设置速度后,都延时不到1秒就应该停止了。
只有key那个函数里你注释掉得2行可能导致电机一直转,其他不应该了。
你多打点日志查查看哪种情况会导致一直走吧

XXL 发表于 2015-9-22 09:46:27

1415926 发表于 2015-9-22 09:08 static/image/common/back.gif
我感觉你的程序不应该会导致一直不停下来。这段程序每次设置速度后,都延时不到1秒就应该停止了。
只有k ...

嗯,谢谢你花了这么长时间看我的程序,我还想问下多打点日志是什么意思?是出打印信息,看程序运行到哪里了吗?

1415926 发表于 2015-9-22 10:42:08

XXL 发表于 2015-9-22 09:46 static/image/common/back.gif
嗯,谢谢你花了这么长时间看我的程序,我还想问下多打点日志是什么意思?是出打印信息,看程序运行到哪里 ...

就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。

XXL 发表于 2015-9-22 11:52:07

1415926 发表于 2015-9-22 10:42 static/image/common/back.gif
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。

严重了是因为我知道的太少了   谢谢哈

XXL 发表于 2015-9-23 16:06:08

1415926 发表于 2015-9-22 10:42 static/image/common/back.gif
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。

言重了谢谢你   是我知道的太少了

林定祥 发表于 2015-9-24 17:43:25

Serial.println(results.value,HEX);
   irrecv.resume();            //接收下一个编码
这两句位置换一下试试看,是否后一句影响了results.value
应该将后一句放在loop的最后,也即跳出loop前。

XXL 发表于 2015-9-30 20:33:48

林定祥 发表于 2015-9-24 17:43 static/image/common/back.gif
Serial.println(results.value,HEX);
   irrecv.resume();            //接收下一个编码
这两句位置换一 ...

谢谢,已经用另一种方法解决了
页: [1]
查看完整版本: 红外遥控器在使用的时候要不要进行消抖