单片机学习小组
直播中

南中南

8年用户 1003经验值
擅长:光电显示
私信 关注

如何实现红外遥控小车的设计?

如何实现红外遥控小车的设计?

回帖(1)

李敏

2022-2-15 11:47:39
红外遥控小车

【材料】
1、NEC编码红外遥控器;
2、红外接收器 VS1838B;
3、Arduino uno 一块
4、L298n驱动一块
5、9v电池
6、杜邦线若干
7、小车底板
8、四个直流电机
【模块介绍】
1、红外接收器 VS1838B
VS1838b红外接收头,内部集成了监测,放大,滤波,解调等一系列电路处理输出基带信号。小车上安有红外接收装置,红外接收装置负责将接收到红外遥控器的信号进行解码,小车依据相应的命令进行操作。
红外接收器面向自己,从右往左分别是VCC,GND,OUT.
供电电源是3.3V–5V.(建议使用3.3V,电压太大容易坏掉)

原始信号就是我们要发送的一个数据“0”位或者一位数据“1”位,而所谓 38K 载波就是频率为 38K 的方波信号,调制后信号就是最终我们发射出去的波形。我们使用原始信号来控制 38K 载波,当信号是数据“0”的时候,38K 载波毫无保留的全部发送出去,当信号是数据“1”的时候,不发送任何载波信号。要想让 HS0038B 识别到 38K的红外信号,那么这个 38K 的载波必须要大于 10 个周期,这就限定了红外通信的基带信号的比特率必须不能高于 3800,那如果把串口输出的信号直接用 38K 调制的话,波特率也就不能高于 3800。

2、NEC编码红外遥控器
遥控范围是8–10 m(其实没有这么远,大概就两三米),红外波载频率为38 KHZ,
每个按键都有自己不同的编码,利用接收器收到不同的编码对小车执行不同的指令。但是当你连续快速按按键时,串口就会显示不同的编码。所以在编写代码时,尽可能填写多种可能的代码。
【小车组装】
模块接线如下:

#这里一个驱动板控制了四个电机,同侧的电机接在驱动板的一侧;
#驱动板,红外接收器,arduino的GND 要共地,否则小车不能动;
#arduino的供电可以从DC接口引入,也可以从驱动板引出5V供电,也可以直接从arduino的VIN接口供电,该接口供电范围是5–12V.
#组装时各模块要固定好,否则杜邦线会松动,损坏开发板。
Arduino 代码如下:

#include   // 使用IRRemote函数库
///选择///
#define choose 2    //1为通过串口打印码值模式  
                    //2为主函数运行模式
//电机设置/


#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
void motor_pinint( );     //引脚初始化
void forward( );          //前进
void back( );             //后退
void turnLeftOrigin( );   //原地左
void turnRightOrigin( );  //原地右
void _stop();             //停车

//红外遥控/

const int irReceiverPin = 2;  // 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接口
IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;    // 定义results变量为红外结果存放位置
void rev(void);
void scan(void);

void setup()
{
  Serial.begin(9600); //9600(PC端使用)
  motor_pinint();        //电机引脚初始化
  irrecv.enableIRIn();   // 启动红外解码

}
void loop()
{
  if(choose==1) scan();
  else if(choose==2) rev();  
}

/*电机引脚初始化*/
void motor_pinint( )
{
  pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
  }
/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  analogWrite(leftA_PIN,120);      
  analogWrite(leftB_PIN,0);         //左轮前进
  analogWrite(righA_PIN,120);      
  analogWrite(righB_PIN,0);         //右轮前进
}
/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,120);        //左轮后退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,120);        //右轮后退
}
/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,0);        
  analogWrite(righA_PIN,80);      
  analogWrite(righB_PIN,0);          //右轮前进
}
/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
  analogWrite(leftA_PIN,80);      
  analogWrite(leftB_PIN,0);        //左轮前进
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,0);      
}


/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,0);         //左轮静止不动
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,0);         //右轮静止不动
}

void rev(void)
{
  if   (irrecv.decode(&results)) {   // 解码成功,把数据放入results.value变量中
  if   ((results.value==16718055)||(results.value==1033561079))
       {forward( ) ;    }//2前进
  else {if((results.value==465573243)||(results.value==16730805)||(results.value==304335233)||(results.value==891929274)||(results.value==93040025))
       {back( )   ;     }//8后退
       else{if((results.value==2351064443)||(results.value==16716015)||(results.value==3640844469)||(results.value==3606423579))   
       {turnLeftOrigin( )   ;  }//4原地左转
       else{if((results.value==16734885)||(results.value==71952287))   
       {turnRightOrigin( )   ;   }//6原地右转
       else{if((results.value==16724175)||(results.value==814588342)||(results.value==2534850111)||(results.value==16724175))
       {_stop( ) ;  }//1停车
       }}}}



irrecv.resume();


  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分