ASUS Tinker Board 2S 與MCU的聯結應用 – UART有線通訊篇

前言

隨著AIoT與IIoT在近幾年的應用蓬勃發展,考量到IoT領域的各種應用情境,對於整體系統運作的成本與效能,一直是AIoT與IIoT考量的重點,因此便產生了各種嵌入系統與微控器的整合應用,希望透過嵌入系統與MCU的分工或互補,能有效提升系統運作整體的整體效益。

若系統開發若需要引入嵌入式系統,通常會有以下考量:

一、 高效GUI

1. 現行的嵌入式系統大都會將標準電腦的顯示介面電路設計進來,目前標準電腦常見的顯示介面,分別有VGA、HDMI、DVI等等,這些顯示介面都具有完整的圖形化顯示功能,作業系統透過程式設計的方式可以迅速建立圖形化使用者介面。

2. 圖形化使用者介面因為需要大量的記憶體存取與運算,必須透過強大的CPU與作業系統的偕同運作,嵌入式系統可較容易達成這些需要大量資料運算的應用。

二、 高運算負荷

1. 嵌入式系統因為有較大容量的記憶體與強大的CPU運算能力,非常適用於需要進行較大運算量的應用情境,如:人工智慧、人工智慧物聯網,其中人工智慧應用目前大都使用深度學習的方式進行設計,其中類神經網路的運算往往需要大量的運算。

2. 大量的網際網路或行動通訊網路應用需要大量的資料交換的過程,此外這些網路的服務往往也伴隨大量的GUI的操作,存取資料往往需要大量的系統記憶體進行儲存或運算。

三、 周邊電路擴充

1. 嵌入式系統大都提供類似標準電腦的硬體連接介面,顯示如:VGA、HDMI、DVI等,硬體擴充或連結介面如:USB系列、M.2、PCI-E、SATA等,能為各種標準電腦硬體周邊設備提供必要的支援。

2. 提供了許多工業標準的介面電氣規格介面,如:SPI、UART、I2C、RS485、TTL / CMOS介面,讓使用者可以擴充各種商用或自行設計的硬體模組電路。

若系統開發若需要引入MCU,通常會有以下考量:

 

一、 行動性

1. 現行常用的各種MCU都具備一個共同的特點就是「體積小」、「重量輕」,這樣的特性有助於開發各種行動裝置應用,或是各種穿戴式裝置的應用。

2. MCU裝置通常都是以單晶片微電腦的方式開發,現在常見的單晶片微電腦都將各種基本行動通訊功能整合在一起,這樣有助於進行各種強調行動通訊應用的情境。

二、 低耗能

1. MCU通常電源能耗都不會太大,在設計電源系統時就可以透過電池進行供電,這樣也有助於提高MCU應用的行動性。

2. 現行的各種MCU都設計有待機睡眠的功能,對於需要進行長時間待機的應用,MCU有甚低的靜態待機消耗功率的特點,對於節能主題的應用,提供相當不錯的實用價值。

三、 應用單純化

1. MCU因為低耗能的特性,大都是不具備甚高的運算效能,僅提供必要的基本資料轉換與算術或邏輯判斷功能,適用於對於環境資訊的蒐集應用。

2. MCU通常僅提供必要的擴充電路模組的信號接腳,提供簡單的電氣裝置的輸入或輸出功能,如:溫溼度感測、繼電器控制、簡單的有線或無線通訊界面功能。

分類 技術教學文 標籤 Tinker Board、Tinker Board 2S、ASUS、AI、AIoT、MCU、Bluetooth、UART、Serial、Communication
撰寫/攝影 曾俊霖
前情提要 有關Asus Tinker Board 2S作業系統的相關安裝教學,請參考以下連結:

ASUS Tinker Board 2S新版Debian 10 V2.0.3 系統與相依套件安裝教學

ASUS Tinker Board 2S 安裝 Android-11 V2.0.3版作業系統與應用軟體

有關Asus Tinker Board 2S作業系統在影像辨識的應用,請參考以下連結:

Tinker Board 2S Android-11 V2.0.3 執行 Tensorflow-Lite 範例程式教學

時間 2小時 材料表 ASUS  Tinker Board 2S / 2GB-連結

 

MCU Linkit-7697

 

MCU ATmega-328系列

 

HC-05/06系列

成本
難度 中等

本篇教學將會著眼在嵌入式系統與MCU整合的應用上,從前述的兩種不同系統的運作特性裡,強調將這兩種系統進行整合開發應用的特點,而在現行各種大型專案的開發裡,尤其針對這兩種系統在進行資料交換的方式進行說明。

嵌入式系統與MCU系統在進行整合應用時,其通訊管道的建立對於這兩種系統的整合是極為重要的技術,本篇教學將會透過「有線通訊」與「無線通訊」兩種方式進行實作教學與應用的說明,其中嵌入式系統將會以華碩Tinker Board 2S為主要測試平台,而MCU將會採用Raspberry Pi Pico、聯發科Linkit-7697或Arduino系列進行測試。

 

一、 有線連線通訊系統設定與程式設計

1. 檢視UART在Tinker Board 2S上的硬體資源占用狀況

本篇教學將透過Tinker Board 2S的USB介面以UART通訊協定與MCU進行通訊,目前常用的MCU開發板(如:Linkit-7697、Raspberry Pi Pico或Arduino系列)都提供USB通訊界面,透過UART的方式來與Tinker Board 2S系統互相訊,並且透過各種開發工具(如:Arduino-IDE)進行連線,這樣的開發模式下,我們可透過UART 來對 MCU 上傳/燒錄程式。在 Tinker Board 2S 系統端若想要運用這樣的方式進行與MCU溝通,就必須要先了解MCU透過USB連結到Tinker Board 2S系統中在UART所占用的系統資源編號或是資源名稱,Tinker Board 2S控制程式設計就必須要開啟這些系統資源。

在Linux作業系統對於UART的通訊應用,通常在系統資源名稱都是以tty的方式進行資源的存取,這些相關存取的硬體資源訊息,通常都會放置在 /dev 目錄當中,只要查找 /dev 目錄就可以尋找到對應MCU的通訊資源編號與名稱,參考下圖,我們可以知道MCU占用Tinker Board 2S系統中的 ttyACM0

2. MCU的UART存取程式設計流程(簡單的輸入與輸出資料傳輸測試)

(1). 設定通訊埠Baud Rate
(2). 接收來自Tinker Board 2S的UART串列資料
(3). 檢查串列資料並進行RGB-LED的操作
(4). 輸出串列資料回應Tinker Board 2S

3. MCU 測試程式

在此使用 Linkit-7697,也適用 Raspberry Pi Pico。

#define LED_G 4
#define LED_B 3
#define LED_R 2

String str;

String SA[2];
int A[2];

void setup(void)
{
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(LED_R, OUTPUT);
  digitalWrite(LED_G, LOW);
  digitalWrite(LED_B, LOW);
  digitalWrite(LED_R, LOW);

  Serial.begin(9600);
}

void loop(void)
{
  str = "";
  if (Serial.available()) {
    // 讀取傳入的字串直到"#"結尾
    str = Serial.readStringUntil('#');

    String_to_Int(str, 2);
  }
  
  if (str.length() != 0) {
    
    if (SA[0] == "G") {
      if (A[1] == 1) {
        digitalWrite(LED_G, HIGH);
        Serial.println("Green ON");
      }
      if (A[1] == 0) {
        digitalWrite(LED_G, LOW);
        Serial.println("Green OFF");
      }
    }

    if (SA[0] == "B") {
      if (A[1] == 1) {
        digitalWrite(LED_B, HIGH);
        Serial.println("Blue ON");
      }
      if (A[1] == 0) {
        digitalWrite(LED_B, LOW);
        Serial.println("Blue OFF");
      }
    }

    if (SA[0] == "R") {
      if (A[1] == 1) {
        digitalWrite(LED_R, HIGH);
        Serial.println("Red ON");
      }
      if (A[1] == 0) {
        digitalWrite(LED_R, LOW);
        Serial.println("Red OFF");
      }
    }
  }
}

void String_to_Int(String temp, int count)
{
  int index;

  index = temp.indexOf(',');
  SA[0] = temp.substring(0, index);

  for (int i = 1; i < count; i++) {
    temp = temp.substring(index + 1, temp.length());
    index = temp.indexOf(',');
    SA[i] = temp.substring(0, index);
    A[i] = SA[i].toInt();
  }
}

這個測試程式可以「接收」來自單板電腦端的指令來控制 RGB-LED,並且「發送」回應訊息,可以做到雙向通訊。

接收命令 RGB-LED動作 發送回應訊息
R,1# 亮起紅色光 Red ON
R,0# 熄滅紅色光 Red OFF
G,1# 亮起綠色光 Green ON
G,0# 熄滅綠色光 Green OFF
B,1# 亮起藍色光 Blue ON
B,0# 熄滅藍色光 Blue OFF

 

4. 單板電腦端測試流程:

在此使用 Tinker Board 2S 編寫 Python 來收發指令

(1). 輸入控制指令
(2). 發送控制指令至MCU
(3). 等候來自MCU的回應訊息
(4). 接收MCU的回應訊息
(5). 顯示來自MCU的回應訊息

5. Tinker Board 2S Python測試程式:

這個程式可以讓使用者可以把控制命令從Tinker Board 2S發送至MCU,並且等待MCU的回應訊息,接收回應訊息後必須檢查串列資料的內容是否正確,最後在螢幕顯示MCU的回傳訊息。

import serial
import argparse
import io
import time
import numpy as np
import cv2

from PIL import Image

parser = argparse.ArgumentParser(
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument(
    '--com', help='Number of UART prot.', required=True)
args = parser.parse_args()

COM_PORT = args.com
BAUD_RATES = 9600
ser = serial.Serial(COM_PORT, BAUD_RATES,timeout=0, parity=serial.PARITY_EVEN, stopbits=1)

while(True):
    COMMAND = input('請輸入控制命令=')

    Data_flag = 0
    while(Data_flag == 0):
        Send_UART_command = COMMAND.encode(encoding='utf-8')    
        ser.write(Send_UART_command)  # 訊息必須是位元組類型

        time.sleep(0.5)
        while ser.in_waiting:
            mcu_feedback = ser.readline().decode()  # 接收回應訊息並解碼
            Data = mcu_feedback.strip('\r\n')

            if 'ON' in Data:
                Data_flag = 1
                print('MCU 回應:', Data)
            elif 'OFF' in Data:
                Data_flag = 1
                print('MCU 回應:', Data)
            else:
                Data_flag = 0

二、 Tinker Board 2S與MCU以USB有線連線方式的應用實例—「水質監測系統」

使用情境照
水質監測系統執行畫面

 

三、 Tinker Board 2S與MCU以USB有線連線方式的應用實例—「影像辨識機械手臂」

機器手臂實體圖

相關文章

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。