新唐NuMaker-IoT-M487 HTTP POST連網實作

幾年前用過新唐的NuMaker Tomato做過一些專案的雛型,時間與能力有限的情況下用官方編好的Python,自己寫一些Python script做簡單的資料庫與I/O控制,還自己編了一個UVC (USB Video Class)執行檔,操作USB上連接的視訊鏡頭。

NuMaker Tomato是用新唐NCU970 ARM9的微處理器,效能很夠直接跑個Linux。今天要介紹的NuMaker-IoT-M487是ARM Cortex-M4微控制器,上面頂多跑個RTOS、MicroPython。新唐應該也是為了推廣,直接把port好的MicroPython放在官方的GitHub上: 
https://github.com/OpenNuvoton/NuMicroPy
開發板上還包含Wi-Fi模組、乙太網路介面、音訊編解碼器、加速度計等,很適合拿來做物聯網相關的應用。

看起來這個專案大概是從2019年2月開始的,可能因為知名度不高用的人不多,目前使用還有很多問題。好比說中斷服務程式裡面放個print很容易會當機,已經發issue上去等他修。歡迎大家一起來用,發現問題發上去讓程式更穩定。

話說甚麼是MicroPython? 顧名思義就是微型Python,他是拿來給微控制器使用的Python。與標準的Python一樣,我們將編好的Python直譯器放入微控制器裡面執行,寫好Python script以後可以讓已經在微控制器裡面執行的Python直譯器直接執行我們要的功能。比較不同的地方是,由於MicroPython是給微控制器用的,因此刪減了很多標準Python有的功能與模組(函式庫),當然語法與邏輯還是與標準Python一致。另外在編MicroPython的時候,可以選擇要把哪些模組(函式庫)一起加入執行檔,由於微控制器的記憶體、效能相對有限,沒辦法把所有的模組都一起編進去,只能選擇一些必要的模組。這個動作有點像我們在Linux上使用Python,可以apt install一些我們需要的函式庫,只不過在這邊都要事先編好存入微控制器的程式記憶體當中。

最近剛好做了個小教案,要求是要用MicroPython配合資策會IDEAS Chain雲端平台。剛才說過以前用過Python寫過簡單的資料庫,當時只用了HTTP GET,但這次要用的IDEAS Chain看來只能用POST上傳。GET應該很直覺,在路徑後面加上?item=value就可以把資料上傳server (改網址這種事情大家應該都做過XD),不過POST似乎就沒這麼直覺,沒辦法直接在網址列上看到。因此先研究了一下POST的原始資料大概是長甚麼樣子:
POST /路徑檔名 HTTP/1.0\r\nHost: 主機網址\r\n應用方式\r\n資料長度\r\n\r\n資料
大部分看到用Python做HTTP POST都是用requests,很不幸我們的MicroPython只有包進底層的socket,我們只能用socket傳整個POST必須的資料。可以查一下"Python socket http post"有一些資料。

拿到NuMaker-IoT-M487之後,如果要跑MicroPython要先去GitHub下載MicroPython韌體:
https://github.com/OpenNuvoton/NuMicroPy/tree/master/build
點進去看可以發現也有支援其他張開發板,不過一些細部的硬體功能例如Wi-Fi等等的,就要看開發板是哪一張,有不同的支援程度。可以去翻"UM_NuMicroPy_EN_Rev1.40.pdf"這份文件有詳細說明。

接著要燒錄韌體,現在新唐的開發板上內建的第二代的燒錄器Nu-Link2-Me很方便,只要把指撥開關MSG撥到ON,插上電腦會讀到一個儲存裝置,往裡面丟firmware.bin就會自動完成燒錄,不需要額外下載安裝燒錄軟體
https://os.mbed.com/platforms/NUMAKER-IOT-M487/
開發板右邊那一個USB是連接燒錄器用的,燒錄完以後記得要把USB傳輸線換到開發板左下角的USB1.1。當我們把MicroPython燒到M487裡面執行以後就要把USB換到M487自己的USB。換過去以後一樣可以發現電腦會讀到一個儲存裝置與COM Port,儲存裝置裡面是讓我們放Python script,COM Port可以直接下Python的指令。

最後就是上傳資料庫的程式了,我們可以在剛才提到晶片產生的儲存裝置建立一個新的文字檔案叫做"test.py"之後然後用記事本開啟,把script貼進去並儲存(記得注意tab的格式,這在Python當中很重要)。接著在COM Port中輸入import test就可以執行。如果我們希望上電以後自動執行,則把檔名改為"main.py"。測試階段避免我們程式寫爆了當機,建議還是以手動的方式執行。
import pyb
from pyb import Pin, ADC
import network
import usocket as socket

wlan = network.WLAN()
wlan.connect('mySSID', 'myPasswd')    # Replace it with your Wi-Fi SSID and password
print('WLAN connection: ' + str(wlan.isconnected()))    # Chenk if connect success

access_token = 'myAccessToken'    # Replace it with your IDEAS Chain access token
url = 'iiot.ideaschain.com.tw/api/v1/%s/telemetry' % access_token
host, path = url.split('/', 1)
domain, server = host.split('.', 1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # Create a net socket object

def upload(key, value):
	param_data = '{"%s": %s}' % (key, value)
	param_length = str(len(param_data))
	content_type = 'Content-Type: application/json'
	content_length = 'Content-Length: %s' % param_length
	try:
		# Get server IP address from DNS
		addr = socket.getaddrinfo(server, 80)[0][-1]
		s.connect(addr)    # Connect to server
		# HTTP POST method
		s.send(bytes('POST /%s HTTP/1.0\r\nHost: %s\r\n%s\r\n%s\r\n\r\n%s' % (path, host, content_type, content_length, param_data), 'utf8'))
		s.close()
	except Exception as err:
		print(err)

adc0 = ADC(Pin.board.A0)

while True:
	val = adc0.read()
	print(val)
	if val > 2000:
		upload('adc_val', str(val))
	pyb.delay(1000

留言

這個網誌中的熱門文章

無法被取代的指針型三用電表(一):前言

關於新唐科技NuMicro ISP的介紹和使用方式

新唐火神板開箱實作(一):NuMaker-Volcano與NuEclipse IDE入門篇