SAMD21 Code Examples

ตัวอย่างโค้ด CircuitPython สำหรับบอร์ด SAMD21 เช่น Seeeduino XIAO หรือ SAMD21 M0-Mini

เริ่มต้นด้วยการทำให้ LED บนบอร์ดกระพริบ (ขา D13) โดยใช้คำสั่งจาก digitalioarrow-up-right เพื่อใช้งานขา 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()arrow-up-right โดยระบุค่าเป็นตัวเลขที่มีหน่วยเป็นวินาที

หรือจะเขียนโค้ดในรูปแบบอื่นที่ทำงานได้เหมือนกัน ดังนี้

ในตัวอย่างนี้ ได้ใช้คำสั่ง time.monotonic()arrow-up-right ซึ่งจะได้ค่าเป็นเลขทศนิยมแบบ float นำมาคูณด้วย 1000 แล้วแปลงให้เป็นข้อมูลแบบ int ดังนั้นจึงได้ค่าตัวเลขในหน่วยเป็น msec และค่าที่อ่านได้นี้ จะใช้ในการเปรียบเทียบกับค่าเวลาที่ได้บันทึกไว้ แล้วตรวจสอบดูว่า เวลาผ่านไป 100 msec หรือไม่ ถ้าใช่ ให้สลับสถานะของขาเอาต์พุตหนึ่งครั้ง และอัปเดทค่าเวลาที่บันทึกไว้

หรือจะเขียนโค้ดโดยใช้คำสั่งของ pwmioarrow-up-right เพื่อสร้างสัญญาณ 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_writearrow-up-right เพื่อกำหนดสีให้โมดูล NeoPixel (WS2812B) RGB LEDs

เลือกใช้ขา D10 เป็นขาเอาต์พุต เพื่อนำไปต่อกับขา DIN ของโมดูล NeoPixel ซึ่งมีทั้งหมด 8 พิกเซล และกำหนดให้ทุกพิกเซลเป็นสีแดง เริ่มต้นด้วยความสว่างระดับ 255 แล้วค่อย ๆ ลดลงจนเป็น 0

หรือจะใช้คำสั่งของไลบรารี neopixelarrow-up-right (APIarrow-up-right) ก็ได้เช่นกัน ตามตัวอย่างโค้ดต่อไปนี้ และจะต้องใช้ไฟล์ neopixel.mpy และ adafruit_pypixelbuf.mpy ซึ่งมีอยู่ใน CircuiPython Library Bundlearrow-up-right และให้นำไฟล์ทั้งสองไปใส่ลงใน Flash File Storage ของ CircuitPython ภายใต้ /lib

รูปภาพ: ตัวอย่างการต่อวงจรทดลอง NeoPixel

โค้ดตัวอย่างที่ 3: DHT22 Sensor Reading

ตัวอย่างถัดไปสาธิตการใช้ไลบรารี adafruit_dhtarrow-up-right (APIarrow-up-right) สำหรับอ่านค่าอุณหภูมิและความชื้นสัมพัทธ์ของโมดูล DHT11 / DHT22 ถ้าจะใช้งานไลบรารีดังกล่าว จะต้องใช้ไฟล์ adafruit_dht.mpy ร่วมด้วย ซึ่งมีอยู่ใน CircuiPython Library Bundlearrow-up-right

ในการต่อวงจรทดลอง ได้เลือกใช้ขา D9 สำหรับต่อกับขา DATA ของโมดูล DHT22 (ใช้แรงดันไฟเลี้ยง +3.3V)

รูปภาพ: ตัวอย่างการต่อวงจรทดลอง DHT22

โค้ดตัวอย่างที่ 4: SI7021 Sensor Reading

ตัวอย่างถัดไปสาธิตการใช้ไลบรารี adafruit_si7021arrow-up-right (APIarrow-up-right) เพื่ออ่านค่าอุณหภูมิและความชื้นสัมพัทธ์จากโมดูล SI7021 (Address=0x40) โดยใช้วิธีบัส I2C (ขาสัญญาณ SDL/D5 และ SDA/D4 สำหรับบอร์ด Seeeduino XIAO)

ไลบรารีต้องใช้ร่วมกับไลบรารี Adafruit Bus Devicearrow-up-right ซึ่งมีอยู่ใน CircuiPython Library Bundlearrow-up-right และเราต้องใช้สองไฟล์นี้ร่วมด้วย

  • adafruit_bus_device/i2c_device

  • adafruit_bus_device/spi_device

รูปภาพ: การเขียนโค้ด CircuitPython อ่านค่าจาก SI7021 โดยใช้ Thonny IDE
รูปภาพ: ตัวอย่างการต่อวงจรทดลอง SI7021

โค้ดตัวอย่างที่ 5: BME680 Sensor Reading

ตัวอย่างนี้สาธิตการใช้ไลบรารี adafruit_bme680arrow-up-right (APIarrow-up-right) เพื่ออ่านค่าจากเซ็นเซอร์ BME680 (address=0x77) ผ่านทางบัส I2C แล้วนำค่าของอุณหภูมิ ความชื้นสัมพัทธ์ และความดันบรรยากาศ มาแสดงผลเป็นข้อความเอาต์พุต

โค้ดตัวอย่างที่ 6: DHT22 + SI7021 + BME680

ตัวอย่างนี้สาธิตการอ่านค่าจากเซ็นเซอร์จำนวน 3 ชนิดที่แตกต่างกันซึ่งได้มีการสาธิตการใช้งานแต่ละโมดูลในตัวอย่างก่อนหน้านี้ไปแล้ว

ในการรันโค้ด CircuitPython แนะนำให้ใช้ Mu Editor แทนการใช้งาน Thonny IDE เนื่องจากใช้หน่วยความจำน้อยกว่า และจะไม่เกิด Runtime Memory Error (SAMD21 มีหน่วยความจำ SRAM ค่อนข้างน้อย)

รูปภาพ: ตัวอย่างการรันโค้ดด้วย Mu Editor
รูปภาพ: ตัวอย่างการต่อวงจรทดลองบนเบรดบอร์ด

โค้ดตัวอย่างที่ 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

รูปภาพ: อุปกรณ์สำหรับการทดสอบการทำงานของโค้ด
รูปภาพ: ตำแหน่งขาของ XIAO (Pin Map)

โค้ดตัวอย่างที่ 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 (APIarrow-up-right) ที่เกี่ยวข้องกับการรับส่งข้อมูลผ่าน 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"}

รูปภาพ: โมดูล PMS9003M และ PCB Adapter สำหรับสายเคเบิลเชื่อมต่อ

การเชื่อมต่อกับโมดูล 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)

รูปภาพ: การทดสอบการทำงานของโค้ดตัวอย่าง (โมดูล PMS9003M)

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

รูปภาพ: การทดสอบการทำงานของโค้ดตัวอย่าง (โมดูล PMS7003)

โค้ดตัวอย่างที่ 11: SHT31-D Sensor Reading

ตัวอย่างนี้สาธิตการอ่านค่าจากโมดูล SHT31-D ซึ่งเป็นเซ็นเซอร์วัดอุณหภูมิและความชื้นสัมพัทธ์ และใช้วิธีสื่อสารข้อมูลด้วย I2C อุปกรณีนี้มีหมายเลขแอดเดรสเท่ากับ 0x44

การเขียนโค้ดเพื่ออ่านค่าจาก SHT31-D ก็ทำได้ง่าย เนื่องจากมีไลบรารีให้ใช้งานคือ adafruit_sht31darrow-up-right (APIarrow-up-right) ดังนั้นถ้าจะรันโค้ดตัวอย่าง จะต้องนำไฟล์ adafruit_sht31d.mpy และไฟล์ของ Adafruit Bus Device ไปใส่ลงในไดเรกทอรี /lib ภายใน Flash File Storage ของ CircuitPython ด้วย

รูปภาพ: การต่อวงจรทดลองใช้งาน SHT31D

โค้ดตัวอย่างที่ 12: Rotary Encode Input

ตัวอย่างนี้สาธิตการตรวจสอบการเปลี่ยนตำแหน่งของ (Incremental) Rotary Encoder ที่มีอินพุต-ดิจิทัล 2 ขา (Channel A & B) ซึ่งมีลักษณะเป็นสัญญาณแบบพัลส์ เมื่อมีการหมุนเปลี่ยนตำแหน่ง และนำไปต่อเข้าที่ขา board.D0 และ board.D1 ตามลำดับ

ในการตรวจสอบและอ่านค่าตำแหน่ง (Postion) จาก Rotary Encoder เราสามารถใช้คำสั่งของไลบรารี rotaryio (APIarrow-up-right) และใช้คลาส IncrementalEncoder

การเปลี่ยนตำแหน่งดังกล่าว มีสองทิศทางที่เป็นไปได้คือ การหมุนทวนหรือการหมุนตามเข็มนาฬิกา และเราจะตรวจสอบทิศทางการหมุน เพื่อมาใช้ในการเพิ่มหรือลดระดับความสว่างของ Neopixel (แบบ 12 Pixels) โดยเลือกใช้สีแดง และใช้ขา board.D2 เป็นขาสัญญาณเอาต์พุต

ข้อสังเกต: ในตัวอย่างนี้จะต้องใช้ไฟล์ที่เป็นไลบรารีร่วมด้วยได้แก่ neopixel.mpy and adafruit_pypixelbuf.mpy

รูปภาพ: ตัวอย่างการต่อวงจร Rotary Encoder

ข้อสังเกต: ในการต่อวงจรบนเบรดบอร์ดเพื่อใช้งานโมดูล Rotary Encoder และ NeoPixel ได้ใช้แรงดันไฟเลี้ยง +3.3V จากโมดูล Voltage Regulator (LM1117-3.3) ที่แปลง +5V (VUSB) ให้เป็น +3.3V

กล่าวสรุป

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

circle-info

เผยแพร่ภายใต้ลิขสิทธิ์ Attribution-ShareAlike 4.0 International (CC BY-SA 4.0arrow-up-right)

Last updated

Was this helpful?