红外小车程序-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4504|回复: 7

[已解决] 红外小车程序

[复制链接]
发表于 2014-2-12 13:37 | 显示全部楼层 |阅读模式
最近想做红外小车,遥控器是用电视遥控器,遥控是可以了,但是有一个问题出现了:按前进时,车子不是按一下就前进一下,而是按一下就一直前进了,只有按停止它才会停止,我的目的是想按着键是车子就走,发开键是车子就停,程序已基本完成,求高手帮忙指点下程序呀哦怎么修改!谢谢啦!!!!!

程序如下:

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void stop();
void forward();
void back();
void left();
void right();
void setup()
{      
        Serial.begin(9600);
        irrecv.enableIRIn();
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 7 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 9 , OUTPUT);
        pinMode( 8 , OUTPUT);
}
void back()
{
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , HIGH );
        digitalWrite( 7 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 9 , HIGH );
        digitalWrite( 8 , LOW );
}

void left()
{
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , HIGH );
        digitalWrite( 7 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 9 , LOW );
        digitalWrite( 8 , HIGH );
}

void right()
{
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , HIGH );
        digitalWrite( 7 , LOW );
        digitalWrite( 6 ,HIGH );
        digitalWrite( 9 , HIGH );
        digitalWrite( 8 , LOW );
}

void forward()
{
        digitalWrite( 5 , HIGH );
        digitalWrite( 4 , HIGH );
        digitalWrite( 8 , HIGH );
        digitalWrite( 9 , LOW );
        digitalWrite( 7 , LOW);
        digitalWrite( 6 , HIGH );
}

void stop()
{
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );  
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        digitalWrite( 8 , LOW );
        digitalWrite( 9 , LOW );
}




void loop()
{
  if (irrecv.decode(&results)){
     Serial.println( results.value,HEX);
  if( results.value ==0x23B47CEC) {
     forward();
     irrecv.resume();
}
  else {
    stop();
    if(results.value ==0x165CC0E2){
    left();
    irrecv.resume();
    }
    else{
       stop();      
       if(results.value ==0xAC7DE7B4){
       right();
       irrecv.resume();
       }
       else {
          stop();         
          if(results.value ==0x81086BA0){
          back();
          irrecv.resume();
}
  else{
     stop();
     irrecv.resume();
}}}}}}


发表于 2014-2-12 14:47 | 显示全部楼层
本帖最后由 cjnt007 于 2014-2-12 14:53 编辑

最近最也在玩红外,用机顶盒遥控器控制音响,其中涉及到楼主的问题,即持续按键的判断,我实现的方法是区别键按下与抬起两个事件分别执行代码。

我把我的代码给你参考下:
[mw_shl_code=cpp,true]#include <IRremote.h>

const int RECV_PIN = 19;//定义红外接收器的引脚为A5=D19
const int Power_PIN = 7;//电源
const int Src_PIN  = 7;//音源
const int Mute_PIN = 6;//静音
const int Up_PIN  =  4;//频道+
const int Down_PIN = 5;//频道-
const int VolumUp_PIN = 3;//音量+
const int VolumDown_PIN = 2;//音量-
int KeyNum = 0;  //记录按键号,0表示为无效键
unsigned long Counter = 0; //延时计数器

IRrecv irrecv(RECV_PIN);
decode_results results;

void KeyDown(int IO_Num){
  //切换为输出脚模式,设置为低电平输出,相当于将对应的电阻接地,
  pinMode(IO_Num,OUTPUT);
  digitalWrite(IO_Num,LOW);
}

void KeyUp(int IO_Num){
  pinMode(IO_Num,INPUT);
}

void setup(){
  //Serial.begin(9600);
  irrecv.enableIRIn(); // 初始化红外接收器
  irrecv.blink13(1);   //开启13脚作指示,在接收时闪烁
  //设置为输入模式,各脚呈高阻抗状态,相当于开路
  pinMode(Power_PIN,INPUT);
  pinMode(Mute_PIN,INPUT);
  pinMode(Up_PIN,INPUT);
  pinMode(Down_PIN,INPUT);
  pinMode(VolumUp_PIN,INPUT);
  pinMode(VolumDown_PIN,INPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    /*
    Serial.print("ircode:");
    Serial.print(results.value, HEX);//以16进制换行输出接收代码
    Serial.print(",  bits: ");
    Serial.println(results.bits);
    Serial.println();//为了便于观看输出结果增加一个空行
    */
    switch (results.value){
      case 0x80BF3BC4:  // Power
        KeyNum=Power_PIN;        break;
      case 0x80BF738C:  // Src
        KeyNum=Src_PIN;        break;
      case 0x80BF39C6:  // Mute
        KeyNum=Mute_PIN;        break;
      case 0x80BF53AC:  // Up
        KeyNum=Up_PIN;        break;
      case 0x80BF4BB4:  // Down
        KeyNum=Down_PIN;        break;
      case 0x80BF9966:  // V+
        KeyNum=VolumUp_PIN;        break;
      case 0x80BF837C:  // V-
        KeyNum=VolumDown_PIN;        break;
      case 0xFFFFFFFF:  //repeat
        break;
      default:
        KeyNum=0;
    }
    if(KeyNum){
      KeyDown(KeyNum);
      delay(200);
      Counter = 0;
    }
    irrecv.resume(); // 接收下一个值
  }else{
    if(KeyNum){
      //delay(200);
      Counter++;
      if (Counter>17000){ //值17000由实际测试得到,表示在持续按键的情况下,在这个值以内时忽略执行按键抬起函数,此时的串口输出功能关闭下为17000,如果开启了串口输出功能,大概为50左右。
        KeyUp(KeyNum);
        //Serial.println("Key UP");
        KeyNum = 0;
        Counter = 0;
      }
      //Serial.println(Counter);
    }
  }
}


[/mw_shl_code]
 楼主| 发表于 2014-2-12 14:58 | 显示全部楼层
cjnt007 发表于 2014-2-12 14:47
最近最也在玩红外,用机顶盒遥控器控制音响,其中涉及到楼主的问题,即持续按键的判断,我实现的方法是区别 ...

请问你会用普通红外的遥控器吗?那个遥控器是按下去后,第一次发送的编码是可以用的,如果按着不放的话,后面的编码就都是FFFFFFFF了,这要怎么编码呢?谢谢!
发表于 2014-2-12 15:04 | 显示全部楼层
我使用的遥控器按键效果就如你所说,持续按键时后续代码就是FFFFFFFF。
我给出的代码在我的uno和nano上运行良好。
 楼主| 发表于 2014-2-12 15:05 | 显示全部楼层
cjnt007 发表于 2014-2-12 15:04
我使用的遥控器按键效果就如你所说,持续按键时后续代码就是FFFFFFFF。
我给出的代码在我的uno和nano上运行 ...

好的,我再试一下啊!谢谢了!
 楼主| 发表于 2014-2-12 15:12 | 显示全部楼层
cjnt007 发表于 2014-2-12 14:47
最近最也在玩红外,用机顶盒遥控器控制音响,其中涉及到楼主的问题,即持续按键的判断,我实现的方法是区别 ...

你好,我还是不知道怎么弄好,你可以帮我改程序吗,谢谢!
发表于 2014-2-12 15:19 | 显示全部楼层
我大概看了下你的代码,stop函数应该对应我的KeyUp(),其他前进、后退、左右转向对应我的KeyDown(),我的KeyDown通过参数实现不同的功能,你能将代码写出来,移植下应该可能做到吧。你仔细读下我的代码else后面的部分,特别是Counter变量,这是关键
 楼主| 发表于 2014-2-12 15:20 | 显示全部楼层
cjnt007 发表于 2014-2-12 15:19
我大概看了下你的代码,stop函数应该对应我的KeyUp(),其他前进、后退、左右转向对应我的KeyDown(),我的Key ...

好的,谢谢!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-4 17:58 , Processed in 0.088665 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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