紅外線收發器 - Part 1

總覽

本教學將會說明如何在 MediaTek LinkIt 7687 開發板上建立一個紅外線(IR)收發器來接收 IR 數據,以及通過 聯發科技雲服務(MCS)發送 IR 數據。此一教學將分成兩部份,第一部涵蓋了捕捉由一個遠端遙控器例如電視遙控器,空調遙控器等發出的 IR 信號。第二部將介紹如何通過聯發科技雲服務 (MCS) ,發送 IR 數據。

簡介

這是此教學的第一部並將會介紹以下內容:

  • 如何將紅外線接收器所使用的硬體組合起來。
  • 如何使用軟體將 IR 接收器 (由 Grove 所提供) 由 LinkIt SDK for RTOS 的 IRRX hardware abstraction layer (HAL) API 來偵測 IR 信號。
  • 執行您的應用。 接收來自一個遠端控制裝置(本教學採用一個電視遙控器) 發送的信號並將數據列印出來。

您可以在以下按鈕下載本教學的完整原始碼。 

開始之前

若您之前不曾使用 7687 HDK 來開發專案,請先安裝 LinkIt SDK v3.3.1 並進行開發環境設定,相關細節請參考 LinkIt development platform for RTOS 入門手冊

硬體設置

本節將介紹所需要的硬體組件。

必備

除了LinkIt 7687 HDK by SAC 之外, 您還需要準備以下組件。

組件說明來源
線 (Cable)Micro-USB cable 
IR 接收器Grove IR 接收器Seeed Bazaar
Grove Base Shield擴充底板Seeed Bazaar
IR 電視遙控器 任何紅外線電視遙控器 

組件圖顯示如下:

Listed components

注: 您也可以使用一個基本麵包板來代替 Grove Base Shield。

組合組件

 以下步驟介紹如何把教學專案硬體組合起來。

  1. 將 Grove base sheild 架在 LinkIt 7687 開發板上。
  2. 將 IR Receiver 連接到 Grove Base Shield 的 D6 埠。 D6 對應到 LinkIt 7687 HDK 的 GPIO 34。 

Final hardware setup

軟體實作

此一節說明如何使用 IRRX HAL API 來接收 IR 遙控器發出的命令, 和 C 語言原始碼總概觀。

LinkIt 7687 HDK 支援兩種硬體解碼方法:

  • RC5 模式。 Philips RC5 IR transmission protocol 使用 Manchester encoding 。 在這種模式下, RC5 能直接收和解碼。
  • Pulse Width Detection (PWD) 模式。 在這種模式下, 硬體会偵測波長, 任何經由紅外線傳輸代碼都會被偵測和收到而所接收的內容可以根據波長來確定。

本教學採用 PWD 模式來接收 IR 數據。

main 程式概觀

LinkIt 7687 HDK 專案是通過執行一個 “main.c” 程序來接收 IR 數據。 該程序的內容有如下:

  • 加入 IR 通訊的 HAL 庫。
  • 初始化 GPIO 埠。
  • 初始化 HAL IR 模組 (IRRX)。
  • 註冊一個 callback 函式以收到 IR data。
  • 列印 IR data。

加 HAL 函式庫

此一專案使用 IRRX HAL API 來接收 IR data。 請參考 API Reference 的 HAL IRRX API 以了解更多細節關於如何使用此API。 

/* hal includes */
#include "hal.h"
 
/*hal pinmux define*/
#include "hal_pinmux_define.h"
    /* Maximum length for PWD data */
#define MAX_PWD_LENGTH (68)

初始化埠與模組

  1. 初始化 GPIO pin 34 

    呼叫 hal_gpio_init() 函式來初始化 GPIO pin 34, 然後呼叫 hal_pinmux_set_function() 函式以設定 pinmux 函式 HAL_GPIO_34_IR_RX, 如下: 

    hal_gpio_init(HAL_GPIO_34);
     
    /* Call hal_pinmux_set_function to set GPIO pinmux, 
    if EPT tool was not used to configure the related pinmux. */
     
    hal_pinmux_set_function(HAL_GPIO_34, HAL_GPIO_34_IR_RX);
  2. 初始化 IRRX 埠以 PWD 模式接收IR data。

    /*  Call hal_irrx_init() to initialize the IRRX. */
    hal_irrx_init();

註冊 callback 函式

首先請定義 PWD format 參數, 例如 inverse 和 terminate_threshold, 然後呼叫 hal_irrx_receive_pwd_start() API 來接收 IR data, 如下:

hal_irrx_pwd_config_t format = {0};
format.inverse = 1;
format.terminate_threshold = 10200;
hal_irrx_receive_pwd_start(&format, (hal_irrx_callback_t)receive_code_pwd, &us);

在操作開始時呼叫 callback 函式 receive_code_pwd , 欲了解更多此一 callback 函式請參考 "定義 callback 函式"。 該 callback 函式 prototype 如下: 

typedef void (* hal_irrx_callback_t) (hal_irrx_event_t event, void *user_data)

定義 callback 函式

callback 函式將呼叫 hal_irrx_receive_pwd() API 來開始接收 IR PWD data 並將 data 存儲在 buffer 內。 此函式將返回 data 的長度, 如下: 

static hal_irrx_callback_t receive_code_pwd(void)
{
    uint8_t received_length = 0;
    uint8_t data[MAX_PWD_LENGTH] = {0};
    hal_irrx_receive_pwd(&received_length, data, sizeof(data));
    log_hal_info("  Using IAR Received PWD data:\r\n");
    show_ir_data(data, received_length);
    log_hal_info("\r\n ---irrx_example finished!!!---\r\n");
   
    return (hal_irrx_callback_t)0;
}

展示 IR data

呼叫 show_ir_data() 函式以展示 IR PWD data, 如下: 

static hal_irrx_callback_t receive_code_pwd(void)
{
    /*Show the irrx received data*/
void show_ir_data(void *data, uint32_t length)
{
    uint8_t *buffer = data;
    uint32_t index = 0;
    log_hal_info("unsigned int receivedIRData[%d] = {",length);
    for (index = 0; index < length; index++) {
        log_hal_info("0x%02x", buffer[index]);
        if (index != length - 1) {
            log_hal_info(",");
        }
        if ((index + 1) % 16 == 0) {
            log_hal_info("\r\n");
            continue;
        }
    }
    if (0 != index && 0 != index % 16) {
        log_hal_info("\r\n");
    }
    log_hal_info("};\r\n");
}

當數據已接收成功後, 呼叫 hal_irrx_deinit()函式以取消初始化硬體並解放資源。

完整原始碼可以在GitHub下載 

執行您的程式

本文件相關的程式碼皆可自行下載,並依照 LinkIt 7687 HDK 入門手冊的步驟進行程式的上傳與執行。 您可以使用SSH 和 telnet client,例如 PuTTY,來觀察output。

  1. 使用 PuTTY 與硬體連接並按下 reset button。  
    Connecting to the board and initializing the modules
  2. 使用一個遙控器, 指向 IR 接收器並按下任何按鈕。 
    Receiving IR data
    就能在 console 以矩陣格式來顯示資料。

結語

透過此教學,您學到如何在 LinkIt 7687 開發板上使用 IRRX HAL API , 以 PWD 模式接收 IR 資料並將資料展示於 console。 在本教學的第二部, 您將學習如何使用 IRTX HAL API 來發送資料並使用 MCS 或者網站來控制資料的收發。欲瞭解更多關於 MediaTek LinkIt 7687 開發板的資訊,請參考 LinkIt development platform for RTOS 開發者指南。