• 方案介紹
    • 一、環(huán)境介紹
    • 二、NEC協議與相關硬件介紹
    • 三、核心代碼
    • 四、格力空調遙控協議介紹
    • 五、美的空調協議介紹
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

STM32入門開發(fā): 制作紅外線遙控器(智能居家-萬能遙控器)

02/21 09:30
3634
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯系.docx

共1個文件

一、環(huán)境介紹

MCU: STM32F103ZET6

編程軟件環(huán)境: keil5

紅外線傳輸協議:??NEC協議---38KHZ載波:。NEC協議是紅外遙控協議中常見的一種。

編碼發(fā)送思路:??延時函數模擬38KHZ +? PWM產生38KHZ兩種方式

代碼風格:???模塊化編程,寄存器直接操作方式

完整keil工程源碼下載(解壓即可編譯運行測試):?

https://download.csdn.net/download/xiaolong1126626497/19863305

二、NEC協議與相關硬件介紹

2.1 NEC協議介紹

NEC協議在上篇<STM32入門開發(fā): NEC紅外線協議解碼(超低成本無線傳輸方案)>文章里已經詳細介紹過了。這篇文章和上篇文章內容是連貫的,上篇文章完成NEC紅外線協議解碼,這篇文章就當做遙控器發(fā)送端,發(fā)送自定義數據給接收端,完成自定義的數據傳輸;也可以模擬家電遙控器,對電視機、投影儀、空調等設備進行遙控操作。

紅外線協議有很多,本章節(jié)主要是針對NEC協議講解,只要把NEC協議原理搞懂了,其他協議都是一樣的使用;如果想要模擬空調遙控器,去控制美的空調、格力空調這些設備,就需要按照美的、格力空調的協議發(fā)送;如果不知道協議長什么樣,可以將邏輯分析儀插在紅外線接收頭的引腳上,拿個正常的空調遙控器對著接收頭按一下,然后采集數據分析,即可得到協議規(guī)律,然后網絡上也有空調按鍵值功能的說明文檔,調試一下即可。

2. 2 使用的相關硬件

因為要模擬紅外線遙控器,就需要一個紅外線發(fā)射管;在學習階段,如果不想自己搭建電路,可以買現成的模塊。 買模塊連接也是比較穩(wěn)定,接線也比較簡單,VCC和GND接好之后,把DAT引腳接到STM32任意一個IO口上即可,如果想用硬件PWM控制發(fā)送,那么引腳接到STM32的PWM輸出腳即可。

2.3 完成NEC協議編碼發(fā)送

先看一段紅外線接收頭引腳上采集的NEC協議的電平: 這是接收端采集的。

紅外線接收頭的硬件特性: (注意: 這里是針對NEC遙控器協議來說明),下圖就是當前使用的紅外線接收頭。

收到38KHZ的紅外光,IN引腳就輸出低電平;沒有收到IN引腳就輸出高電平。

NEC紅外線協議說明:(這是站在接收端解碼的角度分析的)

一段獨立的NEC協議數據包由引導碼+32位數據組成。

引導碼:? 9ms的高電平? +? 4.5ms 低電平組成。

32位數據就是:? 8位用戶碼+ 8位用戶反碼+ 8位按鍵碼+8位按鍵反碼

每個數據位之間的間隔時間是0.56ms(低電平)

NEC協議是依靠收到的高電平持續(xù)時間來判斷數據0和數據1;高電平持續(xù)時間是0.56ms表示數據0,高電平持續(xù)時間是1.68ms表示數據1。

只要明白上面說的兩個特點,就可以寫程序,按照NEC協議驅動紅外線發(fā)射管,發(fā)送數據了。

編寫發(fā)送程序之前,得先明白這個38KHZ的紅外光如何產生?

STM32支持硬件PWM功能,可以配置38KHZ方波輸出;如果沒有硬件PWM功能的單片機,也可以使用延時的方式產生38KHZ方波,差那么一點點問題也不到,解碼端適當調整一下時間范圍即可。

采用延時函數實現方法如下:

/*
函數功能: 發(fā)送38KHZ的載波
函數參數:
u32 time_us 持續(xù)的時間
u8 flag 1表示發(fā)送38KHZ載波,0表示不發(fā)送
*/
void InfraredSend38KHZ(u32 time_us,u8 flag)
{
    u32 i;
    if(flag)
    {
        //發(fā)送38KHZ載波
        for(i=0;i<time_us/13;i++)
        {
            INFRARED_OUTPUT=!INFRARED_OUTPUT;
            DelayUs(13);
        }
    }
    else
    {
        INFRARED_OUTPUT=1;//關閉紅外線發(fā)射管
        DelayUs(time_us);
    }
}

為了方便發(fā)送指定的用戶碼和按鍵碼,可以封裝成一個函數調用。

/*
函數功能: NEC協議編碼發(fā)送
函數參數: 
				u8 user 用戶碼
				u8 key  按鍵碼
先發(fā)低位
按鍵反碼+按鍵碼+用戶反碼+用戶碼
*/
void InfraredNECSend(u8 user,u8 key)
{
	u32 i;
	 /*1. 組合發(fā)送的數據*/
	u32 data=((~key&0xFF)<<24)|((key&0xFF)<<16)|((~user&0xFF)<<8)|((user&0xFF)<<0);
		
	 /*2. 發(fā)送引導碼*/
	InfraredSend38KHZ(9000,1);//發(fā)送38KHZ載波
	InfraredSend38KHZ(4500,0);//不發(fā)送
	
	/*3. 發(fā)送32位數據*/
	 for(i=0;i<32;i++)
	 {
			InfraredSend38KHZ(560,1); //間隔時間
			if(data&0x01)InfraredSend38KHZ(1685,0); //發(fā)送1
			else InfraredSend38KHZ(560,0); //發(fā)送0
		  data>>=1;
	 }
	 InfraredSend38KHZ(560,1); //間隔時間
}

這是使用邏輯分析儀采集的發(fā)送端波形: 和協議對應了一下,沒有問題。

對比一下解碼端采集的波形圖:

三、核心代碼

3.1 main.c

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <string.h>
#include <stdio.h>
#include "exti.h"
#include "timer.h"
#include "rtc.h"
#include "adc.h"
#include "ds18b20.h"
#include "ble.h"
#include "esp8266.h"
#include "wdg.h"
#include "oled.h"
#include "rfid_rc522.h"
#include "infrared.h"

int main()
{   
  LED_Init();
  KEY_Init();
  BEEP_Init();
  TIM1_Init(72,20000); //輔助串口1接收,超時時間為20ms
	USART_X_Init(USART1,72,115200);
	//InfraredDecodeInit(); //紅外線解碼初始化
	InfraredCodingInit();   //紅外線編碼初始化
  printf("UART1 OK.....n");
	
  while(1)
  {
		InfraredNECSend(13,14); //發(fā)送紅外線數據
		DelayMs(500);
		LED0=!LED0;
  }
}

3.2 紅外線.c

#include "infrared.h"

/*
函數功能: 紅外線編碼初始化
硬件連接: PG11
編碼思路: 采用延時函數實現38KHZ
*/
void InfraredCodingInit(void)
{
	  RCC->APB2ENR|=1<<8; //PG
	  GPIOG->CRH&=0xFFFF0FFF;
	  GPIOG->CRH|=0x00003000;
	  GPIOG->ODR|=1<<11;
}

/*
函數功能: 發(fā)送38KHZ的載波
函數參數:
u32 time_us 持續(xù)的時間
u8 flag 1表示發(fā)送38KHZ載波,0表示不發(fā)送
*/
void InfraredSend38KHZ(u32 time_us,u8 flag)
{
    u32 i;
    if(flag)
    {
        //發(fā)送38KHZ載波
        for(i=0;i<time_us/13;i++)
        {
            INFRARED_OUTPUT=!INFRARED_OUTPUT;
            DelayUs(13);
        }
    }
    else
    {
        INFRARED_OUTPUT=1;//關閉紅外線發(fā)射管
        DelayUs(time_us);
    }
}

/*
函數功能: NEC協議編碼發(fā)送
函數參數: 
				u8 user 用戶碼
				u8 key  按鍵碼
先發(fā)低位
按鍵反碼+按鍵碼+用戶反碼+用戶碼
*/
void InfraredNECSend(u8 user,u8 key)
{
	u32 i;
	 /*1. 組合發(fā)送的數據*/
	u32 data=((~key&0xFF)<<24)|((key&0xFF)<<16)|((~user&0xFF)<<8)|((user&0xFF)<<0);
		
	 /*2. 發(fā)送引導碼*/
	InfraredSend38KHZ(9000,1);//發(fā)送38KHZ載波
	InfraredSend38KHZ(4500,0);//不發(fā)送
	
	/*3. 發(fā)送32位數據*/
	 for(i=0;i<32;i++)
	 {
			InfraredSend38KHZ(560,1); //間隔時間
			if(data&0x01)InfraredSend38KHZ(1685,0); //發(fā)送1
			else InfraredSend38KHZ(560,0); //發(fā)送0
		  data>>=1;
	 }
	 InfraredSend38KHZ(560,1); //間隔時間
}

四、格力空調遙控協議介紹

4.1 協議解析

報頭脈沖:9ms

報頭間距:4.5ms

載波頻率:37.9KHz(38KHz)

碼段1與碼段2間距:20ms

“1”:脈寬,656us。間距,1640us。

“0”:脈寬,656us。間距,544us。

4.2 編碼定義

1-3位:模式

送風:圖標:風扇。代碼:110。

自動:圖標:循環(huán)箭頭。代碼:000。

除濕:圖標:水滴。代碼:010。

制冷:圖標:雪花。代碼:100。

制熱:圖標:太陽。代碼:001。

4位(加68位):開機關機

開機:1。

關機:0。第68位取反。

5-6位:風速

一級:10

二級:01

三級:11

自動:00

7、37、41位(加65位):掃風

上下掃風:110。第65位取反

左右掃風:101。

上下左右:111

無掃風:000

8位:睡眠

睡眠:1

不睡眠:0

9-12位與65-68位:溫度

制冷模式下:

溫度 9-12位 65-68位
30 0111 1000
29 1011 0000
28 0011 1111
27 1101 0111
26 0101 1011
25 1001 0011
24 0001 1101
23 1110 0101
22 0110 1001
21 1010 0001
20 0010 1110
19 1100 0110
18 0100 1010
17 1000 0010
16 0000 1100

制熱模式:

溫度 9-12位 65-68位
30 0111 0010
29 1011 1100
28 1101 0100
27 1101 1000
26 0101 0000
25 1001 1111
24 0001 0111
23 1110 1011
22 0110 0011
21 1010 1101
20 0010 0101
19 1100 1001
18 0100 0001
17 1000 1110
16 0000 0110

吸濕模式:

溫度 9-12位 65-68位
30 0111 0100
29 1011 1000
28 0011 0000
27 1101 1111
26 0101 0111
25 1001 1011
24 0001 0011
23 1110 1101
22 0110 0101
21 1010 1001
20 0010 0001
19 1100 1110
18 0100 0110
17 1000 1010
16 0000 0010

送風模式:

溫度 9-12位 65-68位
30 0111 1100
29 1011 0100
28 0011 1000
27 1101 0000
26 0101 1111
25 1001 0111
24 0001 1011
23 1110 0011
22 0110 1101
21 1010 0101
20 0010 1001
19 1100 0001
18 0100 1110
17 1000 0110
16 0000 1010

13-20位:睡眠定時

時間 13-20位
0.5 10010000
1 00011000
1.5 10011000
2 00010100
2.5 10010100
3 00011100
3.5 10011100
4 00010010
4.5 10010010
5 00011010
5.5 10011010
6 00010110
6.5 10010110
7 00011110
7.5 10011110
8 00010001
8.5 10010001
9 00011001
9.5 10011001
10 01010000
10.5 11010000
11 01011000
11.5 11011000
12 01010100
12.5 11010100
13 01011100
13.5 11011100
14 01010010
14.5 11010010
15 01011010
15.5 11011010
16 01010110
16.5 11010110
17 01011110
17.5 11011110
18 01010001
18.5 11010001
19 01011001
19.5 11011001
20 00110000
20.5 10110000
21 00111000
21.5 10111000
22 00110100
22.5 10110100
23 00111100
23.5 10111100
24 00110010
0 00000000

21位:超強

超強:1

普通:0

22位:燈光

亮:1

滅:0

23位與25位:健康,換氣

健康:10

換氣:01

健康+換氣:11

普通:00

24位:制冷模式下-干燥;制熱模式下-輔熱;

干燥:1

普通:0

45-46位:顯示溫度

不顯示:00

顯示:10

顯示室內溫度:01

顯示室外溫度:11

其他位:

除了29、31、34位為“1”外,均為“0”。其他位功能不詳(遙控器無對應項)。

第36位和69位分別是碼段1和碼段2的最后一位,無所謂“0”“1”。

4.3 其他說明

在自動模式下只可以設置的項目有:風速1、2、3級、自動;上上下左右掃風;顯示溫度;燈光;睡眠定時(非睡眠)。其他項均不可以設置。此時溫度不可設置,溫度段的代碼為:10011101。

在關機狀態(tài)下,可以設置定時開機,代碼與睡眠定時關機一樣。也可以設置燈光。

在制冷模式下,可以設置的項有:溫度;掃風;健康換氣,節(jié)能(僅在此狀態(tài)下可以設置);風速;定時;超強;睡眠;燈光;溫度顯示。

在除濕模式下,可以設置的項有:溫度;掃風;健康換氣;干燥;溫度顯示;定時;睡眠;燈光。

在送風模式下,可以設置的項有:溫度;風速;健康換氣;掃風;溫度顯示;定時;燈光。

在制熱模式下,可以設置的項有:溫度;風速;掃風;輔熱;溫度顯示;定時;超強;睡眠;燈光。

MGQ 2012-04-141、?格力YB0F2紅外信號命令格式

紅外信號主要包括CMD1和CMD2兩部分,其中CMD1包括35 位的命令 和一位停止位,CMD2包括32位的命令和一位停止位。

表格 1 CMD1

Bit:1~3 4 5~6 7 8
模式 開關機(CMD2 32bit取反) 風速 是否掃風 是否睡眠
9~12 13~16
溫度 睡眠1
17~20 21 22 23 24
睡眠2 超強 燈光 健康 干燥/輔熱
25 26 27 28 29 30 31 32
換氣 0 0 0 1 0 1 0
33 34 35
0 1 0

表格 2 CMD2

Bit:1 2 3 4 5 6 7 8
上下掃風 0 0 0 左右掃風 0 0 0
9~10 11 12 13 14 15 16
顯示溫度 0 0 0 0 0 0
17 18 19 20 21 22 23 24
0 0 0 0 0 0 0 0
25 26 27 28 29~32
0 0 0 0 溫度

五、美的空調協議介紹

L為引導碼,

S為分隔碼,

A為認別碼(A=10110010=B2,預留方案時A=10110111=B7),

A'為A的反碼,

B'為B的反碼,

C'為C的反碼

遙控器發(fā)射紅外信號之時,通過“560微秒低電平+1680微秒高電平”代表“1”,通過“560微秒低電平+560微秒低電平”代表“0”。

美的的紅外采用NEC格式的R05d

該協議的紅外信號編碼格式為:引導碼+客戶碼+客戶反碼+數據碼+數據反碼+結束位

其中引導碼和結束碼都是固定的,數據反碼由數據碼按位取反得來,真正變化的只有用戶碼和數據碼。

  • 更多詳細資料請聯系.docx
    下載
意法半導體

意法半導體

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據最新的工業(yè)統(tǒng)計數據,意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據最新的工業(yè)統(tǒng)計數據,意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.收起

查看更多

相關推薦