โปรเจกต์ Mega Solar Tracker
พัฒนาต่อยอดให้ดียิ่งขึ้น! โดยนำบทเรียนที่ได้รับจาก tracker computer เครื่องแรกมาปรับใช้ เราได้รวมทุกอย่างไว้ใน code นี้
พัฒนาต่อยอดให้ดียิ่งขึ้น! โดยนำบทเรียนที่ได้รับจาก tracker computer เครื่องแรกมาปรับใช้ เราได้รวมทุกอย่างไว้ใน code นี้
สำหรับใครที่ยังไม่ได้อ่านเรื่องราวส่วนแรก.
เนื่องจากใกล้ถึงเวลาที่ผมต้องปรับปรุงหรือยกเครื่องเจ้า "ฝาแฝด" นี้แล้ว ด้วยเหตุผลทางกลไก ตัวเลือกที่ชัดเจนที่สุดคือควรเริ่มจากหอคอยทิศใต้ก่อน เพราะมันถูกสร้างขึ้นด้วยกลไกตะวันออก-ตะวันตกแบบย้อนกลับ ซึ่งเป็นการทดลองที่สอนให้ผมรู้ว่า มีเหตุผลที่ดีอยู่แล้วที่เราควรสร้างสิ่งต่างๆ ด้วย "วิธีที่ถูกต้อง" เจ้า "ฝาแฝด" นี้เป็นหน่วยที่เล็กกว่ามาก โดยมีกำลังผลิตเพียง 1.5KW ต่อเครื่อง ซึ่งผมได้รวมแบบ CAD โดยละเอียดของพวกมันไว้ที่ด้านล่างของ Project นี้แล้ว หอคอยทั้งสองจะส่งไฟไปยัง Inverter แบบ dual input เครื่องเดียวซึ่งติดตั้งอยู่ที่หอคอยทิศเหนือ หอคอยแต่ละแห่งมีชุด Battery, Solar regulator และ Tracking computer เป็นของตัวเอง อย่างไรก็ตาม ทั้งคู่ได้รับไฟจากแผง DC pony เดียวกันที่ตั้งอยู่บนหอคอยทิศใต้ ทั้งคู่เป็นระบบ 24V ไม่ใช่ 12V เหมือนหอคอยทิศตะวันออก
ถ้าคุณสงสัยว่าทำไมผมถึงต้องเปลี่ยน Optical tracker? ภาพนี้ในวันที่มีเมฆบางส่วนแสดงให้เห็นถึงปัญหาครับ
ดังนั้นสิ่งที่ผมอยากได้สำหรับปีนี้คือ เวลาและตำแหน่งจาก GPS, การเข้าถึงเครือข่ายอินเทอร์เน็ต (NTP time server) และอาจจะมีการสื่อสารกับ Inverter เพื่อดูค่า Solar output ผมยังต้องการให้หน่วยนี้มีขนาดกะทัดรัดขึ้น โดยควรจะรวมอยู่ในกล่องเดียวเพื่อที่ผมจะได้ติดตั้งไว้ที่ด้านหลังของโครง Tracker ได้เหมือนกับ Sensor ในหน่วยแรก แน่นอนว่าผมตั้งใจจะทำระบบ OTA ให้สำเร็จ เพื่อที่ผมจะได้ไม่ต้องแบก Laptop ขึ้นบันไดไปเปลี่ยน Program ข้างบนนั้น
เนื่องจาก Arduino UNO ใน Project ก่อนหน้านี้ของผมถูกใช้งานจนเต็มพิกัดแล้ว ถึงเวลาต้องนำ Arduino Mega มาใช้ ตัวเลือกอื่นๆ สำหรับงานนี้คือ WeMos (ESP8266) แต่นั่นจะเป็นสำหรับตอนต่อไปครับ
ข้อดีของ Chip Mega คือมันมี Serial ports ถึงสี่ (4) ช่อง ซึ่งถือเป็นความฝันของการสื่อสารแบบ Serial ใน Chip เดียวเลย ผมจึงสามารถเชื่อมต่อ GPS, Inverter และ Bluetooth adapter ได้ และยังมีที่ว่างเหลือสำหรับ Diagnostic port อีกด้วย
นอกจากนี้มันยังมี Memory และพื้นที่สำหรับ Code มากขึ้น ซึ่งเป็นสิ่งจำเป็นสำหรับการสร้าง Website บน Chip
ใช่ครับเพื่อให้ทันสมัย ครั้งนี้ผมจะไม่ใส่หน้าจอ LCD ลงในเครื่อง เพราะมันไม่มีประโยชน์อะไรเลยในเมื่อมันอยู่บนหอคอยสูงจนคุณมองไม่เห็น นอกจากนี้ผมยังคิดว่ามันน่าจะสนุกดีถ้าได้เชื่อมต่อมันเข้ากับอินเทอร์เน็ตและให้คนอื่นเข้ามาดูได้สักพัก

เราตัด Code เดิมออกไปถึง 80% ซึ่งเป็นส่วนของ GUI ทำให้เราได้พื้นที่ Memory กลับคืนมามหาศาล แต่ก็ต้องใช้พื้นที่ไปอีกเยอะมากเพื่อรัน Web server
ที่ผมบอกว่าจะไม่ใช้ LCD เอาเข้าจริงผมมักจะขี้โกงโดยใช้มันระหว่างการพัฒนาครับ โดยเฉพาะอย่างยิ่งเมื่อดูเหมือนว่าผมจะมี Bug ในระบบเยอะเกินไป
อย่างไรก็ตาม นี่เป็นส่วนเสริมที่มีประโยชน์มากในขณะที่ผมกำลังทำให้ส่วนต่างๆ ใช้งานได้ มันถอดออกได้ง่าย และ Code ส่วน I2C ก็สามารถทิ้งไว้ในนั้นได้เลย เพื่อที่ผมจะได้เสียบมันกลับเข้าไปใหม่เพื่อทดสอบบนโต๊ะทำงานได้เสมอ
ผมใช้ TinyGPS เป็นตัว Parser สำหรับข้อมูล NEMA จาก GPS ซึ่งมันจะดึงข้อมูล 3 ส่วนที่เราต้องการสำหรับ Tracker จากข้อมูลมหาศาลที่ส่งมาจาก u-blox มันเหมือนกับคำพังเพยที่ว่าขี่ช้างจับตั๊กแตน แต่เฮ้ อย่างน้อยคุณก็ได้เนยถั่วที่เนียนละเอียดสุดๆ ในระหว่างที่ทำล่ะนะ ส่วนการ Lock สัญญาณ GPS ดูจะมีความสำคัญมากในการตัดสินว่าข้อมูลนั้นถูกต้องหรือไม่ ผมเลยคิดว่าจะแสดงจำนวนดาวเทียมบนหน้าจอ Meatball โดยการจุดไฟที่มุมต่างๆ เพิ่มขึ้นตามลำดับ
ในฐานะมือใหม่สำหรับ Arduino IoT สิ่งแรกที่เกิดขึ้นตอนเขียนหน้า Web คือ Variable memory ของผมหมดเกลี้ยง หืม... มันเป็นไปได้ยังไง? ผมไม่ได้ใช้ Variable ที่สำคัญอะไรมากมายเลย หลังจาก "ปรับแต่ง" และศึกษาข้อมูลอยู่พักหนึ่ง ปรากฏว่า "F() macro" เป็นเครื่องมือที่สะดวกมากและคุณไม่ควรลืมใช้มันเด็ดขาด มันจะเก็บ Strings ไว้ใน "Code segment" ซึ่งเป็นที่ที่มันควรจะอยู่ คุณจะเห็นสิ่งนี้กระจายอยู่ทั่วไปใน Code ผมกล้าพูดเลยว่ามันทำให้ทุกอย่างช้าลงนิดหน่อย แต่ผมกำลังติดตามดวงอาทิตย์ ไม่ใช่ขีปนาวุธ Scud ที่พุ่งเข้ามา ดังนั้นเวลาที่เพิ่มขึ้นไม่กี่ ms คงไม่เสียหายอะไร
ผมต้องขออภัยสำหรับการออกแบบหน้า Web เพราะผมคุ้นเคยกับการใช้ ASP บนเครื่องเซิร์ฟเวอร์ยักษ์ใหญ่ที่ส่วนใหญ่รันตอน Idle เพื่อสร้างหน้าเว็บของผม (ผมเป็นแฟนพันธุ์แท้ HTML แบบดั้งเดิม) แต่ในโลกของ Arduino นั้น CPU ตัวน้อยต้องทำงานหนักมากเพื่อสร้างหน้าเว็บพื้นฐาน วิธีที่ดีกว่าคือการผลักภาระไปให้ Web browser โดยใช้ JavaScript เพราะ CPU ของเครื่องที่เป็น Host มักจะมีพลังประมวลผลมากกว่า Mega อย่างน้อย 10 เท่า อย่างไรก็ตาม หน้าเว็บของผมรองรับอุปกรณ์/Browser ได้ถึง 99.9% เพราะมันเป็น HTML ล้วนๆ และไม่ต้องใช้บริการออนไลน์อื่นๆ ในการสร้าง เหมาะอย่างยิ่งสำหรับแอปพลิเคชันแบบ Stand alone
Website นี้ยังเป็นเพียงเวอร์ชันแรก เพราะผมยังคงหาว่าวิธีไหนที่เหมาะกับผมในโลกของ Arduino ดังนั้นจึงมีเศษ Code ตัวอย่างที่นำมาปะติดปะต่อกันแบบ Frankenstein โดยมีสไตล์ของผมปนอยู่เพียงเล็กน้อยเท่านั้น
เรื่องของเวลานั้นค่อนข้างน่าปวดหัว เพราะดูเหมือนว่าจะมีมาตรฐานและส่วนประกอบหลายอย่างที่ต้องนำมารวมกัน ในที่สุดผมก็จัดการทำความเข้าใจวิธีการและเหตุผลของแต่ละส่วน และทำให้การคำนวณทั้งหมดอยู่บนฐาน Time zone เดียวกัน ไม่ว่าแหล่งที่มาของข้อมูลจะเป็นอะไรก็ตาม Tracker จะใช้ GPS เป็นหลัก ตามด้วย NTP ผ่านอินเทอร์เน็ต และ RTC ภายนอก นี่อาจจะดูเกินความจำเป็นไปหน่อย แต่ Code ถูกเขียนขึ้นเพื่อให้คุณสามารถถอดแหล่งที่มาของเวลาบางอย่างออกในขั้นตอนสร้าง Hardware ได้โดยที่ Software ยังทำงานได้ปกติ ปัญหาหนึ่งคือเมื่อคุณผูกติดกับแหล่งเวลาจริงแล้ว คุณจะไม่สามารถโกงโดยการตั้งเวลาล่วงหน้าเพื่อเบี่ยงเบนแผงโซลาร์หรือชดเชยค่า Angular offset ได้ คุณต้องใช้ค่า Angular offset จริงๆ เพราะเวลาได้กลายเป็นค่าคงที่สัมบูรณ์ ไม่ใช่ Variable อีกต่อไป
หลังจากทำ Web interface จนเสร็จ ผมกลับพบว่าจริงๆ แล้วผมอยากให้มันเป็น WiFi มากกว่า นี่ล่ะนะชีวิตคือการเดินทาง! ผมจึงกลับมามองที่ WeMos อีกครั้ง ไม่ว่าจะใช้เป็น Shield หรือแบบ Stand alone ที่เชื่อมต่อผ่าน Serial หรืออาจจะเป็น Modbus RTU อีกทางเลือกหนึ่งคือ Ethernet bridge ภายนอก แต่ปัญหาเดียวคือเรื่องพลังงาน เพราะตัวที่ผมมีอยู่กินไฟประมาณ 100 mA แถมพอวัดค่าดูแล้ว Arduino Ethernet Shield ก็กินไฟจุใช่เล่นเหมือนกัน
จากประสบการณ์ครั้งแรกกับ ESP8266 มันดูจะดิ้นรนพอสมควรในการสร้างหน้าเว็บ แต่ก็นั่นแหละ ผมอาจจะใช้อุปกรณ์ผิดวิธีเอง มันเป็นตัวอย่างที่ชัดเจนว่าคุณควรผลักภาระการประมวลผลไปยัง CPU ที่ดีกว่า หรือในกรณีของผม แค่จับเครื่องมือให้ถูกด้านก็พอ!
ด้วยอาการติด eBay ของผม ทำให้ได้ Module WiFi ตัวใหม่มาในเวลาอันรวดเร็ว มันมีแค่ UART, Level shifters และแค่นั้นเอง การเชื่อมต่อตัวนี้เข้ากับ CH340 และส่ง AT commands จากเครื่องมือโปรดของผมช่วยให้เห็นว่าเวลาเสียไปตรงไหนและอย่างไร พวกนี้ทำงานได้ยอดเยี่ยมมากถ้าคุณจัดระเบียบดีๆ และสามารถพ่นคำตอบทั้งหมดออกมาได้ในคราวเดียว แต่มันไม่ค่อยดีนักสำหรับการสร้างข้อมูลแบบ Real-time เพราะมี Overhead ในการส่งข้อมูลสูงมากเมื่อต้องสลับ Mode ในการส่ง ซึ่งต่างจาก Arduino Ethernet Shield ที่ดูเหมือนจะไม่ได้รับผลกระทบมากนัก ไม่ว่าคุณจะส่งข้อมูลเป็นชิ้นเล็กแค่ไหนก็ตาม หลังจากเรียนรู้บทเรียนนี้แล้ว ผมสามารถทำให้การสร้างหน้า Configuration ของ Tracker ลดเวลาลงจากหลักสิบวินาทีเหลือเพียงไม่กี่วินาที อีกครั้งที่ผมทำใน Code ต้นแบบเพื่อพิสูจน์แนวคิดก่อนที่จะนำไปปรับปรุงในเวอร์ชัน Ethernet Shield ที่ใช้งานได้อยู่แล้ว ผลลัพธ์สุดท้ายคือมี Code สองเวอร์ชันสำหรับ Mega คือเวอร์ชันสำหรับ Ethernet Shield และเวอร์ชันสำหรับ ESP WiFi Serial adapter
ผมตัดสินใจใส่อุปกรณ์อิเล็กทรอนิกส์ทั้งหมด ยกเว้นฟิวส์ ลงในกล่องเดียวที่มีฝาปิดใส ซึ่งช่วยให้ผมมองเห็น LED matrix จากด้านล่างได้ Web interface ช่วยให้ผมสามารถสลับแกน X-Y และกลับค่า +/- ได้ ดังนั้นผมจึงสามารถติดตั้งหน่วยนี้ไว้ที่ไหนก็ได้และยังใช้งานได้อยู่
ผมใช้แผ่น Acrylic ใสเป็นโครงสำหรับยึด Board ทั้งหมด เพราะผมต้องการให้มันโปร่งใสต่อทั้งแสงและคลื่นไมโครเวฟ ปัญหาหนึ่งที่ผมยังไม่ได้ทดสอบคือ GPS จะสามารถมองทะลุแผงโซลาร์เซลล์ได้หรือไม่ อย่างไรก็ตาม ผมได้เตรียมแผน B คือเสาอากาศภายนอกไว้ในใจแล้ว โครงสร้างชั้นเดียวกลายเป็น 2 ชั้นอย่างรวดเร็วเนื่องจากฟีเจอร์ต่างๆ ที่เพิ่มเข้ามาเรื่อยๆ (Feature creep)
Ethernet Shield มีปัญหาเรื่องตำแหน่งนิดหน่อย คือหัวต่อ RJ45 ไปยันกับขอบของกล่องพอดี หืม... บางทีเราอาจจะต้องเปลี่ยน Socket เป็นแบบแนวตั้ง หรือเปลี่ยนไปใช้ Shield แบบอื่นที่สามารถติดตั้งบนชั้นบนสุดของแผงวงจรได้ ในที่สุดผมจึงแยก Code ออกเป็นสองเวอร์ชัน คือ Ethernet และ ESP ที่เชื่อมต่อผ่าน Serial interface หน้าเว็บเหมือนกันแต่ Interface ขาออกต่างกัน
ตอนแรกผมคิดว่าจะมีที่ว่างเหลือเฟือในกล่องใบใหญ่ใบนี้ แต่ "Feature creep" คือตัวฆ่าเวลาและพื้นที่จริงๆ ทั้ง Power supply, RTC, Matrix display, GPS และ Bluetooth module เพื่อนร่วมงานคนหนึ่งของผมมักจะแนะนำเสมอว่าควรเผื่อพื้นที่ในกล่องไว้ 25% ซึ่งนั่นก็ดีครับ ตราบใดที่คุณไม่อยากใส่ของเพิ่มเข้าไปอีก 30% :)
สำหรับบนหอคอย สาย Actuator ที่ไปยัง Motor N/S และ E/W บน Tracker จะต้องมีการเดินสายใหม่ ซึ่งจะใช้สายน้อยลงมากเพราะไม่ต้องเชื่อมต่อกับกล่องควบคุมที่ฐานหอคอย ฟิวส์จะถูกติดตั้งไว้ภายนอกเนื่องจากพื้นที่ในกล่องหมดแล้ว ซึ่งไม่ใช่เรื่องใหญ่และยังเป็นจุดที่ดีในการตัดไฟเพื่อซ่อมบำรุง ผมจะต่อสายไฟชั่วคราวและติดตั้งหน่วยนี้ไว้ที่ใต้ Tracker เพื่อทำการทดสอบ Burn-in มันจะทำงานแต่ยังไม่เชื่อมต่อกับ Motor ผมสามารถเฝ้าดูและตรวจสอบให้แน่ใจว่ามันทำงานได้ 100% ก่อนที่จะสลับระบบ
อัตราการกินไฟเป็นปัญหาเดียวที่เกิดขึ้น อัตราการกินไฟรวมสูงกว่าที่คาดไว้ ตอนแรกผมคิดว่าอาจจะมีไฟฟ้าลัดวงจร แต่พอวัดค่าที่แหล่งจ่ายไฟ 12V ก็พบว่า:
ตอนนี้ที่แรงดัน 24V ทั้งหมดจะกินไฟประมาณ 150 mA ดังนั้นการเปิดทิ้งไว้ข้ามคืนจะกินไฟระหว่าง 1.2 ถึง 2.1 AH ขึ้นอยู่กับฤดูกาล... หืม เราต้องการให้มันอยู่ในเกณฑ์ 20% Depth of discharge สำหรับ Battery ขนาด 7/9AH ซึ่งมันเกือบจะได้ แต่ถ้าใช้สูตรคูณ 6 สำหรับการออกแบบระบบโซลาร์ ผมจำเป็นต้องเพิ่ม Battery เป็นขนาดประมาณ 20AH (ซึ่งคงไม่เกิดขึ้น!)
ดังนั้น - ผมคิดว่านี่น่าจะเป็นช่วงเวลาที่ต้องลองดูผลหน้างาน ผลลัพธ์ที่เป็นไปได้ในอนาคตคือ:
คอยติดตามตอนต่อไปครับ!
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้