星期五, 11月 20, 2015

UART over Wifi by NodeMCU (Programming NavSpark via ESP8266)

動機

NavSpark是個包含GPS功能的Arduino相容版, 詳情請看我之前的網誌: NavSpark Mini初體驗 .
會選用這片做為Arduino, 想必會用到上面的GPS功能, 但麻煩的是, 每次coding燒錄完之後, 若要確定程式正確, 勢必得挑一個可以收到GPS訊號的地方. 我當然大可以帶著筆電和NavSpark去外面coding, 但在寒冷的晚上又要餵蚊子, 不是個很好的coding環境.

又或者我可以拉一個GPS天線到室內, 然後接上NavSpark的IPX接頭.


以上兩個方法似乎都不是很好的方式, 後來我想到UART X Wifi的方式, 這當然不是甚麼先進的想法, 一些天文觀測的同好早就用這樣的方式, 在室內/帳棚內輕鬆遙控寒冷星空下的望遠鏡.
但是這類的周邊通常都不太便宜(當然淘寶找可以便宜很多....), 若只是為了開發驗證用, 這樣的開銷划不來.

串列埠轉WIFI模組 UART to WiFi EM-380C(BB-MAXCHIP) NT$3,300
A06-0029 UART轉WIFI模組 NT$1890


剛好我手邊有片ESP8266 Wifi模組, 又具備UART的功能, 看來只要適當的設定就可以達到UARTx Wifi ! 而且這片ESP8266只花費百圓餘而已!



com0com/com2tcp

如果有兩張ESP8266, Wifi的細節由EPS8266內部處理掉是最理想的了, 可惜的是我手邊只有一片ESP8266可用...



透過com0com/com2tcp的方式, 可以省略掉USB-Serial, 但是需要多一個WIFI Adapter, 不過若是用NB, 應該不會缺乏WIFI Adapter.


本文是朝向使用com0com/com2tcp的方向規劃.
另外, com0com官網上的安裝檔附的驅動不含簽名, 在win7下是無法使用的, 建議可以改下載[1]或[2]的com0com安裝檔進行安裝.

NodeMCU

根據[3], ESP8266可以用AT Command/NodeMCU/原生SDK/Arduino等方法開發(WebSDK就不適用於這裡的用途了, IoT比較適合).
看來比較適合且不用花太多時間的就屬NodeMCU和Arduino, 其中NodeMCU是以script方式執行, 可以略過編譯及燒錄的冗長時間, 最後NodeMCU出線.

為了用上NodeMCU, 需要先將Node MCU Firmware燒錄到ESP8266, 可以參考[3]的說明操作.

Telnet Server

由於com2tcp支援telnet協定, 因此ESP8266端運行一個telnet server, 將接收到的訊息傳送到UART, 再將UART發出的訊息回送到telnet client, 如此就可以做到雙向溝通.
運行在NodeMCU上的telnet我是以[4]為基礎下去修改. 結果下面會提到.

首先NodeMCU將init.lua及wifi.lua設定為以下內容:

--init.lua
dofile("wifi.lua")
--wifi.lua
print("set up wifi mode")
wifi.setmode(wifi.STATION)
wifi.sta.config("skyforce","0913679376")
 --here SSID and PassWord should be modified according your wireless router
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function() 
    if wifi.sta.getip()== nil then 
        print("IP unavaiable, Waiting...") 
    else 
        tmr.stop(1)
        print("Config done, IP is "..wifi.sta.getip())
        --dofile("yourfile.lua")
    end 
 end)

telnet server的script如下,  但不建議一開始就放在init.lua直接執行, 因為執行script後, UART會直接轉向telnet, 因此NodeMCU無法再透過UART被操作, 等於NodeMCU會變成磚(只剩下UART轉Wifi的功能), 除非重燒韌體.

所以請先用手動執行的方式, 確認整個環節都打通了, 再把telnet server script放到init.lua讓他開機自動執行.
telnet.lua[4]:
--simple_telnet.lua
baudrate = 115200
telnet_port = 23
uart.setup( 0, baudrate, 8, 0, 1, 0 )

s=net.createServer(net.TCP,60) 
s:listen(telnet_port ,function(c) --c : net.socket module
   --send 
   function s_output(str) 
      if(c~=nil) 
         then c:send(str) 
      end 
   end 
   --node.output(s_output, 0)   -- re-direct output to function s_ouput.
   uart.on("data", 0, s_output, 0) 

   --receive
   c:on("receive",function(c,l) 
      --node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
      uart.write(0,l)
   end) 

   -- disconnect
   c:on("disconnection",function(c) 
      node.output(nil)        -- un-regist the redirect output function, output goes to serial
   end) 
end)
若要NodeMCU開機時就啟動telnet server, 將init.lua改為:
--init.lua
dofile("wifi.lua")
dofile("telnet.lua")


com0com/com2tcp的設定

com0com照預設的方式安裝好, 並不需要額外的設定. 只要記得com0com的兩個COM port即可.



com2tcp則按照下面的參數執行
com2tcp --baud baudrate \\.\com##  ip port
baudrate的部分照NavSpark UART的baudrate去設定即可, NavSpark mini的UART預設為115200, 因此我也設定在115200, 但115200用來燒錄其實很慢.
com##則要看com0com安裝時配給的com來決定, 依照我的環境設定COM16, 而COM15提供給Arduino或GNSS Viewer燒錄用.
ip則填入NodeMCU跟ap所取得的ip.
port則按照telnet標準port為23.

GNSS Viewer燒錄問題

GNSS Viewer燒錄時可以改變原本的baudrate, 縮短燒錄時間, 但這一招用在UART x Wifi似乎行不通, 比較可能的解釋是這樣的:

在原本的架構下, GNSS Viewer通知NavSpark改變baud rate, 然後comA接著更改到相同的baud rate, 兩邊就可以用新的baud rate繼續溝通



但是當我們採用Wifi的方式燒錄,  架構中共有三個UART設定, GNSS Viewer可以改變UART1, NavSpark也改變了對應的baud rate, 但是com2tcp對應的UART2及ESP8266對應的UART3卻沒有跟著改變, 因此整個UART並沒有用相同的baud rate去運行, 因此整個baud rate改變的機制無法正常運作.



暫時想不到解決方法, ESP8266或許可以攔截UART訊號去改變baud rate, 但是com2tcp該怎麼作到動態改變baud rate我就不知道了. 目前最快的方式, 可能是直接將UART1/2/3的baud rate設高一點縮短燒錄時間.

com2tcp若不開啟 baud rate emulation, 是可以不用care baud rate設定, 參考自這裡. 因此UART2的設定可以don't care.




[參考]

[1]Com0Com v3.0.0.0 utility for W7 x64 platform, signed driver.
[2]Com0Com v3.0.0.0 utility for W7 x86 (32bit) platform, signed driver.

2 則留言:

kimouser64 提到...

http://ez-gui.com/manual/multiwii-clearflight-wifi-to-ezi-gui-how-to/
請教上面網頁最後所講的Virtual serial port 軟體可以用在你的韌體UART嗎
因為他寫的韌體穩定度不好,想試試你的方式 謝謝

kimouser64 提到...

試了一下是兩個可以通用的

Mr.Color飛機模型用Color 與 水性AQUEOUS HobbyColor 對照表

          最近跟兒子一起研究長谷川的飛機模型, 其中說明書中採用的模型漆色號以Mr.Color硝基漆為主, 水性漆AQUEOUS 為輔. 很多Mr.Color有的顏色, AQUEOUS 都沒有, 前100的色號大致上都有對應到, 但Mr.Color 300號以後的都是特...