SAMD21 Code Examples
ตัวอย่างโค้ด CircuitPython สำหรับบอร์ด SAMD21 เช่น Seeeduino XIAO หรือ SAMD21 M0-Mini
โค้ดตัวอย่างที่ 1: LED Blink
เริ่มต้นด้วยการทำให้ LED บนบอร์ดกระพริบ (ขา D13) โดยใช้คำสั่งจาก digitalio เพื่อใช้งานขา GPIO แบบดิจิทัล (Digital I/O)
import digitalio
from board import *
import time
# use Onboard LED on the XIAO board
led = digitalio.DigitalInOut(D13)
led.direction = digitalio.Direction.OUTPUT
try:
while True: # press Ctrl+C to stop
led.value = True
time.sleep(0.1)
led.value = False
time.sleep(0.1)
except KeyboardInterrupt:
pass
led.value = 0 # LED output level LOW
led.deinit() # release the LED pin (D13)
print('Done')ในการหน่วงเวลา ก็ใช้คำสั่ง time.sleep() โดยระบุค่าเป็นตัวเลขที่มีหน่วยเป็นวินาที
หรือจะเขียนโค้ดในรูปแบบอื่นที่ทำงานได้เหมือนกัน ดังนี้
ในตัวอย่างนี้ ได้ใช้คำสั่ง time.monotonic() ซึ่งจะได้ค่าเป็นเลขทศนิยมแบบ float นำมาคูณด้วย 1000 แล้วแปลงให้เป็นข้อมูลแบบ int ดังนั้นจึงได้ค่าตัวเลขในหน่วยเป็น msec และค่าที่อ่านได้นี้ จะใช้ในการเปรียบเทียบกับค่าเวลาที่ได้บันทึกไว้ แล้วตรวจสอบดูว่า เวลาผ่านไป 100 msec หรือไม่ ถ้าใช่ ให้สลับสถานะของขาเอาต์พุตหนึ่งครั้ง และอัปเดทค่าเวลาที่บันทึกไว้
หรือจะเขียนโค้ดโดยใช้คำสั่งของ pwmio เพื่อสร้างสัญญาณ PWM ให้มีความถี่ต่ำ เช่น 10Hz และมีค่า Duty Cycle เท่ากับ 50% เพื่อใช้เป็นสัญญาณสำหรับ LED (ขา D13) ก็ได้เช่นกัน
ข้อสังเกต: ถ้าใช้บอร์ด SAMD21 M0-Mini แทน Seeeduino XIAO ขา D13 (Arduino Pin) ตรงกับขา PA17 (SAMD21 Pin) ซึ่งไม่มีวงจร LED Onboard ดังนั้นจะต้องต่อวงจร LED ภายนอกเพิ่ม
โค้ดตัวอย่างที่ 2: NeoPixel RGB LEDs
ตัวอย่างถัดไปสาธิตการใช้คำสั่งของไลบรารี neopixel_write เพื่อกำหนดสีให้โมดูล NeoPixel (WS2812B) RGB LEDs
เลือกใช้ขา D10 เป็นขาเอาต์พุต เพื่อนำไปต่อกับขา DIN ของโมดูล NeoPixel ซึ่งมีทั้งหมด 8 พิกเซล และกำหนดให้ทุกพิกเซลเป็นสีแดง เริ่มต้นด้วยความสว่างระดับ 255 แล้วค่อย ๆ ลดลงจนเป็น 0
หรือจะใช้คำสั่งของไลบรารี neopixel (API) ก็ได้เช่นกัน ตามตัวอย่างโค้ดต่อไปนี้ และจะต้องใช้ไฟล์ neopixel.mpy และ adafruit_pypixelbuf.mpy ซึ่งมีอยู่ใน CircuiPython Library Bundle และให้นำไฟล์ทั้งสองไปใส่ลงใน Flash File Storage ของ CircuitPython ภายใต้ /lib

โค้ดตัวอย่างที่ 3: DHT22 Sensor Reading
ตัวอย่างถัดไปสาธิตการใช้ไลบรารี adafruit_dht (API) สำหรับอ่านค่าอุณหภูมิและความชื้นสัมพัทธ์ของโมดูล DHT11 / DHT22 ถ้าจะใช้งานไลบรารีดังกล่าว จะต้องใช้ไฟล์ adafruit_dht.mpy ร่วมด้วย ซึ่งมีอยู่ใน CircuiPython Library Bundle
ในการต่อวงจรทดลอง ได้เลือกใช้ขา D9 สำหรับต่อกับขา DATA ของโมดูล DHT22 (ใช้แรงดันไฟเลี้ยง +3.3V)

โค้ดตัวอย่างที่ 4: SI7021 Sensor Reading
ตัวอย่างถัดไปสาธิตการใช้ไลบรารี adafruit_si7021 (API) เพื่ออ่านค่าอุณหภูมิและความชื้นสัมพัทธ์จากโมดูล SI7021 (Address=0x40) โดยใช้วิธีบัส I2C (ขาสัญญาณ SDL/D5 และ SDA/D4 สำหรับบอร์ด Seeeduino XIAO)
ไลบรารีต้องใช้ร่วมกับไลบรารี Adafruit Bus Device ซึ่งมีอยู่ใน CircuiPython Library Bundle และเราต้องใช้สองไฟล์นี้ร่วมด้วย
adafruit_bus_device/i2c_deviceadafruit_bus_device/spi_device


โค้ดตัวอย่างที่ 5: BME680 Sensor Reading
ตัวอย่างนี้สาธิตการใช้ไลบรารี adafruit_bme680 (API) เพื่ออ่านค่าจากเซ็นเซอร์ BME680 (address=0x77) ผ่านทางบัส I2C แล้วนำค่าของอุณหภูมิ ความชื้นสัมพัทธ์ และความดันบรรยากาศ มาแสดงผลเป็นข้อความเอาต์พุต
โค้ดตัวอย่างที่ 6: DHT22 + SI7021 + BME680
ตัวอย่างนี้สาธิตการอ่านค่าจากเซ็นเซอร์จำนวน 3 ชนิดที่แตกต่างกันซึ่งได้มีการสาธิตการใช้งานแต่ละโมดูลในตัวอย่างก่อนหน้านี้ไปแล้ว
ในการรันโค้ด CircuitPython แนะนำให้ใช้ Mu Editor แทนการใช้งาน Thonny IDE เนื่องจากใช้หน่วยความจำน้อยกว่า และจะไม่เกิด Runtime Memory Error (SAMD21 มีหน่วยความจำ SRAM ค่อนข้างน้อย)


โค้ดตัวอย่างที่ 7: Analog Key Switches
ตัวอย่างนี้สาธิตการอ่านค่าสถานะจากปุ่มกดแบบแอนะล็อก โดยใช้คำสั่งของไลบรารี analogio ของ CircuitPython แล้วนำมาตรวจสอบค่าเพื่อดูว่า ตรงกับการกดปุ่มในกรณีใด ซึ่งมีทั้งหมด 5 ปุ่ม (SW1, ..., SW5) การกดปุ่มใดปุ่มหนึ่งจะทำให้ค่าที่อ่านได้จากขาแอนะล็อกอินพุตไม่เท่ากันในแต่ละกรณี ข้อมูลที่อ่านได้จากการใช้คำสั่งของ CircuitPython จะมีขนาด 16 บิต (0..65535) แต่ในตัวอย่างนี้ ข้อมูลตัวเลขนี้ จะถูกสเกลค่าให้ลดลงเป็น 10 บิต หรือ 0..1023
โมดูลนี้มีขา GND, VCC, OUT ตามลำดับ
GND ต่อกับ GND ของบอร์ด XIAO
VCC ต่อกับ +3.3V ของบอร์ด XIAO
OUT ต่อกับขา A1/PA04 ของบอร์ด XIAO


โค้ดตัวอย่างที่ 8: PWM-based LED Fading
โค้ดสาธิตการสร้างสัญญาณ PWM ที่มีความถี่คงที่ เช่น 250Hz แต่ปรับค่า Duty Cycle ได้ เพื่อกำหนดความสว่างของ LED โดยใช้คำสั่งในไลบรารี pwmio
ในตัวอย่างนี้ได้เลือกใช้ขา PA18 และ PA19 สำหรับ LED จำนวน 2 ดวง (ทำงานแบบ Active-Low)
ถ้าใช้บอร์ด XIAO ขา PA18 และ PA19 ต่อกับวงจร LED สีน้ำเงินที่มีอยู่แล้วบนบอร์ด
โค้ดตัวอย่างที่ 9: UART Loopback Test
ตัวอย่างนี้สาธิตการใช้คำสั่งของไลบรารี busio (API) ที่เกี่ยวข้องกับการรับส่งข้อมูลผ่าน UART และทดสอบการส่งข้อมูลซึ่งเป็นข้อความทีละบรรทัด ออกทางขา TX แล้วรับข้อมูลกลับเข้ามาที่ขา RX ในลักษณะ Loopback (ต้องใช้สาย Jumper Wire เขื่อมต่อขา TX ไปยัง RX) และเลือกใช้ค่า Baudrate เท่ากับ 115200
ถ้าทดสอบการทำงานกับบอร์ด XIAO ขา TX และ RX คือ ขา D6/PB08 และ D7/PB09 ตามลำดับ
โค้ดตัวอย่างที่ 10: Laser Dust Sensor Reading
ตัวอย่างนี้สาธิตการอ่านค่าจากเซ็นเซอร์ประเภท Particulate Matter Concentration Sensor (Laser Dust Sensor) เช่น รุ่น PMS7003 หรือ PMS9003M (Plantower) สำหรับวัดปริมาณฝุ่น PM1.0 / PM2.5 / PM10 หน่วยเป็น µg/m^3 (ไมโครกรัม/ลูกบาศก์เมตร)
โมดูล PMS7003 ใช้แรงดันไฟเลี้ยง +5V (แต่มีระดับ Logic Level +3.3V) และเมื่อเริ่มทำงาน จะส่งข้อมูลจำนวน 32 ไบต์ ต่อการอ่านค่าหนึ่งครั้ง ทุก ๆ 1 วินาที โดยอัตโนมัติ (Default Mode) ออกทาง Serial และใช้ความเร็ว Baudrate 9600 ในการรับส่งข้อมูล
ตัวอย่างข้อความเอาต์พุตหนึ่งบรรทัด
{"pm10":41, "pm2.5":36, "pm1.0":23, "unit":"ug/m^3"}

การเชื่อมต่อกับโมดูล PSM9003M จะเชื่อมต่อผ่าน PCB Adapter ที่ด้านหนึ่งเชื่อมต่อกับโมดูลดังกล่าวด้วยสายเคเบิล (มาพร้อมกับโมดูล) และอีกด้านหนึ่งจะเป็น Pin Header แบบ 6 ขา (2.54mm spacing) และมีขาตามลำดับดังนี้
VCC (+5V)
GND
SET (N.C.)
RXD (เชื่อมต่อกับขา TX ของบอร์ด XIAO)
TXD (เชื่อมต่อกับขา RX ของบอร์ด XIAO)
RST (ให้เชื่อมต่อแบบ Pull-up ไปยัง 3.3V)

โค้ดตัวอย่างนี้ สามารถใช้ได้กับโมดูล PMS7003 ของ Plantower ได้เช่นกัน

โค้ดตัวอย่างที่ 11: SHT31-D Sensor Reading
ตัวอย่างนี้สาธิตการอ่านค่าจากโมดูล SHT31-D ซึ่งเป็นเซ็นเซอร์วัดอุณหภูมิและความชื้นสัมพัทธ์ และใช้วิธีสื่อสารข้อมูลด้วย I2C อุปกรณีนี้มีหมายเลขแอดเดรสเท่ากับ 0x44
การเขียนโค้ดเพื่ออ่านค่าจาก SHT31-D ก็ทำได้ง่าย เนื่องจากมีไลบรารีให้ใช้งานคือ adafruit_sht31d (API) ดังนั้นถ้าจะรันโค้ดตัวอย่าง จะต้องนำไฟล์ adafruit_sht31d.mpy และไฟล์ของ Adafruit Bus Device ไปใส่ลงในไดเรกทอรี /lib ภายใน Flash File Storage ของ CircuitPython ด้วย

โค้ดตัวอย่างที่ 12: Rotary Encode Input
ตัวอย่างนี้สาธิตการตรวจสอบการเปลี่ยนตำแหน่งของ (Incremental) Rotary Encoder ที่มีอินพุต-ดิจิทัล 2 ขา (Channel A & B) ซึ่งมีลักษณะเป็นสัญญาณแบบพัลส์ เมื่อมีการหมุนเปลี่ยนตำแหน่ง และนำไปต่อเข้าที่ขา board.D0 และ board.D1 ตามลำดับ
ในการตรวจสอบและอ่านค่าตำแหน่ง (Postion) จาก Rotary Encoder เราสามารถใช้คำสั่งของไลบรารี rotaryio (API) และใช้คลาส IncrementalEncoder
การเปลี่ยนตำแหน่งดังกล่าว มีสองทิศทางที่เป็นไปได้คือ การหมุนทวนหรือการหมุนตามเข็มนาฬิกา และเราจะตรวจสอบทิศทางการหมุน เพื่อมาใช้ในการเพิ่มหรือลดระดับความสว่างของ Neopixel (แบบ 12 Pixels) โดยเลือกใช้สีแดง และใช้ขา board.D2 เป็นขาสัญญาณเอาต์พุต
ข้อสังเกต: ในตัวอย่างนี้จะต้องใช้ไฟล์ที่เป็นไลบรารีร่วมด้วยได้แก่ neopixel.mpy and adafruit_pypixelbuf.mpy

ข้อสังเกต: ในการต่อวงจรบนเบรดบอร์ดเพื่อใช้งานโมดูล Rotary Encoder และ NeoPixel ได้ใช้แรงดันไฟเลี้ยง +3.3V จากโมดูล Voltage Regulator (LM1117-3.3) ที่แปลง +5V (VUSB) ให้เป็น +3.3V
กล่าวสรุป
เนื้อหาในส่วนนี้ได้นำเสนอตัวอย่างการเขียนโค้ด CircuitPython สำหรับไมโครคอนโทรลเลอร์ SAMD21 เช่น การเชื่อมต่อและอ่านค่าอินพุตจากโมดูลเซ็นเซอร์ประเภทต่าง ๆ
Last updated
Was this helpful?