Chapter 3 & Spacing Fix
This commit is contained in:
+2
-2
@@ -27,7 +27,7 @@
|
|||||||
[ครูที่ปรึกษา], [นายภาคิน เหรียญทอง],
|
[ครูที่ปรึกษา], [นายภาคิน เหรียญทอง],
|
||||||
[ครูที่ปรึกษาร่วม], [นายวสันต์ สารคำ],
|
[ครูที่ปรึกษาร่วม], [นายวสันต์ สารคำ],
|
||||||
)
|
)
|
||||||
\ \
|
#v(2em)
|
||||||
|
|
||||||
= บทคัดย่อ
|
= บทคัดย่อ
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
[Thesis Advisor], [Mister Pakin Reanthong],
|
[Thesis Advisor], [Mister Pakin Reanthong],
|
||||||
[Thesis Co-advisor], [Mister Wasan Sarakum],
|
[Thesis Co-advisor], [Mister Wasan Sarakum],
|
||||||
)
|
)
|
||||||
\ \
|
#v(2em)
|
||||||
|
|
||||||
= Abstract
|
= Abstract
|
||||||
|
|
||||||
|
|||||||
+17
-2
@@ -1,4 +1,4 @@
|
|||||||
#import "../PageTemplate.typ": chapter-page, i
|
#import "../PageTemplate.typ": chapter-page, i, jb
|
||||||
#show: chapter-page
|
#show: chapter-page
|
||||||
#set enum(indent: 3em, numbering: n => "2." + str(n))
|
#set enum(indent: 3em, numbering: n => "2." + str(n))
|
||||||
|
|
||||||
@@ -23,4 +23,19 @@
|
|||||||
|
|
||||||
== ไมโครคอนโทรเลอร์ (Microcontroller)
|
== ไมโครคอนโทรเลอร์ (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
|
||||||
|
|||||||
@@ -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 ที่มีทั้งแบบดูอัลคอร์และแบบซิงเกิลคอร์ โปรเซสเซอร์ดูอัลคอร์\
|
#i ESP32 คือ ไมโครคอนโทรลเลอร์ราคาประหยัดและประหยัดพลังงานที่ผสานรวมความสามารถทั้ง Wi-Fi
|
||||||
Xtensa LX7 หรือ ไมโครโปรเซสเซอร์ RISC-V แบบซิงเกิลคอร์ นอกจากนี้ ESP32 ยังมีส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายสัญญาณ ตัวรับสัญญาณเสียงรบกวนต่ำ ตัวกรอง และโมดูลจัดการพลังงาน
|
และ 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 คือ
|
#i นับตั้งแต่เปิดตัว ESP32 รุ่นดั้งเดิม มีการเปิดตัวและประกาศรุ่นต่างๆ มากมาย
|
||||||
ไมโครโปรเซสเซอร์ LX6 32 บิตแบบคอร์เดี่ยว/คู่ Xtensa
|
พวกมันรวมกันเป็นไมโครคอนโทรลเลอร์ตระกูล ESP32 ชิปเหล่านี้มี CPU และความสามารถที่แตกต่างกัน
|
||||||
รองรับหน่วยจุดลอยตัวความแม่นยำเดี่ยว (FPU)
|
แต่ทั้งหมดใช้ SDK เดียวกันและส่วนใหญ่เข้ากันได้กับโค้ด นอกจากนี้ ESP32 รุ่นดั้งเดิมยังได้รับการปรับปรุง
|
||||||
ไวไฟ: 802.11b/g/n
|
และส่วนประกอบหลักของบอร์ด ESP32 คือ ไมโครโปรเซสเซอร์ LX6 32 บิตแบบคอร์เดี่ยว/คู่ Xtensa
|
||||||
บลูทูธ: v4.2 BR/EDR และ BLE (แชร์วิทยุกับ Wi-Fi) GPIO จำนวน 34 ตัว
|
รองรับหน่วยจุดลอยตัวความแม่นยำเดี่ยว (FPU) ไวไฟ: 802.11b/g/n บลูทูธ: v4.2 BR/EDR และ BLE
|
||||||
ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูงสุด 18 ช่องและ #math.equation($2 times 8$, alt: "2 คูณ 8") บิต DAC
|
(แชร์วิทยุกับ 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)
|
== ตารางพาร์ทิชัน (Partition Table)
|
||||||
|
|
||||||
#i ตารางพาร์ทิชันคือสิ่งที่กำหนดการจัดการรูปแบบหน่วยความจำแฟลชและข้อมูลต่าง ๆ จะถูกเก็บไว้ในแต่ละพาร์ทิชัน โดยผู้พัฒนาสามารถใช้รูปแบบตารางพาร์ทิชันที่ถูกกำหนดมาไว้แล้วหรือสามารถกำหนดรูปแบบตารางพาร์ทิชันเองก็ได้
|
#i ตารางพาร์ทิชันคือสิ่งที่กำหนดการจัดการรูปแบบหน่วยความจำแฟลชและข้อมูลต่าง ๆ
|
||||||
|
จะถูกเก็บไว้ในแต่ละพาร์ทิชัน
|
||||||
|
โดยผู้พัฒนาสามารถใช้รูปแบบตารางพาร์ทิชันที่ถูกกำหนดมาไว้แล้วหรือสามารถกำหนดรูปแบบตารางพาร์ทิชันเองก็ได้
|
||||||
|
|
||||||
#i โดยตารางพาร์ทัชันที่ถูกใช้ในโครงงานนี้มีรูปแบบดังนี้
|
#i โดยตารางพาร์ทัชันที่ถูกใช้ในโครงงานนี้มีรูปแบบดังนี้
|
||||||
|
|
||||||
@@ -28,31 +44,63 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง
|
|||||||
..partition-table.flatten().slice(6),
|
..partition-table.flatten().slice(6),
|
||||||
)
|
)
|
||||||
|
|
||||||
ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่:
|
ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform
|
||||||
|
อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่:
|
||||||
|
|
||||||
+ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร (ไม่มีอักขระพิเศษ)
|
+ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร
|
||||||
|
(ไม่มีอักขระพิเศษ)
|
||||||
+ *Type:* ประเภทของพาร์ทัชัน สามารถเป็น `data` หรือ `app` ได้
|
+ *Type:* ประเภทของพาร์ทัชัน สามารถเป็น `data` หรือ `app` ได้
|
||||||
- `app` คือพาร์ทิชันที่ใช้ในการเก็บแอพลิเคชัน
|
- `app` คือพาร์ทิชันที่ใช้ในการเก็บแอพลิเคชัน
|
||||||
- `data` คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
- `data` คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
||||||
+ *SubType:* ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน `app` และ `data`
|
+ *SubType:* ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน `app` และ `data`
|
||||||
- `data`
|
- `data`
|
||||||
- `ota`: พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB (0x2000 ไบต์)
|
- `ota`: พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update)
|
||||||
- `nvs`: พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory) โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์) และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64 KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า
|
โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB
|
||||||
- `coredump`: ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช โดย core dump นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)
|
(0x2000 ไบต์)
|
||||||
- `nvs_keys`: พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000)
|
- `nvs`: พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์,
|
||||||
- `fat`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling และการเข้ารหัสได้
|
และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory)
|
||||||
- `spiffs`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส
|
โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ
|
||||||
|
และการใช้งาน 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`
|
- `app`
|
||||||
- `factory`: พาร์ทิชันเก็บแอพลิเคชันเริ่มต้น โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน `ota_0` สามารถถูกใช้เป็นแอพลิเคชันเริ่มต้นได้และพาร์ทิชัน `factory` สามารถถูกนำออกได้
|
- `factory`: พาร์ทิชันเก็บแอพลิเคชันเริ่มต้น
|
||||||
- `ota_0` ถึง `ota_15`: พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1) และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค
|
โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน 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`: ใช้สำหรับการทดสอบในโรงงาน
|
- `test`: ใช้สำหรับการทดสอบในโรงงาน
|
||||||
+ *Offset:* กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset และขนาดของพาร์ทิชันก่อนหน้า \
|
+ *Offset:* กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset
|
||||||
*หมายเหตุ:* Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000) และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น *0x9000* และ *0x10000* สำหรับพาร์ทิชันแอพลิเคชันแรก
|
และขนาดของพาร์ทิชันก่อนหน้า \
|
||||||
+ *Size:* ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย `0x`), หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000
|
*หมายเหตุ:* Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000)
|
||||||
|
และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset
|
||||||
|
จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น
|
||||||
|
อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น *0x9000* และ *0x10000*
|
||||||
|
สำหรับพาร์ทิชันแอพลิเคชันแรก
|
||||||
|
+ *Size:* ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย `0x`),
|
||||||
|
หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000
|
||||||
+ *Flags:* ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่
|
+ *Flags:* ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่
|
||||||
|
|
||||||
== LittleFS
|
== LittleFS
|
||||||
#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ\ ไมโครคอนโทรลเลอร์
|
#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ#jb
|
||||||
|
ไมโครคอนโทรลเลอร์
|
||||||
|
|
||||||
#show raw: set par(leading: 0.5em)
|
#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
|
root
|
||||||
|
|||||||
+397
-5
@@ -1,18 +1,410 @@
|
|||||||
#import "PageTemplate.typ": *
|
#import "PageTemplate.typ": *
|
||||||
|
#import "@preview/fletcher:0.5.8" as fletcher: diagram, edge, node
|
||||||
|
#import fletcher.shapes: circle, diamond, pill
|
||||||
#show: chapter-page
|
#show: chapter-page
|
||||||
#set heading(numbering: "บทที่ 1")
|
#set heading(numbering: "บทที่ 1")
|
||||||
|
|
||||||
#heading([#linebreak()วิธีการดำเนินโครงงาน])
|
#heading([#linebreak()วิธีการดำเนินโครงงาน])
|
||||||
#set heading(numbering: "1.1")
|
#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 <pioudev>
|
||||||
|
|
||||||
|
ผู้ใช้ 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` ในโฟลเดอร์ของโปรเจกต์
|
||||||
|
|
||||||
|
== การทดสอบ
|
||||||
|
|
||||||
|
== การวิเคราะห์ข้อมูล
|
||||||
|
|||||||
+5
-5
@@ -35,11 +35,11 @@
|
|||||||
row-gutter: 1em,
|
row-gutter: 1em,
|
||||||
column-gutter: 2em,
|
column-gutter: 2em,
|
||||||
[ชื่อ], [นางสาวพีรดา แสงแป้],
|
[ชื่อ], [นางสาวพีรดา แสงแป้],
|
||||||
[เกิด], [วันที่ 8 ธันวาคม พ.ศ.255x],
|
[เกิด], [วันที่ 8 ธันวาคม พ.ศ.2551],
|
||||||
[ที่อยู่],
|
[ที่อยู่],
|
||||||
[
|
[
|
||||||
บ้านเลขที่ ก หมู่ที่ ข ตำบล ค\
|
บ้านเลขที่ 218 หมู่ที่ 12 ตำบล โพธิ์ชัย\
|
||||||
อำเภอ ง จังหวัด หนองคาย
|
อำเภอ เมือง จังหวัด หนองคาย
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -49,8 +49,8 @@
|
|||||||
columns: 3,
|
columns: 3,
|
||||||
row-gutter: 1em,
|
row-gutter: 1em,
|
||||||
column-gutter: 2em,
|
column-gutter: 2em,
|
||||||
[พ.ศ.25xx], [ป.6], [โรงเรียน x],
|
[พ.ศ.2564], [ป.6], [โรงเรียนฮัวเคียวกงฮัก],
|
||||||
[พ.ศ.25xx], [ม.3], [โรงเรียน y],
|
[พ.ศ.2567], [ม.3], [โรงเรียนปทุมเทพวิทยาคาร],
|
||||||
[พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย],
|
[พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -76,3 +76,5 @@
|
|||||||
]
|
]
|
||||||
|
|
||||||
#let i = h(3em)
|
#let i = h(3em)
|
||||||
|
|
||||||
|
#let jb = linebreak(justify: true)
|
||||||
|
|||||||
+34
-6
@@ -243,28 +243,28 @@ flLinuxBuild:
|
|||||||
archPkgs:
|
archPkgs:
|
||||||
type: Web
|
type: Web
|
||||||
title: Arch Linux - Package Search
|
title: Arch Linux - Package Search
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
language: en
|
language: en
|
||||||
url:
|
url:
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
value: https://archlinux.org/packages/
|
value: https://archlinux.org/packages/
|
||||||
|
|
||||||
fedoraPkgs:
|
fedoraPkgs:
|
||||||
type: Web
|
type: Web
|
||||||
title: Fedora Packages
|
title: Fedora Packages
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
language: en
|
language: en
|
||||||
url:
|
url:
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
value: https://packages.fedoraproject.org/
|
value: https://packages.fedoraproject.org/
|
||||||
|
|
||||||
debianPkgs:
|
debianPkgs:
|
||||||
type: Web
|
type: Web
|
||||||
title: Debian -- Packages
|
title: Debian -- Packages
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
language: en
|
language: en
|
||||||
url:
|
url:
|
||||||
date: 2025-12-1
|
date: 2025-12-15
|
||||||
value: https://www.debian.org/distrib/packages
|
value: https://www.debian.org/distrib/packages
|
||||||
|
|
||||||
gitWindows:
|
gitWindows:
|
||||||
@@ -323,3 +323,31 @@ ghEsp32Partition:
|
|||||||
url:
|
url:
|
||||||
date: 2025-12-9
|
date: 2025-12-9
|
||||||
value: https://github.com/espressif/arduino-esp32/blob/2ede5ac10923afd1e3a42ce1fb41930a9de05d16/tools/partitions/default.csv
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user