单片机 编程语言 NEC单片机
回帖(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();
}
}
红外遥控小车
【材料】
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();
}
}
举报
更多回帖