古人智慧

Just Do it!
上士聞道,勤而行之;中士聞道,若存若亡;下士聞道,大笑之。不笑,不足以爲道。
~ 道德經 41

「實現夢想不是追逐成功,而是在於賦予生命意義,人生中的每個決定與聲音都有其重要含義。」"The key to realizing a dream is to focus not on success but on significance — and then even the small steps and little victories along your path will take on greater meaning."
電視名人-歐普拉·溫芙蕾(OPRAH WINFREY)

搜尋此網誌

Translation

2018年4月8日 星期日

[ESP8266] MicroPython + TFT-LCD

想找個小屏來做個有趣的玩具,前些時間買一套樹莓派3B包含攝像頭3.5“TFT-LCD
也用3D打印機做個漂亮的外殼。

好不容易把camera和屏的驅動都設定好,準備開始拿來做有攝像與顯示功能的Robot,結果樹莓派3B不給力,用沒多久就開始開機不順然後直接掛點,還好camera與3.5“屏都可用。
既然樹莓派3B掛點,但對這個3.5”屏非常有興趣想知道底層driver如何控制電阻式touch與TFT-LCD屏。手上有幾片ArduinoESP8266,心中在想是否可以用來學習點亮這個屏? 花了好幾天睡覺時間google很多相關這個屏的pinout電路原理圖,看來全球還真不少強人已經跑在前面好多,車尾燈都不見。。。
這屏的TFT driver是ILI9486,touch driver是XPT2046。在搜尋過程中,這個神人寫的driver驅動最厲害TFT_eSPI,幾乎把可接的LCD屏都寫好並優化加速。
雖然很完整,但是我是想要學習如何透過SPI控制LCD與Touch,能一步步下command觀察屏driver的反應,Python應該是最佳選擇。

前言 MicroPython

MicroPython真是不錯的project,用ESP8266跑起來還算順,但是memory的空間非常有限,我的pyhton code只要稍微多寫一些,就很容易就出現“MemoryError: memory allocation failed,xxxxxxxxx”。所以,MicroPython在ESP8266只能當做實驗作用,無法做成有用的產品。

材料設備

步驟一,NoteMCU與LCD接線

這個屏都是透過SPI配合幾根control pin如chip selectCommand-Datainterrupt來控制,接腳不多但是軟件開發似乎難度不低。。。
NoteMCU pinout%20pinout.pdf)
TFT-LCD pinout
NoteMCU     TFT-LCD
=======     ========
D8              TFT-CS(24)
D3              Command/Data(18)
D4              Reset(22)
D1              Touch-CS(26)
D7              MOSI(19)
D6              MISO(21)
D5              CLK(23)
+5              +5(2)
GND           GND(6)

TFT_CS = 15   # TFT Chip select control pin D8
TFT_DC = 0    # Data Command control pin D3
TFT_RST = 2   # Reset pin pin D4
TOUCH_CS = 5  # Touch Chip select control pin D1

NodeMCU與ESP8266 pin對照表

// These are the pins for all ESP8266 boards
//      Name   GPIO    Function
#define PIN_D0  16  // WAKE
#define PIN_D1   5  // User purpose
#define PIN_D2   4  // User purpose
#define PIN_D3   0  // FLASH mode at boot time
#define PIN_D4   2  // TXD1 (Note: low on boot means go to FLASH mode)
#define PIN_D5  14  // HSCLK
#define PIN_D6  12  // HMISO
#define PIN_D7  13  // HMOSI  RXD2
#define PIN_D8  15  // HCS    TXD0
#define PIN_D9   3  // RXD0
#define PIN_D10  1  // TXD0

#define PIN_MOSI 8  // SD1
#define PIN_MISO 7  // SD0
#define PIN_SCLK 6  // CLK
#define PIN_HWCS 0  // CMD

#define PIN_D11  9  // SD2
#define PIN_D12 10  // SD4

步驟二,下載MicroPython並燒錄到NoteMCU

下載Firmware,我選擇esp8266-20171101-v1.9.3.bin
依照以下指令,安裝ESP8266燒錄工具後,先將NoteMCU的flash清乾淨,然後燒錄MicroPython Firmware。
pip install esptool
esptool.py --port /dev/cu.usbserial erase_flash
esptool.py --port /dev/cu.usbserial --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20171101-v1.9.3.bin
如果沒發生任何錯誤,這MicroPython應該已經完整上傳ESP8266。按下NoteMCU板子上的reset後,MicroPython就開始作動。

步驟三,透過terminal進入MicroPython的對話模式

在MacOS環境,打開Terminal,輸入以下指令
screen /dev/cu.usbserial 115200
這時候應該進入MicroPython的對話模式,按幾下Enter會出現>>>的符號,表示NoteMCU準備接收下指令。輸入簡單指令測試
>>> print('hello esp8266!')
hello esp8266!
>>> import esp
esp.check_fw()
NoteMCU應該回應剛剛燒錄的Firmware version。
重要: 要退出screen,按下CTRL-A+CTRL-K然後回答yes即可退出

步驟四,上傳TFT-LCD的測試code

這是我寫的測試code,分享在GitHub。
那,如何從GitHub下載後如何上傳到NoteMCU?

步驟五,設定NoteMCU上網與File Transfer

輸入以下的code,讓NoteMCU連上家中Wifi AP。
import network
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('<your ESSID>', '<your password>')
sta_if.ifconfig()
會回應類似的IP address
('192.168.0.2', '255.255.255.0', '192.168.0.1', '8.8.8.8')
這樣NoteMCU就應該連上Wifi AP。
再來就是上傳Python code,不然自己慢慢“摳”到死。。。
參考WebREPL設定

方法一

這個方法簡單,但是會影響PC/Mac上internet。

方法二(我喜歡的方法)

在MicroPython對話模式下這個指令,把WebREPL啟動(Enable)
import webrepl_setup
E啟動,再輸入簡單密碼。這個密碼是運用REPL上傳Python code都需要輸入。
下載REPL,然後解開zip file後在folder內下運行以下的指令就可以上傳Python code。
./webrepl_cli.py raspi35.py 192.168.0.2:/raspi35.py
輸入密碼後就上傳。

步驟六,執行上傳的Python code

最重要的部分出現啦。。。
輸入指令就可以執行剛上傳的code
exec(open("raspi35.py").read())
接下來就可以看到類似這樣的圖形在LCD上,就大功告成!!!

參考:

我的開發桌面~~

沒有留言:

張貼留言