กลับไปหน้ารวมไฟล์
mega-solar-tracker-856ab8.md

เล่าเท้าความก่อนนะน้อง

สำหรับใครที่ยังไม่ได้อ่านตอนแรกนะ (ตัดลิงก์ออกตามระเบียบ) บอกเลยว่าพลาด!

คืองี้ พอถึงเวลาที่พี่ต้องรีโนเวทหรือยกเครื่องเจ้าฝาแฝดเนี่ย ตามหลักกลไกแล้วพี่เลยเลือกจัดที่หอคอยทิศใต้ก่อนเลย เพราะไอ้ตัวนี้มันถูกสร้างมาแบบสลับทิศตะวันออก-ตะวันตก (Reversed mechanism) ซึ่งตอนนั้นพี่ก็กะจะทดลองอะไรนิดหน่อยแหละ แต่สุดท้ายมันก็สอนให้รู้ว่า การสร้างของให้มัน "ถูกวิธี" ตั้งแต่แรกน่ะดีที่สุดแล้ว เจ้า "ฝาแฝด" สองตัวนี้เป็นยูนิตเล็กๆ แค่ 1.5KW เอง ซึ่งพี่มีแบบ CAD ละเอียดๆ ให้ดูที่ท้ายโปรเจกต์นะ ทั้งสองหอคอยจะส่งไฟไปที่ Inverter แบบ Dual Input ตัวเดียวที่หอคอยทิศเหนือ แต่ละหอคอยจะมีชุด Battery, Solar Regulator และคอมพิวเตอร์คุม Tracking ของตัวเอง แต่จะรับไฟมาจาก DC Pony Panels ชุดเดียวกันที่หอคอยทิศใต้ ระบบพวกนี้เป็น 24V นะน้อง ไม่ใช่ 12V เหมือนหอคอยทิศตะวันออก

ถ้าสงสัยว่าทำไมพี่ถึงต้องเปลี่ยนพวก Optical Tracker (ตัวตามแสงแบบเดิม)? ดูรูปวันที่มีเมฆสิ เดี๋ยวรู้เลย

ดูสิ หอคอยทิศเหนือกับใต้ดันหันไปมองเมฆสว่างๆ ทางทิศตะวันตกเฉยเลย ในขณะที่หอคอยตะวันออก (ขวา) ยังหันหาเป้าหมายได้แม่นยำ

ดังนั้น รายการของขวัญคริสต์มาสที่พี่อยากได้ปีนี้คือ ค่าเวลาและตำแหน่งจาก GPS, การเข้าถึง Network Internet (NTP Time Server) และอาจจะเชื่อมต่อคุยกับ Inverter เพื่อดูค่า Solar Output ด้วย พี่อยากให้ยูนิตมันกะทัดรัดขึ้น ใส่ลงกล่องใบเดียวแล้วเอาไปติดหลัง Tracker Frame ได้เลย เหมือนกับ [Sensor](https://s.shopee.co.th/7VBG2rX65j) ในยูนิตแรก และแน่นอน พี่ตั้งใจจะทำระบบ OTA (Over the Air) ให้มันเวิร์ก พี่จะได้ไม่ต้องแบก Laptop ปีนบันไดลิงขึ้นไปแก้ Code บ่อยๆ ไงล่ะวัยรุ่น

Memory เยอะขึ้น - CPU แรงกว่าเดิม

ในเมื่อบอร์ด [Arduino](https://s.shopee.co.th/7fUgFAWSki) UNO ตัวเก่ามันโดนยัดจนเต็มพิกัดแล้ว ก็ถึงเวลาเบิกตัวพี่ใหญ่อย่าง Arduino Mega มาลุยงานนี้ จริงๆ ก็มีคู่แข่งอย่าง WeMos (ESP8266) นะ แต่เก็บไว้โปรเจกต์หน้าแล้วกัน

จุดเด่นของชิป Mega คือมันมี Serial Ports ถึง 4 ช่อง! บอกเลยว่าเป็นสวรรค์ของการสื่อสารแบบ Serial ชัดๆ พี่สามารถต่อ GPS, Inverter, Bluetooth Adapter แถมยังเหลือที่ว่างไว้ทำ Diagnostic Port ได้อีกสบายๆ

แถมยังมี Memory และพื้นที่เก็บ Code เยอะกว่าเดิมมาก ซึ่งจำเป็นสุดๆ เวลาเราจะสร้าง Website ลงบนชิป

ใช้ IoT แทน GUI ไปเลยรอบนี้

ยุคนี้มันต้องล้ำหน่อย พี่เลยไม่ใส่จอ [LCD](https://s.shopee.co.th/6AfsSPcAnb) บนยูนิตนี้แล้ว เพราะยังไงมันก็อยู่บนหอคอยสูงปรี๊ด ต่อให้มีจอก็อ่านไม่ออกอยู่ดี พี่เลยคิดว่าเอามาเชื่อมต่อ Internet แล้วให้คนอื่นเข้ามาส่องดูได้น่าจะสนุกกว่าเยอะ

หน้าตา GUI บนเวอร์ชัน Ethernet Shield หล่อเท่เลยงานนี้

การเขียน Code

พอเราตัดส่วน GUI ออกไป Code เดิมหายไปตั้ง 80% เลยนะ ได้ Memory คืนมาบานเบอะ แต่ก็ต้องเอากลับไปใช้รันพวก Web Servers แทน

ที่พี่บอกว่าจะไม่ใช้ LCD น่ะ พี่แอบโกงนิดหน่อย คือเอามาใช้ตอนแก้ Bug ช่วงพัฒนานั่นแหละ เพราะระบบนี้ Bug มันเยอะเหลือเกินน้องเอ๊ย

ไม่แน่ใจว่าพวกนี้ถือเป็น Hardware Bug หรือเปล่านะ? แต่มันเข้ามาอยู่ข้างในเลย ฟีลแบบหนัง Matrix ชัดๆ

สรุปคือใส่จอนิดนึงตอนไล่ระบบน่ะดีแล้ว ถอดปลั๊กง่าย แถม Code I2C ก็ทิ้งไว้ได้เลย เวลาจะ Test บนโต๊ะ (Bench Test) ก็แค่เสียบกลับเข้าไปใหม่

พี่ใช้ Library TinyGPS มาแกะข้อมูลจาก NEMA stream ของ GPS เพื่อดึงเอาข้อมูล 3 อย่างที่จำเป็นสำหรับ Tracker จากข้อมูลมหาศาลที่ u-blox พ่นออกมา จะว่าไปมันก็เหมือน "ขี่ช้างจับตั๊กแตน" นั่นแหละ แต่ก็นะ ช้างมันแรงดีทำอะไรก็สะดวก พี่ว่าส่วน GPS Lock สำคัญมากในการเช็คว่าข้อมูลที่ได้มามันชัวร์ไหม พี่เลยเขียนให้มันแสดงจำนวนดาวเทียมบน Matrix LED โดยการไล่ไฟขึ้นตามมุมต่างๆ

ในฐานะมือใหม่ Arduino IoT ปัญหาแรกที่เจอตอนเขียนหน้าเว็บคือ Variable Memory ดันเต็มเฉย! เห้ย เป็นไปได้ไง? พี่ก็ไม่ได้ใช้ Variable เยอะขนาดนั้นนะ หลังจากมั่วๆ ซั่วๆ ไปสักพักและหาข้อมูลเพิ่ม ก็พบว่า `F()` macro คือของดีที่ห้ามลืมเด็ดขาด! มันจะช่วยยัดพวก String ไปไว้ใน Code Segment แทน ซึ่งช่วยประหยัด RAM ได้เยอะ น้องจะเห็นพี่ใช้ไอ้ตัวนี้กระจายอยู่เต็ม Code ไปหมด แม้มันจะทำให้ระบบช้าลงนิดหน่อย แต่พี่กำลังตามดวงอาทิตย์นะน้อง ไม่ได้สกัดขีปนาวุธ ช้าลงไม่กี่ ms ไม่ตายหรอก

ต้องขออภัยเรื่องหน้าตาเว็บด้วยนะ พี่ชินกับการใช้ ASP บน Server แรงๆ (พี่มันสาย HTML รุ่นเก๋า) พอมาอยู่ในโลก Arduino ตัว CPU ผู้น่าสงสารต้องตะเบ็งเสียงทำงานสุดกำลังเพื่อสร้างหน้าเว็บพื้นฐานขึ้นมา จริงๆ วิธีที่ดีกว่าคือโยนภาระไปให้ Web Browser รัน Javascript แทน เพราะ CPU ฝั่งนั้นแรงกว่า Mega เป็นสิบเท่า แต่ก็นะ หน้าเว็บพี่เนี่ยรองรับอุปกรณ์ 99.9% แน่นอน เพราะมันคือ HTML เพียวๆ ไม่ต้องพึ่งพาบริการ Online อื่นๆ เหมาะสำหรับงาน Standalone สุดๆ

หน้าเว็บที่เห็นนี่คือเวอร์ชันแรกนะ พี่กำลังลองผิดลองถูกอยู่ว่าวิธีไหนเวิร์กสุดสำหรับ Arduino Code เลยอาจจะดูเหมือน "Frankenstein" ที่เอาตัวอย่างจากหลายๆ ที่มายำรวมกันนิดนึง

เรื่องเวลาเนี่ยปวดหัวสุดๆ เพราะมาตรฐานมันเยอะไปหมด สุดท้ายพี่ก็จัดการเอาการคำนวณทั้งหมดมาไว้บน Time Zone เดียวกันไม่ว่าแหล่งข้อมูลจะมาจากไหน โดย Tracker จะใช้ GPS เป็นหลัก ตามด้วย NTP ผ่าน Internet และตบท้ายด้วย RTC ภายนอก คือทำเผื่อไว้เวอร์ๆ แหละ เผื่อ Hardware ตัวไหนหายไป Code ก็ยังเดินต่อได้ แต่ประเด็นคือพอเราอิงกับเวลาจริง (Real Time) เราจะไปโกงเวลาเพื่อขยับแผงหลอกๆ ไม่ได้แล้วนะ ต้องใช้ค่า Angle Offset จริงๆ เท่านั้น

WiFi

ทำ Web Interface ผ่านสาย Lan เสร็จ ดันอยากได้ WiFi ซะงั้น! ชีวิตมันไม่ง่ายเลยวัยรุ่น พี่เลยต้องกลับไปดูพวก WeMos อีกรอบ ทั้งแบบใช้เป็น Shield หรือต่อแยกผ่าน Serial/Modbus RTU อีกทางเลือกคือใช้ External Ethernet Bridge แต่ติดเรื่องกินไฟ เพราะตัวที่พี่มีมันกินตั้ง 100 mA แถมพอวัดดูจริงๆ Arduino Ethernet Shield ก็กินไฟดุใช่เล่นนะน้อง

จากประสบการณ์ครั้งแรกกับ ESP8266 พี่รู้สึกว่ามันหอบแฮกๆ เวลาสร้างหน้าเว็บ (สงสัยพี่คงใช้ไขควงผิดด้านเองแหละ) นี่เป็นตัวอย่างชัดๆ ว่าควรโยนงานประมวลผลไปให้ CPU ที่แรงกว่า หรือไม่พี่ก็ต้องหัดถือไขควงให้ถูกด้านสักที!

ด้วยความเสี้ยนของจาก eBay พี่เลยจัด WiFi Module ตัวใหม่มา มันมีแค่ UART กับ Level Shifters เท่านั้น พอเอามาต่อกับ CH340 แล้วส่ง AT Commands เช็คดู พี่เลยรู้ว่าทำไมมันถึงช้า ถ้าเราส่งข้อมูลพรวดเดียวจบมันจะไวมาก แต่ถ้าค่อยๆ ส่งทีละนิด (Build on the fly) มันจะมี Overhead สูงมากเวลาสลับโหมดส่ง ซึ่งต่างจาก Arduino Ethernet Shield ที่ส่งชิ้นเล็กแค่ไหนก็ไม่ค่อยสะเทือน พอรู้แกวแล้ว พี่เลยจูนหน้าเว็บ Configuration จากที่ต้องรอนับสิบวินาที เหลือแค่ไม่กี่วินาทีเอง โดยพี่ทำเป็น Code Proof of Concept ก่อนจะเอาไปแก้ในเวอร์ชัน Ethernet Shield จนสุดท้ายได้ Code มาสองแบบคือ สำหรับ Ethernet Shield และสำหรับ ESP WiFi Serial Adapter

Case (กล่องใส่อุปกรณ์)

พี่ตัดสินใจยัดทุกอย่างยกเว้นฟิวส์ลงในกล่องเดียวที่มีฝาใส เพื่อจะได้มองเห็น LED Matrix จากด้านล่าง ส่วนหน้าเว็บก็เขียนให้สลับแกน X-Y หรือกลับด้าน +/- ได้ จะได้เอาไปติดตั้งท่าไหนก็ได้ มันทำงานได้หมดแหละ

พี่ใช้แผ่นอะคริลิคใสทำเป็น Chassis ยึดบอร์ด เพราะอยากให้แสงและคลื่นไมโครเวฟผ่านได้สะดวก ปัญหาที่ยังไม่ได้ลองคือ GPS จะมองทะลุแผง Solar Cell ได้ไหม แต่พี่ก็มีแผน B คือเสาอากาศภายนอกเตรียมไว้แล้วล่ะ จากเดิมที่กะจะทำชั้นเดียว พอยัดฟีเจอร์เพิ่มไปเรื่อยๆ (Feature Creep) กลายเป็น 2 ชั้นซะงั้น

ตอนใช้ Ethernet Shield มีจังหวะ "อุ๊ปส์" นิดหน่อย คือหัว RJ45 มันดันไปชนขอบกล่องพอดีเป๊ะ! พี่เลยต้องเลือกว่าจะเปลี่ยน Connector เป็นแนวตั้ง หรือเปลี่ยน Shield ไปไว้ชั้นบนสุดแทน สุดท้ายเลยแก้ปัญหาด้วยการแยก Code เป็นสองเวอร์ชันตามที่บอกไปนั่นแหละ หน้าเว็บเหมือนกัน แค่ทางออกข้อมูลต่างกัน

ตอนแรกนึกว่ากล่องใหญ่จะเหลือที่เยอะ แต่โดน Feature Creep เล่นงานซะงบพื้นที่บาน ทั้ง Power Supply, RTC, Matrix Display, GPS และ Bluetooth Module เพื่อนร่วมงานพี่มักจะเตือนเสมอว่า "ให้เหลือพื้นที่ในกล่องไว้ 25%" ซึ่งมันจะดีมากถ้าเราไม่ดันยัดของเพิ่มเข้าไปอีก 30%! (ฮา)

ส่วนบนหอคอย สาย Actuator ที่ไปคุม Motor เหนือ/ใต้ และ ตะวันออก/ตะวันตก ต้องจัดสายใหม่ ประหยัดสายไปเยอะเพราะไม่ต้องลากไปหา Control Box ที่ฐานหอคอยแล้ว ส่วนฟิวส์เอาไว้ข้างนอกเพราะในกล่องที่เต็มแล้ว (ไม่มีที่แล้วจริงๆ น้อง) แต่มันก็ดีนะ เซอร์วิสง่ายดี พี่กะจะลากสายไฟชั่วคราวแล้วเอาไปติดใต้ Tracker เพื่อทำ Burn-in Test ดูก่อน คือให้มันทำงานแต่ยังไม่ต่อกับ Motor พี่จะได้ Monitor ดูความชัวร์ 100% ก่อนสลับใช้งานจริง

ปัญหาเดียวที่เจอตอนนี้คือเรื่องการกินไฟ (Power Consumption) มันดันสูงกว่าที่คิด พี่นึกว่ามีอะไรช็อตซะอีก แต่พอลองวัดไฟขาเข้าที่ 12V ดู ผลคือ:

  • กินไฟรวม 250mA ถือว่าสูงนะสำหรับสมัยนี้
  • GPS กิน 60 mA
  • WiFi กิน 60 mA — แค่สองตัวนี้ก็ล่อไปเกือบครึ่งแล้ว!
  • LED Display 10-20 mA
  • Sensors 20 mA
  • RS-232 10 mA
  • ที่เหลือ (Mega กับ H-Bridge) 90 mA

พอใช้ไฟ 24V จะกินกระแสประมาณ 150 mA สรุปคือถ้าเปิดทิ้งไว้ข้ามคืนจะกินไฟประมาณ 1.2 ถึง 2.1 AH แล้วแต่ฤดูกาล... อื่มมม แบตเตอรี่ 7/9AH ของเราต้องคุมการคายประจุไม่ให้เกิน 20% ด้วยสิ ถ้าจะให้เป๊ะตามสูตร Solar Design ต้องเพิ่มแบตเป็น 20AH (ซึ่งคงไม่ได้ทำหรอก)

เอาเป็นว่าขอลองใช้ดูไปก่อนแล้วกัน ทางแก้ที่อาจจะทำในอนาคตคือ:

  • ย้าย Code ทั้งหมดไปลงชิป ESP ตัวเดียวเลย ประหยัดไฟได้เพียบ
  • เขียน Code ให้เข้าโหมดประหยัดพลังงาน ปิด GPS ตอนกลางคืน
  • ไม่ต้องใช้ GPS แล้วเอาเวลาจาก NTP ผ่าน WiFi อย่างเดียวดีไหม?

รอติดตามตอนต่อไปนะวัยรุ่น!

อัปเดต มีนาคม 2019

(ตัดลิงก์ Part 3 ออกตามระเบียบ)

รายละเอียดทางเทคนิคแบบจัดเต็ม

ตรรกะการเพิ่มประสิทธิภาพแบบ Dual-Axis

เจ้า Mega Solar Tracker ตัวนี้จะช่วยดึงพลังงานออกมาให้ได้มากที่สุด โดยการทำให้แผง Solar Cell ตั้งฉากกับดวงอาทิตย์อยู่เสมอ

  • Sensing Array: พี่ใช้ LDR (Light Dependent Resistors) 4 ตัว วางแบ่งเป็น 4 ส่วน (Quadrant) โดยมีแผ่นกั้นรูปกากบาทคั่นกลาง ตัว Arduino จะคอยเปรียบเทียบความเข้มแสงจาก LDR แต่ละตัว
  • การเคลื่อนที่: ควบคุมโดย Servo Motors แรงบิดสูง 2 ตัว หรือ Linear Actuators (ผ่าน Relay หรือ Motor Driver) ถ้า LDR มุมซ้ายบนรับแสงได้มากกว่าซ้ายล่าง Arduino ก็จะสั่งเอียงแผงขึ้นข้างบน จัดไปอย่าให้เสีย!

การปรับแต่งระบบ

  • ข้อดีของ Mega: การใช้ Arduino Mega ทำให้เราคุม Array ได้หลายชุดพร้อมกัน เพราะ Pins มันเยอะสะใจเหลือเกิน
  • Night Reset (กลับบ้านนอน): พอพระอาทิตย์ตกดิน ระบบจะตรวจจับได้ว่าแสงหายไป แล้วจะหมุนแผงกลับไปที่ตำแหน่ง "ทิศตะวันออก" อัตโนมัติ เพื่อรอรับแสงในเช้าวันถัดไป หล่อเท่เลยงานนี้!

ข้อมูล Frontmatter ดั้งเดิม

title: "Mega Solar Tracker"
description: "Building on and up! Using the lessons learned from the first tracker computer, we combine a bit of everything in this code."
author: "dougal"
category: "Home & Automation"
tags:
  - "solar tracker"
  - "gps"
  - "internet of things"
views: 35676
likes: 41
price: 2450
difficulty: "Intermediate"
components:
  - "1x Positioning (GNSS, GPS, Glonass, Galileo, Beidou)"
  - "1x Arduino Ethernet Shield 2"
  - "1x Perspex Sheet"
  - "1x Hole Punch or Hole saw"
  - "1x DS3231 I2C RTC"
  - "1x LED Matrix I2C interface"
  - "1x IP65 Enclosure"
  - "1x Resistor 1k ohm"
  - "1x 10 DOF gyro / accelerometer board"
  - "1x Buck Power Supply"
  - "1x HC-05 Bluetooth Module"
  - "1x Hand Drill"
  - "1x Arduino Mega 2560"
  - "1x DUAL H-Bridge motor drive"
  - "1x ESP8266 ESP-12E"
  - "1x Capacitor 100 nF"
  - "1x Resistor 2.21k ohm"
  - "1x Cable Gland"
  - "1x Soldering iron (generic)"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://projects.arduinocontent.cc/de2f9526-b406-41ac-b74b-224652f0b648.ino"
  - "https://projects.arduinocontent.cc/de2f9526-b406-41ac-b74b-224652f0b648.ino"
  - "https://projects.arduinocontent.cc/82b5cb28-a190-4ee6-b173-8dc77019fbc0.ino"
documentationLinks: []
passwordHash: "6476cdc76af1c0a017c40ad53906a7de8115e7480cc8197a76d8b11f6d4a382e"
encryptedPayload: "U2FsdGVkX190Uv2JOytfffqQGaYjbWhQJjYBfNuEAu+zgqTEsT9mwmeuaTcyqJzH0tjURdMOPCR3SibXRmMd/fr4AMqw+0v+Bucl00mN6uU="
seoDescription: "Build an advanced Mega Solar Tracker by combining lessons learned into one optimized code for maximum efficiency and precision."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/mega-solar-tracker-856ab8_cover.gif"
lang: "th"