Ameba Arduino: [RTL8195] [RTL8710] IR – 使用红外线传送、接收器

材料准备

  • Ameba x 1
  • Grove - Infrared Receiver x 1
  • Grove - Infrared Emitter x 1

原理
红外线是不可见光,波长在770nm〜1毫米之间,常见于家中的遥控器。
一般的红外线传送端与接收端需要事先规范好传送的频率,常见的规范有NEC,Philips RC5,RC6,RCMM,Toshiba, Sharp, JVC, Sony SIRC......。其中NEC是家电常用的规范,它使用38KHz的频率。
红外线接收器里面有解调器(demodulator),它的讯号线平常会输出数位讯号3.3V(或5V)。接收到一定頻率的紅外線訊號時,它的數位輸出會變成0V。如果不是這個頻率的紅外線,像是手上拿著紅外線燈開關個幾次,紅外線接收器不會對這有反應,以避免雜訊。
红外线发射器则要传送对应频率的讯号,一般来说是PWM讯号。
一个完整的红外线发设器的讯号如下图,它分成几个阶段:
1

  1. 一开始他会送起始讯号,它分成Start high与Start low,其中Start high的讯号为PWM讯号,频率为38K,Start low则是一般的数位输出,只要不是PWM讯号即可,一般为了省电会将讯号置于0V。
  2. 接着会送资料,依序将资料以字节为单位送出,送的顺序为LSB(最低有效位)至MSB(最高有效位)。其中第1位的表示方式,先打出长度560us的PWM讯号,再停止1.69ms。而位0的表示方式,打出長度560us的PWM訊號,再停止560us。可以看到0跟1的表示方式差別只在於後面的停止長度。
  3. 资料送完之后,送一个1位当作Stop bit,然后不再送讯号。

接收端的部份,因為已經經過解調器,所以原本是PWM訊號的地方,都被轉成一般的數位輸入:
2
而原本不是PWM讯号的地方,都被置于3.3V(或5V)的地方。

红外线接收范例

Ameba在实作上,使用了一根GPIO Interrupt与硬体的Timer 4。范例请打开 “File” -> “Examples” -> “AmebaIRSendRecv” -> “recv”
在接收器的部份,这个范例里使用Grove Infrared Receiver,如果你使用其它的红外线接收器也类似。一般只会用到三根Pin:一根VCC(接3.3V),一根GND,一根RX。范例里RX接到D3 (具有GPIO Interrupt),接法如下:
3

RTL8710,接法如下:
3

然后编译程式并上传到Ameba,完成之后按Reset按键。
如果你手边有NEC规格的遥控器,就可以试试看是否有接收到讯息。如果没有的话,也可以参考红外线发射的范例,并设定另一块Ameba互传。
如果有接收到讯息,那么会在Serial Monitor里看到解析的结果
4

红外线传送范例

红外线传送器一般只有2根Pin,就像是一般的LED灯泡,只不过发出的是红外线灯光。
Grove的Infrared Emitter有3根Pin:一根VCC,一根GND,一根TX。实际上也可以只接GND与TX。
Ameba在传送上,为了要及时地送出38K的讯号,在实作上使用了一组UART,并且用UART的TX将讯号送出去。也因为用了一组UART,当使用Ameba传送红外线,D0 (UART RX)就无法使用。接法如下:
5这样接会有额外的耗电,因为UART的TX平常准位(Level)在3.3V,造成平常红外线的登是亮的,于是我们改变接法,将Ameba的UART TX接在传送器的GND,并且将传送器的讯号线接在3.3V上:
6

RTL8710接线图如下:
6

这样的话,不传送的时候,GND的PIN与TX的PIN都在3.3V,电压差为0,灯就不会亮。
最后打开范例, “File” -> “Examples” -> “AmebaIRSendRecv” -> “send”,编译并上传到Ameba之后,按下Reset按钮。
范例里会每两秒送一次讯号,可以与前一个红外线接收的范例对测即可。

程式码说明

这里的API参考Grove IR Send Recv的library,原始的程式码可以参考这里,Ameba虽然API一样,但实作上与Arduino不同。

  • 红外线接收
    首先接收要先设定要在哪根PIN上,它需要使用GPIO Interrupt,所以只能选有GPIO Interrupt的PIN,范例里使用的是D3
    IR.Init(pinRecv)
    在Loop里则是一直检查是否有讯号进来
    IR.IsDta()
    如果有讯号进来,就将结果放进使用者自行宣告的buffer里
    IR.Recv(dta)
    这个buffer的资料格式如下:

    • Byte 0: 整包资料的长度
    • Byte 1: Start high的长度,单位为50us
    • Byte 2: Start low的长度,单位为50us
    • Byte 3: 资料如果是bit 1,不打PWM的长度,单位是50us
    • Byte 4: 资料如果是bit 0,不打PWM的长度,单位是50us
    • Byte 5….: 传送的资料

 

  • 红外线传送
    传送的部份只需要呼叫Send,第一个参数是资料内容,第二个参数是讯号频率,单位是1K,范例中使用38KHz
    IR.Send(dtaSend, 38)
    资料格式如下:

    • Byte 0: 整包资料的长度
    • Byte 1: Start high的长度,单位为50us
    • Byte 2: Start low的长度,单位为50us
    • Byte 3: 资料如果是bit 1,不打PWM的长度,单位是50us
    • Byte 4: 资料如果是bit 0,不打PWM的长度,单位是50us
    • Byte 5: 资料的长度
    • Byte 6….: 资料内容