ไมโครไพธอนและไมโครคอนโทรลเลอร์

เขียนโดย ดร.จักรกฤษณ์  แสงแก้ว วันที่ 13 กันยายน 2562

แนะนำบอร์ดไมโครคอนโทรลเลอร์เพื่อการศึกษาไมโครไพธอน (Micropython)

ในปัจจุบันมีความแปรปรวนของมวลความรู้อย่างยิ่งยวด สิ่งที่เคยเรียนมาในอดีตอาจถูกแทนที่ด้วยความรู้ใหม่แบบยกชุด ไมโครไพธอนเป็นอีกตัวอย่างหนึ่งที่แสดงให้เห็นถึงการควบคุมไมโครคอนโทรลเลอร์โดยไม่ต้องเขียนโปรแกรมด้วยภาษาแอสเซมบลี้และภาษาเครื่อง (Instruction sets) หรือแม้กระทั่งภาษาระดับสูงอย่างเช่น C/C++ ด้วยเหตุนี้การเขียนโปรแกรมเพื่อควบคุมไมโครคอนโทรลเลอร์และรับค่าจากอุปกรณ์อิเล็กทรอนิกส์จึงเป็นเรื่องง่ายและใกล้ตัวกว่าในอดีตที่ผ่านมา นอกจากนั้นอุปกรณ์เหล่านี้ยังสามารถสื่อสารผ่านเครือข่ายไร้สายได้ 
ไมโครไพธอน เป็นภาษาไพธอนสำหรับทำงานบนไมโครคอนโทรลเลอร์เป็นภาษาที่ง่ายต่อการเรียนรู้ และมีไวยากรณ์ที่ทำความเข้าใจได้ อีกทั้งการพัฒนาด้านอินเตอร์เน็ตอ๊อฟติงค์เติบโตอย่างรวดเร็ว ในปัจจุบันสามารถนำภาษาไพธอนมาเขียนโปรแกรมบนตัวไมโครคอนโทรลเลอร์ได้ 
1. Interactive REPL (Read-Evaluate-Print Loop) คือ การอนุญาตให้ผู้ใช้พิมพ์คำสั่งโต้ตอบกับบอร์ดได้ผ่าน Interactive Shell
2. Extensive software library คือ สามารถพัฒนาโค๊ตและเก็บบันทึกในลักษณะของไลบรารี่เพื่อเรียกใช้งานได้
3. Extensibility คือ สามารถใช้ภาษาซีสร้างฟังก์ชั่นเพิ่มเติมได้
ESP 8266 เป็นโมดูล WiFi ผลิตในประเทศจีน สามารถรันโปรแกรมได้และมีพื้นที่เก็บโปรแกรม 4 MB ทำงานที่แรงดันไฟฟ้า 3.3v-3.6v ความถี่ 40MHz 
ตำแหน่งขาของ NodeMCU แบ่งได้ดังนี้
- VCC คือ แรงดันไฟฟ้าที่จ่ายเข้าไปให้ไมโครคอนโทรลเลอร์ 3.3-3.6v
- GND คือ สายกราวด์ 
- Reset และ CH_PD ต่อกับไฟขั้วบวก (Pull-up) ทำหน้าที่รีเซ็ตเหมือนกัน แต่ขา CH_PD (EN) จะต่อกับไฟขั้วบวก (Pull-up)  แต่ขา Reset จะปล่อยลอยเอาไว้
- GPIO (General Purpose Input Output) เป็นขาดิจิทัลอินพุต/เอาต์พุต ทำงานที่แรงดัน 3.3v
- GPIO0 หากต่อกับกราวด์จะทำหน้าเป็นการเขียนข้อมูลลงไมโครคอนโทรลเลอร์ (การโปรแกรม) หากต่อกับไฟขั้วบวกจะทำงานเป็นโหมดปกติ
- ADC เป็นขาอนาล็อกอินพุต รับแรงดันได้สูงสุด 1V ขนาด 10 บิต
ESP 8266 ทำงานแบบ Serial to WiFi โดยเชื่อมต่ออินเตอร์เน็ตได้โดยใช้อนุกรมพอร์ต โดยใช้ขา Tx (ส่งข้อมูล) และ Rx (รับข้อมูล)

สั่งซื้อ NodeMCU ESP8266 จาก Shopee.com

การติดตั้ง Esptool สำหรับเขียนเฟิร์มแวร์ลงบน ESP8266

1. ติดตั้งไพธอน http://python.org
2. ติดตั้ง pip ด้วยคำสั่ง
python3 -m pip install esptool

การติดตั้ง Adafruit Micropython Tool สำหรับจัดการไฟล์บน ESP8266

1. การติดตั้ง Adafruit Micropython Tool
pip install adafruit-ampy 

2. การอัพเดทโปรแกรม Adafruit Micropython Tool
pip install adafruit-ampy -U

ดาวน์โหลดเฟิร์มแวร์เพื่อติดตั้งไว้ใน ESP8266

ดาวน์โหลดเฟิร์มแวร์ที่นี่ http://micropython.org/download
ปล. การอบรมใช้เฟิร์มแวร์ เวอร์ชั่น esp8266-20190125-v1.10.bin

การติดตั้งเฟิร์มแวร์ Micropython

1. กรณีติดตั้งสำหรับ ESP8266
esptool --port  erase_flash
esptool --port  write_flash --flash_size=detect -fm dio 0 FIRMWARE.bin
เช่น
esp>esptool --port COM4 write_flash --flash_size=detect -fm dio 0 esp8266-20190125-v1.10.bin

2. กรณีติดตั้งสำหรับ ESP32
esptool --port  erase_flash
esptool --port  --chip esp32 write_flash -z 0x1000 FIRMWARE.bin

หมายเหตุ : หากพบปัญหาให้กดปุ่ม Reset ค้างไว้ (ขณะที่กำลังเขียน micropython) และใช้ความเร็วเพิ่มการรับส่งเร็วขึ้นได้ ดังคำสั่งต่อไปนี้
esptool --port COM5 --baud 962100  --before default_reset --after hard_reset  --chip esp32 write_flash -z 0x1000 esp32-20190907-v1.11-291-gc69f58e6b.bin

การเปิด Terminal ด้วยโปรแกรม Putty เพื่อสื่อสารกับ ESP8266 (Micropython)

1. ดาวน์โหลด putty 
2. เปิดโปรแกรม putty
3. เลือกการสื่อสารแบบ serial 
- ระบุคอมพอร์ต
-  กำหนดความเร็วการสื่อสาร 115200
- กำหนด  Flow control เป็นค่า None


- กำหนด  Flow control เป็นค่า None


กดปุ่ม Reset ที่ไมโครไพธอนบอร์ด
เมื่อกด Reset บนบอร์ดจะปรากฎอินเตอร์แอคทีฟเชลล์สามารถเขียนโปรแกรมโต้ตอบกับไมโครไพธอนได้

การทำงานของหลอด LED

หลอด LED คือ ไดโอดเปล่งแสง (Light-Emitting Diode) พบเห็นได้ทั่วไปในอุปกรณ์อิเล็กทรอนิสก์ โดยหลอดLED สามารถเปล่งแสงได้เมื่อจ่ายกระแสไฟฟ้าเพียงเล็กน้อยแต่ให้ประสิทธิภาพการเรืองแสงที่ดีกว่าหลอดไฟขนาดเล็กทั่ว ๆ ไป

แรงดันไฟฟ้าที่ป้อนให้หลอด LED ประมาณ 3-5 โวลต์ โดยป้อนไฟลบเข้าที่ขา Cathode (ขาสั้น) และป้อนไฟบวกที่ Anode (ขายาว) ถ้าต่อผิดข้างหลอด LED จะไม่สว่าง 


การต่อหลอด LED

เขียนโปรแกรมสั่งเปิดไฟ/ปิดไฟด้วย Interactive Shell

import machine
pin4=machine.Pin(4, 1) 
pin4.on()
pin4.off()
หมายเหตุ : 
 - machine.Pin.OUT มีค่าเท่ากับ 1 หมายถึงกำหนดให้เป็นเอาต์พุต
 - machine.Pin.INPUT มีค่าเท่ากับ 0 หมายถึงกำหนดให้เป็นอินพุต

สคริปต์สำหรับทำงานเป็นครั้งแรกตั้งชื่อด้วย boot.py

1. เปิดโปรแกรม uPyLoader
2. เลือก File -> Init Transfer File (เป็นการสร้างไฟล์สำหรับอัพโหลดและดาวน์โหลดไฟล์ของ uPyLoader โดยทำครั้งแรกเพียงครั้งเดียว)
3. แก้ไขไฟล์ boot.py
4. กดปุ่ม reset

เขียนโปรแกรมไฟกระพริบ 10 รอบ

import machine, time
pin4=machine.Pin(4, 1)
for i in range(10):
	pin4.on()
	time.sleep_ms(100)
	pin4.off()
	time.sleep_ms(100)

เขียนโปรแกรมไฟกระพริบตลอดเวลา

import machine, time
pin4=machine.Pin(4, 1) 
while True:
	pin4.on()
	time.sleep_ms(100)
	pin4.off()
	time.sleep_ms(100)

การเขียนโปรแกรมควบคุมไฟกระพริบ 2 ดวงเปิด/ปิดสลับกันตลอดเวลา

import machine, time
pin4=machine.Pin(4, machine.Pin.OUT)
pin5=machine.Pin(5, machine.Pin.OUT)
while True:
	pin4.on()
	pin5.on()
	time.sleep_ms(100)
	pin4.off()
	pin5.on()
	time.sleep_ms(100)

การเขียนโปรแกรมควบคุมไฟดวงที่ 1 เปิด และดวงที่สองกระพริบ 2 ครั้ง จากนั้นดวงที่ 1 ปิด วนรอบไม่รู้จบ

import machine, time
pin4=machine.Pin(4, machine.Pin.OUT)
pin5=machine.Pin(5, machine.Pin.OUT)
while True:
	pin4.on()
	pin5.on()
	time.sleep_ms(100)
	pin5.off()
	time.sleep_ms(100)
	pin5.on()
	time.sleep_ms(100)
	pin5.off()
	time.sleep_ms(100)
	pin4.off()
	time.sleep_ms(100)

การใช้งาน WiFi

- WiFi 3 โหมด คือ โหมด AP (Access Point) โหมด STA  โหมด AP
1) AP (Access Point) เป็นโหมดปล่อยสัญญาณ WiFi ออกไป เพื่อให้อุปกรณ์ต่าง ๆ มาเชื่อมต่อ โดยรองรับอุปกรณ์ที่เชื่อมเพียง 1 ตัวเท่านั้น  ไม่ต้องใช้งานผ่านอินเตอร์เน็ต
2) STA (Station) เป็นโหมดเชื่อมต่อกับอุปกรณ์ปล่อยสัญญาณอื่น ๆ เช่น เร้าเตอร์ โทรศัพท์มือถือที่เปิดฮอตสปอต การใช้งานในโหมดนี้นิยมใช้กับงานที่ต้องการเชื่อมต่ออินเตอร์เน็ต หรือมีการสื่อสารกับอุปกรณ์หลาย ๆ ในวงแลน ในงานด้าน IoT Smart Home และ Smart Farm มักใช้งานในโหมดนี้เพื่อส่งข้อมูลจากเซ็นเซอร์ขึ้นไปบนระบบคลาวด์และใช้โหมดนี้เพื่อเชื่อมต่อกับระบบคลาวด์รับคำสั่งมีสั่งอุปกรณ์ต่าง ๆ ให้ทำงานผ่านอินเตอร์เน็ต
3 AP+STA เป็นโหมดทำงาน AP และ STA ร่วมกัน

การเขียนโปรแกรมเชื่อมต่อ Access Point และอ่านข้อมูลจากเว็บไซต์

def connect_to_router():
   import network
   ssid = 'dsdi'
   password = '12345678910'
   sta_if = network.WLAN(network.STA_IF)
   ap_if = network.WLAN(network.AP_IF)
   sta_if.active(True)
   ap_if.active(False)
   sta_if.connect(ssid,password)

import machine,time
pin4=machine.Pin(4, 1) 
pin4.on()

connect_to_router()
time.sleep(1)
pin4.off()

from urllib.urequest import urlopen
data = urlopen("http://dsdi.msu.ac.th/iot/random.php").read().decode('utf-8')
time.sleep(1)
pin4.on()

for i in range(int(data)):
	pin4.off()
	time.sleep_ms(100)
	pin4.on()
	time.sleep_ms(100)

เขียนโปรแกรมเชื่อมต่อกับ Wifi และส่งค่าจากเซ็นเซอร์ไปยังเว็บไซต์

def connect_to_router():
   import network

   ssid = 'dsdi'
   password = '12345678910'

   sta_if = network.WLAN(network.STA_IF)
   ap_if = network.WLAN(network.AP_IF)

   sta_if.active(True)
   ap_if.active(False)
   sta_if.connect(ssid,password)

import machine,time
pin4=machine.Pin(4, 1) 
pin4.on()

connect_to_router()
time.sleep(1)
pin4.off()

import random
from urllib.urequest import urlopen

for i in range(10):
     sensor1 = random.getrandbits(8)
     pin4.off()
     send = urlopen("http://dsdi.msu.ac.th/iot/sensor.php?id=1&data=%d"%sensor1).read()
     time.sleep(0.25)
     pin4.on()
     time.sleep(0.25)

ใบงาน :

- ใบงาน 1 : การเขียนโปรแกรมสั่งเปิดและปิดหลอด LED
- ใบงาน 2 : การเขียนโปรแกรมควบคุมไฟกระพริบ 10 รอบ
- ใบงาน 3 : การเขียนโปรแกรมควบคุมไฟกระพริบตลอดเวลา
- ใบงาน 4 : การเขียนโปรแกรมควบคุมไฟกระพริบ 2 ดวงเปิด/ปิดสลับกัน
- ใบงาน 5 : การเขียนโปรแกรมควบคุมไฟดวงที่ 1 เปิด และดวงที่สองกระพริบ 2 ครั้ง จากนั้นดวงที่ 1 ปิด วนรอบไม่รู้จบ
- ใบงาน 6 : เขียนโปรแกรมเชื่อมต่อกับ Wifi และอ่านข้อมูลจากเว็บและนำค่าที่ได้จากเว็บมาทำไฟกระพริบวนรอบตามจำนวนที่อ่านค่าออกมาจากเว็บ
- ใบงาน 7 : เขียนโปรแกรมเชื่อมต่อกับ Wifi และส่งค่าจากเซ็นเซอร์ไปยังเว็บไซต์

การสร้างและใช้งานสภาพแวดล้อมเสมือนสำหรับ Micropython

วัตถุประสงค์
1. สามารถสร้างสภาพแวดล้อมเสมือนเพื่อใช้งานสำหรับไมโครไพธอนได้
2. สามารถติดตั้ง esptool, adafruit-ampy ได้
3. สามารถบันทึกไฟล์ลง Micropython board ได้
4. สามารถเรียกใช้คำสั่ง ampy สำหรับจัดการไมโครไพธอนได้
เนื้อหา
1. ทำการสร้างสภาพแวดล้อมสำหรับ micropython ด้วยคำสั่ง
conda create -n micropython python3.6

2. การเลือกใช้สภาพแวดล้อมใหม่ที่สร้างขึ้น ชื่อ micropython
activate micropython

3. ติดตั้ง esptool
conda install esptool

4. ติดตั้ง adafruit-ampy สำหรับอัพโหลดไฟล์เข้าไปยังบอร์ดไมโครไพธอน
pip install adafruit-ampy

5. การคัดลอกไฟล์เข้าไฟล์เข้าไปในไมโครไพธอนบอร์ด
ampy -p COM4 put led.py

6. การแสดงรายชื่อไฟล์ในไมโครไพธอนบอร์ด
ampy -p COM4 ls

7. การรันสคริปต์ในไมโครไพธอนบอร์ด
ampy -p COM4 run led.py

8. การอ่านไฟล์ออกมาจากไมโครไพธอนบอร์ด
ampy -p COM4 get /led.py board_led.py

9. การสร้างไดเร็คทอรี่บนไมโครไพธอนบอร์ด
ampy -p COM4 mkdir test

10. การลบไฟล์บนไมโครไพธอนบอร์ด
ampy -p COM4 rm filename

11. การลบไดเร็คทอรี่บนไมโครไพธอนบอร์ด
ampy -p COM4 rmdir test
สรุปผลการทดลอง
      เนื้อหาส่วนนี้เป็นการสร้างและใช้งานสภาพแวดล้อมใหม่สำหรับไมโครไพธอน โดยจะติดตั้งและใช้งานโปรแกรม ampy เพื่อจัดการไมโครคอนโทรลเลอร์บอร์ด ได้แก่ การอัพโหลดไฟล์เข้าไปยังบอร์ด การแสดงรายชื่อไฟล์ การรันสคริปต์ไพธอน ด้วย ampy 

การสร้าง HTTP Server บนไมโครไพธอนบอร์ด

วัตถุประสงค์
1. สามารถสร้างเว็บเซิฟเวอร์ด้วย socket ได้
การดำเนินงาน
1. คัดลอกโค๊ดต่อไปนี้ลงในไฟล์ server.py
2. ถ่ายโอนไฟล์ลงไปยังไมโครไพธอน
3. รันสคริปต์ server.py ด้วยโปรแกรม ampy
4. นำคอมพิวเตอร์หรือสมาร์ตโฟนเชื่อมต่อเข้ากับ Access Point เดียวกับ Micropython เชื่อมต่อ ในตัวอย่างนี้คือ ssid : dsdi 
5. ใส่หมายเลขไอพีของไมโครไพธอนที่ทำงานเป็นเว็บเซิฟเวอร์ลงในบราวเซอร์และสังเกตผลลัพธ์ที่ได้
import network
import utime

ssid   = 'dsdi' 
password = '1234567890'
sta_if.connect(ssid, password)
utime.sleep(1)
sta_if.isconnected()

# stop AP mode
ap_if = network.WLAN( network.AP_IF )
ap_if.active(False)

# enable STA mode
sta_if = network.WLAN( network.STA_IF )
sta_if.active(True)
sta_if.ifconfig()

import machine
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]

html = """<!DOCTYPE html>
<html>
    <head> <title>ESP8266 Pins</title> </head>
    <body> <h1>ESP8266 Pins</h1>
        <table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
    </body>
</html>
"""

import socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    cl_file = cl.makefile('rwb', 0)
    while True:
        line = cl_file.readline()
        if not line or line == b'\r\n':
            break
    rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
    response = html % '\n'.join(rows)
    cl.send(response)
    cl.close()

การสื่อสารกับบอร์ดไมโครไพธอนด้วย uPyLoader

วัตถุประสงค์
1. สามารถสื่อสารและจัดการระบบไฟล์บนบอร์ดไมโครไพธอนด้วย uPyLoader บนวินโดวส์ได้
การดำเนินการ
1. ดาวน์โหลดโปรแกรม uPyLoader ที่ลิงค์ https://github.com/BetaRavener/uPyLoader/releases/tag/v0.1.4
2. เสียบสาย USB และ Micropython board
3. เรียกโปรแกรม uPyLoader
4. จัดการระบบไฟล์และการเอ็กซีคิวส์ผ่าน uPyLoader


สรุปผลการทดลอง
      เนื้อหาส่วนนี้เป็นการจัดการระบบไฟล์บนไมโครคอนโทรลเลอร์บอร์ด ได้แก่ การอัพโหลดไฟล์เข้าไปยังบอร์ด การแสดงรายชื่อไฟล์ การรันสคริปต์ไพธอนผ่านกราฟิกอินเตอร์เฟสด้วย upyloader เป็นต้น พบว่าสามารถจัดการไฟล์บนไมโครคอนโทรลเลอร์บอร์ดด้วยกราฟิกอินเตอร์เฟสได้สะดวก โดยโปรแกรมจะทำการสร้างไฟล์ _upload.py และไฟล์ _download.py เพื่อจัดการสื่อสารระหว่างบอร์ดและโปรแกรม uPyLoader

การสื่อสารกับบอร์ดไมโครไพธอนด้วย uPyCraft

แนะนำ uPyCraft
uPyCraft เป็นโปรแกรมที่ใช้สื่อสารกับบอร์ดไมโครไพธอน เหมือน uPyLoader ทำงานได้คล้ายกันแต่มีหน้าตาโปรแกรมที่ใช้แก้ไขโค๊ดไพธอนได้สะดวกกว่า มีการแสดงหมายเลขบรรทัดและย่อหน้าเอื้อความสะดวกในการเขียนโปรแกรม

ดาวน์โหลด uPyCraft
http://docs.dfrobot.com/upycraft/

การตรวจสอบการตั้งค่าใน ESP8266

import port_diag
ผลลัพธ์ : 

>>> import port_diag
FlashROM:
Flash ID: 1640e0 (Vendor: e0 Device: 4016)
Flash bootloader data:
Byte @2: 02
Byte @3: 40 (Flash size: 4MB Flash freq: 40MHZ)
Firmware checksum:
size: 615372
md5: 7a71fb7238ce227f23450783b1389443
True

Networking:
STA ifconfig: ('0.0.0.0', '0.0.0.0', '0.0.0.0', '208.67.222.222')
AP ifconfig: ('192.168.4.1', '255.255.255.0', '192.168.4.1', '208.67.222.222')
Free WiFi driver buffers of type:
0: 8 (1,2 TX)
1: 0 (4 Mngmt TX(len: 0x41-0x100))
2: 8 (5 Mngmt TX (len: 0-0x40))
3: 4 (7)
4: 7 (8 RX)
lwIP PCBs:
Active PCB states:
Listen PCB states:
TIME-WAIT PCB states:

การใช้งาน micropython-lib

รายละเอียดของ micropython อยู่ที่เว็บ https://github.com/micropython/micropython-lib โดยสามารถติดตั้งไลบรารี่แต่ละตัวแยกออกจากกันได้ เมื่อติดตั้งไลบรารี่ด้วยคำสั่ง upip.install() จะนำไลบรารี่เก็บไว้ในไดเร็คทอรี่ lib โดยสามารถติดตั้งด้วยคำสั่ง REPL ดังนี้
หมายเหตุ : ท่านต้องเชื่อมต่ออินเตอร์เน็ตให้กับ ESP8266 ก่อนเรียกใช้งาน upip (ศึกษาหัวข้อการเชื่อมต่ออินเตอร์เน็ตเพิ่มเติม)
import upip
upip.install("micropython-struct")
ไลบรารี่ต่าง ๆ ภายใน micropython-lib ประกอบด้วย
- abc
- argparse
- array
- asyncio
- asyncio_slow
- base64
- binascii
- binhex
- bisect
- calendar
- cgi
- cmd
- code
- codecs
- codeop
- collections.defaultdict
- collections.deque
- collections
- concurrent.futures
- contextlib
- copy
- cpython-uasyncio
- csv
- curses.ascii
- curses
- datetime
- dbm
- decimal
- difflib
- dis
- dummy_threading
- email.charset
- email.encoders
- email.errors
- email.feedparser
- email.header
- email.internal
- email.message
- email.parser
- email.utils
- errno
- fcntl
- ffilib
- fnmatch
- formatter
- fractions
- ftplib
- functools
- getopt
- getpass
- gettext
- glob
- gzip
- hashlib
- heapq
- hmac
- html.entities
- html.parser
- html
- http.client
- imaplib
- imp
- importlib
- inspect
- io
- ipaddress
- itertools
- json
- keyword
- linecache
- locale
- logging
- machine
- mailbox
- mailcap
- math
- mimetypes
- multiprocessing
- nntplib
- numbers
- operator
- optparse
- os.path
- os
- pathlib
- pdb
- pickle
- pickletools
- pkg_resources
- pkgutil
- platform
- poplib
- posixpath
- pprint
- profile
- pty
- pwd
- pyb
- pystone
- pystone_lowmem
- queue
- quopri
- random
- re-pcre
- readline
- reprlib
- runpy
- sched
- select
- selectors
- shelve
- shlex
- shutil
- signal
- smtplib
- socket
- socketserver
- sqlite3
- ssl
- stat
- statistics
- string
- stringprep
- struct
- subprocess
- sys
- tarfile
- telnetlib
- tempfile
- test.pystone
- test.support
- test
- textwrap
- threading
- time
- timeit
- trace
- traceback
- tty
- types
- typing
- uaiohttpclient
- uasyncio.core
- uasyncio.queues
- uasyncio.synchro
- uasyncio.udp
- uasyncio.websocket.server
- uasyncio
- ucontextlib
- ucurses
- udnspkt
- umqtt.robust
- umqtt.simple
- unicodedata
- unittest
- upip
- upysh
- urequests
- urllib.parse
- urllib.urequest
- urllib
- utarfile
- uu
- uuid
- venv
- warnings
- weakref
- xmltok
- zipfile
- zlib

การใช้งาน LCD 16x2 สื่อสารด้วย I2C

1. ต่อสาย 5 Volt เข้า Vcc
2. ต่อสายกราวด์ เข้า Ground 
3. ต่อ GPIO4 เข้ากับ SCL (Clock)
4. ต่อ GPIO5 เข้ากับ SDA (Data)
5. ต่อ Ground ระหว่าง ESP8266 เข้ากับกราวด์ของ LCD 16x2
6. ดาวน์โหลดไลบรารี่ลงบนบอร์ด MicroPython 1) esp8266_i2c_lcd.py 2) lcd_api.py
7. เขียนโค๊ดดังต่อไปนี้
from time import sleep_ms, ticks_ms
from machine import I2C, Pin
from esp8266_i2c_lcd import I2cLcd
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
lcd.backlight_on()
lcd.clear()
lcd.putstr("Weight: 100%")
lcd.move_to(0,1)
lcd.putstr("Status: Ready !!")


แหล่งข้อมูล : 
- Esp8266 LCD ไลบรารี่ : https://github.com/dhylands/python_lcd
- https://github.com/gsampallo/micropython_examples

การใช้งานเซ็นเซอร์อุณหภูมิและความชื้น DH11

DHT (Digital Humidity & Temperature) sensor
- DHT เป็นเซ็นต์เซอร์วัดอุณหภูมิและความชื้นในอากาศ ส่งข้อมูลเป็น analog
- DHT มี 2 แบบ คือ 1) DHT11 (สีน้ำเงิน) 2) DHT22 (สีขาว) ทำงานเหมือนกันแต่ DHT22 จะคำนวณซับซ้อนกว่า
- ฟังก์ชั่น temperature() คืนค่าเป็นหน่วยองศาเซลเซียส 
- ฟังก์ชั่น humidity() คืนค่าเป็นเปอร์เซ็นต์

 การต่อสายสัญญาณ 
1. ต่อ 5 โวลต์ เข้ากับ Vcc
2. ต่อกราวด์ เข้ากับ Gnd
3. ต่อ GPIO 16 เข้ากับ Output 
import dht
import machine
d = dht.DHT11(machine.Pin(4))

import dht
import machine
d = dht.DHT22(machine.Pin(4))

d.measure()
d.temperature()
d.humidity()

การตรวจน้ำหนักด้วย HX711

การเชื่อมต่อสัญญาณ
1. ต่อสายไฟและกราวด์
2. ต่อ GPIO 12 เข้ากับ Data
3. ต่อ GPIO 14 เข้ากับ CLOCK
4. ต่อกราวด์ระหว่าง ESP8266 กับ HX711
5. เขียนโค๊ดดังต่อไปนี้
from hx711 import HX711
driver = HX711(d_out=12, pd_sck=14)
print(driver)
HX711 on channel A, gain=128
x = driver.read()
print(x)
#driver.channel=HX711.CHANNEL_A_64
#driver.channel
#driver.read()
#driver.power_off()

การตรวจจับ Gas

1. ต่อ VCC และ GND
2. ต่อ A0 เข้ากับ A0
3. ต่อ Ground เข้ากับ Ground
4. เขียนโค๊ดต่อไปนี้
import machine
adc = machine.ADC(0)
adc.read()

การติดต่อ MPU6050 และ ESP8266 MicroPython

» https://github.com/adamjezek98/MPU6050-ESP8266-MicroPython
» ไฟล์ mpu6050.py
» SCL connected to pin 5, SDA to pin 4 example usage:
import machine
class accel():
    def __init__(self, i2c, addr=0x68):
        self.iic = i2c
        self.addr = addr
        self.iic.start()
        self.iic.writeto(self.addr, bytearray([107, 0]))
        self.iic.stop()

    def get_raw_values(self):
        self.iic.start()
        a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
        self.iic.stop()
        return a

    def get_ints(self):
        b = self.get_raw_values()
        c = []
        for i in b:
            c.append(i)
        return c

    def bytes_toint(self, firstbyte, secondbyte):
        if not firstbyte & 0x80:
            return firstbyte << 8 | secondbyte
        return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)

    def get_values(self):
        raw_ints = self.get_raw_values()
        vals = {}
        vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
        vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
        vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
        vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
        vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])
        vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
        vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
        return vals  # returned in range of Int16
        # -32768 to 32767

    def val_test(self):  # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
        from time import sleep
        while 1:
            print(self.get_values())
            sleep(0.05)
>>>from machine import I2C, Pin
>>>import mpu6050
>>>i2c = I2C(scl=Pin(5), sda=Pin(4))
>>>accelerometer = mpu6050.accel(i2c)
>>>accelerometer.get_values()
{'GyZ': -235, 'GyY': 296, 'GyX': 16, 'Tmp': 26.64764, 'AcZ': -1552, 'AcY': -412, 'AcX': 16892}

สรุป

การเขียนโปรแกรมภาษาไพธอนทำให้การพัฒนางานด้านไมโครคอนโทรลเลอร์เป็นเรื่องง่ายกว่าการพัฒนาด้วยภาษาแอสเซมบลี้และ C/C++ เพราะคุณลักษณะเด่นของ python คือไวยากรณ์ที่ง่ายและความสามารถด้านต่าง ๆ อาทิ map reduce lambda filter และการจัดการสตริง ซึ่งทำให้สามารถจัดการข้อมูลได้ง่ายกว่าภาษาระดับล่างอย่างมาก

ไลบรารี่สำหรับ Micropython

» โมดูลขยาย GPIO 16 ช่องผ่าน I2C สำหรับ Micropython 
   1) micropython-mcp23017 https://github.com/mcauser/micropython-mcp23017
   2) https://github.com/ShrimpingIt/micropython-mcp230xx
» 
micropython-mcp23017
ความรู้เบื้องต้นภาษา Python และไมโครไพธอนบนไมโครคอนโทรลเลอร์