前言
隨著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作業系統在影像辨識的應用,請參考以下連結: |
||
| 時間 | 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。
[pastacode lang=”cpp” manual=”%23define%20LED_G%204%0A%23define%20LED_B%203%0A%23define%20LED_R%202%0A%0AString%20str%3B%0A%0AString%20SA%5B2%5D%3B%0Aint%20A%5B2%5D%3B%0A%0Avoid%20setup(void)%0A%7B%0A%20%20pinMode(LED_G%2C%20OUTPUT)%3B%0A%20%20pinMode(LED_B%2C%20OUTPUT)%3B%0A%20%20pinMode(LED_R%2C%20OUTPUT)%3B%0A%20%20digitalWrite(LED_G%2C%20LOW)%3B%0A%20%20digitalWrite(LED_B%2C%20LOW)%3B%0A%20%20digitalWrite(LED_R%2C%20LOW)%3B%0A%0A%20%20Serial.begin(9600)%3B%0A%7D%0A%0Avoid%20loop(void)%0A%7B%0A%20%20str%20%3D%20%22%22%3B%0A%20%20if%20(Serial.available())%20%7B%0A%20%20%20%20%2F%2F%20%E8%AE%80%E5%8F%96%E5%82%B3%E5%85%A5%E7%9A%84%E5%AD%97%E4%B8%B2%E7%9B%B4%E5%88%B0%22%23%22%E7%B5%90%E5%B0%BE%0A%20%20%20%20str%20%3D%20Serial.readStringUntil(‘%23’)%3B%0A%0A%20%20%20%20String_to_Int(str%2C%202)%3B%0A%20%20%7D%0A%20%20%0A%20%20if%20(str.length()%20!%3D%200)%20%7B%0A%20%20%20%20%0A%20%20%20%20if%20(SA%5B0%5D%20%3D%3D%20%22G%22)%20%7B%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_G%2C%20HIGH)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Green%20ON%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_G%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Green%20OFF%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(SA%5B0%5D%20%3D%3D%20%22B%22)%20%7B%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_B%2C%20HIGH)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Blue%20ON%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_B%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Blue%20OFF%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(SA%5B0%5D%20%3D%3D%20%22R%22)%20%7B%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_R%2C%20HIGH)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Red%20ON%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(A%5B1%5D%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_R%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22Red%20OFF%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0Avoid%20String_to_Int(String%20temp%2C%20int%20count)%0A%7B%0A%20%20int%20index%3B%0A%0A%20%20index%20%3D%20temp.indexOf(‘%2C’)%3B%0A%20%20SA%5B0%5D%20%3D%20temp.substring(0%2C%20index)%3B%0A%0A%20%20for%20(int%20i%20%3D%201%3B%20i%20%3C%20count%3B%20i%2B%2B)%20%7B%0A%20%20%20%20temp%20%3D%20temp.substring(index%20%2B%201%2C%20temp.length())%3B%0A%20%20%20%20index%20%3D%20temp.indexOf(‘%2C’)%3B%0A%20%20%20%20SA%5Bi%5D%20%3D%20temp.substring(0%2C%20index)%3B%0A%20%20%20%20A%5Bi%5D%20%3D%20SA%5Bi%5D.toInt()%3B%0A%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]這個測試程式可以「接收」來自單板電腦端的指令來控制 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的回傳訊息。
[pastacode lang=”python” manual=”import%20serial%0Aimport%20argparse%0Aimport%20io%0Aimport%20time%0Aimport%20numpy%20as%20np%0Aimport%20cv2%0A%0Afrom%20PIL%20import%20Image%0A%0Aparser%20%3D%20argparse.ArgumentParser(%0A%20%20%20%20formatter_class%3Dargparse.ArgumentDefaultsHelpFormatter)%0A%0Aparser.add_argument(%0A%20%20%20%20′–com’%2C%20help%3D’Number%20of%20UART%20prot.’%2C%20required%3DTrue)%0Aargs%20%3D%20parser.parse_args()%0A%0ACOM_PORT%20%3D%20args.com%0ABAUD_RATES%20%3D%209600%0Aser%20%3D%20serial.Serial(COM_PORT%2C%20BAUD_RATES%2Ctimeout%3D0%2C%20parity%3Dserial.PARITY_EVEN%2C%20stopbits%3D1)%0A%0Awhile(True)%3A%0A%20%20%20%20COMMAND%20%3D%20input(‘%E8%AB%8B%E8%BC%B8%E5%85%A5%E6%8E%A7%E5%88%B6%E5%91%BD%E4%BB%A4%3D’)%0A%0A%20%20%20%20Data_flag%20%3D%200%0A%20%20%20%20while(Data_flag%20%3D%3D%200)%3A%0A%20%20%20%20%20%20%20%20Send_UART_command%20%3D%20COMMAND.encode(encoding%3D’utf-8′)%20%20%20%20%0A%20%20%20%20%20%20%20%20ser.write(Send_UART_command)%20%20%23%20%E8%A8%8A%E6%81%AF%E5%BF%85%E9%A0%88%E6%98%AF%E4%BD%8D%E5%85%83%E7%B5%84%E9%A1%9E%E5%9E%8B%0A%0A%20%20%20%20%20%20%20%20time.sleep(0.5)%0A%20%20%20%20%20%20%20%20while%20ser.in_waiting%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mcu_feedback%20%3D%20ser.readline().decode()%20%20%23%20%E6%8E%A5%E6%94%B6%E5%9B%9E%E6%87%89%E8%A8%8A%E6%81%AF%E4%B8%A6%E8%A7%A3%E7%A2%BC%0A%20%20%20%20%20%20%20%20%20%20%20%20Data%20%3D%20mcu_feedback.strip(‘%5Cr%5Cn’)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20’ON’%20in%20Data%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data_flag%20%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(‘MCU%20%E5%9B%9E%E6%87%89%EF%BC%9A’%2C%20Data)%0A%20%20%20%20%20%20%20%20%20%20%20%20elif%20’OFF’%20in%20Data%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data_flag%20%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(‘MCU%20%E5%9B%9E%E6%87%89%EF%BC%9A’%2C%20Data)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data_flag%20%3D%200″ message=”” highlight=”” provider=”manual”/]二、 Tinker Board 2S與MCU以USB有線連線方式的應用實例—「水質監測系統」


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

相關文章









