1、简介
红外遥控想必对大家来说都不陌生,红外也属于无线通信的一种,只要是无线通信,必然要用电磁波,要理解无线通信的本质和原理,不管用哪个频段都要学习电磁场与电磁波,这是一个难度很大的课,同学们好好学哈,我们实验都是很简单的。
红外遥控是一种通过红外光信号来控制电子设备的技术。它基于红外发射器和接收器之间的通信,通过发送特定的红外信号来模拟按下遥控器上的按键。
红外遥控器通常由两部分组成:发射器和接收器。发射器负责发送红外信号,而接收器用于接收并解码这些信号,然后将其传递给电子设备进行相应的操作。
在红外遥控中,不同的按钮通常对应于不同的红外信号,这些信号通过编码技术进行区分。当用户按下遥控器上的按钮时,发射器会发送相应的红外信号,接收器接收到信号后进行解码,然后将命令传递给电子设备执行相应的操作,比如调整音量、切换频道等。
红外遥控技术被广泛应用于电视、空调、音响等各种家电设备,它提供了方便快捷的控制方式,使用户能够轻松地操作设备而不必直接接触它们。同时,红外遥控还具有成本低廉、稳定可靠等优点,在家庭和办公环境中得到了广泛的应用。
上图一个是发射器,一个是接收器,接收器和树莓派开发板连接,发射器拿手里进行红外遥控,实际上就是发送不同的红外信号,接收器解码,开发板执行相应的动作。
2、接线与相应环境配置
这个接收模块只有3个引脚,VCC接5V,GND接地,DO接GPIO23(BOARD16),接线很简单,但是红外模块的系统环境设置比较复杂。
(1)安装 lirc模块
sudo apt-get install lirc
安装lirc软件包,同时系统会安装gir1.2-vte-2.91 liblirc0 libportaudio2 libusb-0.1-4 lirc python3-yaml软件包。
(2)加载模块
sudo nano /boot/firmware/config.txt
(3)修改配置文件
进入/etc/lirc/lirc_options.conf
sudo nano /etc/lirc/lirc_options.conf
driver = default
device = /dev/lirc0
sudo reboot
(4)测试
mode2 -m -d /dev/lirc0 然后按遥控器就可以收到很多数字了
如果不行开启下lircd服务
sudo service lircd status
(5)录入按键
树莓派可以通过lirc库发射接收红外信号,所以要先通过lirc库进行红外信号的配置后再发射
lirc软件包有一个irrecord命令可以配置按键,但是准确度不高。
这里我们仅用它输出配置文件格式sudo irrecord -f -d /dev/lirc0
这个录入按键实在是太繁琐,我们干脆找一个别人录好的直接用就行了。
sudo cp lircd.conf /etc/lirc/lircd.conf或者复制内容到lircd.conf
这个文件的内容大概是这样,后续会将我的所有代码和文件给大家,这个内容太多就不放里面了。
然后就可以测试按键对应码了
以上是红外遥控模块在Linux系统上的测试。如果都OK的话,说明没问题,我们可以继续。
3、红外遥控原理
红外发射信号0和1的表示方式:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如下图。
一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次代码,直到遥控器按键释放。重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。
下面是红外遥控模块的驱动,Infrared.py
import RPi.GPIO as GPIO
import time
PIN = 16
global Keynum
def GPIO_Init():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN,GPIO.IN,GPIO.PUD_UP)
def Get_Keynum():
if GPIO.input(PIN) == 0:
count = 0
while GPIO.input(PIN) == 0 and count < 200:
count += 1
time.sleep(0.00006)
count = 0
while GPIO.input(PIN) == 1 and count < 80:
count += 1
time.sleep(0.00006)
idx = 0
cnt = 0
data = [0,0,0,0]
for i in range(0,32):
count = 0
while GPIO.input(PIN) == 0 and count < 15:
count += 1
time.sleep(0.00006)
count = 0
while GPIO.input(PIN) == 1 and count < 40:
count += 1
time.sleep(0.00006)
if count > 8:
data[idx] |= 1<<cnt
if cnt == 7:
cnt = 0
idx += 1
else:
cnt += 1
if data[0]+data[1] == 0xFF and data[2]+data[3] == 0xFF:
#exec_cmd(data[2]) #可以不要,如果不用系统提醒按的是哪个键
keynum = data[2]
return keynum
4、实验代码和现象
红外遥控实验主要是通过接收不同的键值,获得不同的返回值,然后根据返回值触发相应的功能,那么我们就让接收到的键解码后的返回值显示到数码管上面。(后面我随便写了几个,视频里面没有)
import Infrared
import TM1638
def main_loop():
while True:
keynum = Infrared.Get_Keynum()
if keynum !=None:
print(keynum)
tm.number(int(keynum))
if __name__ == '__main__':
Infrared.GPIO_Init()
tm=TM1638.TM1638(stb=36,clk=38,dio=40)
tm.brightness(2)
try:
main_loop()
except KeyboardInterrupt:
print("程序结束!")
finally:
tm.clear()
红外遥控
if keynum == 12:
tm.led(0,1)
elif keynum == 24:
tm.led(1,1)
elif keynum == 22:
tm.leds(0b00000000)
else:
tm.leds(0b11111111)
不过现在都有蓝牙、wifi了,红外模块显得有些尴尬了,只能适应一些低速的设备控制。