บทความนี้กล่าวถึงการใช้ Arduino กับไมโครคอนโทรลเลอร์ LGT8F328P ซึ่งได้ชื่อว่าเป็นไมโครคอนโทรลเลอร์ที่มีความคล้ายกับ Atmel AVR atmega328P ที่ใช้กับบอร์ด Arduino Uno และตระกูล Arduino Nano แต่มีความสามารถที่เพิ่มขึ้น เช่น ความเร็วในการทำงานที่สูงขึ้น และมีความละเอียดในการแปลงสัญญาณแอนาล็อกที่มากขึ้นพร้อมทั้งมีภาคแปลงสัญญาณดิจิทัลเป็นแอนาล็อกมาให้ด้วย ดังนั้น บทความนี้จึงไล่เรียงตั้งแต่คุณสมบัติ การติดตั้งบอร์ด และตัวอย่างการใช้งานคุณสมบัติของไมโครคอนโทรลเลอร์ตัวนี้
LGT8F328P
LGT8F328P เป็นไมโครคอนโทรลเลอร์สถาปัตยกรรมแบบ RISC ขนาด 8 บิตที่ผลิตโดยบริษัท LogicGreen Technology Co.,LTD โดยมีคำสั่งใช้งาน 131 ชุดคำสั่ง ซึ่งคำสั่งส่วนใหญ่ทำงานจบในเพียง 1 Clock Cycle และคุณสมบัติเป็นดังนี้
- มีเรจิสเตอร์ขนาด 8 บิต จำนวน 32 ตัว (R0, .., R31)
- หน่วยความจำของ LGT8F328P มี 32KB Flash และ 2KB SRAM
- Timer/Counter ขนาด 8 บิต จำนวน 2 ชุดที่สามารถทำงานแยกกันในโหมด Prescaler หรือ Compare
- Timer/Counter ขนาด 16 บิต จำนวน 2 ชุดที่สามารถทำงานแยกกันในโหมด Prescaler, Compare และ Capture
- มี PWM จำนวน 9 ช่องสัญญาณ (Channels)
- มีภาค ADC (Analog-to-Digital Converter) ความละเอียด 12 บิต
- มีภาค DAC (Digital-to-Analog Converter) ความละเอียด 8 บิต
- มี WDT (Watch-dog timer) ที่โปรแกรมได้
- รองรับการสื่อสาร
- USART
- SPI
- I2C
- TWI
- มี EZPROM สำหรับเก็บข้อมูลภายใน ซึ่งสามารถปรับขนาดด้วยการแบ่งปันพื้นที่กับ Flash ROM ดังตารางต่อไปนี้
Flash ROM | EZPROM |
---|---|
32KB | 0KB |
30KB | 1KB |
28KB | 2KB |
24KB | 4KB |
16KB | 8KB |
ในภาพที่ 2 เป็นบอร์ดที่ใช้งาน LGT8F328P ตัวถังแบบ QFP32L ด้านหลังและการจัดวางขาเป็นดังภาพที่ 3 และ 4
ภาคเชื่อมต่อกับพอร์ต USB อาศัยชิพ HT42B534 ของบริษัท Holtek เป็นตัวแปลงสัญญาณ UART/USB รองรับการสื่อสารตามมาตรฐาน USB2.0 ทำอัตราการสื่อสารหรือ baud rate สูงสุดที่ 3Mbps ทำงานในช่วงแรงดัน 3.3VDC ถึง 5.5VDC ใช้ได้กับระบบปฏิบัติการ Windows, Android, MacOS และ Linux (ทีมเราใช้ Linux Mint 20.1 ดังภาพที่ 5) ทำให้สามารถเขียนโปรแกรมใช้งานได้กับหลากหลายระบบปฏิบัติการ
การติดตั้งบอร์ด
การติดตั้งบอร์ดสามารถกระทำได้ 2 วิธี คือ ใช้ JSON และดาวน์โหลดไฟล์มาไว้ในโฟลเดอร์ Arduino/hardware
การติดตั้งด้วย JSON
การติดตั้งให้ Arduino IDE รู้จักกับบอร์ด LFT8F386P กระทำโดยการเข้าไปที่เมนู File/Preferences ดังภาพที่ 6 แล้วแสดงหน้าต่างดังภาพที่ 7
จากภาพที่ 7 ให้ึลิกที่ไอคอนด้านขวาของ Additional Boards Manager URLs จะปรากฎหน้าต่างสำหรับใส่รายการคลังของบอร์ดดังภาพที่ 8 ให้ใส่รายการต่อไปนี้เพิ่มเข้าไป หลังจากนั้นปิดหน้าต่างเพื่อกลับไปยังหน้าจอโปรแกรม
- https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json
ให้เข้าเมนู Tools เลือก Board: xxx (อยู่ที่ว่าเดิมเลือกบอร์ดใดไว้) และเลือกรายการย่อย Boards Manager … ดังภาพที่ 9 เพื่อเลือกติดตั้งรายการบอร์ด ให้พิมพ์ LGT เพื่อค้นหาดังภาพที่ 10 และติดตั้ง หลังจากนั้นปิดหน้าต่าง
สุดท้ายให้เลือกรายการบอร์ดเป็น LGT8F328 ดังภาพที่ 11 และตั้งค่า Port พร้อมค่าความถี่ซึ่งเลือกได้สูงสุด 32MHz ดังภาพที่ 12
ติดตั้งด้วยการวางไฟล์ข้อมูลบอร์ด
วิธีการนี้ต้องเข้าไปดาวน์โหลดไฟล์จาก https://github.com/LGTMCU/Larduino_HSP ด้วยการคลิกที่ Code/Download ZIP ดังภาพที่ 12
เมื่อได้ไฟล์บีบอัดดังภาพที่ 13 ให้ทำการคลายไฟล์ด้วยการคลิกขวาที่ไฟล์เพื่อสั่ง Exttract เช่นในภาพที่ 14
เมื่อไฟล์ถูกคลายการบีบอัดจะได้โฟลเดอร์ดังภาพที่ 15 ให้เข้าไปในโฟลเดอร์จะพบรายการโฟลเดอร์ hardware ดังภาพที่ที่ 16 ให้คัดลอกโฟลเดอร์ LGT (ภาพที่ 17) ในโฟลเดอร์ hardware ไปวางใน Arduino/hardware ซึ่งในระบบปฏิบัติการ Windows และ macOS จะอยู่ใน Documents/Arduino/hardware ส่วน Linux ขึ้นอยู่กับการติดตั้ง คือ ถ้าใช้การติดตั้งจาก repo ของระบบปฏิบัติการจะอยู่ที่ Documents/Arduino/hardware แต่ถ้าดาวน์โหลดมาติดตั้งเองจะอยู่ที่ ~/Arduino/hardware
การเลือกใช้บอร์ดกระทำโดยการเข้าที่ Tools/Bord:รายการที่เคยเลือกก่อนหน้า/Arduino AVR Boards (in sketchbook) แล้วเลือก LGT8F328P-LQFP32 MiniEVB ดังภาพที่ 18 หลังจากนั้นจะได้รายการข้อมูลบอร์ดดังภาพที่ 19
ตัวอย่างโปรแกรม
ตัวอย่างที่1
ตัวอย่างโปรแกรมการอ่านค่า ADC จากขา A0 เขียนได้ดังนี้
#include <Arduino.h>
#define pinADC A0
void setup() {
Serial.begin(115200);
pinMode( pinADC, INPUT );
}
void loop() {
int aValue = analogRead( pinADC );
float approxVDC = 3.3*(aValue/1024.0);
Serial.print("ADC value = ");
Serial.print(aValue);
Serial.print(" approximate V = ");
Serial.println(approxVDC);
delay(1000);
}
ตัวอย่างที่2
ตัวอย่างถัดมาเป็นการนำออกคลื่น Cosine ได้ผลลัพธ์ดังภาพที่ 20 และ 21
#include <Arduino.h>
#include <math.h>
#define pi 3.141592654
void setup() {
pinMode(4, ANALOG); // D4
analogReference(INTERNAL4V096); //Internal reference source 4.096V
}
void loop() {
for(float i=0;i<(2*pi); i+=0.01) {
float rad=pi*i;
float cosValue = cos(rad);
long intCosValue = cosValue*300;
byte dacValue = map(intCosValue,-300,300,0,255);
analogWrite(4, dacValue);
}
}
ตัวอย่างที่3
ตัวอย่างหา Prime Number จาก 2 ถึง 2000 ให้ผลลัพธ์เป็นดังภาพที่ 22 และเมื่อทดสอบกับ Arduino Uno ได้ผลลัพธ์ดังภาพที่ 23 ในภาพ 24 เป็นของ Arduino Mega256 แต่อย่างไรก็ดีเมื่อดูผลลัพธ์จากการทำงานด้วย Micropython ของ ESP8266 ในภาพที่ 25 มองได้ว่าทำงานได้ไวพอควร ส่วนภาพที่ 26 และ 27 เป็นผลลัพธ์ที่ได้จาก ESP8266 ที่เขียนใน Arduino และ STM32F103C8 ซึ่งอย่างไรก็ดี esp8266 และ stm32f103c8 เป็นไมโครคอนโทรลเลอร์แบบ 32 บิต จึงไม่ควรเอามาเปรียบเทียบเป็นจริงจังกับ ไมโครคอนโทรลเลอร์ 8 บิต
#include <Arduino.h>
#include <math.h>
bool isPrimeNumber(uint16_t x) {
uint16_t i;
for (i = 2; i < x; i++) {
if (x % i == 0) {
return false;
}
}
if (i == x)
return true;
return false;
}
int counter = 0;
uint32_t t0, t1;
void testPrimeNumber(uint16_t maxN) {
t0 = millis();
for (uint16_t n = 2; n < maxN; n++) {
if (isPrimeNumber(n)) {
counter++;
}
}
t1 = millis();
}
void setup() {
Serial.begin(9600);
testPrimeNumber(2000);
Serial.print("Found ");
Serial.print(counter, DEC);
Serial.print(" in ");
Serial.print(int(fabs(t1 - t0)), DEC);
Serial.println(" milliseconds.");
}
void loop() {
}
สรุป
จากการทดลองของทีมงานพบว่า LGT8F328P สามารถใช้งานกับ Arduino IDE เป็นอย่างดี ทำงานได้เร็วกว่า Atmel 328P เล็กน้อยในสัญญาณนาฬิกาที่เท่ากัน (ปกติจะทำงานที่ clock_div_2) แต่ด้วยราคาถูกกว่าพร้อมทั้งรองรับ ADC ที่ละเอียดขึ้นและสร้าง DAC 8 บิตได้ซึ่งเรียกว่าเพียงพอสำหรับบอร์ดสำหรับควบคุมอุปกรณ์โดยสื่อสารกับบอร์ดที่ทำงานได้ซับซ้อนกว่าเช่นใช้ ESP8266 เป็นตัวสั่งงานผ่านบัส I2C และใช้ ESP8266 เป็นตัวสื่อสาร IoT เป็นต้น สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ
แหล่งอ้างอิง
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-06-26, 2021-06-27, 2021-06-28, 2021-10-02