极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17076|回复: 13

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

[复制链接]
发表于 2015-9-21 14:26:59 | 显示全部楼层 |阅读模式
我使用了红外遥控对小车的转动方向进行控制,自己定义了四个按键,分别来控制车的前后左右方向(行驶一小段时间),但是在使用过程中发现有时候按下了一个方向键,她是一直根据这个方向运动,挺都停不下来,是因为按键没有消抖而导致的持续运动吗?求大神解释
回复

使用道具 举报

发表于 2015-9-21 14:32:02 | 显示全部楼层
感觉不是这个问题,键盘抖动只会误操作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-21 16:23:41 | 显示全部楼层
本帖最后由 XXL 于 2015-9-21 19:19 编辑
林定祥 发表于 2015-9-21 14:32
感觉不是这个问题,键盘抖动只会误操作。


嗯,谢谢,但是我想不到是哪里出了问题!
好像很巧,我的名字跟你的名字就相差一个字
回复 支持 反对

使用道具 举报

发表于 2015-9-21 17:55:04 | 显示全部楼层
我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定的一致
通过串口打印日志到电脑,跟踪实际跑出来的流程是否和预定的一致

如果还有问题,把代码贴出来请大家帮你找找原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-21 19:39:18 | 显示全部楼层
1415926 发表于 2015-9-21 17:55
我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定 ...

嗯   好的   谢谢

/**************************************************************************************
* @ 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 SHOUDONG  2

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 | 显示全部楼层
红外接收有一定的角度的,考虑下是否会超出'视线'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-22 08:40:17 | 显示全部楼层
林定祥 发表于 2015-9-22 06:04
红外接收有一定的角度的,考虑下是否会超出'视线'

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

使用道具 举报

发表于 2015-9-22 09:08:36 | 显示全部楼层
XXL 发表于 2015-9-21 19:39
嗯   好的   谢谢

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

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

使用道具 举报

 楼主| 发表于 2015-9-22 09:46:27 | 显示全部楼层
1415926 发表于 2015-9-22 09:08
我感觉你的程序不应该会导致一直不停下来。这段程序每次设置速度后,都延时不到1秒就应该停止了。
只有k ...

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

使用道具 举报

发表于 2015-9-22 10:42:08 | 显示全部楼层
XXL 发表于 2015-9-22 09:46
嗯,谢谢你花了这么长时间看我的程序,我还想问下多打点日志是什么意思?是出打印信息,看程序运行到哪里 ...

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

使用道具 举报

 楼主| 发表于 2015-9-22 11:52:07 | 显示全部楼层
1415926 发表于 2015-9-22 10:42
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。

严重了  是因为我知道的太少了   谢谢哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 16:06:08 | 显示全部楼层
1415926 发表于 2015-9-22 10:42
就是通过Serial.println打印出来点信息。抱歉,我是做软件的,说习惯日志了,没注意用词。

言重了  谢谢你   是我知道的太少了
回复 支持 反对

使用道具 举报

发表于 2015-9-24 17:43:25 | 显示全部楼层
Serial.println(results.value,HEX);
     irrecv.resume();            //接收下一个编码
这两句位置换一下试试看,是否后一句影响了results.value
应该将后一句放在loop的最后,也即跳出loop前。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-30 20:33:48 | 显示全部楼层
林定祥 发表于 2015-9-24 17:43
Serial.println(results.value,HEX);
     irrecv.resume();            //接收下一个编码
这两句位置换一 ...

谢谢,已经用另一种方法解决了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 00:22 , Processed in 0.063103 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表