1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 基于红外遥控的arduino遥控小车

基于红外遥控的arduino遥控小车

时间:2018-04-27 08:34:01

相关推荐

基于红外遥控的arduino遥控小车

遥控小车是每个人童年的最爱,不仅好奇它的奇妙,更是喜欢它带来的刺激。小编为大家带来几篇博客,来给大家讲讲制作遥控小车的程序。

看大标题可知我们一共有五个方法去制作一款带有遥控功能的小车,小编分开来给大家讲解。

本文是基于arduino的红外遥控小车

基于arduino的手机蓝牙遥控小车

基于arduino的红外遥控小车

基于arduino的无线NRF24L01遥控小车

基于ardunio的无线手柄遥控小车

基于ardunio的有线手柄遥控小车

从0到1教你做:基于红外遥控模块的Arduino的遥控小车

bilibili:/video/av74669242/

腾讯视频:/x/page/a301789lmwp.html

1、CSDN下载:

/download/qq_38351824/11107043

2、可以关注点赞并在下方评论,我给你邮箱发过去。

3、关注微信公众号下载:

① 关注微信公众号:Tech云

红外遥控小车,用的就是遥控器来控制小车的移动,遥控部分分为发射端和接收端。如下图

第一个是遥控器为发射端,第二个为接收端。

我们只需要记录下来每个按键对应的码值,然后就可以像按键那样写程序啦,就是if(串口接收到是) 那么......

那么如何测出每个按键的码值呢?

我们先来连接线路吧

一、接线:

(1)红外遥控接线:

(2)电机接线:

四个逻辑通道从左到右(即IN1到IN4)分别接5、6、9、10

12v供电,5伏输出给arduino供电

注意:此处驱动一定要和arduino共地!!!否则无法传输数据。

输出A接左边电机,输出B做右边电机

二、书写代码:

然后复制以下代码到编译器:

#include <IRremote.h> // 使用IRRemote函数库///选择///#define choose 2 //1为通过串口打印码值模式 //2为主函数运行模式//-------------------------------------------------------------------////*******************************************************************///////电机设置////#define leftA_PIN 5#define leftB_PIN 6#define righA_PIN 9#define righB_PIN 10void motor_pinint( );//引脚初始化void forward( );//前进void back( ); //后退void turnLeftOrigin( ); //原地左void turnRightOrigin( ); //原地右void turnRightforword( ); //右前void turnLeftforword( ); //左前void turnLeftback( );//左后void turnRightback( ); //右后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,180);analogWrite(leftB_PIN,0); //左轮前进analogWrite(righA_PIN,180);analogWrite(righB_PIN,0); //右轮前进}/**************************************************back子函数——后退子函数函数功能:控制车后退**************************************************/void back( ){analogWrite(leftA_PIN,0);analogWrite(leftB_PIN,180); //左轮后退analogWrite(righA_PIN,0);analogWrite(righB_PIN,180); //右轮后退}/**************************************************turnLeftOrigin子函数——原地左转子函数函数功能:控制车原地左转**************************************************/void turnLeftOrigin( ){analogWrite(leftA_PIN,0);analogWrite(leftB_PIN,120); //左轮后退analogWrite(righA_PIN,120);analogWrite(righB_PIN,0);//右轮前进}/**************************************************turnRightOrigin子函数——原地右转子函数函数功能:控制车原地右转**************************************************/void turnRightOrigin( ){analogWrite(leftA_PIN,120);analogWrite(leftB_PIN,0); //左轮前进analogWrite(righA_PIN,0);analogWrite(righB_PIN,120);//右轮后退}/**************************************************turnRightforword子函数——右前运动子函数函数功能:控制车右前**************************************************/void turnRightforword( ){analogWrite(leftA_PIN,200);analogWrite(leftB_PIN,0); //左轮快前进analogWrite(righA_PIN,120);analogWrite(righB_PIN,0); //右轮慢前进}/**************************************************turnLeftforword子函数——左前运动子函数函数功能:控制车左前**************************************************/void turnLeftforword( ){analogWrite(leftA_PIN,120);analogWrite(leftB_PIN,0); //左轮慢前进analogWrite(righA_PIN,200);analogWrite(righB_PIN,0); //右轮快前进}/**************************************************turnRightforword子函数——右后运动子函数函数功能:控制车右后**************************************************/void turnRightback( ){analogWrite(leftA_PIN,0);analogWrite(leftB_PIN,200); //左轮快后退analogWrite(righA_PIN,0);analogWrite(righB_PIN,120); //右轮慢后退}/**************************************************turnLeftforword子函数——左后运动子函数函数功能:控制车左后**************************************************/void turnLeftback( ){analogWrite(leftA_PIN,0);analogWrite(leftB_PIN,120); //左轮慢后退analogWrite(righA_PIN,0);analogWrite(righB_PIN,200); //右轮快后退}/**************************************************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( ) ;delay(500);_stop();}//2前进else if((results.value==465573243)||(results.value==16730805)||(results.value==304335233)||(results.value==891929274)||(results.value==93040025)){back( ) ;delay(500);_stop();}//8后退else if((results.value==16724175)||(results.value==814588342)||(results.value==2534850111)||(results.value==16724175)){turnLeftforword( ) ;delay(500);_stop();}//1左前else if((results.value==16743045)||(results.value==1635910171)||(results.value==16743045)){turnRightforword( );delay(500);_stop();}//3右前else if((results.value==1209942246)||(results.value==851901943)||(results.value==16728765)) {turnLeftback( ) ;delay(500);_stop();}//7左后else if((results.value==16732845)||(results.value==1623741183)) {turnRightback( ) ;delay(500);_stop();}//9右后else if((results.value==2351064443)||(results.value==16716015)||(results.value==3640844469)||(results.value==3606423579)) {turnLeftOrigin( ) ;delay(250);_stop();}//4原地左转else if((results.value==16734885)||(results.value==71952287)) {turnRightOrigin( ) ;delay(250);_stop();}//6原地右转irrecv.resume(); // 继续等待接收下一组信号}if(results.value==0x16) delay(600); //延时600毫秒,做一个简单的消抖}void scan(void){if (irrecv.decode(&results)) { // 解码成功,把数据放入results变量中// 把数据输入到串口Serial.print("irCode: "); Serial.print(results.value, DEC); // 显示红外编码Serial.print(", bits: "); Serial.println(results.bits); // 显示红外编码位数irrecv.resume(); // 继续等待接收下一组信号}if(results.value==0x16)digitalWrite(9, HIGH); delay(600); //延时600毫秒,做一个简单的消抖}

将以下截图中的2改为1,即开始测码值,然后下载程序

然后打开串口监视器,波特率设置为9600,使用遥控器对着红外头按下按键,串口监视器上就会出来当前按键的红外编码与位数。

显示irCode:FFFFFFFF,bits:32是因为遥控器上没有做中断,误码导致,只要按一下松开,再按一下松开就没问题。

这样我们就能获得每个按键的码值啦。

小编用的是遥控器上的1-9九个按键,分别对应着小车的不同状态如下图:

然后开始一个按键一个按键进行测试记录数据,将数据填入程序中即可(下图对应按键数据的红圈)

由于小编手头的材料比较劣质,所以往往是一个按键对应多个码值,为了减少误码,特意多写了几个数据;如下图:

将这部分数据测量更改后,准备工作就结束啦!

将以下截图中的1改为2,即开始主程序,然后下载程序

然后感受下,小车的转速、转角是否符合心意,如果想更改,请去每个按键对应的运动指令下,分别更改PWM和延时(对应下图的绿圈和红圈)

这样一个红外遥控小车就做完啦!

可能出现的问题/qq_38351824/article/details/88551999

如果大家在制作过程中有什么问题或者思路可以在下方留言和我一起交流噢!

如果发现本文有错误,也请在下方评论区指出,感激不尽!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。