[TH] Arduino: LGT8F328P

บทความนี้กล่าวถึงการใช้ Arduino กับไมโครคอนโทรลเลอร์ LGT8F328P ซึ่งได้ชื่อว่าเป็นไมโครคอนโทรลเลอร์ที่มีความคล้ายกับ Atmel AVR atmega328P ที่ใช้กับบอร์ด Arduino Uno และตระกูล Arduino Nano แต่มีความสามารถที่เพิ่มขึ้น เช่น ความเร็วในการทำงานที่สูงขึ้น และมีความละเอียดในการแปลงสัญญาณแอนาล็อกที่มากขึ้นพร้อมทั้งมีภาคแปลงสัญญาณดิจิทัลเป็นแอนาล็อกมาให้ด้วย ดังนั้น บทความนี้จึงไล่เรียงตั้งแต่คุณสมบัติ การติดตั้งบอร์ด และตัวอย่างการใช้งานคุณสมบัติของไมโครคอนโทรลเลอร์ตัวนี้

ภาพที่ 1 บอร์ด LGT8F328P QFP32L

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 ROMEZPROM
32KB0KB
30KB1KB
28KB2KB
24KB4KB
16KB8KB

ในภาพที่ 2 เป็นบอร์ดที่ใช้งาน LGT8F328P ตัวถังแบบ QFP32L ด้านหลังและการจัดวางขาเป็นดังภาพที่ 3 และ 4

ภาพที่ 2 ด้านบนของบอร์ด
ภาพที่ 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) ทำให้สามารถเขียนโปรแกรมใช้งานได้กับหลากหลายระบบปฏิบัติการ

ภาพที่ 5 รายละเอียดของเครื่องใช้งานของทีม JarutEx

การติดตั้งบอร์ด

การติดตั้งบอร์ดสามารถกระทำได้ 2 วิธี คือ ใช้ JSON และดาวน์โหลดไฟล์มาไว้ในโฟลเดอร์ Arduino/hardware

การติดตั้งด้วย JSON

การติดตั้งให้ Arduino IDE รู้จักกับบอร์ด LFT8F386P กระทำโดยการเข้าไปที่เมนู File/Preferences ดังภาพที่ 6 แล้วแสดงหน้าต่างดังภาพที่ 7

ภาพที่ 6 เมนู File/Preferences
ภาพที่ 7 หน้าจอ Preferences

จากภาพที่ 7 ให้ึลิกที่ไอคอนด้านขวาของ Additional Boards Manager URLs จะปรากฎหน้าต่างสำหรับใส่รายการคลังของบอร์ดดังภาพที่ 8 ให้ใส่รายการต่อไปนี้เพิ่มเข้าไป หลังจากนั้นปิดหน้าต่างเพื่อกลับไปยังหน้าจอโปรแกรม

  • https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json
ภาพที่ 8 รายการคลังเก็บข้อมูลบอร์ดที่ทาง JarutEx ใช้งาน

ให้เข้าเมนู Tools เลือก Board: xxx (อยู่ที่ว่าเดิมเลือกบอร์ดใดไว้) และเลือกรายการย่อย Boards Manager … ดังภาพที่ 9 เพื่อเลือกติดตั้งรายการบอร์ด ให้พิมพ์ LGT เพื่อค้นหาดังภาพที่ 10 และติดตั้ง หลังจากนั้นปิดหน้าต่าง

ภาพที่ 9 เมนู Board Manager…
ภาพที่ 10 รายการบอร์ด lgt8fx ที่เราต้องติดตั้ง

สุดท้ายให้เลือกรายการบอร์ดเป็น LGT8F328 ดังภาพที่ 11 และตั้งค่า Port พร้อมค่าความถี่ซึ่งเลือกได้สูงสุด 32MHz ดังภาพที่ 12

ภาพที่ 11 เมนู Tools/Board:xxx/Logic Green Arduino AVR Compatible Boards/LGT8F328
ภาพที่ 12 การตั้งค่าความถี่สัญญาณนาฬิการให้การทำงาน

ติดตั้งด้วยการวางไฟล์ข้อมูลบอร์ด

วิธีการนี้ต้องเข้าไปดาวน์โหลดไฟล์จาก https://github.com/LGTMCU/Larduino_HSP ด้วยการคลิกที่ Code/Download ZIP ดังภาพที่ 12

ภาพที่ 12 ดาวน์โหลดไฟล์จาก github

เมื่อได้ไฟล์บีบอัดดังภาพที่ 13 ให้ทำการคลายไฟล์ด้วยการคลิกขวาที่ไฟล์เพื่อสั่ง Exttract เช่นในภาพที่ 14

ภาพที่ 13 ไฟล์ที่ดาวน์โหลดได้
ภาพที่ 14 ตัวอย่างการคลายไฟล์

เมื่อไฟล์ถูกคลายการบีบอัดจะได้โฟลเดอร์ดังภาพที่ 15 ให้เข้าไปในโฟลเดอร์จะพบรายการโฟลเดอร์ hardware ดังภาพที่ที่ 16 ให้คัดลอกโฟลเดอร์ LGT (ภาพที่ 17) ในโฟลเดอร์ hardware ไปวางใน Arduino/hardware ซึ่งในระบบปฏิบัติการ Windows และ macOS จะอยู่ใน Documents/Arduino/hardware ส่วน Linux ขึ้นอยู่กับการติดตั้ง คือ ถ้าใช้การติดตั้งจาก repo ของระบบปฏิบัติการจะอยู่ที่ Documents/Arduino/hardware แต่ถ้าดาวน์โหลดมาติดตั้งเองจะอยู่ที่ ~/Arduino/hardware

ภาพที่ 15 โฟลเดอร์ที่ถูกคลายจากไฟล์ ZIP
ภาพที่ 16 รายการโฟลเดอร์และไฟล์ใน Larduino_HSP-master
ภาพที่ 17 โฟลเดอร์ LGT ที่ต้องคัดลอกไปไว้ที่ Arduino/hardware

การเลือกใช้บอร์ดกระทำโดยการเข้าที่ Tools/Bord:รายการที่เคยเลือกก่อนหน้า/Arduino AVR Boards (in sketchbook) แล้วเลือก LGT8F328P-LQFP32 MiniEVB ดังภาพที่ 18 หลังจากนั้นจะได้รายการข้อมูลบอร์ดดังภาพที่ 19

ภาพที่ 18 เลือกบอร์ด LGT8F328P-LQFO32 MiniEVB
ภาพที่ 19 รายการบอร์ด LGT8F328P-LQFP32 MiniEVB ที่พร้อมใช้งาน

ตัวอย่างโปรแกรม

ตัวอย่างที่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);
  }
}
ภาพที่ 20 บอร์ดทดลองต่อเชื่อมกับบอร์ดแสดงกราฟ
ภาพที่ 21 กราฟผลลัพธ์จากโปรแกรมตัวอย่าง

ตัวอย่างที่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() {
}
ภาพที่ 22 ผลลัพธ์การหา Prime Number ด้วย LGT8F328P
ภาพที่ 23 ผลลัพธ์การหา Prime Number ด้วย Arduino Uno
ภาพที่ 24 ผลลัพธ์ที่ได้จาก Arduino Mega256
ภาพที่ 25 ผลการทดสอบด้วย Micropython ของ esp8266
ภาพที่ 26 ผลลัพธ์จาก esp8266
ภาพที่ 27 ผลลัพธ์จาก STM32F103C8

สรุป

จากการทดลองของทีมงานพบว่า LGT8F328P สามารถใช้งานกับ Arduino IDE เป็นอย่างดี ทำงานได้เร็วกว่า Atmel 328P เล็กน้อยในสัญญาณนาฬิกาที่เท่ากัน (ปกติจะทำงานที่ clock_div_2) แต่ด้วยราคาถูกกว่าพร้อมทั้งรองรับ ADC ที่ละเอียดขึ้นและสร้าง DAC 8 บิตได้ซึ่งเรียกว่าเพียงพอสำหรับบอร์ดสำหรับควบคุมอุปกรณ์โดยสื่อสารกับบอร์ดที่ทำงานได้ซับซ้อนกว่าเช่นใช้ ESP8266 เป็นตัวสั่งงานผ่านบัส I2C และใช้ ESP8266 เป็นตัวสื่อสาร IoT เป็นต้น สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ

แหล่งอ้างอิง

  1. Ralph Bacon
  2. LGTMCU
  3. dbuezas

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-06-26, 2021-06-27, 2021-06-28, 2021-10-02