บทความนี้แนะนำบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ชิพ ATSAMD21G18 ของบริษัท Microchip ที่ใช้สถาปัตยกรรม ARM แบบ 32 บิต แกนตระกูล Cortex-M0+ ในรูปแบบบอร์ดตามตระกูล Arduino Uno ดังภาพที่ 1
คุณสมบัติ
บอร์ดไมโครคอนโทรลเลอร์ที่พวกเราเลือกมาใช้งานใช้ชิพ ATSAMD21G18 ที่มีคุณสมบัติ ดังนี้
- ทำงานที่ความถี่สูงสุด 48MHz
- ฮาร์ดแวร์รองรับการคูณในวงรอบการทำงานเดียว
- มีหน่วยความจำแรมแบบ SRAM ขนาด 32KB
- มีหน่วยความจำแฟลชสำหรับใช้งานขนาด 256KB
- พอร์ตสื่อสารแบบอนุกรมจำนวน 6 พอร์ต (SERCOM) ที่สามารถตั้งค่าให้ทำงานเป็นการสื่อสารดังต่อไปนี้
- พอร์ตสื่อสารอนุกรม UART/USART
- SPI
- I2C ที่ความเร็ว 3.4MHz
- SMBUS/PMBUS
- LIN Slave
- Timer/Counter ขนาด 16 บิต จำนวน 5 ชุด ที่สามารถตั้งค่าการทำงานให้เป็นดังต่อไปนี้ได้
- 16 บิต TC พร้อม compare และ capture
- 8 บิต TC พร้อม compare และ capture
- 32 บิต TC พร้อม compare และ capture
- Timer/Counter ขนาด 24 บิต จำนวน 3 ชุด
- 32 บิต RTC (Real Time Clock) ที่ทำงานเป็นนาฬิกาและปฏิทิน
- PWM จำนวน 20 ช่องสัญญาณ
- ADC (Analog to Digital Convertor) ขนาด 12 บิต จำนวน 1 ช่องสัญญาณ ทำงานที่ 350ksps หรือ 350,000 ครั้งต่อวินาที
- DAC (Digital to Analog Convertor) ขนาด 10 บิต จำนวน 1 ช่องสัญญาณ ที่ความเร็ว 350ksps
- ทำงานที่แรงดัน 1.62 ถึง 3.63V
- รองรับแหล่งขัดจังหวะภายนอก (External Interrupt) จำนวน 16 แหล่ง
- โปรแกรมด้วย SWD ได้
- มีโหมด idle และ sleep ทำให้ประหยัดพลังงาน
- มีระบบ DMAC หรือ Direct Memory Access Control จำนวน 12 ช่องสัญญาณ
- มีระบบรองรับเหตุการณ์ (Event System) จำนวน 12 ช่องสัญญาณ
- รองรับ Touch Control (PTC) สูงสุด 256 ตัว
การติดตั้งบอร์ด
การติดตั้งสามารถทำได้ 2 แบบ คือ
- เสียบบอร์ดแล้วเปิดโปรแกรม Arduino IDE ถ้าระบบยังไม่เคยติดตั้งมาก่อนจะมีข้อความเตือนให้ติดตั้งบอร์ด ดังภาพที่ 3 หลังจากนั้นคลิกเลือกจะเข้าหน้าต่าง Boards Manager และมีรายการบอร์ดให้เลือกดังภาพที่ 4 ให้ดำเนินคลิกที่ติดตั้ง
- ติดตั้งเองโดยเข้าโปรแกรม Arduino IDE แล้วเลือกเมนู Boards Manager … จากรายการ Board ของเมนู Tools ดังภาพที่ 2 หลังจากนั้นในหน้าจอของ Boards Manager ให้ค้นหา Arduino SAMD Boards (32-bits ARM Cortex-M0+) ดังภาพที่ 4 แล้วให้คลิกติดตั้ง
เมื่อติดตั้งเรียบร้อยคราวนี้ก็พร้อมใช้งาน แต่บอร์ดที่ซื้อมานั้นเป็นรุ่นพัฒนาต่อจาก Arduino Zero ดังนั้น ให้เลือกบอร์ด Arduino Zero (Native USB Port) จากรายการในเมนู Arduino SAMD (32-bits ARM Cortex-M0+) จากรายการเมนู Board ของเมนู Tools ดังภาพที่ 5
สุดท้ายให้ตรวจสอบว่า Port ถูกต้องตามตัวอย่างในภาพที่ 6
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรมค้นหาเลขจำนวนเฉพาะที่แสดงผลผ่านทางพอร์ตสื่อสารอนุกรม USB ของบอร์ดจะใช้คลาส SerialUSB แทน Serial ในโปรแกรมปกติ ซึ่งบนบอร์ดนั้นมีคลาสสำหรับสื่อสารกับพอร์ตอนุกรมให้ใช้งาน 3 พอร์ตดังนี้
- Serial สำหรับขา Tx/Rx ที่อยู่กับเสาเชื่อมต่อ ICSP
- SerialUSB สำหรับใช้การสื่อสารจากพอร์ต USB ของบอร์ด
- Serial1 สำหรับใช้ผ่านทางขา Tx/Rx เดิมของบอร์ดในฟอร์มของ Arduino Uno
โค้ดโปรแกรมเป็นดังนี้
uint32_t counter = 0;
uint32_t t0, t1;
uint32_t t2000;
uint32_t isPrimeNumber(uint32_t x) {
uint32_t i;
for (i = 2; i < x; i++) {
if (x % i == 0) {
return 0;
}
}
if (i == x)
return 1;
return 0;
}
void testPrimeNumber(uint32_t maxN) {
counter = 0;
t0 = millis();
for (uint32_t n = 2; n < maxN; n++) {
if (isPrimeNumber(n)) {
counter++;
}
}
t1 = millis();
}
void setup() {
SerialUSB.begin(115200);
SerialUSB.println();
}
void loop() {
testPrimeNumber(2000);
SerialUSB.print("\n\nTest 2,000 times : Found ");
SerialUSB.print(counter, DEC);
SerialUSB.print(" in ");
t2000 = int(fabs(t1 - t0));
SerialUSB.print(t2000, DEC);
SerialUSB.println(" milliseconds.");
delay(15000);
}
ผลลัพธ์ที่ได้เป็นดังนี้ ซึ่งจะพบว่าใช้เวลาไป 308 มิลลิวินาที
เมื่อเปรียบเทียบการหาตัวเลขจำนวนเฉพาะในช่วง 2-1000 ไปจนถึง 2 ถึง 20,000 โดยแต่ละรอบเพิ่มจำนวนการหาครั้งละ 5000 ของไมโครคอนโทรลเลอร์ esp32, esp8266, STM32C103, Arduino Due, SAM-D21 และ Raspberry Pi PICO เป็นดังกราฟภาพที่ 7
สรุป
จากบทความนี้จะพบว่าบอร์ด SAMD21 ที่เป็นไมโครคอนโทรลเลอร์ ARM แบบ 32 บิตนั้น รองรับการทำงานทั้ง ADC และ DAC พร้อมทั้งปริมาณหน่วยความจำที่มากกว่า Arduino Uno และพอเพียงสำหรับการใช้งานในระดับไม่ซับซ้อนมาก และให้พอร์ตสื่อสารอนุกรมมาให้ใช้งานได้พร้อมกัน 3 พอร์ต ทำให้นำมาใช้งานคู่กับ ESP32 เพื่อชดเชยการทำงาน ADC และ DAC โดยส่งข้อมูลระหว่าง Serial1 ของแต่ละบอร์ด สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ
แหล่งอ้างอิง
- Starting Electronics. (2018). WeMos SAMD21 Arduino M0 Quick Start Tutorial. เข้าถึงเมื่อ 2021-11-18
- MicroChip. (2021). SAM D21/DA1 Family. เข้าถึงเมื่อ 2021-11-18
(C) 2020-2022, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-11-18, 2021-11-19, 2022-01-19