วันพุธ, ธันวาคม 1

เริ่มต้นใช้งาน MicroPython กับ ESP32 ด้วย uPyCraft IDE




ไมโครไพธอน - MicroPython 

ประวัติของ MicroPython เริ่มต้นโดย Damien P. George (http://dpgeorge.net/) ซึ่งเป็นนักฟิกส์ชาวออสเตรเลีย มีความคิดที่จะเขียนโปรแกรมไมโครคอนโทรลเลอร์โดยใช้ภาษา Python ขณะที่ทำงานเป็น Post-Doctoral Fellow และทำวิจัยด้านอนุภาคพลังงานสูง ในมหาวิทยาลัย Cambridge ประเทศอังกฤษ (UK) ตอนเรียนระดับป.ตรี เขามีโอกาสได้ร่วมทีม RobotCup แข่งขันหุ่นยนต์เตะฟุตบอล (Robot Soccer League) จึงมีประสบการณ์ด้านฮาร์ดแวร์ อิเล็กทรอนิกส์ และเขียนโปรแกรมด้านสมองกลฝังตัว

เขาจึงเริ่มพัฒนาคอมไพเลอร์ (Compiler) เพื่อแปลงโค้ด Python 3.x Script (.py) ให้เป็นโปรแกรมหรือเฟิร์มแวร์ที่ทำงานได้โดยใช้ไมโครคอนโทรลเลอร์ และสร้างบอร์ด PyBoard และระดมทุนใน Kickstarter ในช่วงปี ค.ศ. 2013-2014 ได้ผู้มาสนับสนุนราว 2,000 ราย (1,931 backers) และได้ระดมทุนเงินสูงเกือบ £100,000 ซึ่งเป็นจุดเริ่มต้นของ MicroPython และเผยแพร่ซอฟต์แวร์ โดยใช้ลิขสิทธิ์ MIT license

ต่อมาบอร์ดที่ใช้ชิปหรือโมดูล ESP8266 และ ESP32 ของบริษัท Espressif Systems ซึ่งมีความสามารถในการเชื่อมต่อ Wi-Fi และนำไปใช้งานด้าน IoT ก็เพิ่มความสามารถให้ใช้งานร่วมกับ MicroPython ได้

MicroPython เป็นการใช้ภาษา Python ในการเขียนโปรแกรมขนาดเล็ก ที่สามารถทำงานได้โดยเชื่อมต่อบน Development Boards ด้วย MicroPython นั้น คุณสามารถเขียนโปรแกรมได้อย่างเรียบง่าย และ สามารถใช้การเขียนภาษา Python ขั้นพื้นฐานเพื่อควบคุมการทำงานในส่วนของ Hardware ได้เลย ซึ่งมีความซับซ้อนน้อยกว่า การใช้ภาษา C,C++

MicroPython ได้ทำการ Implement มาจาก Python 3 และได้ทำการ Optimised ในส่วนของ Python Standard Library เพื่อให้สามารถทำงานได้บน Microcontroller ที่มีขนาดของแรมที่จำกัด และยังคงมีคุณสมบัติในการทำงานแบบ Interactive เหมือนกับที่เราเขียนภาษา Python บนคอมพิวเตอร์ทั่วไป และมันมีขนาดกะทัดรัดเพียงพอที่จะทำงานบนพื้นที่เก็บข้อมูลภายใน (Flash) เพียง 256K ของพื้นที่ 16K ของแรม

ความเรียบง่ายของการเขียนโปรแกรมโดยใช้ภาษา Python ทำให้ MicroPython เป็นทางเลือกที่ดีสำหรับผู้เริ่มต้นที่ยังใหม่กับ การเขียนโปรแกรม และ Hardware อย่างไรก็ตาม MicroPython ยังค่อนข้างมีความสามารถในการสนับสนุนการทำงานหลายรูปแบบและการสนับสนุนมากที่สุดในด้านของ Syntax ซึ่งแทบไม่มีความแตกต่างจากการใช้ภาษา Python นอกเหนือจากความสะดวกในการใช้งาน


MicroPython มีคุณสมบัติพิเศษบางอย่างที่ทำให้มันแตกต่างจากระบบ Embedded ตัวอื่น ๆ ดังนี้

Interactive REPL, or read-evaluate-print loop.

โดยในส่วนนี้จะช่วยให้คุณสามารถเชื่อมต่อไปยังบอร์ด รวมถึงเขียนโค้ดแล้วรันได้โดยไม่จำเป็นต้อง Compile โค้ดชุดนั้นๆ ซึ่งจะเหมาะสำหรับผู้ที่เพิ่งเริ่มต้นและใช้ในการทดลองกับ Hardware

Extensive software library.

เช่นเดียวกับการเขียนโปรแกรมปกติด้วยภาษา Python การเขียนด้วยภาษา MicroPython คือการรวมข้อมูลและสร้างขึ้นใน Library เพื่อสนับสนุนงานเป็นจำนวนมาก ยกตัวอย่างเช่นการแยก JSON ข้อมูลจากบริการเว็บค้นหาข้อความ ที่มีการแสดงออกปกติ หรือ แม้กระทั่งการทำโปรแกรม Socket Network ซึ่งเป็นเรื่องง่ายที่ที่สามารถสร้างได้ใน library ของ MicroPython

Extensibility.

สำหรับผู้ใช้ในระดับขั้นสูงขึ้นมาหน่อย MicroPython จะขยายขอบเขตของการทำงาน สำหรับภาษาที่มีที่มีระดับต่ำ เช่น C / C ++ โดยจะมีฟังก์ชั่นเพื่อให้สามารถใช้ภาษา MicroPython ระดับสูงที่ทำให้สามารถแสดงผล/ประมวลผลได้ได้เร็วขึ้น


MicroPython สำหรับบอร์ด ESP8266 และ ESP32

ข้อดีของการใช้ MicroPython สำหรับบอร์ด ESP8266 หรือ ESP32 คือ ทั้งสองตัวเลือกสามารถเชื่อมต่อระบบเครือข่าย Wi-Fi ในกรณีที่ใช้ ESP32 ก็มีจำนวนขา GPIO และมีขาอานะล็อกอินพุตให้ใช้งานได้มากกว่า ESP8266 รวมถึงมีความเร็วในการประมวลผลของซีพียูสูงกว่า





ความแตกต่างระหว่าง MicroPython สำหรับ ESP8266 และ ESP32


  • ในการคอมไพล์ซอร์สโค้ดของ MicroPython จะต้องใช้เครื่องมือ OpenSource ESP SDK for ESP8266 ของ Espressif แต่ถ้าใช้กับ ESP32 จะต้องใช้เครื่อง "ESP-IDF framework (IoT development framework)" ของ Espressif ซึ่งแตกต่างกัน และมีการใช้ร่วมกับ FreeRTOS ด้วย
  • ในกรณีของ ESP32 การทำงานของ MicroPython จะเป็นเพียงหนึ่งทาสก์ (Task) ที่ทำงานภายใต้การจัดการของ FreeRTOS



เตรียมเครื่องมือ สำหรับการเขียนโปรแกรมด้วย MicroPython


โดยขั้นตอนการทำงานมีดังนี้


1. ติดตั้ง Python 3.7.X  บน Windows PC


ก่อนการติดตั้ง uPyCraft IDE ต้องติดตั้ง Python 3.7.X เวอร์ชันล่าสุด ลงในคอมพิวเตอร์ ระบบปฏิบัติการวินโดวส์ ถ้ายังไม่ได้ติดตั้งให้ทำตามขั้นตอนด้านล่างนี้

1.1 ไปที่  https://www.python.org/downloads/



1.2 คลิกที่ [ Download Python 3.7.x ]







1.3 หลังจากนั้นจะได้ไฟล์ชื่อ python-3.7.X.exe ในคอมพิวเตอร์ของคุณ ให้ดับเบิ้ลคลิกที่ไฟล์เพื่อเปิด



1.4  เลือก “Add Python 3.7 to PATH“




1.5 คลิกที่ “Install Now”




1.6 รอจนกระทั่งติดตั้งเสร็จ แล้วคลิก Close





2. ติดตั้ง uPyCraft IDE



2.1 ดาวน์โหลด uPyCraft IDE สำหรับ Windows


link 
https://randomnerdtutorials.com/uPyCraftWindows.

หรือ

link https://raw.githubusercontent.com/DFRobot/uPyCraft/master/uPyCraft.exe


2.2 หลังจากนั้นจะได้ไฟล์ชื่อ uPyCraft.exe ในคอมพิวเตอร์ของคุณ



3.  เขียน Firmware และทดลองใช้งาน MicroPython


### อุปกรณ์ที่ใช้ ###


1. PICO KIT V4 ESP32 Development Board WiFi + Bluetooth

2. Micro USB Cable Wire 1m for NodeMCU

3. Breadboard 830 Point MB-102

4. หลอดไฟ LED 5 mm สีแดง

5. รีซิสเตอร์ 330 OHM 1/4W 1%

6. Jumper (M2M) 20cm Male to Male

7. Push Button Switch สวิตช์กดติดปล่อยดับ 2 ขา

8. รีซิสเตอร์ 10K Ohm 1/4W


3.1 เชื่อมต่อสาย USB ระหว่าง คอมพิวเตอร์ กับ ESP32






3.2 ดาวน์โหลด Firmware สำหรับ ESP32


https://micropython.org/download/esp32/


3.3  คลิกที่ esp32-idf4-20191203-v1.11-613-g8ce69288e.bin





3.4 ดับเบิ้ลคลิกที่ไฟล์  uPyCraft.exe




3.5 หน้าตาของ  uPyCraft





3.6 ไปที่ Tools -> BurnFirmware (เขียน MicroPython Firmware ลงในหน่วยความจำของบอร์ด ESP32)





3.7 เลือกค่าในการ Burn Firmware  ดังนี้


board : esp32

burn_addr : 0x1000

erase_flash : yes

com :  COM18 (แต่ละเครื่องไม่เหมือนกัน ให้เลือก COM ที่ปรากฏ)

Users -> choose




3.8 เลือกไปที่ไฟล์ ที่เราดาวโหลดมาจากข้อ 3.3 -> Open



3.9  คลิก ok




3.10 ไปที่ Tools -> board > esp32





3.11 ไปที่ Tools -> Serial > COMX (ในตัวอย่างเป็น COM18)





3.12 จะเห็น รูปโซ่ ปรากฏขึ้นมา





3.13 ทดสอบการทำงานโดย คีย์ 6 + 6 -> Enter




3.14 ถ้าผลลัพธ์ แสดงมาเป็น 12 แสดงว่าการใช้งาน MicroPython กับ ESP32 พร้อมใช้งานแล้ว





4.เชื่อมต่ออุปกรณ์


4.1 เชื่อมต่อ  ESP32  กับ LED





ภาพรวมการต่อวงจร 






5. ทดสอบไฟกระพริบ (Blink) ด้วย MicroPython

โค้ดนี้สาธิตการใช้คำสั่งเพื่อใช้งานขา GPIO เช่น เลือกใช้ขา GPIO27 เป็นเอาต์พุต และกำหนดสถานะ LOW (0) หรือ HIGH (1) สลับกันไป โดยเว้นช่วงเวลาประมาณ 0.5 วินาที   การเขียนโปรแกรม MicroPython เพื่อใช้งานขาดิจิทัล I/O ของ ESP32 จะใช้ผ่านคลาส Pin ของแพ็คเกจ machine และในตัวอย่างนี้ได้ใช้ขา GPIO จำนวน 1 ขา เป็นขาดิจิทัล-เอาต์พุต


5.1  ไอคอนที่อยู่ทางด้านขวาสุดช่วยให้คุณทำงานได้อย่างรวดเร็วขึ้น




5.2 คลิกที่ New file




5.3 เขียนโค้ดดังนี้


from machine import Pin from time import sleep led = Pin(27, Pin.OUT) while True: led.value(not led.value()) sleep(0.5)



5.4 คลิกที่ Save file




5.5 ตั้งชื่อไฟล์ เป็น main.py -> ok




5.6  คลิกที่ Disconnect (ทดสอบทำให้คอมพิวเตอร์ ไม่เชื่อมต่อกับ บอร์ด ESP32)




5.7  คลิกที่ Connect (ทดสอบทำให้คอมพิวเตอร์เชื่อมต่อกับ บอร์ด ESP32)




5.8 ไปที่ workSpace จะพบ ไฟล์ main.py ที่เราสร้างขึ้น ซึ่งส่วนนี้จะเก็บอยู่ที่ คอมพิวเตอร์ของเรา





5.9 คลิกที่ Download and run เพื่อ อัพโหลด โค้ดไปยัง บอร์ด ESP32





5.10 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า download ok ที่แถบด้านล่าง




5.11 ไปที่ device จะพบไฟล์ main.py ที่เราอัพโหลดเข้าไปที่ บอร์ด ESP32

ส่วนไฟล์ boot.py โปรแกรมจะสร้างให้เราโดยอัตโนมัติ  ซึ่งจะอยู่ภายในหน่วยความจำของบอร์ดไมโครคอนโทรลเลอร์ จะทำงานโดยอัตโนมัติเมื่อมีการรีเซตบอร์ด และหลังจากนั้น ถ้ามีไฟล์ชื่อ main.py ก็จะทำงานเป็นลำดับถัดไป





5.12 ถึงขั้นตอนนี้ถ้าไม่มีอะไรผิดพลาด ไฟ LED สีแดงจะ กระพริบ ติด-ดับ แสดงว่าโปรแกรมแรกของ MicroPython สำเร็จแล้ว








ถ้าไม่ทำงาน ให้ตรวจสอบการต่อสาย , ขั้วของ LED แล้ว กดที่ปุ่ม EN 1 ครั้ง เพื่อเริ่มการทำงาน ของ ESP32




6. ทดสอบหรี่ไฟ (PWM) ด้วย MicroPython

โค้ดนี้สาธิตการใช้คำสั่งเพื่อใช้งาน สร้างสัญญาณ PWM ด้วยบอร์ด ESP32 โดยใช้เฟิร์มแวร์ MicroPython ตัวอย่างเช่นเราจะหรี่ความสว่างของ LED โดยการเปลี่ยนรอบการทำงานตลอดเวลา


6.1  แก้ไขไฟล์ main.py  ที่อยู่ที่คอมพิวเตอร์เรา (workSpace)




6.2 เขียนโค้ดดังนี้


from machine import Pin, PWM from time import sleep frequency = 5000 led = PWM(Pin(27), frequency) while True: for duty_cycle in range(0, 1024): led.duty(duty_cycle) sleep(0.005)

โค้ดทำงานอย่างไร

นำเข้าคลาส Pin จากโมดูล machine
 และในการสร้างพิน PWM ให้นำเข้าคลาส PWM เพิ่มเติมจากคลาส Pin จากโมดูล machine
from machine import Pin, PWM
จากนั้นสร้างวัตถุ PWM ที่ชื่อว่า led กำหนดพินเป็น GPIO 27 และรับค่าจาก frequency
led = PWM(Pin(27), frequency)
ในการสร้างวัตถุ PWM คุณจะต้องผ่านพารามิเตอร์พินที่เชื่อมต่อกับ Frequency และ Duty cycle

Frequency: ความถี่สามารถเป็นค่าระหว่าง 0 ถึง 78125 เราจึงสามารถใช้ความถี่ 5000 Hz เพื่อควบคุมความสว่างของ LED

Duty cycle: รอบการทำงานสามารถเป็นค่าระหว่าง 0 ถึง 1,023 ซึ่ง 1023 สอดคล้องกับรอบการทำงาน 100% (ความสว่างสูงสุด) และ 0 สอดคล้องกับรอบการทำงาน 0% (LED ที่ไฟไม่ติด)




6.4 คลิกที่ Stop




6.5  คลิกที่ Disconnect




6.6  คลิกที่ Connect




6.7 คลิกที่ Download and run เพื่อ อัพโหลด โค้ดไปยัง บอร์ด ESP32




6.8 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า download ok ที่แถบด้านล่าง





6.9 กดที่ปุ่ม EN 1 ครั้ง เพื่อเริ่มการทำงาน ของ ESP32





6.10 สังเกต LED จะค่อยๆสว่างขึ้น จนสว่างที่สุดแล้วกลับไปเริ่มต้นใหม่ ( แสดงว่าประสบความสำเร็จแล้ว)





7. ทดสอบเช็คสถานะปุ่มกด (Push Button) สวิทซ์ กดติดกดดับ

โค้ดนี้สาธิตการคอยอ่านและตรวจสอบค่าลอจิก-อินพุตจากปุ่มกด (Push button) ที่ต่อเพิ่มเข้าที่ขา GPIO32 เมื่อมีการกดแล้วปล่อยปุ่มหนึ่งครั้ง จะทำให้สถานะลอจิก-เอาต์พุตเปลี่ยนหนึ่งครั้ง โดยเลือกใช้ขา GPIO27 เป็นเอาต์พุต


7.1 เชื่อมต่อสวิตซ์





7.2  แก้ไขไฟล์ main.py  ที่อยู่ที่คอมพิวเตอร์เรา (workSpace) ตามโค้ดด้านล่าง




from machine import Pin from time import sleep btn = Pin(32, Pin.IN,Pin.PULL_UP) led = Pin(27, Pin.OUT) led.value( 0 ) while True: if btn.value() == 0: led.value( not led.value() ) while btn.value() == 0: sleep(0.1) sleep(0.1)


7.3 อัพโหลดโค้ดไปยัง บอร์ด ESP32





7.4 เมื่อมีการกดแล้วปล่อยปุ่มหนึ่งครั้ง LED จะติด






7.5 และเมื่อมีการกดแล้วปล่อยปุ่มหนึ่งครั้ง LED จะดับ  ( แสดงว่าประสบความสำเร็จแล้ว)




8. ทดสอบเช็คสถานะปุ่มกด (Push Button) สวิทซ์ กดติดปล่อยดับ

โค้ดนี้สาธิตการคอยอ่านและตรวจสอบค่าลอจิก-อินพุตจากปุ่มกด (Push button)  ที่ขา GPIO32 เมื่อมีการกดสวิทซ์แล้วค้างไว้ จะทำให้ LED ติด และเมื่อปล่อยสวิทซ์ LED จะดับ โดยเลือกใช้ขา GPIO27 เป็นเอาต์พุต


8.1 เชื่อมต่อรีซิสเตอร์ 10K OHM





8.2  แก้ไขไฟล์ main.py  ที่อยู่ที่คอมพิวเตอร์เรา (workSpace) ตามโค้ดด้านล่าง




from machine import Pin from time import sleep led = Pin(27, Pin.OUT) button = Pin(32, Pin.IN) while True: led.value(button.value()) sleep(0.1)


โค้ดทำงานอย่างไร



คุณเริ่มต้นด้วยการนำเข้าคลาส Pin จากโมดูล machine และคลาส sleep จากโมดูล time
from machine import Pin
from time import sleep
จากนั้นสร้างวัตถุ Pin โดยให้ชื่อว่า led กำหนดพินเป็น GPIO 27 ที่เชื่อมต่อไฟ LED ซึ่งจะเป็นเอาต์พุตดังนั้น ให้ส่งผ่านเป็นอาร์กิวเมนต์ที่สองกำหนดให้เป็น Pin.OUT
led = Pin(27, Pin.OUT)
เรายังสร้างวัตถุที่เรียกว่า button กำหนดพินเป็น GPIO 32 ปุ่มเป็นอินพุต ดังนั้นกำหนดให้เป็น Pin.IN
button = Pin(32, Pin.IN)
ใช้ button.value () เพื่อย้อนกลับ / อ่านสถานะปุ่มจากนั้นส่งค่าไปที่ button.value () เป็นอาร์กิวเมนต์ไปยังค่า LED
led.value(button.value())
วิธีนี้เมื่อเรากดปุ่ม button.value () ส่งคืน 1 ดังนั้นนี่เป็นเหมือนกับ led.value (1) เป็นการตั้งค่าสถานะ LED เป็น 1 เพื่อเพิ่มความสว่างของ LED เมื่อปุ่มกดไม่ถูกกดปุ่ม button.value () จะคืนค่า 0 ดังนั้นเราจึงได้ led.value (0) และ LED จะดับ



8.3 อัพโหลดโค้ดไปยัง บอร์ด ESP32





8.4 เมื่อมีการกดสวิทซ์ค้างไว้ LED จะติด





8.5 และเมื่อมีการปล่อยสวิทซ์ปุ่ม LED จะดับ  ( แสดงว่าประสบความสำเร็จแล้ว)






บทความที่เกี่ยวข้อง : MicroPython การใช้โหมดประหยัดพลังงาน Deep Sleep


credit :

https://medium.com/blogs-194/what-is-micropython-esp-8266-f1a54c6fbadd

https://randomnerdtutorials.com/install-upycraft-ide-windows-pc-instructions/

https://randomnerdtutorials.com/flash-upload-micropython-firmware-esp32-esp8266/

https://randomnerdtutorials.com/getting-started-micropython-esp32-esp8266/

https://randomnerdtutorials.com/esp32-esp8266-pwm-micropython/

https://randomnerdtutorials.com/esp32-esp8266-digital-inputs-digital-outputs-micropython/