"Embedded Space"

Think − Do − Learn − Share







This page is no longer maintained or updated...






การใช้งาน NodeMCU สำหรับโมดูล ESP8266 เบื้องต้น

บทความนี้กล่าวถึง แนะนำการใช้งาน NodeMCU และภาษา Lua สำหรับโมดูล ESP8266

คำสำคัญ / Keywords: NodeMCU, ESP8266, Lua

โมดูล ESP8266 มาพร้อมกับเฟิร์มแวร์ที่ทำงานในลักษณะเป็น Serial-to-WiFi ช่วยให้อุปกรณ์อื่นอย่างเช่น MCU สามารถต่อเข้ากับระบบอินเทอร์เน็ตผ่านระบบ Wi-Fi โดยสื่อสารผ่านพอร์ต Serial (ขา Tx และ Rx) และใช้ชุดคำสั่งแบบ AT ในการควบคุมการทำงาน

ปัจจุบัน มีการพัฒนาเฟิร์มแวร์ที่มีชื่อว่า NodeMCU และจะช่วยในนักพัฒนาสามารถเขียนโค้ดโดยใช้ภาษา Lua เพื่อควบคุมการทำงานของโมดูล ESP8266 ได้ เช่น สามารถใช้งาน GPIO, I2C, SPI, PWM, One-Wire, ADC, Wi-Fi รวมถึงมีการพัฒนาไลบรารี่ (Libraries) เพิ่มมากขึ้นตามลำดับ ให้ใช้งานกับอุปกรณ์อื่นๆได้ เช่น DS18B20, DHT11, WS2812 RGB LED, OLED Display เป็นต้น (ดูตัวอย่างได้จาก NodeMCU API)


ข้อดีของ NodeMCU (Firmware)
  • ใช้ทรัพยากรของชิป ESP8266 ได้คุ้มค่ามากกว่าเดิม ผู้ใช้สามารถใช้งานในรูปแบบอื่นๆ นอกเหนือจากการใช้งานเพื่อเชื่อมต่อแบบ Serial-to-WiFi เท่านั้น
  • สามารถเขียนโค้ดโดยใช้ภาษา Lua (NodeMCU v0.9.5 รองรับ Lua 5.1.x แต่ไม่ครบทุกโมดูล) ซึ่งเป็นภาษาประเภท Scripting Language แม้ว่าจะไม่ได้รับความนิยมเทียบเท่าภาษา อย่างเช่น C/C++ และ Python แต่ก็สามารถเรียนรู้ได้ไม่ยาก
  • การใช้งานภาษา Lua สำหรับชิป ESP8266 อาจช่วยในการเรียนรู้และพัฒนาโค้ดได้เร็วกว่า การใช้ภาษา C/C++
  • มีการพัฒนาซอฟต์แวร์มารองรับการใช้งาน อย่างเช่น ESPlorer ทำหน้าที่เป็น Code Editor / IDE (ใช้ได้กับ Windows, Mac OS, Linux) และสามารถอัพโหลดไปยังโมดูลได้เลย สามารถเขียนโค้ดและสร้างเป็นไฟล์ .lua แยกเก็บไว้ภายในหน่วยความจำของโมดูล ESP8266 ได้
  • ซอฟต์แวร์ และเฟิร์มแวร์ เป็น Opensource และมี Sourcecode อยู่บน Github.com
  • มีฮาร์ดแวร์ / บอร์ดที่ใช้ชิป ESP8266 ที่ใช้งานได้ง่าย เช่น NodeMCU DevKit สามารถเชื่อมต่อกับพอร์ต USB ของคอมพิวเตอร์ได้ มีขา I/O ที่ใช้งานกับเบรดบอร์ดได้ ราคาไม่แพงเมื่อเปรียบเทียบกับบอร์ด Arduino ทั่วไป
  • ชิป ESP8266 ภายในมี CPU ขนาด 32 บิต ขาลอจิกทำงาน ที่แรงดัน +3.3V ดังนั้น ถ้าเปรียบเทียบกับบอร์ด Arduino Due ซึ่งใช้ไมโครคอนโทรลเลอร์ 32 บิต +3.3V การใช้บอร์ด NodeMCU DevKit มีต้นทุนที่ต่ำกว่ามาก
  • มีอุปกรณ์หลายๆ ประเภทที่ใช้งานที่แรงดัน +3.3V เป็นส่วนใหญ่ ดังนั้น ESP8266 จึงสามารถเชื่อมต่อกับอุปกรณ์เหล่านี้ได้โดยตรง
  • แม้ว่าจะมีขา I/O ให้ใช้งานไม่มาก (น้อยกว่า Arduino) แต่ ESP8266 ก็เชื่อมต่อกับอุปกรณ์อื่นๆ โดยใช้ GPIO, SPI, I2C, ADC ได้

เมื่อพิจารณาข้อดีต่างๆ ตามที่ได้กล่าวไป โดยเฉพาะอย่างยิ่ง ภาษาที่ใช้ในการเขียนโค้ด (ซึ่งไม่ใช่ C/C++) ราคาของฮาร์ดแวร์หรือบอร์ดทดลอง NodeMCU ก็คงเป็นตัวเลือกหนึ่งที่น่าสนใจ (นอกเหนือจาก Arduino) สำหรับก้าวแรกในการเรียนรู้ด้าน Embedded Systems และ Embedded Programming

การใช้งาน NodeMCU สำหรับโมดูล ESP-01

เนื่องจากโมดูล ESP-01 มีเฟิร์มแวร์สำหรับ AT commands ถ้าจะใช้งาน NodeMCU จะต้องเปลี่ยนเฟิร์มแวร์ (ดาวน์โหลดเฟิร์มแวร์ NodeMCU ล่าสุด nodemcu_latest.bin ได้จาก Github.com) ก่อนอื่นจะต้องนำโมดูล ESP-01 มาเชื่อมต่อกับอุปกรณ์ USB-to-Serial ขา Tx และ Rx จะต้องใช้แรงดันสำหรับลอจิกที่ +3.3V ใช้แรงดันไฟเลี้ยงป้อนให้โมดูล ESP-01 ที่ +3.3V และสามารถจ่ายกระแสได้ไม่ต่ำกว่า 350mA เป็นอย่างน้อย



รูปแสดงโมดูล ESP-01 และตำแหน่งของขาต่างๆ


การเชื่อมต่อขาสำหรับโมดูล ESP-01
  RX      ต่อกับขา Tx ของ USB-to-Serial
  VCC     ต่อกับแรงดันไฟเลี้ยง +3.3V
  GPIO0  ต่อกับตัวต้านทาน (อย่างน้อย 1kΩ) ไปยัง Gnd (LOW) สำหรับ Firmware Flashing Mode
          หรือไปยัง Vcc (HIGH) สำหรับ Normal Operation Mode
  RESET   ต่อกับตัวต้านทาน (อย่างน้อย 1kΩ) ไปยัง Vcc
  GPIO2   ใช้เป็นขา GPIO 
  CH_PD   ต่อกับ VCC 
  GND     ต่อกับ GND ของระบบ 
  TX      ต่อกับขา Rx ของ USB-to-Serial  

โปรแกรมสำหรับดาวน์โหลดเฟิร์มแวร์ NodeMCU ลงในชิป ESP8266 คือ NodeMCU Flasher (สำหรับ Windows)   แต่ถ้าใช้ระบบปฏิบัติการ Linux สามารถใช้โปรแกรม esptool (ทำงานแบบ command line และ เขียนด้วยภาษา Python)

เมื่อต้องการโปรแกรมเฟิร์มแวร์ ให้ต่อขา GPIO0 ผ่านตัวต้านทานไปยัง Gnd ก่อน และจึงจ่ายแรงดันไฟเลี้ยง แล้วใช้โปรแกรม NodeMCU Flasher เพื่อทำขั้นตอน Firmware Flash ผ่าน USB-to-Serial และเมื่อทำขั้นตอนสำเร็จแล้ว ให้ต่อขา GPIO0 ผ่านตัวต้านทานไปยัง Vcc แล้วปิด-เปิดแรงดันไฟเลี้ยงใหม่อีกครั้ง



รูปแสดงหน้าต่างของโปรแกรม NodeMCU Flasher
ขั้นตอนการเลือกไฟล์สำหรับเฟิร์มแวร์ NodeMCU



รูปแสดงขั้นตอนการโปรแกรมเฟิร์มแวร์ NodeMCU ไปยังชิป ESP8266
ถ้าสามารถเชื่อมต่อกับโมดูล ESP-01 ได้จะปรากฏหมายเลข MAC Address
สำหรับ AP (Access Point) และ STA (Station) ของชิป ESP8266 ในการใช้งาน Wi-Fi

ข้อจำกัดของการใช้โมดูล ESP-01 สำหรับ Node MCU คือ มีขา GPIO ให้ใช้งานอย่างจำกัด (มีเพียงขา GPIO2 และ GPIO0 เท่านั้น) ดังนั้นจึงเหมาะกับการทดลองเขียนโค้ด Lua สำหรับ ESP8266 ในเบื้องต้น

การใช้งาน NodeMCU สำหรับโมดูล ESP-07 และ ESP-12

เนื่องจากโมดูล ESP-01 มีข้อจำกัดในเรื่องจำนวนขา I/O จึงแนะนำให้ใช้โมดูลอื่น อย่างเช่น ESP-07 หรือ ESP-12 สำหรับ Node MCU แต่ในการใช้งานจริง จะต้องบัดกรีโมดูล ESP-07 หรือ ESP-12 ลงบนแผ่น PCB ที่ทำหน้าที่เป็น Adapter มีขา I/O ที่สามารถต่อใช้งานได้ง่าย เช่น นำไปต่อวงจรเบรดบอร์ดได้สะดวก

เมื่อเชื่อมต่อโมดูล ESP-07 หรือ ESP-12 กับโมดูล USB-to-Serial Adapter ได้แล้ว ขั้นตอนแรกคือ การโปรแกรม NodeMCU Firmware ลงในชิป ESP8266 ตามขั้นตอนที่ได้กล่าวไป



รูปแสดงโมดูล ESP-07



รูปแสดงตัวอย่างแผ่น PCB สำหรับโมดูล ESP-07 และ ESP-12


การเชื่อมต่อขาสำหรับโมดูล ESP-07
  RX      ต่อกับขา Tx ของ USB-to-Serial
  VCC     ต่อกับแรงดันไฟเลี้ยง +3.3V
  GPIO0   ต่อกับตัวต้านทาน (อย่างน้อย 1kΩ) ไปยัง Gnd (LOW) สำหรับ Firmware Flashing 
          แต่ถ้าใช้งานปรกติ Normal Operation Mode ให้ต่อไปยัง Vcc
  RESET   ต่อกับตัวต้านทาน (อย่างน้อย 1kΩ) ไปยัง Vcc
  GPIO15  ต่อกับ GND ***
  CH_PD   ต่อกับ VCC 
  GND     ต่อกับ GND ของระบบ 
  TX      ต่อกับขา Rx ของ USB-to-Serial  

การใช้งานโปรแกรม ESPlorer - NodeMCU IDE

โปรแกรม ESPlorer จะถูกนำมาใช้ในการเขียนโค้ดภาษา Lua สำหรับ NodeMCU / ESP8266   เมื่อเรียกโปรแกรมใช้งานแล้ว ขั้นตอนแรกคือ เลือกเปิด Serial Port ที่ตรงกับ USB-to-Serial และเชื่อมต่อกับโมดูล ESP8266



รูปแสดงหน้าต่างของ ESPlorer (เวอร์ชัน v0.1 build 206)
ให้เลือกพอร์ต Serial และกดปุ่ม Open (ใช้ baudrate 9600)



รูปแสดงผลการทำคำสั่งตัวอย่างในหน้า Tab "Commands"
โดยกดปุ่ม "Chip ID" และ "Restart ESP" ตามลำดับ



รูปแสดงการทำคำสั่งแบบ interactive ให้หน้า Tab "Snippets"
เมื่อพิมพ์คำสั่งในภาษา Lua ในช่องทางซ้ายมือ
แล้วสามารถทดลองและดูผลการทำงานได้ในช่องทางขวามือ โดยกดปุ่ม Run
ข้อสังเกต คำสั่ง print (...) จะแสดงเอาต์พุตออกมาทาง Serial

ตัวอย่างพื้นฐาน LED Blinking

ตัวอย่างแรก สาธิตการทำให้ขา GPIO2 เป็นเอาต์พุตและเปลี่ยนสถานะทางลอจิกทุกๆ 0.5 วินาที และสามารถนำไปต่อกับ LED (และตัวต้านทานจำกัดกระแส) การทำงานของโค้ด จะใช้วิธีวนลูปโดยใช้ประโยคคำสั่ง repeat ... until และมีการเว้นช่วงเวลา (delay) ทำงานโดยใช้คำสั่ง tmr.delay() การใช้งานขา GPIO จะใช้โมดูล gpio เช่น คำสั่ง gpio.mode() และ gpio.write() เป็นต้น


File: led_blink_loop_delay.lua
-- LED Blinking
led_pin = 4  -- use NodeMCU IO index 4 => GPIO2 pin
gpio.mode( led_pin, gpio.OUTPUT )    -- output mode
state = false
count = 0

repeat
    gpio.write( led_pin, gpio.HIGH ) -- update output to high
    tmr.delay( 500000 )              -- delay for 0.5 sec
    gpio.write( led_pin, gpio.LOW )  -- update output to low
    tmr.delay( 500000 )              -- delay for 0.5 sec
    count = count + 1                -- increment counter by 1
    tmr.wdclr()                      -- reset watchdog timer
until count > 100



รูปแสดงการเขียนโค้ดตามตัวอย่าง "led_blink_loop_delay.lua" และส่งไปยังโมดูล ESP

การทำงานของโค้ดในลักษณะนี้ โดยการวนลูปและหน่วงเวลาในการทำงาน ซึ่งพบเห็นได้ทั่วไปในการเขียนโค้ดสำหรับไมโครคอนโทรลเลอร์ แต่การใช้งานกับ NodeMCU นั้น เป็นวิธีการที่ไม่เหมาะสม วิธีที่ดีกว่าคือ การใช้ Timer (tmr) ในการทำงานตามคาบเวลาที่ต้องการ (คล้ายกรณีของ JavaScript) ตัวอย่างต่อไปนี้ใช้ Timer 1 ในการเรียกฟังก์ชันเพื่อเปลี่ยนสถานะของลอจิกที่ขา GPIO2


File: led_blink_tmr.lua
-- LED Blinking
led_pin = 4  -- use NodeMCU IO index 4 => GPIO2 pin
gpio.mode( led_pin, gpio.OUTPUT )
state = false

tmr.alarm( 1, 500, 1, function() -- setup alarm for timer1, fired every 500 msec
   if state then
     gpio.write( led_pin, gpio.HIGH )  -- update output to high
   else
     gpio.write( led_pin, gpio.LOW )   -- update output to low
   end
   state = not state                   -- toggle state
end )

ตัวอย่างไฟล์ init.lua

เมื่อ NodeMCU เริ่มต้นทำงานและพร้อมที่จะทำคำสั่งต่างๆ ต่อไป จะเรียกไฟล์ init.lua โดยอัตโนมัติ ดังนั้น ถ้าต้องการทำขั้นตอนหรือคำสั่งต่างๆ หลังจากรีเซตระบบ ให้นำไปใส่ในไฟล์ดังกล่าวได้   ลองมาดูตัวอย่างโค้ด ซึ่งใช้ในการเชื่อมต่อกับ Wi-FI AP โดยอัตโนมัติ และถ้าต้องการให้เรียกไฟล์ Lua Script ก็ให้เพิ่มคำสั่ง dofile() พร้อมระบุชื่อไฟล์ .lua


File: init.lua
-- specify the SSID and PASSWORD for your AP 
ssid   = "SSID" 
passwd = "PASSWORD" 

print ("Setting up WiFi...")
wifi.setmode(wifi.STATION) -- configure the device as a station (STA)
print('MAC: ',wifi.sta.getmac())
print('chip: ',node.chipid())
print('heap: ',node.heap())

wifi.sta.config(ssid, passwd) 
wifi.sta.connect()
wifi.sta.autoconnect(1)
print( 'Connecting WiFi...' )

retries = 0
tmr.alarm( 1, 1000, 1, function()
  ip = wifi.sta.getip() 
  if ip == nil then
    print( "Retry #"..retries)
    if retries >= 10 then
      print( 'WiFi connection failed!' ) 
      tmr.stop(1) -- stop timer 1
    else
      retries = retries + 1
    end
  else
    tmr.stop(1) -- stop timer 1
    print( 'IP: ' .. ip ) 
    print( 'MAC: ' .. wifi.sta.getmac() )
    status = wifi.sta.status() -- status=5 'STATION GOT IP' 
    -- dofile( 'main.lua' )
  end
end)

การใช้งาน NodeMCU ร่วมกับ ESP8266 ทำให้สามารถเขียนโค้ดภาษา Lua ได้ และเชื่อมต่อกับระบบเครือข่าย (Wi-Fi) หรือระบบอินเทอร์เน็ตได้ สื่อสารกับอุปกรณ์อื่นผ่านขา I/O ได้ ในราคาที่ถูก ดังนั้นจึงเป็นอีกตัวเลือกที่น่าสนใจสำหรับงานด้าน IoT


เผยแพร่ (First Published): 19 April 2015
แก้ไขครั้งล่าสุด (Last Updated): 19 April 2015


เผยแพร่ภายใต้ลิขสิทธิ์ / This work is licensed under: Creative Commons Attribution-NonCommercial 3.0 Unported



This page is no longer maintained or updated...




ไปหน้ารายการบทความ / Back to the article list
Formerly known as "Embedded Systems Lab (ESL@KMUTNB)"
Department of Electrical and Computer Engineering (ECE)
Faculty of Engineering, KMUTNB, Bangkok / Thailand