[TH] How to flash the MicroPython firmware to WeMos D1 Pro Mini

WeMos D1 Pro Mini เป็นบอร์ด ESP8266 ที่มีหน่วยความจำ Flash ROM ให้ใช้งาน 16MB ซึ่งมีประโยชน์การนำข้อมูลภาพหรือข้อมูลที่ไม่มีการเปลี่ยนแปลงจัดเก็บไว้ใน Flash ROM และนำมาใช้งาน แต่อย่างไรก็ดี การเขียน Firmware MicroPython ลงบนบอร์ดนี้จะมีขั้นตอนที่ต้องทำเพิ่มจากการเขียนกับบอร์ดรุ่น 4MB (วิธีการของบอร์ด WeMos D1 R1 mini หรือ ESP8266 สามารถดูได้จากคลิปนี้ครับ … gogogo …) ในบทความนี้เราจะทดลองเขียน ROM และเขียนโปรแกรมเพื่อแสดงข้อมูลของบอร์ดกันครับ

ภาพที่ 1 บอร์ด WeMos D1 Pro mini ที่เชื่อมต่อกับเครื่องคอมพิวเตอร์เรียบร้อยแล้ว

ขั้นตอนเตรียมการ

ก่อนอื่นเราต้องมีอุปกรณ์ และไฟล์เหล่านี้เตรียมไว้ก่อนครับ
1. Firmware MicroPython สำหรับ ESP8266 รุ่น 1.13 จากลิงค์นี้ครับ
2. ไฟล์ส่วนของข้อมูลสำหรับ ESP8266 จากที่นี่
3. โปรแกรม python สำหรับระบบปฏิบัติการที่ใช้งานอยู่
3. โปรแกรม esptool.py ซึ่งสามารถติดตั้งได้จาก pip ของ python ด้วยการสั่งติดตั้งดังนี้
pip install esptool
4. โปรแกรม Thonny ซึ่งสามารถดาวน์โหลดโปรแกรมติดตั้งจากเว็บไซต์หรือสั่งดาวน์โหลดจาก pip ด้วยคำสั่งต่อไปนี้
pip install thonny

เริ่มลงมือกัน

  1. ต่อสาย microUSB เข้ากับบอร์ด และเครื่องคอมพิวเตอร์
  2. เข้า Terminal
  3. สั่งลบรอมด้วยคำสั่งต่อไปนี้
    python -m esptool –baud 460800 erase_flash –port ชื่อพอร์ต
    หรือ กรณีที่ใช้ esptool.exe
    esptool.exe –port ชื่อพอร์ต –baud 460800 erase_flash
  4. นำไฟล์ทั้งหมดมาไว้ที่เดียวกัน แล้วสั่งเขียนลงรอมด้วยคำสั่งต่อไปนี้
    python -m esptool –baud 460800 write_flash \
    -fm dio -fs 16MB 0x0 esp8266-20200911-v1.13.bin \
    0xffc000 esp_init_data_default.bin
    –port ชื่อพอร์ต
    หรือ กรณีใช้ esptool.exe
    esptool.exe –port ชื่อพอร์ต –baud 460800 write_flash -fm dio -fs 16MB 0x0 esp8266-20200911-v1.13.bin 0xffc000 esp_init_data_default.bin
  5. เรียก Thonny และเชื่อมต่อกับบอร์ด
  6. เขียนโปรแกรมทดสอบการทำงาน (info-esp8266.py) และผลลัพธ์ของการทำงานเป็นดังภาพต่อไปนี้
import os
import sys
import machine as mc
import gc
import time
if sys.platform == 'esp8266':
    import esp
    scl_pin = mc.Pin(5)
    sda_pin = mc.Pin(4)
    i2c = mc.I2C(scl=scl_pin,sda=sda_pin)
else: 
    scl_pin = None
    sda_pin = None
    i2c = None
uname = os.uname()
if sys.platform == 'esp8266':
    mc.freq(160000000)
mem_total = gc.mem_alloc()+gc.mem_free()
free_percent = str((gc.mem_free())/mem_total*100.0)+"%"
alloc_percent = str((gc.mem_alloc())/mem_total*100.0)+"%"
print("ID ............: {}".format(mc.unique_id()))
print("Platform ......: {}".format(sys.platform))
print("Version .......: {}".format(sys.version))
if sys.platform == 'esp8266':
    print("ROM Size ......: {} MBytes".format(esp.flash_size()/(1024*1024)))
print("Memory")
print("   total ......: {} Bytes or {} MBytes".format(mem_total, mem_total/(1024*1024)))
print("   usage ......: {} Bytes or {}".format(gc.mem_alloc(),alloc_percent))
print("   free .......: {} Bytes or {}".format(gc.mem_free(),free_percent))
print("system name ...: {}".format(uname.sysname))
print("node name .....: {}".format(uname.nodename))
print("release .......: {}".format(uname.release))
print("version .......: {}".format(uname.version))
print("machine .......: {}".format(uname.machine))
if sys.platform == 'esp8266':
    print("Frequency .....: {} MHz".format(mc.freq()/1000000.0))
if i2c != None:
    devices = i2c.scan()
    i2c_dev = {32:'PCF8574',33:'PCF8574',34:'PCF8574',35:'PCF8574',36:'PCF8574',37:'PCF8574',38:'PCF8574',39:'LCD',56:'LCD',57:'PCF8574',58:'PCF8574',59:'PCF8574',
               60:'PCF8574/OLED',61:'PCF8574',62:'PCF8574',63:'PCF8574',68:'SHT31', 84:'24xx #1',85:'24xx #2',86:'24xx #3',87:'24xx #4',104:'RTC'}
    if len(devices)==0:
        print("No I2C")
    for io in devices:
        if io in i2c_dev:
            print("Address [",hex(io),"] Device :",i2c_dev[io])
        else:
            print("Address [",hex(io),"] Device : ???")
ภาพที่ 2 โค้ดของ info-esp8266.py
ภาพที่ 3 ผลลัพธ์การทำงานจากโปรแกรม info-esp8266.py

สรุป

จากการทดลองครั้งนี้จะพบว่า การเขียนเฟิร๋มแวร์สำหรับบอร์ด WeMos D1 Pro mini ต้องประกอบด้วย MicroPython และ Data Area ของ ESP8266 จึงจะทำให้บอร์ดทำงานได้ตามปกติเหมือนการเบิร์นด้วยโปรแกรม Thonny ส่วนข้อดีของการมีรอมที่มากขึ้นทำให้เราสามารถเขียนโค้ดได้มากขึ้น อัพโหลดไฟล์ไปเก็บในรอมได้มากขึ้น เป็นต้น

สุดท้ายหวังว่าบทความนี้คงเป็นประโยชน์สำหรับผู้ศึกษาการเขียนโปรแกรมภาษาไพธอนบนบอร์ด ESP8266 ที่มีรอม 16MB และโค้ดตัวอย่างการอ่านข้อมูลของบอร์ดคงเป็นแนวทางในการเขียนโค้ดเพื่อตรวจสอบสถานะของบอร์ดในขณะที่ทำงาน เช่น ปริมาณหน่วยความจำแรมที่เหลือ รุ่นของเฟิร์มแวร์ หรือแพลตฟอร์มที่กำลังทกงานอยู่ เป็นต้น

อ้างอิง

1. https://medium.com/@rawat.s/micropython-for-esp8266-d932e51e6f47
2. http://www.micropython.org

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020/09/20
ปรับปรุงเมื่อ 2020/11/04