Notas de desarrollo de ESP32 (3) Ejemplo de código fuente 12_IR_Rev_RMT Utilice RMT para realizar la recepción y decodificación de control remoto por infrarrojos (codificación NEC)

Enlace de compra de la placa de desarrollo

https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=626366733674

Introducción al
entorno de desarrollo de la placa de desarrollo para crear el
ejemplo de código fuente de Windows :
    0_Hello Bug (ESP_LOGX y printf)     plantilla de proyecto / salida de depuración de impresión
    1_LED                                                     LED encendido y apagado control       
    2_LED_Task                                           usar tarea para controlar LED
    3_LEDC_PWM                                       usar LEDC para controlar LED para lograr efecto de luz de respiración
    4_ADC_LightR                                       usar ADC para leer fotosensible Resistencia para lograr la detección de luz
    5_KEY_Short_Long                               presione prolongadamente y presione brevemente para lograr
    6_TouchPad_Interrupt                           Interrupción táctil capacitiva para lograr
    7_WS2812_RMT                                   RGB_LED ejemplo de cambio de color del arco iris
    8_DHT11_RMT                                     usando RMT para lograr la lectura del sensor de temperatura y humedad DHT11
    9_SPI_SDCard                                     usando el sistema de archivos de la tarjeta TF del bus SPI implementado ejemplar
    10_IIC_ADXL345                                 usando el bus IIC para leer el ángulo del sensor de aceleración
    ADXL345 11_IIC_AT24C02                                  usó la prueba del bus IIC para realizar un almacenamiento de datos de pequeña capacidad
    12_IR_Rev_RMT RMT implementado usando el receptor de control remoto por infrarrojos usando el decodificador de
    transmisión de datos por infrarrojos_RMT implementado 13 (NEC)
    14_WIFI_Scan Ejemplo de escaneo de señal WIFI cercano
    15_WIFI_AP Ejemplo de     creación de AP suave
    16_WIFI_AP_TCP_Server Implementación del servidor TCP
    en modo AP suave
    17_WIFI_AP_TCP_Client Implementación del cliente TCP en modo AP suave 18_WIFI_AP_UDP Implementación de comunicación UDP en modo AP suave
    19_WIFI_STA Crear modelo de estación STA
    20_WIFI_STA_TCP_Server Implementar servidor TCP
    en modo estación STA
    21_WIFI_STA_TCP_Client Implementar cliente TCP en modo estación STA
    22_WIFI_STA_UDP Implementar comunicación UDP en modo estación STA 23_LVGL_Test Ejemplo simple de biblioteca gráfica LVGL

Introducción a los infrarrojos

La tecnología de control remoto, también conocida como tecnología de control remoto, se refiere a la realización del control remoto del objetivo controlado y se usa ampliamente en los campos del control industrial, aeroespacial y electrodomésticos.

El control remoto por infrarrojos es una tecnología de control inalámbrico sin contacto. Tiene ventajas significativas como una gran capacidad antiinterferente, transmisión de información confiable, bajo consumo de energía, bajo costo y fácil realización. Es ampliamente utilizado por muchos dispositivos electrónicos, especialmente electrodomésticos, y se está volviendo cada vez más popular. Es ampliamente utilizado en sistemas informáticos y de telefonía móvil.

        El infrarrojo también se llama onda de luz infrarroja. En el espectro electromagnético, el rango de longitud de onda de la onda de luz es 0.01um ~ 1000um. Según las diferentes longitudes de onda, se puede dividir en luz visible y luz invisible. Las ondas de luz con una longitud de onda de 0.38um ~ 0.76um pueden ser luz visible, seguidas de siete colores de rojo, naranja, amarillo, verde, azul, azul y morado. La onda de luz con una onda de luz de 0.01um ~ 0.38um es luz ultravioleta (línea), y la onda de luz con una longitud de onda de 0.76um ~ 1000um es luz infrarroja (línea). La luz infrarroja se divide en 4 tipos de infrarrojo cercano, infrarrojo medio, infrarrojo lejano e infrarrojo extremo según el rango de longitud de onda. El control remoto infrarrojo utiliza luz infrarroja cercana para transmitir comandos de control remoto, con una longitud de onda de 0.76um ~ 1.5um. El infrarrojo cercano se utiliza como fuente de luz de control remoto porque las longitudes de onda máximas de los dispositivos emisores de infrarrojos (tubos emisores de luz infrarroja) y los dispositivos receptores de infrarrojos (fotodiodos, triodos y fotocélulas) son generalmente de 0,8 um ~ 0,94 um. En la banda de luz del infrarrojo cercano, Los espectros de los dos coinciden exactamente, pueden coincidir bien y pueden obtener una mayor eficiencia de transmisión y una mayor confiabilidad

En el campo de la comunicación real, la señal enviada generalmente tiene un espectro de frecuencia más amplio y una gran cantidad de energía se distribuye en un rango de frecuencia relativamente bajo, por lo que se denomina señal de banda base. Esta señal no es adecuada para la transmisión directa en el canal. . Para facilitar la transmisión, mejorar la capacidad antiinterferente y utilizar eficazmente el ancho de banda, generalmente es necesario modular la señal a un rango de frecuencia adecuado para el canal y las características de ruido para la transmisión, lo que se denomina modulación de señal. En el extremo receptor del sistema de comunicación, la señal recibida debe demodularse para recuperar la señal de banda base original. Puede comprender el contenido de esta parte del principio de comunicación.

  La comunicación por infrarrojos en el mando a distancia por infrarrojos que usamos habitualmente suele estar modulada con un portador de unos 38 K. A continuación les presentaré el principio. Para entenderlo, veamos el principio de la parte emisora.

  Modulación: El proceso de usar la señal que se va a transmitir para controlar la amplitud, fase, frecuencia y otros parámetros de una señal de alta frecuencia, es decir, usar una señal para cargar otra señal. Por ejemplo, cuando se va a enviar nuestra señal de control remoto por infrarrojos, primero se modula en 38K, como se muestra en la figura

La señal original es un bit de datos "0" o un bit de datos "1" que queremos enviar, y la llamada portadora 38K es una señal de onda cuadrada con una frecuencia de 38K, y la señal modulada es la forma de onda final que transmitimos. Usamos la señal original para controlar la portadora de 38K. Cuando la señal es de datos "0", la portadora de 38K se envía sin reserva. Cuando la señal es de datos "1", no se envía ninguna señal de portadora. La forma de onda de la señal después de la modulación como se muestra en la figura anterior.

La siguiente figura muestra la sincronización de la forma de onda en el código NEC en la forma de onda

Un segmento completo de forma de onda codificada por NEC

Hay muchos tipos de receptores de infrarrojos. El receptor de infrarrojos utilizado en la placa de desarrollo es el KMS183. El receptor de infrarrojos integrado puede decodificar la señal de infrarrojos portadora en señales de nivel alto y bajo, lo que es conveniente para que la MCU analice los comandos de infrarrojos, como se muestra en la siguiente figura:

Introducción a RMT

El controlador del módulo RMT (control remoto) se puede utilizar para enviar y recibir señales de control remoto por infrarrojos. Debido a la flexibilidad del módulo RMT, el controlador también se puede utilizar para generar o recibir muchos otros tipos de señales.

La señal consta de una serie de pulsos, que son generados por el transmisor RMT en base a una lista de valores. Estos valores definen la duración del pulso y el nivel binario, ver más abajo. El transmisor también puede proporcionar una onda portadora y modularla con el pulso proporcionado.

Enviar diagrama de modulación:

En el receptor, una serie de pulsos se decodifica en una lista de valores que contienen la duración del pulso y el nivel binario. Se pueden aplicar filtros para eliminar el ruido de alta frecuencia de la señal de entrada.

Recepción del diagrama de modulación:

1. Diseño / principio de hardware

Verifique el diagrama esquemático de la placa de desarrollo, el pin de señal del receptor de infrarrojos integrado KMS183 está conectado al pin GPIO35 del control principal, y el pin de emisión de infrarrojos está conectado al pin GPIO7 del control principal. Puede proceder de acuerdo con la introducción de RMT e infrarrojos arriba. El código está escrito.

2. Diseño de programas

Primero cite los archivos de encabezado necesarios

// IR_Rre Example

#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "IR_Rev.h"
#include <esp_log.h>
#include "driver/rmt.h"

De forma predeterminada, la placa de desarrollo decodifica la codificación infrarroja NEC, que también es la codificación infrarroja más común. Puede probarse con el control remoto de otros pequeños electrodomésticos como televisores, decodificadores, etc., si necesita cambiar la codificación, solo necesita cambiar el tiempo de codificación en el código. Un click

Tiempo de decodificación infrarroja NEC

#define NEC_BITS          32
#define NEC_HDR_MARK    9000
#define NEC_HDR_SPACE   4500
#define NEC_BIT_MARK     560
#define NEC_ONE_SPACE   1690
#define NEC_ZERO_SPACE   560
#define NEC_RPT_SPACE   2250

Definición de pin y función principal

const static char *TAG = "IR_Rre Demo";


#define RECV_PIN		35	// 一体化红外接收头GPIO
uint8_t command = 0;		// 接收到的ENC红外指令
void app_main()
{
	ESP_LOGI(TAG, "APP Start......");

	IRrecvInit(RECV_PIN, 3);
	while(1){
		command = IRrecvReadIR();
		if (command != 0){
			printf("IR Command is 0x%02X\n", command);
		}
	}
}

Inicialización RMT de decodificación infrarroja

void IRrecvInit(uint8_t pin, uint8_t port)
{
	IRrecv_Pin = pin;
	IRrecv_Chanel = port;
	rmt_config_t config;
	config.rmt_mode = RMT_MODE_RX;
	config.clk_div = CLK_DIV;
	config.channel = (rmt_channel_t)IRrecv_Chanel;
	config.gpio_num = (gpio_num_t)IRrecv_Pin;
	config.mem_block_num = 2;
	config.rx_config.filter_en = 1;
	config.rx_config.filter_ticks_thresh = 100;
	config.rx_config.idle_threshold = TICK_10_US * 100 * 20;
	ESP_ERROR_CHECK(rmt_config(&config));
	ESP_ERROR_CHECK(rmt_driver_install(config.channel, 5000, 0));
	rmt_get_ringbuf_handle(config.channel, &ringBuf);
	rmt_rx_start(config.channel, 1);
}

Recibir código de infrarrojos

uint8_t IRrecvReadIR(void)
{
	size_t itemSize;
	uint8_t command = 0;
	rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive((RingbufHandle_t)ringBuf, (size_t *)&itemSize, (TickType_t)portMAX_DELAY);
	int numItems = itemSize / sizeof(rmt_item32_t);
	int i;
	rmt_item32_t *p = item;
	for (i=0; i<numItems; i++) {
		p++;
	}
	command = IRrecvDecode(item, numItems);
	vRingbufferReturnItem(ringBuf, (void*) item);
	return command;
}

Decodifica la matriz de nivel recibida en función de codificación infrarroja


uint8_t IRrecvDecode(rmt_item32_t *data, int numItems)
{
	printf("IRrecvDecode->Levels Count:%d   Start Decode.....\n", numItems*2);
	// 检查协议头,9ms/4.5ms,检查误差300us
	if(!IRrecvIsInRange(data[0], NEC_HDR_MARK, NEC_HDR_SPACE, 300)){
		uint32_t lowValue = data[0].duration0 * 10 / TICK_10_US;
		uint32_t highValue = data[0].duration1 * 10 / TICK_10_US;
		printf("IRrecvIsInRange->Error   lowValue %d	highValue %d\n", lowValue,highValue);
		return 0;
	}
	int i;
	uint8_t address = 0, notAddress = 0, command = 0, notCommand = 0;
	int accumCounter = 0;
	uint8_t accumValue = 0;
	for(i=1; i<numItems; i++){// 第1组为协议头,从第2组开始
		if(IRrecvIS0(data[i])){// 检查是否为0
			accumValue = accumValue >> 1;
		}else if(IRrecvIS1(data[i])){// 检查是否为1
			accumValue = (accumValue >> 1) | 0x80;
		}
		if(accumCounter == 7){// 检查了8Bit
			accumCounter = 0;
			if(i==8){
				address = accumValue;		// 第1字节为地址
			}else if (i==16){
				notAddress = accumValue;	// 第2字节为地址取反
			}else if (i==24){
				command = accumValue;		// 第3字节是命令
			}else if (i==32){
				notCommand = accumValue;	// 第4字节是命令取反
			}
			accumValue = 0;
		}else{
			accumCounter++;
		}
	}
	// 检查取反数据是否正确
	if(address != (notAddress ^ 0xff)){
		printf("IRrecvDecode->Address Overturn Check Error   address %02X	notAddress %02X\n", address,notAddress);
		return 0;
	}
	if(command != (notCommand ^ 0xff)){
		printf("IRrecvDecode->Command Overturn Check Error   command %02X	notCommand %02X\n", command,notCommand);
		return 0;
	}
	return command;
}

La sincronización recibida está sesgada, así que haga un juicio

//高低电平结构体,低电平检测时长,高电平检测时长,公差
bool IRrecvIsInRange(rmt_item32_t item, int lowDuration, int highDuration, int tolerance)
{
	uint32_t lowValue = item.duration0 * 10 / TICK_10_US;
	uint32_t highValue = item.duration1 * 10 / TICK_10_US;
	if(lowValue<(lowDuration-tolerance)||lowValue>(lowDuration+tolerance)||(highValue!=0&&(highValue<(highDuration-tolerance)||highValue>(highDuration+tolerance))))
	{
		return false;
	}
	return true;
}

Tres, descargar prueba

Abra el símbolo del sistema de ESP-IDF

comando cd para ingresar a este directorio del proyecto

cd F:\ESP32_DevBoard_File\12_IR_Rev_RMT

Ver el número de puerto serie de la placa de desarrollo en el administrador de dispositivos de la computadora

Ejecute idf.py -p COM9 flash monitor para descargar desde el puerto serie 9 y ejecútelo. Abra el puerto y muestre la información de depuración del dispositivo. Ctrl + c para salir de la operación. Puede usar el control remoto de su hogar para presionar varios botones contra el receptor de infrarrojos en la placa de desarrollo y observar la impresión del puerto serie .

Supongo que te gusta

Origin blog.csdn.net/cnicfhnui/article/details/108508379
Recomendado
Clasificación