顯示具有 ESP8266 標籤的文章。 顯示所有文章
顯示具有 ESP8266 標籤的文章。 顯示所有文章

星期五, 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.

星期三, 11月 04, 2015

ESP8266 ESP-201 X Arduino

網路上較少ESP-201當Arduino的中文文章, 所以每次要接線都要翻閱資料許久. 英文資源雖不少, 但每次重看都需要稍微消化一下才懂.
這張全pin引出, 且可安裝在麵包版的ESP-201(雖然需要小小改造一下), 是很適合拿來開發的板子. 我把開發ESP-201的基本設置筆記如下, 方便記性不太好的我可以翻閱.



ESP-201 header改造

ESP-201這張模組雖然拉出所有pin-out很方便, 但犯傻做錯了兩件事情:
  1. RX/TX的header方向讓ESP-201無法安裝在麵包板上
  2. 把pin的名字印在電路板的背面, 這樣裝上麵包板誰看的到
或許一開始設計就不打算讓大家裝在麵包板上.......
首先要解決第一個問題, 根據[2], 把RX/TX的header焊到另外一端即可, 或者你要更搞剛把兩個11-pin header焊到另外一邊, 這樣上述兩個問題就一次解決.......否則就照下圖的方式修改[2]:
before

after



ESP-201接線

但是ESP8266 Arduino官網卻沒提到如何燒錄/連結ESP-201的資訊, 這讓我有點頭痛.
另外ESP-201上面標示的pin-out也跟一般ESP8266不一樣, 必須了解一下對應關係....
幸好已經有心人整理出下面這些圖[1]:




ESP8266 Arduino官網提到Generic ESP8266的連接方法[3]:



但是這個方法需要USB-Serial可以拉出RTS, 以便控制ESP8266 Reset. 我手邊的USB-Serial都沒有拉出RTS, 像這種:



全部pin-out都有拉出的模組是比較適合搭配ESP-201的:


若你的USB-Serial也沒有RTS, 可以手工焊上鍍銀線把RTS拉出來, 但是沒地方可固定感覺不是很穩固, 只好作罷. 後來找到這張表:


模式
GPIO
1520
1SDIO1xx系統工作在 SDIO 模式, 可以用外部 MCU 驅動内部WIFI
2工作模式011系统從外部FLASH 啟動
3燒錄模式010系统自動進入升級狀態,等待Serial-port下達命令



照表操課, 如果要燒錄的話, 要這樣接[2]:
GPIO0和GPIO15有接地即可燒錄. GPIO2可能內部有上拉電阻(?), 所以沒接也ok.



但每次上電後只能燒錄一次, 若要再燒錄必須斷電, 或者讓 RST接地讓ESP-201Reset.
我是直接拉出RST到微動開關,微動開關接地, 再加一個上拉電阻10k確保不會沒事Reset, 這樣每次要重新燒錄前, 按一下微動開關就好了.




還有人將ESP8266所有pin-out整理成一張非常棒的表[4], 開發時接線很方便:



我試著將上述幾張表整合成一張, 方便查詢:


Arduino IDE環境設置

接好線後, 設置ArduinoIDE環境, 我是使用 Arduino core for ESP8266 WiFi chip 提供的core, Board Manager URLs 為:
 http://arduino.esp8266.com/stable/package_esp8266com_index.json


安裝好官方Arduino IDE後, 再設定Boards Manage即可使用. 細節請直接見 Arduino core for ESP8266 WiFi chip官網.


ESP-201燒錄

從node.info()讀出來的訊息[2]:
flash size(byte)flash mode (SPI mode)flash speed(Hz)
512040000000

但我後來發現, 每一片ESP-201的flash不一定一樣, 同樣從node.info()讀出來, 我手上的ESP-201 flash參數如下:
flash size(byte)flash mode (SPI mode)flash speed(Hz)
512220000000

其中flash mode的部分不太確定數字對應的意義, 若參照[5]的說明:spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)

註: 後來發現node.info()讀出來的值, 跟當初燒錄韌體時的設定是連動的, 也就是說這裡的值是設定好的, 未必直接關連到板子上的flash.
若你是用NodeMCU的燒錄工具, node.info()的值則直接關連到下圖的設定值:


Arduino IDE燒錄時的設定應該如下:



Flash Frequency的地方, 預設只有40和80MHz, 額外的頻率需要自行設定, 在 AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0  的目錄下(可能因為esp8266-arduino版本不同而目錄名稱略有不同), 編輯 boards.txt:




找到FlashFreq的欄位, 新增20/26.7兩種頻率即可.


[參考]

  1. ESP8266 ESP-201 module - first impressions
  2. ESP8266: ESP-201 breakout board review
  3. Generic ESP8266 modules
  4. ESP8266之GPIO功能、資源探索
  5. MOD-WIFI-ESP8266 Reflashing question

http://www.barissanli.com/electronics/nodemcu.php
http://www.areresearch.net/2015/05/flashing-running-esp-201-module.html

ESP8266 ESP-201 module - antenna troubleshooting


iPhone 14 Pro vs Olympus EM10 MkII 中篇

時間來到2022年, 我的S20+因為綠線事件, 立馬被我淘汰了, 同時我也正計畫購入Mini Countryman, 很殘念的是該車系統只支援CarPlay而不支援Android AUTO, 所以我也開始考慮要不要從Android換到Apple陣營. 好, 上面都是題外話, 反...