概述

在前一课中我们学会了如何控制电机,这一课将在前面一课基础上加上红外控制的功能,通过红外控制小车运动。

硬件

这一课只需要安装一个红外接收模块就可以了。

所需配件:

M2.5*10十字螺丝 x2颗

M2.5螺帽  x2颗

用2两颗M2.5*10十字螺丝加螺帽将红外接收模块安装在底盘表面(放照片!)

将红外接收模块按照下表顺序连接到arduino uno

Arduino UNO 红外接收模块
S D4
+ 5V
GND

软件

要使用红外功能,需要在arduino IDE中安装一个红外解码库IRremote

,将其解压后放到arduino IDE安装目录下的libraries文件夹中。下载示例代码并解压,用arduino IDE打开lesson-2.ino,下面对部分代码作简单说明。

#define IR_ADVANCE       0x00FF18E7       //code from IR controller "▲" button
#define IR_BACK          0x00FF4AB5       //code from IR controller "▼" button
#define IR_RIGHT         0x00FF5AA5       //code from IR controller ">" button
#define IR_LEFT          0x00FF10EF       //code from IR controller "<" button

上面4行代码分别表示遥控器上▲、▼、>、<的红外编码

每个按键的红外编码可以烧录下面的示例代码获得

IRrecv IR(IRPIN);  //   IRrecv object  IR get code from IR remoter
decode_results IRresults;

实例化一个IRrecv对象,用于解码红外信号;并将解码结果存放在IRresults中

void do_IR_Tick()
{
  if(IR.decode(&IRresults))
  {
    if(IRresults.value==IR_ADVANCE)
    {
      Drive_Num=GO_ADVANCE;
    }
    else if(IRresults.value==IR_RIGHT)
    {
       Drive_Num=GO_RIGHT;
    }
    else if(IRresults.value==IR_LEFT)
    {
       Drive_Num=GO_LEFT;
    }
    else if(IRresults.value==IR_BACK)
    {
        Drive_Num=GO_BACK;
    }
    IRresults.value = 0;
    IR.resume();
  }
}

解码红外信号,并将收到的红外信号与预定义的值比较,若相等则给Drive_Num赋相应值

void do_Drive_Tick()
{
    switch (Drive_Num) 
    {
      case GO_ADVANCE:
            go_ahead(20);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_ADVANCE code is detected, then go advance
      case GO_LEFT:
            turn_left(1);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_LEFT code is detected, then turn left
      case GO_RIGHT:
            turn_right(1);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_RIGHT code is detected, then turn right
      case GO_BACK:
            go_back(20);JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_BACK code is detected, then backward
      default:break;
    }
    Drive_Num=DEF;
   //keep current moving mode for  200 millis seconds
    if(millis()-JogTime>=200)
    {
      JogTime=millis();
      if(JogFlag == true) 
      {
        stopFlag = false;
        if(JogTimeCnt <= 0) 
        {
          JogFlag = false; stopFlag = true;
        }
        JogTimeCnt--;
      }
      if(stopFlag == true) 
      {
        JogTimeCnt=0;
        go_stop();
      }
    }
}

这段代码是红外控制的核心代码,按下对应按键小车执行相应动作,若所按按键未在程序中定义,小车不作回应。

测试

用USB线将arduino 和PC连接起来,选择正确的板卡型号和端口将其烧录到arduino uno中。将遥控器塑料垫片扯掉,对着红外接收器按按键。

“▲”:前进

“▼”:后退

“>”:右转

“<“左转

 

如果小车不动,请检查如下事项

  1. 电池有没有电
  2. 遥控器有没有离接收器太远
  3. 线路有没有接错