1、目录目录IRremote类库成员函数红外接收红外发射17.2 17.117.3红外遥控总述红外遥控总述Arduino可以使用的无线模块很多,驱动方式各有不同。本章将要介绍一种最常用、成本最低的无线通信方式红外通信。红外通信是一种利用红外光编码进行数据传输的无线通信方式,是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、成本低等特点,因而被广泛应用于各个领域。生活中常见的电视机遥控器和空调遥控器,均使用红外线遥控。17.1 IRremote类库成员函数1.IRrecv 类IRrecv类可用于接收红外信号并对其解码。在使用该类之前,需要实例化一个该类的对象。其成员函数如下
2、。(1)IRrecv()l功能:IRrecv类的构造函数。可用于指定红外一体化接收头的连接引脚。l语法:IRrecvobject(recvpin)l参数:object,用户自定义的对象名。recvpin,连接到红外一体化接收头的Arduino引脚编号。17.1 IRremote类库成员函数(2)enableIRIn()l 功能:初始化红外解码。l 语法:IRrecv.enableIRIn()l 参数:IRrecv,个IRrecv类的对象。l 返回值:无。(3)decode()l功能:检查是否接收到编码。l语法:IRrecv.decode(&results)l参数:IRrecv,一个IRrecv
3、类的对象。results,一个decode_results类的对象。l返回值:int型值,为0表示接收到编码;为1表示没有接收到编码。17.1 IRremote类库成员函数(4)resume()l 功能:接收下一个编码。l 语法:IRrecv.resume()l 参数:IRrecv,个IRrecv类的对象。l 返回值:无。2.IRsend 类IRsend类可以对红外信号编码并发送。17.1 IRremote类库成员函数(1)IRsend()l 功能:IRSend类的构造函数。l 语法:IRsendobject()l 参数:object,一个IRsend类的对象。(2)sendNEC()l功能:
4、以NEC编码格式发送指定值。l语法:IRsend.sendNEC(data,nbits)l参数:IRsend,一个IRsend类的对象。data,发送的编码值。nbits,编码位数。l返回值:无。17.1 IRremote类库成员函数(3)sendSony()l功能:以Sony编码格式发送指定值。l语法:Irsend.sendSony(data,nbits)l参数:IRsend,一个IRsend类的对象。data,发送的编码值。nbits,编码位数。l返回值:无。(4)sendRaw()l功能:发送原始红外编码信号。l语法:IRsend.sendRaw(buf,len,hz)l参数:IRsen
5、d,一个IRsend类的对象。buf,存储原始编码的数组。len,数组长度。hz,红外发射频率。l返回值:无。17.1 IRremote类库成员函数除此之外还有如下函数,用于其他常见协议的红外信号发送:l sendRC5();l sendRC6();l sendDISH();l sendSharp();l sendPanasonic();l sendJVC();在红外通信中的两端,一端进行红外信号的编码并发送,另一端接收红外信号并解码。以下示例中将使用红外遥控器作为红外信号的发送端,使用Arduino和一体化接收头作为红外信号的接收端。17.2红外接收要想使用遥控器来控制Arduino,首先需
6、了解遥控器各按键对应的编码,不同的遥控器,不同的按键,不同的协议,都对应着不同的编码。可通过IRremote的示例程序来获取遥控器发送信号的编码。红外信号接收端的制作只需将红外一体化接收头按图17-1连人Arduino即可,示例中将红外一体化接收头的输出脚连接到Arduino的11号引脚。17.2红外接收这里使用以下程序对红外信号进行解码,可以通过选择“文件”“示例”IRremoteIRrecvDemo菜单项找到该程序。下载好该示例程序后,使用遥控器向红外一体化接收头发送信号,并在串口监视器中査看,则会看到如图17-2所示的信息。17.2红外接收遥控器的每个按键都对应了不同的编码,不同的遥控器
7、使用的编码方式也不相同。之所以出现“FFFFFFFF”编码,是因为使用的是NEC协议的遥控器,当按住某按键不放开时,其会发送重复编码“FFFFFFFF”。对于其他协议的遥控器,则会重复发送其对应的编码。在以上示例中,通过语句int RECV_PIN=11;IRrecvirrecv;实例化了一个IRrecv类的红外接收对象irreev,并将红外接收头引脚连接到了Arduino的11号引脚上;接着在setup()中使用enableIRIn()函数初始化红外解码功能。在loop()中使用decode()函数检査是否收到编码,并将结果存储到decode_ results类的results对象中。解码后
8、的结果会保存在results.value中;最后通过 resume()函数开始接收下一个编码。17.2红外接收如果要使用红外遥控器来控制Arduino上连接的设备,则只需将解码后的结果results.value与设定功能的编码进行比对,如果一致,便执行相应的功能,如在以上程序中添加如下语句:switch case 0 xFFA25D:break;/按键对应的动作 case 0 xFFE21D:break;/按键对应的动作 case 0 xFF9867:break;/按键对应的动作.17.3红外发射除了使用红外遥控器发射红外信号外,也可以使用Arduino来发送经过编码的红外信号。如图17-3所
9、示,只需将红外发射管与Arduino连接即可,连接方式与普通LED类似,只要串联一个限流电阻即可。另外,IRremote库只能使用3号引脚作为红外信号输出脚。17.3红外发射可以通过选择“文件”“示例”IRremoteIRrecvDemo菜单项找到该示例程序。#includeIRsend irsend;void setup()Serial.begin(9600);/初始化串口通信 void loop()if(Serial.read()!=-1)for(int i=0;i3;i+)irsend.sendSony(0 xa90,12);/发送索尼电视机电源开关对应的编码 delay(40);17.
10、3红外发射这样便可模拟红外遥控器发射的经过编码的红外信号了。虽然红外光不可见,但可以通过手机或者电脑的摄像头来观察红外LED是否发光,以便排除硬件问题。还可以使用两块Arduino进行红外无线通信。在一定环境下,即使接收模块与发送模块没有相对,红外信号也可以靠物体反射进行传播。以上程序中使用了for循环,发送了3次Sony红外编码,这是因为在Sony、RC5、RC6协议中都规定编码要发送3次。IRremote库还可以使用其他函数来发送不同编码的红外信号,如使用sendNEC()发送NEC编码的红外信号,使用sendPanasonic()发送松下编码的红外信号等。除了这些常见标准协议外,IRremote库还支持发送自定义的原始编码。17.4 本章小结本章介绍了一种目前使用最广泛的通信和遥控手段红外通信,其因体积小、功耗低、成本低等特点,被广泛应用于各个领域。本章分别从IRremote类库成员函数、红外接收、红外发射三个方面对其进行了一些简单介绍。Thank You!