机器人等级考试4级第二章.docx
- 文档编号:23457990
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:21
- 大小:882.92KB
机器人等级考试4级第二章.docx
《机器人等级考试4级第二章.docx》由会员分享,可在线阅读,更多相关《机器人等级考试4级第二章.docx(21页珍藏版)》请在冰豆网上搜索。
机器人等级考试4级第二章
第二章红外遥控调速小风扇
炎热的夏天,很多人都怕得空调病,选择使用电风扇,但是电风扇调档需要手动去按,使用不便,为了解决这一问题,我们来一起制作遥控小风扇!
在制作之前,大家先思考一下遥控小风扇都具有哪些功能呢?
2.1红外遥控控制LED灯
2.1.1知识准备
红外遥控器由纽扣电池供电。
注意:
不要将遥控器电池安反。
红外遥控器上每个按键都有各自的编码,按下按键后,遥控器就会发送对应编码的红外波。
项目开始前,先安装红外遥控库IRremote.zip。
红外遥控控制LED灯的程序流程图如图2-11所示。
图2-1红外遥控控制LED灯流程图
2.1.2硬件搭建
2.1.2.1认识新硬件
红外遥控组件
红外遥控组件分別由红外遥控器和红外接收模块两部分组成。
红外遥控器将按键的编码值发送到红外接收器模块;红外接收器模块接收遥控器的编码值,并将码值传送给UNO主控板。
图2-1红外遥控器
红外通信是常用的一种无线通信方式。
除了红外通信以外,还有蓝牙、Wi-Fi、RFID等方式。
红外通信是一种利用红外光编码进行数据传输的无线通信方式,是目前使用最广泛的一种通信和遥控手段。
红外遥控装置具有体积小、功耗及成本低等特点,因而被广泛使用。
日常生活中的电视机遥控器、空调遥控器,均使用红外遥控。
红外遥控器如图所示。
红外遥控器上每一个按键都有各自的编码,按下按键后,遥控器就会发送对应编码的红外波。
红外遥控器有多种编码方式,最常见的红外遥控器大多使用NEC编码。
红外接收模块
红外接收模块由红外接收头组成,红外接收头是一个一体化的红外接收电路,包含了红外监测二极管、放大器、滤波器、积分电路、比较器等。
其功能是接收红外信号并还原成发射端的波形信号。
红外接收器接收38kHz左右的红外信号。
图2-3红外接收模块
红外遥控器发出信号,红外接收器接收信号,处理后将信号传给Arduino主控板,由Arduino主控板内的程序根据不同按键的键值,控制程序做出不同的反应。
红外遥控模块对应的红外库为IRremote。
该库能接收Sony、飞利浦、NEC和其他品牌的遥控器信号。
红外接收器有三个引脚:
GND、VCC、DO
2.1.2.2硬件清单
项目
模块
数量
1
红外接收模块
1
2
红外遥控器
1
3
LED模块
2
2
传感器数据线
3
3
青蜓派arduino控制器
1
4
程序下载线
1
2.1.2.3电路搭建
图2-4红外遥控控制LED灯电路连接示意图
2.1.2.4搭建说明
Ø将红外接收模块连接到青蜓派控制器的3号端口;
Ø将红色LED模块连接到青蜓派控制器4号端口
Ø将绿色LED模块连接到青蜓派控制器5号端口
2.1.3编程实现
2.1.3.1程序编写
#include
(1)
constintledPin1=11;//红色LED灯信号引脚
constintledPin2=A0;//绿色LED灯信号引脚
constintirPin=10;////定义红外接收器信号引脚
IRrecvirrecv(irPin);//
(2)
decode_resultsresults;//(3)
voidsetup()
{
pinMode(ledPin1,OUTPUT);
pinMode(ledPin2,OUTPUT);
irrecv.enableIRIn();//启动红外接收功能
Serial.begin(9600);//初始化串口波特率为9600
}
voidloop()
{
if(irrecv.decode(&results)){//(4)接收红外遥控数据,赋值给results
Serial.println(results.value,HEX);//(5)将results的值以十六进制输出
switch(results.value){//(6)
case0xFF30CF:
//(7)红灯亮
{
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
break;
}
case0xFF18E7:
//(7)绿灯亮
{
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
break;
}
case0xFF7A85:
//(7)同时亮
{
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,HIGH);
}
}
irrecv.resume();//(8)
}
}
2.1.3.2程序说明
(1)引入红外函数库
(2)声明一个红外遥控对象irRecv,并初始化连接引脚为常量irPin,连接数据引脚10。
声明一个用于存储接收红外按键值的变量,名称为results。
(3)enableIRIn()红外类库的成员函数。
功能:
初始化红外接收器(解码),启动红外接收功能。
语法:
红外库对象.enableIRIn()
(4)decode()红外类库的成员函数。
功能:
接收红外信息(解码)。
如果decode()接收到新的数据,则返回值为true。
接收到的数据存储于变量results中。
语法:
红外库对象.decode(&results)。
(5)Serial.println(results.value.HEX)。
功能:
将遥控器按键信息通过串口以十六进制方式输出。
results.value为红外接收头接收的信号;HEX为十六进制输出方式。
BIN为二进制的输出方式。
遥控器的不同按键都对应有不同的编码,不同遥控器使用的编码方式不同。
在串口监视器中,会显示“FFFFFFFF”,这是因为使用的是NEC协议的遥控器,当按住某键不放时,会重复发送“FFFFFFFF”编码。
对其他协议的遥控器,则会重复发送其对应的编码。
(6)使用switch()选择语句对不同按键编码进行判断,执行不同的程序功能。
switch…case语句是三种基本程序逻辑结构中的选择结构,其语法表示如下:
switch(表达式){
case常量表达式1:
语句1
break;
case常量表达式2:
语句2
break;
case常量表达式3:
语句3
break;
.
.
.
default:
语句n;
}
switch语句和if语旬相比,脉络更加清晰。
不过switch语句后的表达式的结果只能是整型或者字符型,如果使用其他的类型,则必须使用if语句。
每个case语句以“:
”结束。
整个case的判断,一般要使用break语句退出switch结构。
如果没有break语句,那么程序会继续执行下一个case判断直到下一个break语句或整个switch结构运行结束。
break语句也在for循环和while播环中使用,用于终止当前循环,执行循环体后面的语句。
(7)0xFFA25D为按键对应的十六进制编码,每个红外遥控器的各个按键所对应的编码不同,所以需要读取每个按键的编码值,找到按键和其编码值的对应关系。
按键所对应的编码不同,所以需要读取每个按键的编码值,找到按键和其编码值的对应关系。
(8)resume()红外类库的成员函数。
功能:
接收下个红外编码。
语法:
红外库对象.resume()。
resume不可忽略,应与decode()函数配对使用,否则,只能读取一个红外按键值,而不再接收新的按键值。
2.1.3.3运行结果
上传程序并打开串口监视器(注意修改波特率为9600),将红外遥控器对准红外接收模块,按下红外遥控器各个按键并记录其对应的编码值。
如果接收的按键编码值与程序中不一样,在程序中,请修改程序以反映正确的编码值,重新上传程序。
程序现象:
按下按键1,实现功能1,红灯亮;按下按键2,实现功能2,绿灯亮;按下按键3,两灯同时亮。
不同种类的红外遥控器,按键的编码值也不相同,所以程序中每个按键对应的功能应根据实际需要调试修改。
2.2按键控制直流电机的启停
2.2.1知识准备
常用的电机根据电源不同有直流驱动和交流驱动两种,而直流驱动电机又分为直流电机和步进电机。
2.2.2硬件搭建
2.2.2.1认识新硬件
三极管
S8050晶体三极管是NPN型,其三个引脚的顺序如图所示。
晶体三极管有三只引脚,分别叫做B(基极)、C(集电极)和E(发射极)。
三个引脚的功能可以概述为:
基极(Base)相当于控制台,集电极Collector)代表收集电流,发射极(Emitter)代表射出电流。
晶体三极管根据构造结构不同,分为NPN和PNP两种类型,
图2-5NPN三极管
NPN型晶体三极管通常情况下,是断开状态,当一个小的电流流人基极(B)或一个小的正向偏压加在基极和发射极时,它就处于导通状态,允许一个较大的集电极-发射极电流,用于开关电路和放大电路。
PNP型晶体三极管与NPN型相反,当一个小的电流流出基极(B)或一个小的反向偏压加在基极和发射极时,它就处于导通状态,允许一个较大的发射极-集电极电流,用于开关电路和放大电路。
二极管是常见的半导体器件之一。
二极管有很多种类型,如整流二极管、开关二极管等。
二极管最基本的特性是单向导电性。
所以二极管经常用在把交流电压和电流转换成直流电压和电流的电路中,如常见的AC/DC电源适配器。
二极管为极性器件,电路图中,不同类型的二极管符号不同,PN结二极管的符号为
图2-6二级管
直流小马达
马达是通过电磁感应,将电能转换为机械能的装置,通过改变直流电机两个引脚的电压,控制电机的转速变化,正转或者反转,直流马达也可以发电,将机械能转换成电能。
图2-7直流电机
2.2.2.2硬件清单
项目
模块
数量
1
S8050晶体三极管
1
2
FR107二极管
1
3
100Ω电阻
1
4
按键模块
1
5
5号电池
2
6
电池盒
1
7
传感器数据线
1
8
R11转换线
1
9
直流电机
1
10
青蜓派arduino控制器
1
11
杜邦线
若干
12
程序下载线
1
2.2.2.3电路搭建
图2-8按键控制直流电机启停连接示意图
2.2.2.4搭建说明
(1)二极管是极性器件,单向导电。
二极管有条纹末端的为阴极或负极,另一端为阳极。
连接二极管的阳极到马达的地,阴极到马达的电源。
这样连接的目的是什么呢?
直流马达内部有线圈,电磁感应,通电时,把电能转换为机械能;断电的瞬间,马达会产生感应电流,感应电流的方向和原来相同。
并联二极管将感应流导回电机,防止进入电路,损坏电路中的晶体管。
(2)将晶体三极管放置在面包板上,有字的平面正对着您。
将青蜓派控制器的数字引脚10连接晶体管中间引脚(B),晶体管右侧引脚(C)和马达相连,晶体管左侧引脚(E)连接电池盒GND。
(3)此导线的目的是为了实现电池电源和UNO主控板共地。
(4)控制器的数字端口10引线
(5)控制器的GND线
按键模块接入控制器的4号端口
2.2.3编程实现
2.2.3.1程序编写
constintmotorPin=10;
constintbuttonPin=11;
voidsetup()
{
pinMode(motorPin,OUTPUT);
pinMode(buttonPin,INPUT);
Serial.begin(9600);
}
voidloop()
{
intval=digitalRead(buttonPin);//读取按键值
(1)
if(val==0)//
(1)
{
digitalWrite(motorPin,HIGH);//
(1)
}
else
{
digitalWrite(motorPin,LOW);//
(1)
}
/*if(val==0){
for(inti=50;i<=255;i+=5){
analogWrite(motorPin,i);//
(2)
delay(20);
}
for(inti=255;i>=50;i-=5){
analogWrite(motorPin,i);
delay(20);
}
}
else{
analogWrite(motorPin,0);//
(2)
}*/
}
2.2.3.2程序说明
(1)程序val=digitalRead(keyPin)读取按键模块的值,赋值给变量vaL因为按键模块默认为上拉电路,所以按键默认状态返回值为1,当按键按下时,返回值为0。
电路中的晶体三极管为NPN型。
当按键按下时,程序digitalWrite(motorPin,HIGH)往晶体三极管基极写入高电平,三极管导通,马达加电后启动旋转。
释放按键时,程序digitalWrite(motorPin,LOW)往晶体三极管基极写入低电平,三极管处千默认断开状态,马达停止旋转。
图2-9三极管通断示意图
2.2.3.3运行结果
单击工具栏中的上传按钮,将程序上传到UNO板。
按下按键,马达开始旋转,释放按键,马达逐渐停止。
把下方注释的语旬解除注释,重新上传程序。
按下按键,观察马达的运动状态。
结合程序
(2),思考马达速度变化的原因?
实验发现,通过analogWrite(motorPin,i)向晶体三极管的基极(B)输入一个PWM信号,马达的速度发生了变化。
晶体三极管基极接收到PWM信号后,随着PWM信号高低电平的变化而导通和断开,导通的时间由占空比决定,通过控制PWM值的变化,从而实现马达转速的变化。
所以要通过三极管实现风扇小马达的速度变化,与基极相连的应该是引脚3/5/6/9/10/11中的一个。
2.2.3.4程序进阶
在上述电路中,增加一个电位器,来控制马达转速的变化。
2.3红外遥控调速小风扇
2.3.1知识准备
本项目通过将舵机、红外遥控、晶体三极管、马达等,制作一个实用化的调速小风扇,实现启动、停止、加速、减速以及摇头的功能。
请你先自己想一想,应该如何实现呢?
图2-10红外遥控调速小风扇程序流程图
2.3.2硬件搭建
2.3.2.1硬件清单
项目
模块
数量
1
S8050晶体三极管
1
2
FR107二极管
1
3
100Ω电阻
1
4
红外接收模块
1
5
5号电池
2
6
电池盒
1
7
传感器数据线
1
8
R11转换线
1
9
直流电机
1
10
舵机
1
11
青蜓派arduino控制器
1
12
杜邦线
若干
13
程序下载线
1
2.3.2.2搭建说明
和上一个项目搭建相似,将按键模块换成红外接收模块,舵机接入舵机接口2。
其他不变。
2.3.3编程实现
2.3.3.1程序编写
#include
constintservoPin=5;//定义舵机信号引脚
constintirPin=11;//定义红外接收器信号引脚
constintmotorPin=10;//定义晶体三极管的基极引脚
IRrecvirrecv(irPin);//声明红外遥控对象irrecv
decode_resultsresults;//声明变量,用于接收红外按键值
constintangleStep=5;//设定舵机转动的基本步幅
constintspeedStep=5;//设定马达转速调整的基本步幅
constintminSpeed=50;//设定马达的最低转速
intmotorSpeed=150;//马达的转速,初始值为150
intangle=90;//舵机的位置角度,初始值为90
booleanmotorStatus=false;//状态变量false:
close,true:
open
(1)
voidsetup()
{
pinMode(motorPin,OUTPUT);
pinMode(servoPin,OUTPUT);//设定舵机接口为输出接口
irrecv.enableIRIn();//启动红外遥控
servo(angle);//定位舵机到90度
delay(600);
Serial.begin(9600);//初始化串口波特率为9600
}
voidloop()
{
if(irrecv.decode(&results)){//红外接收按键值
Serial.println(results.value,HEX);//将按键值输出到串口监视器
switch(results.value){//判断按键值
case0xFF02FD:
{
motorSpeed+=speedStep;
if(motorSpeed>255)
motorSpeed=255;//风扇转速增加
(2)
break;
}
case0xFF9867:
{
motorSpeed-=speedStep;
if(motorSpeed motorSpeed=minSpeed;//风扇转速降低 (2) break; } case0xFFA857: { motorStatus=! motorStatus;//(3) break; } case0xFFE01F: { angle-=angleStep; angle=(angle<0)? 0: angle;//(4) servo(angle);//转动舵机到角度angle delay(300); break; } case0xFF906F: { angle+=angleStep; angle=(angle>180)? 180: angle;//(4) servo(angle);//转动舵机到角度angle delay(300); break; } } irrecv.resume();}//接收下一个数据 if(motorStatus){//马达转动(5) analogWrite(motorPin,motorSpeed); } else{ analogWrite(motorPin,0); } } voidservo(intangle1){//定义一个脉冲函数 //发送50个脉冲 for(inti=0;i<50;i++){ intpulsewidth=(angle1*11)+500;//将角度转化为500-2480的脉宽值 digitalWrite(servoPin,HIGH);//将舵机接口电平至高 delayMicroseconds(pulsewidth);//延时脉宽值的微秒数 digitalWrite(servoPin,LOW);//将舵机接口电平至低 delayMicroseconds(20000-pulsewidth); } delay(100); } 2.3.3.2程序说明 (1)定义了马达启停的状态变量motorStatus。 本项目的功能是通过一个按键来切换马达的启动和停止。 如何通过一个按键实现两种功能状态呢? 通过布尔类型变量motorStatus来记录当前的状态,布尔类型的变量值只可能是true或者false。 程序中设定值为true时马达转动,值为false时马达静止。 (2)通过两个按键分别控制马达速度的变化。 由上一个项目知道,马达速度的变化是通过PWM来控制的,通过程序来改变变量motorSpeed值的大小,改变的幅度为speedStep。 因为PWM的范围为0~255,所以当motorSpeed的值超出0-255时,分别取值为0和255。 (3)"! "是“非“的运算符,如果motorStatus的值为true,那么"! motorStatus"的值为false。 通过这个语旬实现了状态变噩motorStatus的值在true和false之间切换。 (4)程序的功能是控制舵机的转动角度angle的值在0~180之间。 程序"angle=(angle<0)? 0: angle;"的右侧是一个三目运算符表达式,是一个简化版的选择结构。 使用格式如下: 逻辑表达式1: ? 表达式2: 表达式3; 其含义是如果逻辑表达式1的值为真,将返回表达式2的值;如果逻辑表达式1的值为假,将返回表达式3的值。 (5)程序(3)实现了状态变量motorStatus的变化,通过(5)的选择结构语旬,实现了马达的启动和停止。 2.3.3.3运行结果 单击工具栏中的上传按钮,将程序上传到UNO板,按下OK按键启动/停止马达。 按"◄”“►”键控制舵机左转和右转;按"+"”-”控制马达加速和减速。 2.3.3.4程序进阶 很多电风扇都有自动摇摆功能,请你修改程序,实现通过红外遥控器上某一功能键,实现风扇的自动摇摆和归位控制。 本章中讲到了温度传感器,尝试给小风扇增加一个温度控制启停功能。 当室温大于或等于26°时,风扇自动打开,低于时自动关闭。 获取温度传感器的值可以参考如下步骤: 步骤一: 连接温度传感器模块到引脚A0。 步骤二: analogRead(A0)函数读取返回值。 步骤三: 返回值×0.488,即得到当前的温度值,参数0.488是通过下式计算得到的。 (5.0÷1024)×1000÷10=0.488 温度模块 温度模块由LM35温度传感器和相应的电路组成。 LM35温度传感器的输出电压和摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。 图2-11温度传感器 温度模块的具体参数如下: 工作电压: 4-20V 比例因数: 线性+10.0mv/℃ 精度: 0.5℃精度(在+25℃时) 温度范围: 0-100℃ 温度模块有三个引脚GND、VCC和A0,A0引脚连接模拟输入引脚。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人 等级 考试 第二