嵌入式人工智能(42-基于树莓派4B的红外遥控)

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了,红外模块显得有些尴尬了,只能适应一些低速的设备控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值