From 95f5cd414e312912a8af6eed371c40074b5aa1f1 Mon Sep 17 00:00:00 2001 From: Satakun Utama Date: Fri, 19 Dec 2025 14:53:17 +0700 Subject: [PATCH] Chapter 3 & Spacing Fix --- Abstract.typ | 4 +- Chapter2/Intro.typ | 19 +- Chapter2/Microcontroller.typ | 125 ++++++++--- Chapter3.typ | 402 ++++++++++++++++++++++++++++++++++- History.typ | 10 +- PageTemplate.typ | 2 + References.yaml | 40 +++- 7 files changed, 550 insertions(+), 52 deletions(-) diff --git a/Abstract.typ b/Abstract.typ index 2f1db7a..8dd25d3 100644 --- a/Abstract.typ +++ b/Abstract.typ @@ -27,7 +27,7 @@ [ครูที่ปรึกษา], [นายภาคิน เหรียญทอง], [ครูที่ปรึกษาร่วม], [นายวสันต์ สารคำ], ) -\ \ +#v(2em) = บทคัดย่อ @@ -61,7 +61,7 @@ [Thesis Advisor], [Mister Pakin Reanthong], [Thesis Co-advisor], [Mister Wasan Sarakum], ) -\ \ +#v(2em) = Abstract diff --git a/Chapter2/Intro.typ b/Chapter2/Intro.typ index f4da05a..26af356 100644 --- a/Chapter2/Intro.typ +++ b/Chapter2/Intro.typ @@ -1,4 +1,4 @@ -#import "../PageTemplate.typ": chapter-page, i +#import "../PageTemplate.typ": chapter-page, i, jb #show: chapter-page #set enum(indent: 3em, numbering: n => "2." + str(n)) @@ -23,4 +23,19 @@ == ไมโครคอนโทรเลอร์ (Microcontroller) -#i ความรู้เกี่ยวกับไมโครคอนโทรลเลอร์เบื้องต้น ไมโครคอนโทรลเลอร์ (มักย่อว่า uC หรือ MCU) คือ อุปกรณ์ควบคุมขนาดเล็ก ซึ่งบรรจุความสามารถที่คล้ายคลึงกับระบบคอมพิวเตอร์ โดยใน ไมโครคอนโทรลเลอร์ได้รวม เอาซีพียูหน่วยความจำและพอร์ต ซึ่งเป็นส่วนประกอบหลักสำคัญของ ระบบคอมพิวเตอร์เข้าไว้ด้วยกัน โดยทำการบรรจุเข้าไว้ในตัวถังเดียวกัน ไมโครคอนโทรลเลอร์ถ้าแปล ความหมายแบบตรงตัวก็คือ ระบบคอนโทรลขนาดเล็กเรียกอีกอย่างหนึ่งคือเป็นระบบคอมพิวเตอร์ ขนาดเล็ก ที่สามารถนำมาประยุกต์ใช้งานได้หลากหลาย โดยผ่านการออกแบบวงจรให้เหมาะกับงาน ต่างๆ และยังสามารถเขียนโปรแกรมคำสั่งเพื่อควบคุมขา Input/Output เพื่อสั่งงานให้ไป ควบคุม อุปกรณ์ต่างๆ ได้อีกด้วย ซึ่งก็นับว่าเป็นระบบที่สามารถนำมาประยุกต์ใช้งานได้หลากหลาย ทั้ง ทางด้าน Digital และ Analog ยกตัวอย่างเช่น ระบบสัญญาณตอบรับอัตโนมัติ, ระบบบัตรคิว, ระบบ ตอกบัตรพนักงาน และอื่นๆ ยิ่งระบบไมโครคอนโทรลเลอร์ในยุคปัจจุบันนั้นสามารถทำการเชื่อต่อกับ ระบบ Network ของคอมพิวเตอร์ทั่วไปได้อีกด้วย ดังนั้นการสั่งงานจึงไม่ใช่แค่หน้าแผงวงจร แต่ อาจจะเป็นการสั่งงานอยู่คนละ ซีกโลกผ่านเครือข่ายอินเตอร์เน็ตก็ได้โครงสร้างโดยทั่วไปของไมโครคอนโทรลเลอร์นั้น สามารถแบ่งออกมาได้เป็น 5 ส่วนใหญ่ๆ ได้แก่ หน่วยประมวลผลกลาง หรือ ซีพียู, หน่วยความจ า, ส่วนติดต่อกับอุปกรณ์ภายนอก หรือพอร์ต, ช่องทางเดินของสัญญาณ หรือบัส และ วงจรกำเนิดสัญญาณนาฬิกา หน่วยความจำนั้น สามารถแบ่งออกเป็น 2 ส่วนคือ หน่วยความจำที่มีไว้สำหรับเก็บ โปรแกรมหลัก เปรียบเสมือนฮาร์ดดิสก์และหน่วยความจำข้อมูล ใช้เป็นเหมือนกับ กระดาษทดในการ คำนวณของซีพียู โดย ESP32 เป็นไมโครคอนโทรลเลอร์แบบ System-on-a-Chip (SoC) ที่มีการรวมส่วนประกอบทั้งหมดที่จำเป็นสำหรับการประมวลผลและการสื่อสารไร้สายไว้ในชิปเดียว ที่มีคุณสมบัติเด่นด้านการ +#i ความรู้เกี่ยวกับไมโครคอนโทรลเลอร์เบื้องต้น ไมโครคอนโทรลเลอร์ (มักย่อว่า uC หรือ MCU) คือ +อุปกรณ์ควบคุมขนาดเล็ก ซึ่งบรรจุความสามารถที่คล้ายคลึงกับระบบคอมพิวเตอร์ โดยใน +ไมโครคอนโทรลเลอร์ได้รวม เอาซีพียูหน่วยความจำและพอร์ต ซึ่งเป็นส่วนประกอบหลักสำคัญของ +ระบบคอมพิวเตอร์เข้าไว้ด้วยกัน โดยทำการบรรจุเข้าไว้ในตัวถังเดียวกัน ไมโครคอนโทรลเลอร์ถ้าแปล +ความหมายแบบตรงตัวก็คือ ระบบคอนโทรลขนาดเล็กเรียกอีกอย่างหนึ่งคือเป็นระบบคอมพิวเตอร์ ขนาดเล็ก +ที่สามารถนำมาประยุกต์ใช้งานได้หลากหลาย โดยผ่านการออกแบบวงจรให้เหมาะกับงาน ต่างๆ +และยังสามารถเขียนโปรแกรมคำสั่งเพื่อควบคุมขา Input/Output เพื่อสั่งงานให้ไป ควบคุม อุปกรณ์ต่างๆ +ได้อีกด้วย ซึ่งก็นับว่าเป็นระบบที่สามารถนำมาประยุกต์ใช้งานได้หลากหลาย ทั้ง ทางด้าน Digital และ +Analog ยกตัวอย่างเช่น ระบบสัญญาณตอบรับอัตโนมัติ, ระบบบัตรคิว, ระบบ ตอกบัตรพนักงาน และอื่นๆ +ยิ่งระบบไมโครคอนโทรลเลอร์ในยุคปัจจุบันนั้นสามารถทำการเชื่อต่อกับ ระบบ Network +ของคอมพิวเตอร์ทั่วไปได้อีกด้วย ดังนั้นการสั่งงานจึงไม่ใช่แค่หน้าแผงวงจร แต่ อาจจะเป็นการสั่งงานอยู่คนละ +ซีกโลกผ่านเครือข่ายอินเตอร์เน็ตก็ได้โครงสร้างโดยทั่วไปของไมโครคอนโทรลเลอร์นั้น +สามารถแบ่งออกมาได้เป็น 5 ส่วนใหญ่ ๆ ได้แก่ หน่วยประมวลผลกลาง หรือ ซีพียู, หน่วยความจำ, +ส่วนติดต่อกับอุปกรณ์ภายนอก หรือพอร์ต, ช่องทางเดินของสัญญาณ หรือบัส และ วงจรกำเนิดสัญญาณนาฬิกา#jb +หน่วยความจำนั้น สามารถแบ่งออกเป็น 2 ส่วนคือ หน่วยความจำที่มีไว้สำหรับเก็บ โปรแกรมหลัก +เปรียบเสมือนฮาร์ดดิสก์และหน่วยความจำข้อมูล ใช้เป็นเหมือนกับ กระดาษทดในการ คำนวณของ#jb diff --git a/Chapter2/Microcontroller.typ b/Chapter2/Microcontroller.typ index bd2658e..df27793 100644 --- a/Chapter2/Microcontroller.typ +++ b/Chapter2/Microcontroller.typ @@ -1,22 +1,38 @@ -#import "../PageTemplate.typ": i +#import "../PageTemplate.typ": i, jb -เชื่อมต่อ Wi-Fi และ Bluetooth ในตัว เป็นชิปไมโครคอนโทรลเลอร์แบบ 32 บิต ที่มีความสามารถสูง พัฒนาและผลิตโดย บริษัท Espressif Systems จากประเทศจีน ส่วนประกอบหลักของบอร์ด ESP32 +ซีพียู โดย ESP32 เป็นไมโครคอนโทรลเลอร์แบบ System-on-a-Chip (SoC) +ที่มีการรวมส่วนประกอบทั้งหมดที่จำเป็นสำหรับการประมวลผลและการสื่อสารไร้สายไว้ในชิปเดียว +ที่มีคุณสมบัติเด่นด้านการเชื่อมต่อ Wi-Fi และ Bluetooth ในตัว เป็นชิปไมโครคอนโทรลเลอร์แบบ 32 บิต +ที่มีความสามารถสูง พัฒนาและผลิตโดย บริษัท Espressif Systems จากประเทศจีน +ส่วนประกอบหลักของบอร์ด ESP32 -#i ESP32 คือ ไมโครคอนโทรลเลอร์ราคาประหยัดและประหยัดพลังงานที่ผสานรวมความสามารถทั้ง Wi-Fi และ Bluetooth ชิปเหล่านี้มีตัวเลือกการประมวลผลที่หลากหลาย รวมถึง ไมโครโปรเซสเซอร์ Tensilica Xtensa LX6 ที่มีทั้งแบบดูอัลคอร์และแบบซิงเกิลคอร์ โปรเซสเซอร์ดูอัลคอร์\ -Xtensa LX7 หรือ ไมโครโปรเซสเซอร์ RISC-V แบบซิงเกิลคอร์ นอกจากนี้ ESP32 ยังมีส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายสัญญาณ ตัวรับสัญญาณเสียงรบกวนต่ำ ตัวกรอง และโมดูลจัดการพลังงาน +#i ESP32 คือ ไมโครคอนโทรลเลอร์ราคาประหยัดและประหยัดพลังงานที่ผสานรวมความสามารถทั้ง Wi-Fi +และ Bluetooth ชิปเหล่านี้มีตัวเลือกการประมวลผลที่หลากหลาย รวมถึง ไมโครโปรเซสเซอร์#jb +Tensilica Xtensa LX6 ที่มีทั้งแบบดูอัลคอร์และแบบซิงเกิลคอร์ โปรเซสเซอร์ดูอัลคอร์ Xtensa LX7 หรือ +ไมโครโปรเซสเซอร์ RISC-V แบบซิงเกิลคอร์ นอกจากนี้ ESP32 +ยังมีส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF +เครื่องขยายสัญญาณ ตัวรับสัญญาณเสียงรบกวนต่ำ ตัวกรอง และโมดูลจัดการพลังงาน -#i โดยทั่วไป ESP32 จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์ หรือนำเสนอเป็นส่วนหนึ่งของชุดพัฒนาที่มี พินและขั้วต่อ GPIO หลากหลายรูป แบบ โดยมีการกำหนดค่าแตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ออกแบบโดย Espressif Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตรเป็นรุ่นต่อยอดจากไมโครคอนโทรลเลอร์ ESP8266 +#i โดยทั่วไป ESP32 จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์ หรือนำเสนอเป็นส่วนหนึ่งของชุดพัฒนาที่มี +พินและขั้วต่อ GPIO หลากหลายรูป แบบ โดยมีการกำหนดค่าแตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 +ออกแบบโดย Espressif Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 +นาโนเมตรเป็นรุ่นต่อยอดจากไมโครคอนโทรลเลอร์ ESP8266 -#i นับตั้งแต่เปิดตัว ESP32 รุ่นดั้งเดิม มีการเปิดตัวและประกาศรุ่นต่างๆ มากมาย พวกมันรวมกันเป็นไมโครคอนโทรลเลอร์ตระกูล ESP32 ชิปเหล่านี้มี CPU และความสามารถที่แตกต่างกัน แต่ทั้งหมดใช้ SDK เดียวกันและส่วนใหญ่เข้ากันได้กับโค้ด นอกจากนี้ ESP32 รุ่นดั้งเดิมยังได้รับการปรับปรุง และส่วนประกอบหลักของบอร์ด ESP32 คือ -ไมโครโปรเซสเซอร์ LX6 32 บิตแบบคอร์เดี่ยว/คู่ Xtensa -รองรับหน่วยจุดลอยตัวความแม่นยำเดี่ยว (FPU) -ไวไฟ: 802.11b/g/n -บลูทูธ: v4.2 BR/EDR และ BLE (แชร์วิทยุกับ Wi-Fi) GPIO จำนวน 34 ตัว -ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูงสุด 18 ช่องและ #math.equation($2 times 8$, alt: "2 คูณ 8") บิต DAC +#i นับตั้งแต่เปิดตัว ESP32 รุ่นดั้งเดิม มีการเปิดตัวและประกาศรุ่นต่างๆ มากมาย +พวกมันรวมกันเป็นไมโครคอนโทรลเลอร์ตระกูล ESP32 ชิปเหล่านี้มี CPU และความสามารถที่แตกต่างกัน +แต่ทั้งหมดใช้ SDK เดียวกันและส่วนใหญ่เข้ากันได้กับโค้ด นอกจากนี้ ESP32 รุ่นดั้งเดิมยังได้รับการปรับปรุง +และส่วนประกอบหลักของบอร์ด ESP32 คือ ไมโครโปรเซสเซอร์ LX6 32 บิตแบบคอร์เดี่ยว/คู่ Xtensa +รองรับหน่วยจุดลอยตัวความแม่นยำเดี่ยว (FPU) ไวไฟ: 802.11b/g/n บลูทูธ: v4.2 BR/EDR และ BLE +(แชร์วิทยุกับ Wi-Fi) GPIO จำนวน 34 ตัว ADC SAR #math.equation( + $2 times 12$, + alt: "2 คูณ 12", +) บิต สูงสุด 18 ช่องและ #math.equation($2 times 8$, alt: "2 คูณ 8") บิต DAC == ตารางพาร์ทิชัน (Partition Table) -#i ตารางพาร์ทิชันคือสิ่งที่กำหนดการจัดการรูปแบบหน่วยความจำแฟลชและข้อมูลต่าง ๆ จะถูกเก็บไว้ในแต่ละพาร์ทิชัน โดยผู้พัฒนาสามารถใช้รูปแบบตารางพาร์ทิชันที่ถูกกำหนดมาไว้แล้วหรือสามารถกำหนดรูปแบบตารางพาร์ทิชันเองก็ได้ +#i ตารางพาร์ทิชันคือสิ่งที่กำหนดการจัดการรูปแบบหน่วยความจำแฟลชและข้อมูลต่าง ๆ +จะถูกเก็บไว้ในแต่ละพาร์ทิชัน +โดยผู้พัฒนาสามารถใช้รูปแบบตารางพาร์ทิชันที่ถูกกำหนดมาไว้แล้วหรือสามารถกำหนดรูปแบบตารางพาร์ทิชันเองก็ได้ #i โดยตารางพาร์ทัชันที่ถูกใช้ในโครงงานนี้มีรูปแบบดังนี้ @@ -28,31 +44,63 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง ..partition-table.flatten().slice(6), ) -ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่: +ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform +อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่: -+ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร (ไม่มีอักขระพิเศษ) ++ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร + (ไม่มีอักขระพิเศษ) + *Type:* ประเภทของพาร์ทัชัน สามารถเป็น `data` หรือ `app` ได้ - `app` คือพาร์ทิชันที่ใช้ในการเก็บแอพลิเคชัน - `data` คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป + *SubType:* ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน `app` และ `data` - `data` - - `ota`: พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB (0x2000 ไบต์) - - `nvs`: พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory) โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์) และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64 KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า - - `coredump`: ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช โดย core dump นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000) - - `nvs_keys`: พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000) - - `fat`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling และการเข้ารหัสได้ - - `spiffs`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส + - `ota`: พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) + โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB + (0x2000 ไบต์) + - `nvs`: พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, + และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory) + โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ + และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส + และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์) + และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64 + KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS + นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า + - `coredump`: ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช + โดย core dump + นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค + โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช + และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000) + - `nvs_keys`: พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS + เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000) + - `fat`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ + และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling + และการเข้ารหัสได้ + - `spiffs`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ + wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส - `app` - - `factory`: พาร์ทิชันเก็บแอพลิเคชันเริ่มต้น โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน `ota_0` สามารถถูกใช้เป็นแอพลิเคชันเริ่มต้นได้และพาร์ทิชัน `factory` สามารถถูกนำออกได้ - - `ota_0` ถึง `ota_15`: พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1) และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค + - `factory`: พาร์ทิชันเก็บแอพลิเคชันเริ่มต้น + โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน + OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน `ota_0` + สามารถถูกใช้เป็นแอพลิเคชันเริ่มต้นได้และพาร์ทิชัน `factory` สามารถถูกนำออกได้ + - `ota_0` ถึง `ota_15`: พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA + นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1) + และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน + OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค - `test`: ใช้สำหรับการทดสอบในโรงงาน -+ *Offset:* กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset และขนาดของพาร์ทิชันก่อนหน้า \ - *หมายเหตุ:* Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000) และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น *0x9000* และ *0x10000* สำหรับพาร์ทิชันแอพลิเคชันแรก -+ *Size:* ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย `0x`), หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000 ++ *Offset:* กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset + และขนาดของพาร์ทิชันก่อนหน้า \ + *หมายเหตุ:* Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000) + และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset + จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น + อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น *0x9000* และ *0x10000* + สำหรับพาร์ทิชันแอพลิเคชันแรก ++ *Size:* ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย `0x`), + หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000 + *Flags:* ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่ == LittleFS -#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ\ ไมโครคอนโทรลเลอร์ +#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ#jb +ไมโครคอนโทรลเลอร์ #show raw: set par(leading: 0.5em) @@ -65,19 +113,32 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง | | | ``` -*ความยืดหยุ่นในการป้องกันการสูญเสียพลังงาน* littlefs ออกแบบมาเพื่อรับมือกับปัญหาไฟฟ้าดับแบบสุ่ม การดำเนินการไฟล์ทั้งหมดมีการรับประกันการคัดลอกข้อมูลเมื่อเขียนข้อมูล (copy-on-write) ที่แข็งแกร่ง และหากไฟฟ้าดับ ระบบไฟล์จะกลับสู่สถานะปกติล่าสุดที่ทราบ +*ความยืดหยุ่นในการป้องกันการสูญเสียพลังงาน* littlefs ออกแบบมาเพื่อรับมือกับปัญหาไฟฟ้าดับแบบสุ่ม +การดำเนินการไฟล์ทั้งหมดมีการรับประกันการคัดลอกข้อมูลเมื่อเขียนข้อมูล (copy-on-write) ที่แข็งแกร่ง +และหากไฟฟ้าดับ ระบบไฟล์จะกลับสู่สถานะปกติล่าสุดที่ทราบ -*การปรับระดับการสึกหรอแบบไดนามิก* littlefs ออกแบบมาเพื่อแฟลชโดยเฉพาะ และมอบการปรับระดับการสึกหรอบนบล็อกแบบไดนามิก นอกจากนี้ littlefs ยังสามารถตรวจจับบล็อกเสียและแก้ไขปัญหาได้ +*การปรับระดับการสึกหรอแบบไดนามิก* littlefs ออกแบบมาเพื่อแฟลชโดยเฉพาะ +และมอบการปรับระดับการสึกหรอบนบล็อกแบบไดนามิก นอกจากนี้ littlefs +ยังสามารถตรวจจับบล็อกเสียและแก้ไขปัญหาได้ -*RAM/ROM แบบมีขอบเขต* ittlefs ออกแบบมาเพื่อทำงานกับหน่วยความจำขนาดเล็ก การใช้งาน RAM ถูกจำกัดอย่างเข้มงวด ซึ่งหมายความว่าการใช้ RAM จะไม่เปลี่ยนแปลงเมื่อระบบไฟล์เติบโตขึ้น ระบบไฟล์ไม่มีการเรียกซ้ำแบบไม่มีขอบเขต และหน่วยความจำแบบไดนามิกถูกจำกัดให้อยู่ในบัฟเฟอร์ที่กำหนดค่าได้ซึ่งสามารถจัดเตรียมแบบคงที่ได้ +*RAM/ROM แบบมีขอบเขต* littlefs ออกแบบมาเพื่อทำงานกับหน่วยความจำขนาดเล็ก การใช้งาน#jb +RAM ถูกจำกัดอย่างเข้มงวด ซึ่งหมายความว่าการใช้ RAM จะไม่เปลี่ยนแปลงเมื่อระบบไฟล์เติบโตขึ้น#jb +ระบบไฟล์ไม่มีการเรียกซ้ำแบบไม่มีขอบเขต +และหน่วยความจำแบบไดนามิกถูกจำกัดให้อยู่ในบัฟเฟอร์ที่กำหนดค่าได้ซึ่งสามารถจัดเตรียมแบบคงที่ได้ == ออกแบบ -#i ในระดับสูง littlefs เป็นระบบไฟล์แบบบล็อกที่ใช้ไฟล์บันทึกขนาดเล็กในการจัดเก็บข้อมูลเมตาและโครงสร้าง copy-on-write (COW) ขนาดใหญ่ในการจัดเก็บข้อมูลไฟล์ +#i ในระดับสูง littlefs +เป็นระบบไฟล์แบบบล็อกที่ใช้ไฟล์บันทึกขนาดเล็กในการจัดเก็บข้อมูลเมตาและโครงสร้าง copy-on-write +(COW) ขนาดใหญ่ในการจัดเก็บข้อมูลไฟล์ -#i ใน littlefs ส่วนผสมเหล่านี้ก่อตัวเป็นเค้กสองชั้น โดยที่ท่อนไม้ขนาดเล็ก (เรียกว่าคู่เมตาเดตา)\ จะให้การอัปเดตเมตาเดตาอย่างรวดเร็วในทุกที่ในที่เก็บข้อมูล ในขณะที่โครงสร้าง COW จะจัดเก็บข้อมูลไฟล์อย่างกะทัดรัดและไม่มีค่าใช้จ่ายในการขยายการสึกหรอใด ๆ +#i ใน littlefs ส่วนผสมเหล่านี้ก่อตัวเป็นเค้กสองชั้น โดยที่ท่อนไม้ขนาดเล็ก (เรียกว่าคู่เมตาเดตา)#jb +จะให้การอัปเดตเมตาเดตาอย่างรวดเร็วในทุกที่ในที่เก็บข้อมูล ในขณะที่โครงสร้าง COW +จะจัดเก็บข้อมูลไฟล์อย่างกะทัดรัดและไม่มีค่าใช้จ่ายในการขยายการสึกหรอใด ๆ -#i โครงสร้างข้อมูลทั้งสองนี้สร้างขึ้นจากบล็อก ซึ่งถูกป้อนโดยตัวจัดสรรบล็อกร่วม โดยการจำกัดจำนวนการลบข้อมูลที่อนุญาตบนบล็อกต่อการจัดสรรแต่ละครั้ง ตัวจัดสรรจะปรับระดับการสึกหรอแบบไดนามิกทั่วทั้งระบบไฟล์ +#i โครงสร้างข้อมูลทั้งสองนี้สร้างขึ้นจากบล็อก ซึ่งถูกป้อนโดยตัวจัดสรรบล็อกร่วม +โดยการจำกัดจำนวนการลบข้อมูลที่อนุญาตบนบล็อกต่อการจัดสรรแต่ละครั้ง +ตัวจัดสรรจะปรับระดับการสึกหรอแบบไดนามิกทั่วทั้งระบบไฟล์ ``` root diff --git a/Chapter3.typ b/Chapter3.typ index 6f88322..c4597ad 100644 --- a/Chapter3.typ +++ b/Chapter3.typ @@ -1,18 +1,410 @@ #import "PageTemplate.typ": * +#import "@preview/fletcher:0.5.8" as fletcher: diagram, edge, node +#import fletcher.shapes: circle, diamond, pill #show: chapter-page #set heading(numbering: "บทที่ 1") #heading([#linebreak()วิธีการดำเนินโครงงาน]) #set heading(numbering: "1.1") -#i ในการดำเนินการศึกษาครั้งนี้ คณะผู้จัดทำโครงงานได้ศึกษาข้อมูลเบื้องต้นในการสร้างเครื่องยืนยันตัวตนด้วย NFC และได้ดำเนินการตามขั้นตอนนี้ +#i ในการดำเนินการศึกษาครั้งนี้ +คณะผู้จัดทำโครงงานได้ศึกษาข้อมูลเบื้องต้นในการสร้างเครื่องยืนยันตัวตนด้วย NFC +และได้ดำเนินการตามขั้นตอนนี้ -== ศึกษาข้อมูลเบื้องต้น ++ วางแผนการดำเนินงาน ++ การออกแบบ ++ วัสดุอุปกรณ์ ++ ขั้นตอนการประกอบ ++ การทดลอง ++ การวิเคราะห์ข้อมูล -== อุปกรณ์/เครื่องมือที่ใช้ในการสร้าง +== วางแผนการดำเนินงาน + +#show table.cell.where(y: 1): strong +#set par(leading: 0.5em) + +#let arrow = [ + #place( + left + horizon, + text(weight: "bold", size: 14pt)[#sym.arrow.l], + dx: -5pt, + dy: -0.7pt, + ) + #place( + horizon, + line(length: 100%, stroke: (thickness: 1pt)), + dx: 0pt, + dy: 0pt, + ) + #place( + right + horizon, + text(weight: "bold", size: 14pt)[#sym.arrow.r], + dx: 5pt, + dy: -0.7pt, + ) +] + +=== แผนขั้นตอนและวิธีการดำเนินงาน + +#table( + columns: 12, + align: ( + left + horizon, + center, + center, + center, + center, + center, + center, + center, + center, + center, + center, + center, + ), + table.header( + table.cell( + [ขั้นตอนการ\ ดำเนินการ], + rowspan: 2, + ), + table.cell( + [พ.ศ.2568], + colspan: 3, + ), + table.cell( + [พ.ศ.2569], + colspan: 8, + ), + [ต.ค.], + [พ.ย.], + [ธ.ค.], + [ม.ค.], + [ก.พ.], + [มี.ค], + [เม.ย], + [พ.ค.], + [มิ.ย.], + [ก.ค.], + [ส.ค.], + ), + [ศึกษาค้นคว้าข้อมูล], + table.cell(arrow, colspan: 3), + [], + [], + [], + [], + [], + [], + [], + [], + [เสนอหัวข้อ], arrow, [], [], [], [], [], [], [], [], [], [], + [เสนอครั้งที่ 1], [], arrow, [], [], [], [], [], [], [], [], [], + [ออกแบบและสร้าง], [], table.cell(arrow, colspan: 5), [], [], [], [], [], + [จัดซื้ออุปกรณ์ทดลอง], + [], + table.cell(arrow, colspan: 3), + [], + [], + [], + [], + [], + [], + [], + [ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 4), [], [], [], [], [], + [ปรับปรุงแก้ไข], [], [], [], [], table.cell(arrow, colspan: 5), [], [], + [เสนอครั้งที่ 2], [], [], [], arrow, [], [], [], [], [], [], [], + [จัดทำรูปเล่ม], table.cell(arrow, colspan: 11), + [นำเสนอโครงงาน], [], [], [], [], [], [], [], [], [], [], [], +) + +=== ผังการดำเนินงาน + +#diagram( + node-stroke: 1pt, + spacing: 2em, + node((0, 0), [เริ่มต้น], shape: pill), + edge("-|>"), + node((0, 1), shape: circle, radius: 1em), + edge("-|>"), + node((0, 2), [ศึกษาข้อมูลและทฤษฏีที่เกี่ยวข้อง], width: 2.5in), + edge("-|>"), + node((0, 3), [ออกแบบและวางแผนการดําเนินงาน], width: 2.5in), + edge("-|>"), + node((0, 4), [เครื่องยืนยันตัวตนด้วย NFC], width: 2.5in), + edge("-|>"), + node((0, 5), [ทดสอบประสิทธิภาพ], shape: diamond), + edge("r,u,u,u,u,l", "-|>", [ไม่ผ่าน]), + edge("-|>", [ผ่าน]), + node((0, 6), [จัดทำเอกสาร], width: 2.5in), + edge("-|>"), + node((0, 7), [นำเสนอ], width: 2.5in), + edge("-|>"), + node((0, 8), [สิ้นสุด], shape: pill), +) + +#pagebreak() + +=== ผังการทำงาน + +#diagram( + node-stroke: 1pt, + spacing: 2em, + node([เริ่มต้น], shape: pill), + edge("-|>"), + node((1, 0), [ตั้งค่า LittleFS]), + edge("-|>"), + + node((1, 2), [มี Wi-Fi บันทึก\ ไว้อยู่หรือไม่], shape: diamond), + edge("l", "-|>", [ไม่มี]), + edge((1, 2), (1, 3), "-|>", [มี]), + + node((0, 2), [รอรับรายละเอียดเครือข่าย\ (ESP-Touch)]), + edge("d,r", "-|>"), + node((1, 3), [เชื่อมต่อเครือข่าย]), + edge("-|>"), + + node((0, 4), [มีอุปกรณ์ควบคุม\ หลักแล้วหรือไม่], shape: diamond), + edge("-|>", [ไม่มี]), + edge("d", "-|>", [มี]), + + node((1, 4), [สร้างโทเค็นสำหรับการยืนยัน\ อุปกรณ์ควบคุมหลัก]), + edge("-|>"), + + node((1, 5), [รออุปกรณ์ควบคุมหลัก\ แตะเซนเซอร์ NFC]), + edge("-|>"), + + node((0, 5), [ตั้งค่าเซิร์ฟเวอร์ HTTPS]), + edge("-|>"), + + node((0, 6), shape: circle, radius: 1em), + edge("-|>"), + + node((0, 7), [มีการแตะเซนเซอร์\ NFC ขาเข้าหรือไม่], shape: diamond), + edge("-|>", [ไม่มี]), + + node((0, 9), [มีคนผ่านเซนเซอร์ PIR\ โดยไม่ได้รับอนุญาตหรือไม่], shape: diamond), + edge((0, 9), (0, 10), [ไม่มี]), + edge((0, 7), (1, 6), "-|>", [มี]), + + node((1, 6), [อยู่ในโหมดลงทะเบียน\ หรือไม่], shape: diamond), + edge("-|>", [ใช่]), + edge((1, 6), (2, 7), [ไม่]), + + node((1, 7), [นำ ID อุปกรณ์เข้า\ สู่รายการทะเบียน]), + edge((1, 7), (0.6, 7), (0, 9), "-|>"), + + node((2, 7), [ID ของอุปกรณ์อยู่\ ในทะเบียนหรือไม่], shape: diamond), + edge("-|>", [อยู่]), + edge((2, 7), (1, 8), "-|>", [ไม่อยู่], label-sep: -5pt), + + node((2, 8), [ส่งเสียงคอนเฟิร์ม]), + edge((2, 8), (2, 8.5), (0.4, 8.5), (0, 9), "-|>"), + + node((1, 8), [ส่งเสียงแสดงความผิดพลาด]), + edge((1, 8), (0.5, 8), (0, 9), "-|>"), + + node((1, 9), [แจ้งเตือนทางเสียง\ และแอพลิเคชัน]), + edge((1, 9), (0, 10), "-|>"), + edge((0, 10), (1, 10), "-|>", [มี]), + + node((0, 10), [มีคำขอ HTTPS\ ใหม่หรือไม่], shape: diamond), + edge((0, 10), (-2, 10), "-|>", [ไม่มี], label-pos: 10%), + edge((0, 9), (1, 9), "-|>", [มี], label-anchor: "center", label-sep: -8pt), + + node((1, 10), [ประมวลผลคำขอ HTTPS]), + edge((1, 10), (1, 11), (-2, 11), (-2, 10), "-|>"), + + node((-2, 10), shape: circle, radius: 1em), + edge((-2, 10), (-2, 6), (0, 6), "-|>"), +) + +#pagebreak() +#set par(leading: 1em) == การออกแบบ -== การสร้าง +== วัสดุอุปกรณ์ -== การทดสอบประสิทธิภาพ ++ บอร์ด ESP32 (NodeMCU) ++ กล่องพลาสติก ++ Buzzer ++ เซนเซอร์ PIR ++ เซนเซอร์ NFC 2 ชิ้น + +== ขั้นตอนการประกอบ + +=== การติดตั้งอุปกรณ์ + +=== การเขียนเฟิร์มแวร์ + +โครงงานนี้ใช้ซอฟต์แวร์ PlatformIO ในการสร้างและจัดการโปรเจกต์เฟิร์มแวร์ +โดยหากต้องการเพียงแค่เขียนเฟิร์มแวร์ลงไปยังบอร์ด ESP32 คุณจำเป็นต้องใช้ซอฟต์แวร์หลัก ๆ คือ +PlatformIO Core และ Git (ไม่จำเป็น แต่เพื่อความสะดวกสบาย) + +อย่างไรก็ตาม PlatformIO จำเป็นต้องใช้ Python เวอร์ชัน 3.6 ขึ้นไปด้วยเช่นกัน +ดังนั้นคุณจำเป็นต้องติดตั้ง Python ด้วยหากคุณยังไม่มี + +ในขั้นตอนแรก โปรดเปิดเทอร์มินัลของคุณ ซึ่งโดยทั่วไปแล้วคุณสามารถค้นหาแอพลิเคชัน "Terminal" ได้เลย +โดยบน Windows 10 เวอร์ชั่นใหม่ ๆ และ Windows 11 จะมาพร้อมกับแอพลิเคชัน Windows Terminal +อย่างไรก็ตาม เมื่อเปิดแล้ว โปรดตรวจสอบให้แน่ใจว่าคุณกำลังใช้ PowerShell และไม่ใช่ Command +Prompt + +โดยในปัจจุบัน Python เวอร์ชันล่าสุดคือ Python 3.14.2 โดยคุณสามารถติดตั้ง Python และ Git บน +Windows ได้ด้วยการใช้คำสั่งต่อไปนี้ + +```sh +winget install Python.Python.3.14 Git.Git -e -s winget +``` + +สำหรับระบบปฏิบัติการอื่นนั้น โดยปกติแล้วจะไม่ต้องติดตั้ง Python +เพิ่มเนื่องจากมีติดมากับระบบปฏิบัติการอยู่แล้ว อย่างไรก็ตาม บน Linux อาจต้องมีการติดตั้งการรองรับ +Virtual Environment แยก โดยแต่ละระบบจะมีชื่อแพคเกจไม่เหมือนกัน โดยบน Debian, Fedora, +และ Arch สามารถใช้คำสั่งต่อไปนี้ในการติดตั้งทั้ง Python Virtual Environment และ Git +พร้อมกันได้ + +```sh +# Debian +sudo apt install python3-venv git +# Fedora +sudo dnf install python3-virtualenv git +# Arch +sudo pacman -S python-virtualenv git +``` + +#pagebreak() + +#show raw.where(block: true): set block(below: 2em) + +==== การติดตั้ง PlatformIO Core ผ่านแพคเกจ + +หากคุณใช้ Fedora Linux หรือ Arch Linux (หรือลูก ๆ ของมัน) คุณสามารถติดตั้งแพคเกจ +PlatformIO ได้โดยตรง โดยมีคำสั่งดังนี้: + +```sh +# Fedora Linux +sudo dnf install platformio +# Arch Linux +sudo pacman -S platformio-core +``` + +หากคุณติดตั้งแพคเกจ Fedora นั้นแล้ว คุณไม่จำเป็นที่จะต้องติดตั้งกฎ udev ด้วยตนเอง +(ที่จะถูกกล่าวถึงใน@pioudev) + +หากคุณใช้ Arch คุณสามารถติดตั้งแพคเกจกฎ udev ได้โดยตรงโดยไม่ต้องดาวน์โหลดเอง + +```sh +sudo pacman -S --asdeps platformio-core-udev +``` + +==== การติดตั้ง PlatformIO Core ผ่านสคริปต์ + +ถัดไป ในการติดตั้ง PlatformIO Core สามารถทำได้โดยการใช้สคริปต์ติดตั้ง โดยสำหรับ `curl` +สามารถใช้คำสั่งนี้ได้: + +```sh +curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py +``` + +หรือหากต้องการใช้ `wget`: + +```sh +wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py +``` + +หรือสำหรับ PowerShell, สามารถใช้ `iwr` (หรือชื่อเต็มคือ `Invoke-WebRequest`) ได้: + +```sh +iwr -OutFile get-platformio.py -Uri https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py +``` + +(มีการเว้นบรรทัดใหม่เนื่องจากพื้นที่ไม่เพียงพอ โปรดอย่าเว้นบรรทัดเมื่อพิมพ์คำสั่งจริง) + +แล้วดังนั้นจึงใช้คำสั่ง `python3 get-platformio.py` ในการรันสคริปต์ติดตั้งที่ได้ทำการดาวน์โหลดมา + +โดยค่าเริ่มต้นแล้ว PlatformIO จะไม่เพิ่มตนเองเข้าไปยังตัวแปรสิ่งแวดล้อม PATH +ซึ่งจำเป็นในการใช้คำสั่งจากที่ใหนก็ได้โดยไม่ต้องกล่าวถึงไฟล์พาธ + +โดยสำหรับ Linux แล้วนั้น คุณต้องเพิ่ม `$HOME/.local/bin/` เข้าไปยัง PATH ของคุณ โดยหากคุณใช้ +Bash คุณสามารถแก้ไข `~/.bash_profile` และเพิ่มบรรทัดนี้เข้าไปได้: + +```sh +export PATH=$PATH:$HOME/.local/bin +``` + +หากคุณใช้ Zsh สามารถใช้โคดเดียวกันได้ เพียงแต่คุณต้องแก้ไขไฟล์ `~/.zprofile` หรือ `~/.zshrc` +แทน + +โดยบน Windows มีขั้นตอนดังนี้: + ++ กด Windows + R ++ พิมพ์ `sysdm.cpl` และกด Enter ++ ในหน้าต่าง *System Properties* คลิกไปยังแท็บ *Advanced* ++ คลิกปุ่ม *Environment Variables* + +หลังจากนั้น เลือกตัวแปร *Path* ในส่วน *User variables* แล้วจึงกด *Edit* แล้วเพิ่ม +`%USERPROFILE%\.platformio\penv\Scripts\` เข้าไปในรายการ + +==== 99-platformio-udev.rules + +ผู้ใช้ Linux จำเป็นที่จะต้องติดตั้งกฎ udev โดยสามารถดูไฟล์กฎ udev เวอร์ชันล่าสุดได้ที่\ +https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules + +*หมายเหตุ:* โปรดตรวจสอบว่า PID และ VID ของบอร์ดคุณอยู่ในไฟล์กฎนั้น โดยคุณสามารถดู PID/VID +ของบอร์ดคุณได้ผ่านคำสั่ง `pio device list` + +โดยไฟล์นั้นต้องถูกวางอยู่ที่ `/etc/udev/rules.d/99-platformio-udev.rules` (ตำแหน่งที่ดีที่สุด) +หรือ `/lib/udev/rules.d/99-platformio-udev.rules` (อาจจำเป็นสำหรับบางระบบที่พัง) + +โปรดใช้คำสั่งต่อไปนี้ในการดาวน์โหลดและวางไฟล์นั้นไว้ในสถานที่ที่ถูกต้อง: + +```sh +curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules +``` + +หรือคุณก็สามารถดาวน์โหลดไฟล์นั้นด้วยตัวเองและคัดลอกมันไปในโฟลเดอร์ที่หมายได้เช่นกัน + +```sh +sudo cp 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules +``` + +หลังจากนั้น รีสตาร์ทบริการ udev: + +```sh +sudo service udev restart +``` +หรือ: +```sh +sudo udevadm control --reload-rules +sudo udevadm trigger +``` + +หลังจากติดตั้งไฟล์นี้แล้ว ถอดสายที่เชื่อมต่อระหว่างบอร์ดและคอมพิวเตอร์ของคุณแล้วเสียบมันใหม่ + +==== การดาวน์โหลดโปรเจกต์ + +สามารถใช้ Git ในการ clone โปรเจกต์ได้ด้วยคำสั่งต่อไปนี้: + +```sh +git clone https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32.git +``` + +โดย Git นั้นจะทำการโคลนโปรเจกต์ไปที่โฟลเดอร์ `liteauth-firmware32` เนื่องจากเป็นชื่อของ Git +repository + +หรือไปที่ https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32 +และทำการคลิกปุ่ม *Code* แล้วกด *Download ZIP* หรือ *Download TAR.GZ* +แล้วทำการแตกไฟล์ได้ตามปกติ + +หลังจากนั้น ไปที่โฟลเดอร์ของคุณในเทอร์มินัลโดยใช้คำสั่ง `cd` + +==== คำสั่ง PlatformIO เบื้องต้น + +- `pio run --list-targets`: ดูรายการเป้าหมายคำสั่งรัน +- `pio run upload`: รันเป้าหมายอัพโหลด ซึ่งนี่คือคำสั่งที่คุณควรจะใช้ในการเขียนเฟิร์มแวร์ลงบนบอร์ด +- `pio device monitor`: เปิด Serial Monitor + +*หมายเหตุ:* โปรดใช้คำสั่งประเภท `pio run` ในโฟลเดอร์ของโปรเจกต์ + +== การทดสอบ + +== การวิเคราะห์ข้อมูล diff --git a/History.typ b/History.typ index c03a57d..4e0537f 100644 --- a/History.typ +++ b/History.typ @@ -35,11 +35,11 @@ row-gutter: 1em, column-gutter: 2em, [ชื่อ], [นางสาวพีรดา แสงแป้], - [เกิด], [วันที่ 8 ธันวาคม พ.ศ.255x], + [เกิด], [วันที่ 8 ธันวาคม พ.ศ.2551], [ที่อยู่], [ - บ้านเลขที่ ก หมู่ที่ ข ตำบล ค\ - อำเภอ ง จังหวัด หนองคาย + บ้านเลขที่ 218 หมู่ที่ 12 ตำบล โพธิ์ชัย\ + อำเภอ เมือง จังหวัด หนองคาย ], ) @@ -49,8 +49,8 @@ columns: 3, row-gutter: 1em, column-gutter: 2em, - [พ.ศ.25xx], [ป.6], [โรงเรียน x], - [พ.ศ.25xx], [ม.3], [โรงเรียน y], + [พ.ศ.2564], [ป.6], [โรงเรียนฮัวเคียวกงฮัก], + [พ.ศ.2567], [ม.3], [โรงเรียนปทุมเทพวิทยาคาร], [พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย], ) diff --git a/PageTemplate.typ b/PageTemplate.typ index 0df27bc..7bea5b0 100644 --- a/PageTemplate.typ +++ b/PageTemplate.typ @@ -76,3 +76,5 @@ ] #let i = h(3em) + +#let jb = linebreak(justify: true) diff --git a/References.yaml b/References.yaml index 9e6b9d0..4ed6264 100644 --- a/References.yaml +++ b/References.yaml @@ -243,28 +243,28 @@ flLinuxBuild: archPkgs: type: Web title: Arch Linux - Package Search - date: 2025-12-1 + date: 2025-12-15 language: en url: - date: 2025-12-1 + date: 2025-12-15 value: https://archlinux.org/packages/ fedoraPkgs: type: Web title: Fedora Packages - date: 2025-12-1 + date: 2025-12-15 language: en url: - date: 2025-12-1 + date: 2025-12-15 value: https://packages.fedoraproject.org/ debianPkgs: type: Web title: Debian -- Packages - date: 2025-12-1 + date: 2025-12-15 language: en url: - date: 2025-12-1 + date: 2025-12-15 value: https://www.debian.org/distrib/packages gitWindows: @@ -323,3 +323,31 @@ ghEsp32Partition: url: date: 2025-12-9 value: https://github.com/espressif/arduino-esp32/blob/2ede5ac10923afd1e3a42ce1fb41930a9de05d16/tools/partitions/default.csv + +pioPython: + type: Web + title: Install Python Interpreter + date: 2024-9-14 + publisher: PlatformIO Docs (ภายใต้ Apache License 2.0) + url: + date: 2025-12-15 + value: https://docs.platformio.org/en/latest/faq/install-python.html + +pioSysReq: + type: Web + date: 2022-5-30 + title: System Requirements + publisher: PlatformIO Docs (ภายใต้ Apache License 2.0) + url: + date: 2025-12-15 + value: https://docs.platformio.org/en/latest/core/installation/requirements.html + +pioInsScript: + type: Web + date: 2023-8-14 + title: Installer Script (Recommended) + publisher: PlatformIO Docs (ภายใต้ Apache License 2.0) + url: + date: 2025-12-15 + value: https://docs.platformio.org/en/latest/core/installation/methods/installer-script.html +