โปรเจกต์ DIY Rotating LED Display - Arduino ในแบบที่ดีที่สุด
อุปกรณ์ขนาดเท่า CD ที่แสดงผลเวลาและข้อมูลสภาพอากาศแบบ online พร้อมระบบจ่ายไฟและควบคุมแบบไร้สาย
อุปกรณ์ขนาดเท่า CD ที่แสดงผลเวลาและข้อมูลสภาพอากาศแบบ online พร้อมระบบจ่ายไฟและควบคุมแบบไร้สาย
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
Project Supporter Team
โพสต์โดย
Rotating Display คืออุปกรณ์ขนาดเท่ากับแผ่น Compact Disk ที่หมุนได้อย่างเงียบสนิทโดยใช้ CD Motor มี LED จำนวน 40 ดวงสำหรับแสดงผลข้อมูลเวลาและสภาพอากาศที่ดึงมาจาก Internet อุปกรณ์นี้ใช้พลังงานแบบไร้สายและควบคุมผ่าน Web Interface ที่ใช้งานง่าย โดยใช้ Microcontrollers ชนิด Arduino Nano และ ESP-01s และประกอบได้ง่าย
อุปกรณ์ Rotating Display ประกอบด้วยสองส่วนหลัก คือ ชุด Power Supply และ Display Board (Figure 1) ทั้งคู่มีการออกแบบเป็นวงกลมโดยมีเส้นผ่านศูนย์กลาง 120 มม. ซึ่งเท่ากับขนาดของแผ่น Compact Disk มาตรฐาน Display Board จะถูกหมุนโดย CD Motor พลังงานจะถูกส่งแบบไร้สายจากชุด Power Supply ไปยัง Display Board ทำให้ไม่ต้องมีการเชื่อมต่อด้วยสายไฟ

Figure 1: การประกอบ Rotating Display PCB แผ่นล่างคือชุด Power Supply พร้อมระบบส่งพลังงานไร้สาย ส่วน PCB แผ่นบนคือ Display Board
Display Board ติดตั้ง LED สองแถว แถวละ 20 ดวง รวมทั้งหมดเป็น 40 LED สำหรับใช้ในการแสดงรูปภาพ การทำงานของ LED ถูกควบคุมโดย Arduino Nano ในขณะที่ ESP-01s Microcontroller จะทำหน้าที่สร้างเนื้อหาที่จะแสดงผล โดย ESP-01s จะเชื่อมต่อ Wi-Fi กับ Internet เพื่อจุดประสงค์นี้
การเชื่อมต่อ Internet ช่วยให้อุปกรณ์สามารถดึงเวลาจาก Time Server เพื่อให้มั่นใจในความแม่นยำของเวลา และยังสามารถดึงข้อมูลสภาพอากาศได้อีกด้วย การทำงานของอุปกรณ์ถูกจัดการผ่าน Web Interface (Figure 2) ซึ่งเข้าถึงได้จาก Web Browser ใดก็ได้ Interface นี้ช่วยให้ผู้ใช้จัดการข้อมูล Login, อัปโหลดไฟล์ภาพไปยังจอแสดงผล และควบคุมไฟล์ภาพรวมถึงไฟล์ Configuration ต่างๆ ผ่าน File Manager



Figure 2: Web User Interface ช่วยให้เลือก Operating Mode และตั้งค่าอุปกรณ์ได้
มีวิดีโอเกี่ยวกับ Rotating Display ให้ชมบน YouTube:
เมื่อเปิดเครื่อง อุปกรณ์จะพยายามเชื่อมต่อกับ Wi-Fi ที่รู้จัก หากไม่พบข้อมูล Wi-Fi ที่ถูกต้อง อุปกรณ์จะถูกกำหนดค่าเป็น Wi-Fi Access Point ในโหมดนี้ คุณสามารถเชื่อมต่อคอมพิวเตอร์หรืออุปกรณ์มือถือเข้ากับอุปกรณ์ได้โดยตรง (SSID: RD40, ไม่มีรหัสผ่าน)
เมื่อสร้างการเชื่อมต่อ Wi-Fi แล้ว อุปกรณ์จะแสดง IP Address บนหน้าแรกของอุปกรณ์ (Figure 3) ให้ป้อนที่อยู่นี้ใน Web Browser ของคุณ เพื่อโหลด Web User Interface และกำหนดค่า Wi-Fi ในพื้นที่ของคุณ

Figure 3: หน้า Home Page
มี Operating Mode หลายรูปแบบที่แสดงเวลาและข้อมูลสภาพอากาศ (Figure 4) โหมดนาฬิกาแบบโลโก้จะรวมภาพที่กำหนดเองได้เข้ากับหน้าปัดนาฬิกา ภาพนี้สามารถอัปโหลดได้อย่างง่ายดายจาก User Interface เช่นเดียวกับนาฬิกาแบบ Analog ที่ใช้หน้าปัดนาฬิกาที่ปรับแต่งได้เป็นพื้นหลัง

Figure 4: Operating Modes สามารถเลือกและตั้งค่าโหมดต่างๆ ได้ผ่าน Web Interface
อุปกรณ์ประกอบด้วยสองส่วนคือ Power Supply และ Display โดยแผ่น Power Supply Board ยังทำหน้าที่เป็นแผ่นฐาน ซึ่งสามารถวางบนพื้นราบหรือแขวนบนผนังได้ CD Motor มาตรฐานจะถูกใส่ผ่านช่องในบอร์ดนี้ เพื่อให้ถาด CD ด้านบนบอร์ดสามารถรองรับชุด Display ได้ Display Board จะถูกยึดด้วยสกรู M2 สองตัว นอกจากนี้ แผ่นฐานยังมี Potentiometer เพื่อควบคุมความเร็วของ Motor และสวิตช์เปิด/ปิดสำหรับ Motor

Figure 5: Power Supply Board พร้อม CD Motor (กลาง), แจ็คจ่ายไฟ 12V (ด้านล่าง) และ Potentiometer ปรับความเร็ว
ข้อกำหนดที่สำคัญสำหรับ Display Board คือจุดศูนย์กลางมวลของชุดอุปกรณ์จะต้องอยู่ตรงกลางพอดีบนแกนหมุนของ Motor นี่เป็นวิธีเดียวที่จะทำให้การหมุนของจอแสดงผลราบรื่นและไม่มีการสั่นสะเทือน เพื่อให้บรรลุเป้าหมายนี้ อุปกรณ์อิเล็กทรอนิกส์จึงถูกจัดวางให้สมมาตรที่สุดเท่าที่จะเป็นไปได้กับแกนสมมาตรแนวตั้งใน **Figure 7** ซึ่งเบื้องต้นจะช่วยให้จุดศูนย์ถ่วงอยู่บนแกนแนวตั้งนี้ อย่างไรก็ตาม เนื่องจากอุปกรณ์ต่างๆ ไม่สามารถกระจายตัวให้สมมาตรกับแกนแนวนอนได้ จึงต้องเลื่อนจุดศูนย์ถ่วงไปยังจุดกึ่งกลางตามแกนนี้โดยใช้ตุ้มน้ำหนักถ่วง (Balancing weights) เพื่อจุดประสงค์นี้ จึงมีการใช้สกรู M2x6mm สองตัวพร้อมน็อตตัวเมียสองตัววางไว้ที่ด้านซ้ายและขวาของ Arduino Nano ผลการถ่วงน้ำหนักออกมาดีมาก แต่แน่นอนว่ายังสามารถปรับแต่งให้ดียิ่งขึ้นได้

Figure 6: Display Board ส่วนประกอบหลักคือแถว LED สองแถว, ชิป Serial Shift Register 5 ตัว และ Microcontrollers สองตัว (Arduino Nano และ ESP-01s) ที่ด้านหลังของบอร์ดจะมีขดลวด Secondary Coil ของชุดจ่ายไฟไร้สายติดตั้งอยู่

Figure 7: ส่วนประกอบของ Display Board ถูกจัดวางให้สมมาตรกับแกนสมมาตรแนวตั้ง ดังนั้นจุดศูนย์ถ่วงจึงตั้งอยู่บนแกนนี้ ส่วนตำแหน่งแนวตั้งของจุดศูนย์ถ่วงจะถูกปรับให้อยู่ตรงกลางโดยใช้ตุ้มน้ำหนักสำหรับปรับแต่ง
แถว LED ทั้งสองแถวประกอบด้วย LED ทรงสี่เหลี่ยมแยกชิ้น แถวละ 20 ดวง แต่ละชิ้นมีความกว้าง 2 มม. และสามารถเรียงต่อกันได้โดยไม่มีช่องว่าง อย่างไรก็ตาม พื้นที่เปล่งแสงของ LED มีเส้นผ่านศูนย์กลางเพียงประมาณ 1 มม. ดังนั้นจึงมีช่องว่าง 1 มม. ระหว่างจุดแสง เพื่อเติมเต็มช่องว่างเหล่านี้ จึงมีการใช้ LED แถวที่สอง โดยจะวางเอียง 90 องศาตามมุมการหมุน ในแนวรัศมี แถว LED ทั้งสองจะถูกเลื่อนออกจากกัน 1 มม. ทำให้เกิดรูปแบบจุดที่ไม่มีช่องว่าง (Figure 8)

Figure 8: แถว LED ทั้งสองแถว ถูกเลื่อนออกไปในแนวรัศมีครึ่งหนึ่งของความกว้าง LED
LED จะต้องส่งข้อมูลภาพในตำแหน่งที่ถูกต้องพอดีในแต่ละการหมุน สำหรับการจัดตำแหน่งภาพในพื้นที่ จะมีการสร้างสัญญาณ Trigger ที่ตำแหน่งที่กำหนดไว้สำหรับการหมุนแต่ละรอบ ซึ่งจะกระตุ้นการส่งข้อมูล Pixel ออกมาตามจังหวะที่กำหนด สัญญาณ Trigger จะต้องมีความเสถียรมาก มิฉะนั้นจะไม่สามารถสร้างภาพที่นิ่งได้ จากผลการทดสอบพบว่า Hall Sensor เหมาะที่สุดสำหรับจุดประสงค์นี้ โดยติดตั้งอยู่ใต้ Arduino Nano (ดู Figure 6, ภาพขวา, ขอบด้านล่างของ PCB) ส่วนแม่เหล็กจะถูกติดไว้ในรูของ Power Supply PCB (ดู Figure 5, ภาพซ้าย, ตำแหน่ง 4 นาฬิกา)
การกระจายวงจรอิเล็กทรอนิกส์ระหว่างสองส่วนแสดงอยู่ใน **Figure 9** ชุด Power Supply ประกอบด้วย Royer Converter สำหรับการส่งพลังงานไร้สายไปยังชุด Display และส่วนปรับความเร็ว Motor ส่วน LED ทั้ง 40 ดวงของชุด Display ถูกควบคุมโดย Shift Register 5 ตัว (ตัวละ 8 Bits) ซึ่งจะรับสัญญาณ Clock และ Data จาก Arduino Nano ผ่านทาง SPI Interface เนื้อหาที่แสดงผลจะถูกสร้างโดย ESP-01s Microcontroller ซึ่งเชื่อมต่อกับ Internet ผ่าน Wi-Fi และส่งข้อมูลไปยัง Arduino Nano ผ่าน I2C Interface

Figure 9: ผังวงจรอิเล็กทรอนิกส์
หัวใจสำคัญของ Power Supply คือ Royer Converter สำหรับการส่งพลังงานไร้สาย บทความที่ยอดเยี่ยมเกี่ยวกับการทำงานและการออกแบบวงจรสามารถพบได้ที่ Mikrocontroller.net (ภาษาเยอรมัน) และวงจรนี้ก็นำมาจากที่นั่น Transistors สองตัวจะสลับกันทำงาน (Push-Pull Operation) เพื่อให้กระแสไหลผ่านขดลวดทีละข้าง ขดลวดนี้เป็นส่วนหนึ่งของวงจร Resonance ที่มีความถี่ประมาณ 120 kHz แรงดันควบคุมสำหรับ Transistors จะได้รับผ่านขดลวด Coupling Coil (Figure 10) ส่วนขดลวด Secondary Coil จะอยู่ใต้ Display Board (Figure 6, ขวา)
วงจร Royer ใช้ส่วนประกอบน้อยมาก อย่างไรก็ตาม ตัวขดลวดค่อนข้างซับซ้อน มันคือขดลวดแบบ Bifilar ที่มีสองส่วนพันสลับกัน นอกจากนี้ขดลวด Coupling Coil จะต้องเชื่อมต่อให้ถูกขั้ว มิฉะนั้น Transistors ทั้งสองจะพัง ในช่วงแรกของการพัฒนา ขดลวดถูกพันด้วยลวดทองแดง อย่างไรก็ตามวิธีนี้ทำซ้ำได้ยาก ดังนั้นในการออกแบบขั้นสุดท้าย ขดลวด (Bifilar Primary Coil, Coupling Coil, Secondary Coil) จึงถูกทำขึ้นเป็นลายวงจรบน PCB (ดู Figure 5, ซ้าย และ Figure 6, ขวา) พบว่าวงจรนี้มีประสิทธิภาพในการส่งพลังงานสูงอย่างน่าประหลาดใจและเพียงพอต่อการใช้งาน แม้ว่าค่า Quality Factor ของขดลวดบน PCB จะด้อยกว่าปกติ Royer Converter พร้อมชุดขดลวดบน PCB นี้ปลอดภัยอย่างยิ่งสำหรับการนำไปสร้างตาม

Figure 10: Royer converter อ้างอิงจาก Mikrocontroller.net
นอกจากนี้ยังมีวงจรสำหรับจ่ายไฟให้ CD Motor บน Power Supply Board (Figure 11) โดยใช้ Voltage Regulator เบอร์ LM317 เพื่อสร้างแรงดันไฟฟ้าที่ปรับค่าได้ระหว่าง 1.7V ถึง 6.0V ผ่าน Potentiometer ช่วงแรงดันนี้สอดคล้องกับช่วงการทำงานที่กำหนดของ CD Motor การจ่ายไฟให้ Motor สามารถขัดจังหวะได้ด้วยสวิตช์ ตัวอย่างเช่น เพื่อให้สามารถทำการโปรแกรม Microcontrollers ได้

Figure 11: ชุดควบคุมแรงดันไฟฟ้าแบบปรับค่าได้ สำหรับขับ CD Motor
LED ทั้ง 40 ดวงบน Display Board ถูกขับเคลื่อนด้วย 8-bit Shift Registers จำนวน 5 ตัวต่อพ่วงกัน (Figure 12) Register จะโหลดกระแสข้อมูล Serial จาก SPI Interface ของ Arduino Nano ซึ่งซิงโครไนซ์กับ SPI Clock (SRCK) และสลับรูปแบบขนานไปยัง LED เมื่อมีการส่งสัญญาณขอบขาขึ้นไปยัง Register Clock (RCK) Shift Register เบอร์ TIPC6C595 มีเอาต์พุตแบบ Open Drain DMOS กระแส LED ถูกตั้งไว้ที่ 20mA ต่อดวง ดังนั้นกระแสสูงสุดต่อ Register คือ 160mA ซึ่งอยู่ในเกณฑ์ที่กำหนด ความสว่างของ LED สามารถควบคุมได้ผ่าน Duty Cycle โดยใช้อินพุต Output Enable (G) ของ Register เฉพาะเมื่ออินพุตนี้เป็น Low เท่านั้น เอาต์พุต DMOS ของ Register จึงจะทำงาน
SPI Interface ทำงานด้วยความเร็ว Clock 16 MHz ดังนั้นข้อมูล 40 Bits จะถูกโอนถ่ายในเวลา 40 x 1/16MHz = 2.5µs หากสมมติว่าความเร็วในการหมุนสูงสุดของหน้าจอคือ 2000 RPM จะเท่ากับ 30ms ต่อการหมุนหนึ่งรอบ ในการหมุนหนึ่งรอบเต็ม LED แต่ละดวงจะแสดงผล 240 Pixels ซึ่งเท่ากับ 125µs ต่อ Pixel ดังนั้นเวลาในการรับส่งข้อมูลผ่าน SPI Bus (2.5µs) จึงสั้นกว่าเวลาที่ใช้แสดงผลต่อ Pixel อย่างมาก

Figure 12: ผังวงจรของ Display Board ผังวงจรนี้มีให้ดาวน์โหลดและอยู่ใน Github ด้วย
แนวคิดในการใช้ Microcontrollers สองตัว (Arduino Nano และ ESP-01s) คือการแยกส่วน Timing ที่วิกฤตมากของการควบคุม LED ออกจากการสร้างภาพและการสื่อสาร Internet ที่ต้องใช้การประมวลผลสูงและทำงานแบบ Asynchronous ด้วยวิธีนี้ Arduino จะได้รับภาระน้อยที่สุดและการแสดงภาพจะมีความเสถียรอย่างมาก
Software ของ Arduino ที่เขียนด้วยภาษา C ประกอบด้วย Interrupt Routines สั้นๆ สองชุด Routine แรก (INT0) จะถูกกระตุ้นโดย Hall Sensor หนึ่งครั้งต่อการหมุนหนึ่งรอบเต็ม (Figure 13) Routine นี้จะเริ่มการทำงานของ Timer 1 ซึ่งกำหนดระยะเวลาที่จะแสดง Pixel แต่ละแถว เมื่อ Timer หมดเวลา มันจะเริ่มใหม่โดยอัตโนมัติและกระตุ้น Interrupt Routine ชุดที่สอง (INT1) ใน Routine ชุดที่สองนี้ รูปแบบ Bit ของ LED จะถูกอัปเดต ด้วยวิธีนี้รูปแบบ LED ใหม่จะปรากฏขึ้นทุกครั้งที่ Timer 1 หมดเวลา สิ่งสำคัญคือ Timer 1 จะต้องเริ่มใหม่โดยอัตโนมัติ (ควบคุมด้วย Hardware) มิฉะนั้นอาจเกิดความล่าช้าหาก Processor ไม่สามารถเริ่ม Interrupt Routine ได้ทันที (เช่น มี Routine อื่นขวางอยู่)
ฟังก์ชันที่สำคัญอีกอย่างคือการตั้งค่าระยะเวลาของ Timer 1 เพื่อให้ส่งแถว Pixel ออกมาได้ครบ 240 แถวต่อรอบ เพื่อจุดประสงค์นี้ ตัวแปร "tpt" (Time Per Turn) จะเพิ่มขึ้นตามค่าที่ตั้งไว้ของ Timer 1 ในการเรียก INT1 แต่ละครั้ง Routine INT0 สามารถอ่านค่า tpt และทำให้ทราบระยะเวลาที่แน่นอนของการหมุนหนึ่งรอบ แม้ว่ามันจะประกอบด้วยรอบของ Timer 1 มากกว่าหรือน้อยกว่า 240 รอบก็ตาม จากนั้นค่า Time Per Pixel ใหม่ (tpt/240) จะถูกคำนวณจากค่านี้และ Timer 1 จะถูกตั้งค่าตามนั้น
ในการควบคุมความสว่างของ LED จะใช้ฟังก์ชัน Threshold ของ Timer 1: ทันทีที่ค่าเกิน Threshold ที่โปรแกรมไว้ เอาต์พุตของ Arduino จะสลับสถานะ สัญญาณนี้จะใช้ในการเปิด LED ตามเวลาที่เลือก หลักการนี้คล้ายกับ Pulse Width Modulation ที่รู้จักกันดี อย่างไรก็ตาม Pulse จะถูกซิงโครไนซ์กับ Pixel Clock

Figure 13: Arduino Interrupt Timing Timer 1 ทำหน้าที่กำหนดจังหวะการส่ง Pixel และตั้งค่าความสว่างของ LED
Microcontroller ESP-01s มีโมดูล Wi-Fi สำหรับการสื่อสาร Internet และมีขา Input/Output ที่โปรแกรมได้เพียงสองขา โมดูลนี้ถูกวางไว้ที่ขอบของ Display Board เนื่องจากสนามรบกวนจากชุดจ่ายไฟไร้สายจะต่ำที่สุดที่บริเวณนั้น ในบอร์ดเวอร์ชันก่อนหน้า โมดูลถูกวางไว้ตรงกลางบอร์ด ซึ่งทำให้คอนโทรลเลอร์ทำงานผิดปกติในลักษณะที่ตีความได้ยาก ซึ่งเห็นได้ชัดว่าเกิดจากการรบกวนของชุดจ่ายไฟไร้สาย ปัญหานี้ได้รับการแก้ไขอย่างสมบูรณ์ในเวอร์ชันล่าสุดของหน้าจอนี้
แม้ว่าจะเป็นที่กังวลในช่วงเริ่มต้นของการพัฒนา แต่กลับกลายเป็นว่าการหมุนที่รวดเร็วของจอแสดงผลไม่ได้ทำให้การเชื่อมต่อ Wi-Fi ด้อยลงอย่างเห็นได้ชัด
Arduino Nano สามารถโปรแกรมผ่านพอร์ต Mini-USB ในระหว่างการโปรแกรม สามารถปิดสวิตช์จ่ายไฟของจอแสดงผลได้ (แต่ไม่จำเป็น)
การโปรแกรม ESP-01 จะยุ่งยากกว่าเล็กน้อย เนื่องจากไม่มี USB Level Converter ในตัว ดังนั้นที่ด้านล่างของ Microcontroller จึงมีคอนเน็กเตอร์ตัวเมีย 6 ขา สำหรับเชื่อมต่อกับ FT232 Level Converter โปรดสังเกตทิศทางที่ถูกต้องของ FT232! จะมีภาพขนาดเล็กข้างคอนเน็กเตอร์แสดงทิศทางที่ถูกต้อง Microcontoller ไม่สามารถรับไฟจากคอมพิวเตอร์ในระหว่างการโปรแกรมได้ ดังนั้นจึงต้องเปิดสวิตช์จ่ายไฟของจอแสดงผล ก่อนทำการโปรแกรม ต้องเสียบ Jumper ที่ตำแหน่ง "P" จากนั้นกดปุ่ม Reset ข้างคอนโทรลเลอร์เพื่อให้เข้าสู่ Programming Mode ตอนนี้สามารถเริ่มอัปโหลดบนคอมพิวเตอร์ได้ หลังจากนั้นให้ย้าย Jumper กลับไปยังตำแหน่งเดิมและ Restart ระบบ
โปรดทราบว่าโค้ดโปรแกรมและเนื้อหาใน Flash Disk (โดยเฉพาะโค้ดของหน้า Internet) จะต้องถูกโหลดแยกกัน Tutorial ที่ดีเกี่ยวกับวิธีการโหลด Flash Disk ด้วย Visual Studio Code และ PlatformIO สามารถดูได้ที่: randomnerdtutorials.com
ESP-01s ทำหน้าที่สร้างข้อมูลภาพและส่งไปยัง Arduino Nano (วินาทีละครั้ง) ข้อมูลที่แสดงผล (เวลาและสภาพอากาศ) จะถูกดึงมาจาก Internet นอกจากนี้ Microcontroller ยังทำหน้าที่เป็น HTML Web Server อย่างง่ายที่สามารถเข้าถึงได้โดย Browser ใดก็ได้เพื่อควบคุมการแสดงผล
แม้ว่าความละเอียดของหน้าจอที่ทำได้ด้วย LED 40 ดวงจะค่อนข้างต่ำ แต่ก็เพียงพอที่จะแสดงรูปภาพและข้อความในแนวตั้ง ไม่บิดเบี้ยว และอ่านง่าย ข้อมูลภาพถูกสร้างขึ้นใน Pixel Matrix สี่เหลี่ยม (นั่นคือระบบพิกัด Cartesian) ขนาด 110 x 110 Pixels (Figure 14) จากนั้น Bitmap นี้จะต้องถูกแปลงเป็นระบบพิกัด Polar ของแถว LED ที่หมุนอยู่ ก่อนที่จะถูกส่งไปยัง Arduino เพื่อให้การแปลงรวดเร็วขึ้น จึงมีการใช้ Lookup Table ซึ่งจะแปลงพิกัด x, y ของ Bitmap เป็นพิกัด r, theta ของแถว LED ที่หมุน การแปลงยังพิจารณาถึงลำดับการสลับของ LED ระหว่างสองแถวและมุม 90 องศาระหว่างสองแถวด้วย

Figure 14: จอแสดงผลจัดการ Bitmap ขนาด 110x110 Pixel ซึ่งจะถูกแปลงเป็นระบบพิกัด Polar สำหรับแถว LED ที่หมุน
สำหรับการสร้าง Web Server จะใช้ Library ชื่อ ESPAsyncWebServer ซึ่งมีข้อดีคือกิจกรรมของ Server จะทำงานเป็น Background แยกจากโปรเซสอื่นๆ ที่รันพร้อมกันบนคอนโทรลเลอร์ Server จะดึงข้อมูล HTML, CSS และ JS ของหน้าเว็บที่แสดงผลจากระบบไฟล์ภายใน (LittleFS) ของ Microcontroller ดังนั้นหน้าเว็บและ Server จึงสามารถพัฒนาแยกกันได้ การดึงหรือแก้ไขข้อมูลทำได้โดยใช้วิธี HTTP GET และ POST
พารามิเตอร์บางอย่าง (ความสว่างของ LED, Operating Mode ของจอแสดงผล) สามารถตั้งค่าได้ผ่าน Web Interface นอกจากนี้ ข้อมูล Configuration เช่น ข้อมูลการเข้าถึงบริการสภาพอากาศ openweather.org หรือข้อมูล Wi-Fi สามารถแก้ไขและบันทึกได้ ข้อมูลเหล่านี้จะถูกเก็บไว้ในระบบไฟล์ LittleFS ของ ESP-01 เช่นกัน ดังนั้นจึงยังคงอยู่หลังจากการ Reboot
ระบบไฟล์ LittleFS ช่วยให้สามารถจัดระเบียบไฟล์ในโครงสร้างไดเรกทอรีและเก็บไว้ใน Flash Disk ของ Microcontroller ส่วน User Interface ของอุปกรณ์มี File Browser ที่สามารถอัปโหลดไฟล์จากอุปกรณ์ปลายทาง (เช่น มือถือ) ไปยัง Microcontroller หรือดาวน์โหลดจาก Microcontroller ได้ ซึ่งมีความสำคัญอย่างยิ่งต่อการโหลดข้อมูลภาพไปยังอุปกรณ์ นอกจากนี้ ยังสามารถลบ เปลี่ยนชื่อ และย้ายไฟล์รวมถึงไดเรกทอรีทั้งหมดได้ ซึ่งช่วยให้การจัดระเบียบ Flash Disk ง่ายขึ้นมาก
Software ของ ESP-01 เขียนด้วย C++ เพื่อให้รักษาภาพรวมได้แม้มันจะมีปริมาณมาก ส่วนฟังก์ชันและข้อมูลต่างๆ จึงถูกแบ่งออกเป็น Classes ต่อไปนี้คือคำอธิบายสั้นๆ ของ Classes ที่สำคัญที่สุด:
Class RD40
Class นี้ทำหน้าที่เป็น Object ศูนย์กลางของจอแสดงผลแบบหมุน มันจัดการข้อมูล (ส่วนตัว) ของภาพที่แสดงผล (หนึ่ง Bit ต่อ LED) Class นี้มี Methods สำหรับแสดง Bitmaps และสำหรับการส่งข้อมูลไปยังคอนโทรลเลอร์ของจอแสดงผล
Class myBMP
Class นี้สร้าง Bitmaps ขนาด 110x110 Bit สำหรับการแสดงผล โดยใช้ Private Methods ในการเขียนข้อความลงบน Bitmap, วาดเส้นและวงกลม หรือโหลดรูปภาพ
Class WebInterface
Class นี้จัดการ Web User Interface เมื่อ Object webInterface ถูกสร้างขึ้น Web Server จะทำงานเป็น Background โดยไม่จำเป็นต้องได้รับความสนใจจาก Software อื่น Class นี้มี Attributes บางอย่าง เช่น clockMode และ brightness ซึ่งถูกจัดการโดย Web Interface ผู้ใช้สามารถเปลี่ยนข้อมูล Configuration ผ่าน Web Interface ได้ จากนั้นข้อมูลจะถูกบันทึกเป็นไฟล์พารามิเตอร์ใน Flash Disk
เนื่องจากตัวผมเองไม่ได้เป็น Software Engineer โค้ดต้นฉบับนี้ย่อมจะได้รับประโยชน์หากมีการทำ Code Review และแก้ไขปรับปรุง
Visual Studio Code พร้อมส่วนขยาย PlatformIO ถูกใช้เป็นสภาพแวดล้อมในการพัฒนา สามารถใช้สำหรับ Compile โค้ด C ของ Arduino Nano, โค้ด C++ ของ ESP-01s รวมถึงการพัฒนาโค้ดของหน้าเว็บ
ในบทความนี้จะให้คำอธิบายการประกอบเพียงคร่าวๆ อย่างไรก็ตาม มีคำอธิบายที่ครอบคลุมกว่านั้นใน instructables.com ข้อมูลที่จำเป็นทั้งหมด เช่น โค้ดต้นฉบับ, ผังวงจร, Layout ของแผ่นวงจรพิมพ์, รายการอุปกรณ์ทั้งหมด และแหล่งจัดซื้อรวมอยู่ใน Github Repository ของผม ข้อมูลเหล่านี้สามารถนำไปใช้เพื่อวัตถุประสงค์ที่ไม่ใช่เชิงพาณิชย์ เช่น สำหรับนักประดิษฐ์หรืองานด้านการศึกษา ไม่ว่าจะเป็นการสร้างตามหรือพัฒนาต่อยอดก็ตาม อย่างไรก็ตาม โปรดปฏิบัติตามเงื่อนไขของ License ด้วย
อุปกรณ์ส่วนใหญ่ใช้ส่วนประกอบมาตรฐานที่หาได้ง่าย ข้อยกเว้นเพียงอย่างเดียวอาจจะเป็น LED และ Shift Register (TIPC6C595, Texas Instruments) LED สามารถซื้อได้จาก LED1.de (ราคา 0.32 ยูโรต่อชิ้น เมื่อซื้อ 50 ชิ้นขึ้นไป) Shift Register มีจำหน่ายในปริมาณมากจาก DigiKey ณ เวลาที่เขียนบทความนี้ ส่วนแผ่นวงจรพิมพ์ถูกผลิตที่ Aisler.net
ต่อไปนี้คือคำแนะนำบางประการสำหรับการประกอบ การประกอบนั้นง่าย โดยเฉพาะอย่างยิ่งเนื่องจากใช้เฉพาะส่วนประกอบแบบ Through-hole เกือบทั้งหมด อย่างไรก็ตาม ยังคงต้องมีทักษะการบัดกรีที่ดี อุปกรณ์นี้อาจจะเหมาะสำหรับโปรเจกต์เริ่มต้นในระดับปานกลางเท่านั้น

Figure 15: เริ่มจากการประกอบ Power Supply Board ใส่และบัดกรีอุปกรณ์อิเล็กทรอนิกส์ทั้งหมด หลังจากนั้นใส่ CD Motor จากด้านบัดกรีและยึดด้วยกาว Epoxy สองส่วนที่เซตตัวเร็ว

Figure 16: น็อต M2 สองตัวถูกทากาวติดไว้ใน CD Tray PCB โดยจะติดด้วยเทปกาวสองหน้าเข้ากับด้านหลังของถาด CD Motor สามารถใช้สกรู M2 สองตัวเพื่อช่วยจัดตำแหน่ง PCB ให้ถูกต้อง

Figure 17: ยางรองกันกระแทกจะถูกทากาวติดเข้ากับปลายของโบลต์ยาว 20 มม. ด้วยกาว Epoxy จากนั้นแม่เหล็กจะถูกทากาวติดเข้ากับรูที่เตรียมไว้ ข้อควรระวัง: ทิศทางของแม่เหล็กที่ถูกต้อง (หันด้านที่ถูกขึ้นข้างบน) มีความสำคัญมาก! ตรวจสอบให้แน่ใจว่าอุปกรณ์ทำงานได้ถูกต้องก่อนจะทากาวติดแม่เหล็ก!

Figure 18: ดำเนินการต่อด้วยการประกอบ Display Board ขั้นแรกให้เตรียม LED โดยการตัดขาให้สั้นลง ใส่เข้าไปทีละแถว ยึด LED ไว้ด้วยเทปกาวก่อนทำการบัดกรี หมายเหตุ: ต้องใส่ LED ให้ถูกทิศทาง ใช้รูปภาพเป็นตัวอ้างอิงเพื่อระบุขา Cathode และ Anode ของอุปกรณ์ สังเกตเครื่องหมายบน PCB (A = Anode, K = Cathode)

Figure 19: หมายเหตุ: Hall Sensor เป็นอุปกรณ์ชิ้นเดียวที่เสียบผ่านรูจากด้านบัดกรี! จำเป็นต้องติดตั้งก่อนใส่ Arduino Nano เนื่องจาก Hall Sensor จะถูกบัดกรีที่ด้านอุปกรณ์ของ PCB

Figure 20: เมื่อติดตั้งอุปกรณ์ทั้งหมดแล้ว สามารถติดตั้ง PCB ขดลวด Secondary Coil โดยใช้หมุด 4 ตัว
จอแสดงผลแบบหมุนทำงานตามหลักการที่เรียบง่าย อย่างไรก็ตาม การพัฒนาอุปกรณ์ Rotating Display นี้ก่อให้เกิดความท้าทายทางวิศวกรรมที่น่าสนใจมากมาย การหาคำตอบสำหรับปัญหาเหล่านี้ไม่เพียงแต่น่าสนใจมาก แต่ยังเป็นโอกาสในการเรียนรู้เทคโนโลยีที่หลากหลายอีกด้วย และท้ายที่สุดแล้ว มันเป็นความท้าทายทางสติปัญญาที่ผมสนุกกับมันมาก
สิ่งที่น่าสนใจคือ:
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้