กลับไปหน้ารวมไฟล์
airfuel-controller-for-lpg-engines-fa17bd.md

เป้าหมายของโปรเจคนี้คือการสร้างอุปกรณ์ที่สามารถปรับปรุงสัดส่วนอากาศ/เชื้อเพลิงของเครื่องผสม LPG (OHG) แบบกลในรถของพี่ได้นั่นเอง

ถ้าอยากประหยัดน้ำมันให้สุดๆ เราต้องพยายามให้สัดส่วนอากาศ/เชื้อเพลิงอยู่ใกล้จุดที่เหมาะสมที่สุดให้มากที่สุด

สมัยก่อนก็มีสินค้าพวกคอนโทรลเลอร์เชื้อเพลิงอย่าง IMPCO วางขายอยู่บ้าง แต่ตอนนี้ตลาดหายไปแล้ว เลยหาซื้ออะไรแบบนี้ไม่ได้อีก

และพวกมันก็ทำงานต่างกันไปและค่อนข้างช้า พี่เลยตัดสินใจลองทำขึ้นมาเองซะเลย

เพราะเครื่องผสม LPG ส่วนใหญ่ปรับแต่งได้จำกัด มันเลยไม่ค่อยแม่นยำและมักจะผสมเชื้อเพลิงเข้มข้นเกินไป (rich) ซึ่งไม่ดีต่อการประหยัดน้ำมันเลย

แนวคิดคือการทำให้ส่วนผสมบางลง (lean out) โดยการเติมอากาศเข้าไปหลังจากเครื่องผสม แต่ก่อนจะถึงวาล์วเร่ง (throttle valve)

อากาศที่ไหลผ่านเครื่องผสม (false air) นี่แหละที่จะทำให้ส่วนผสมของแก๊สบางลงได้

ปรากฏว่าไอเดียนี้เวิร์คมากเลยนะ

พี่แค่ต้องควบคุมปริมาณอากาศที่ไหลผ่าน (by-pass air) ให้แม่นยำมากๆ เพื่อให้ได้สัดส่วนอากาศ/เชื้อเพลิงที่เหมาะสมที่สุด

นี่แหละคือจุดที่ Arduino Nano เข้ามามีบทบาท มันเหมาะเจาะกับงานแบบนี้สุดๆ

ก่อนหน้านี้พี่เคยทำระบบจุดระเบิด (ignition system) ที่โปรแกรมได้ด้วย Nano มาแล้ว ซึ่งนั่นคือจุดเริ่มต้นที่พี่ได้รู้จักกับโลกของ Arduino

พี่เรียนรู้เรื่อง Arduino และการเขียนโค้ดทั้งหมดจากการย้อนรอยระบบจุดระเบิด Arduino ที่เจอในเน็ต แต่นั่นเป็นอีกเรื่องหนึ่งเลย

ระบบจุดระเบิด Arduino นั้นทำงานมาได้ 6 ปีแล้วนะ พี่เลยมั่นใจในความน่าเชื่อถือของ Nano พอสมควร

สำหรับโปรเจคนี้ พี่ใช้ส่วนใหญ่เป็นของเก่าจากคอมพิวเตอร์และของที่เหลือๆ อยู่แล้ว

เพื่อควบคุมอากาศที่ไหลผ่าน พี่ใช้วาล์ว Bosch stationairy ที่ไปเจอในร้านขายของเก่า

เพื่อควบคุมวาล์ว พี่ใช้ Arduino Nano

เพื่อควบคุม Nano พี่ใช้เซ็นเซอร์แลมบ์ดาแบบแคบแบนด์ (narrow-band lambda sensor) ในท่อไอเสีย

เซ็นเซอร์ O2 แบบแคบแบนด์ (Lambda Zirconia Physics)

เซ็นเซอร์ออกซิเจน Bosch แบบ 1-Wire หรือ 4-Wire ธรรมดาๆ ที่ยื่นออกมาจากท่อไอเสียรถยนต์ มันไม่ได้ส่งสัญญาณออกมาเป็นคำว่า "Rich" หรือ "Lean" นะน้อง

  1. องค์ประกอบเซรามิก Zirconia ภายในเซ็นเซอร์จะสร้างแรงดันไฟฟ้าแอนะล็อกดิบๆ ที่วุ่นวายและไม่เป็นเชิงเส้นออกมา!
  2. 0.1 โวลต์ = ผสมบางมากเกินไป (Lean สุดขีด, อากาศมากเกินไป เครื่องยนต์ร้อนและอาจระเบิดได้).
  3. 0.9 โวลต์ = ผสมเข้มข้นมากเกินไป (Rich สุดขีด, น้ำมันมากเกินไป เชื้อเพลิงกระเด็นออกทางไอเสีย).
  4. 0.45 โวลต์ = สัดส่วนที่สมบูรณ์แบบ (Stoichiometric, อัตราส่วน 14.7:1).
  5. พินแอนะล็อก A0 ของ Arduino จะอ่านค่าแรงดันนี้ตรงๆ เป๊ะๆ ในขณะที่แก๊สไอเสียอุณหภูมิ 1000°C กำลังกระแทกเซ็นเซอร์อยู่

เพราะพี่มีเซ็นเซอร์แลมบ์ดาติดตั้งในท่อไอเสียอยู่แล้วสองตัว ฝั่งละตัว มานานหลายปี และก็มีเกจ O2 สองตัวสำหรับอ่านค่าจากเซ็นเซอร์ พี่เลยเข้าใจดีว่าเกิดอะไรขึ้นในเครื่องยนต์บ้าง

พี่ใช้เซ็นเซอร์หนึ่งตัวเป็นอินพุตให้กับ Nano สัญญาณเอาต์พุตจากเซ็นเซอร์จะอยู่ระหว่าง 0 ถึง 1000mV ดังนั้นมันสามารถต่อตรงไปที่อินพุตแอนะล็อกได้เลย

พี่ใช้ตัวต้านทาน (Resistor) 1Mohm ต่อลงกราวด์เพื่อลดสัญญาณรบกวนที่อินพุต

การควบคุมลูปของแอคชูเอเตอร์

ก่อนอื่นพี่ต้องหาวิธีควบคุมวาล์ว Bosch แบบอยู่กับที่ตัวนี้ก่อน

วาล์วตัวนี้หลักๆ แล้วประกอบด้วยขดลวดแม่เหล็กไฟฟ้า (coil) 2 ขดวางตรงข้ามกัน ขดหนึ่งใช้เปิดวาล์ว อีกขดใช้ปิดวาล์ว

ถ้าเราจ่ายไฟให้ทั้งคู่ เราก็จะได้ตำแหน่งวาล์วตรงกลางตามที่ต้องการเลย

วาล์วมีขาต่อ 3 ขา ขาหนึ่งเป็นขาร่วม (common) และอีกสองขาเป็นของ coil แต่ละขด วาล์วใช้ไฟ 12V และกินกระแสประมาณ 1A พี่เลยใช้ FET ระดับลอจิก 2 ตัวมาควบคุมมัน

สัญญาณ PWM ที่ตรงข้ามกันจาก Arduino จะไปขับ FET สองตัวนี้ ถ้าตัวหนึ่งขึ้น อีกตัวก็ลง และในทางกลับกัน

เพื่อกำจัดเสียงรบกวนน่ารำคาญจากความถี่มาตรฐาน 980Hz ออกไป พี่ใช้ไลบรารี่ชื่อ "GYVER" ซึ่งเป็นของรัสเซียน่ะ แต่มันทำงานได้เพอร์เฟกต์เลย

มันตั้งความถี่ได้ตามที่เราต้องการ หลังทดลองนิดหน่อย พี่ก็เซ็ตไว้ที่ 8000Hz ซึ่งอยู่นอกช่วงที่หูคนได้ยินแล้ว

การจะขยับวาล์ว พี่แค่ต้องการตัวเลขระหว่าง 0 (ปิดสนิท) ถึง 100 (เปิดสุด) มันก็จะขยับไปยังตำแหน่งนั้นอัตโนมัติ

ลูป `FOR` จะขยับวาล์วทีละ 1% เพื่อให้การเคลื่อนไหวลื่นไหล

ในโค้ดจะมีส่วนแยกไว้สำหรับควบคุมวาล์วโดยเฉพาะ

กับดักการทำงาน (Execution Trap): เซ็นเซอร์วัดออกซิเจน (Oxygen Sensor) มี "ดีเลย์" อยู่ 250 มิลลิวินาที หลังการดูดอากาศจริงๆ ของเครื่องยนต์ ถ้า Arduino ปรับวาล์วแรงเกิน มันจะแก้ไขเกิน (over-correct) เข้าสู่ลูปการแกว่งกวัดที่น่ากลัว และทำให้เครื่องยนต์ดับสนิททันที

ไดโอดทั้งหมดมีไว้เพื่อป้องกัน Arduino ไม่ให้โดนไฟ 12V โดยอุบัติเหตุ หรือกรณีชิ้นส่วนเสียเท่านั้น

แล้วจะประมวลผลสัญญาณ O2 ยังไง?

เนื่องจากเอาต์พุตของเซ็นเซอร์แลมบ์ดาแบบแคบ (narrow-band lambda sensor) มันแกว่งขึ้นลงตลอดเวลา มันจะอยู่เหนือหรือใต้ 500mV เสมอ แต่ไม่เคยอยู่ที่ 500mV ตามที่ต้องการเลย พี่เลยต้องทำให้ค่าที่อ่านจากเซ็นเซอร์เสถียรขึ้นหน่อย

พี่ตัดสินใจใช้ค่าเฉลี่ยสองแบบ

แบบที่หนึ่งคือค่าเฉลี่ยระยะสั้น (500ms) และอีกแบบคือค่าเฉลี่ยระยะยาว (10 วินาที) เพื่อทำให้ค่าจากเซ็นเซอร์นิ่งขึ้น

ค่าเฉลี่ยระยะสั้นคือค่าเฉลี่ยของค่าจากเซ็นเซอร์ 10 ครั้ง พี่จำกัดความเร็วลูปไว้ที่ 50ms ดังนั้นทุกๆ 50ms จะได้ค่าอ่านใหม่หนึ่งครั้ง

พี่ใส่ค่าที่อ่านได้ลงในอาร์เรย์ขนาด 10 แล้วหารด้วย 10 พออาร์เรย์เต็ม (10 ตัวเลข) ค่าอ่านแรกจะถูกแทนที่ด้วยค่าอ่านใหม่ จากนั้นก็ค่าที่สอง ที่สาม ไปเรื่อยๆ

สรุปคือมันคือค่าเฉลี่ยของ 500ms ที่รีเฟรชใหม่ทุก 50ms

วิธีนี้ทำให้พี่ได้ค่าที่เสถียรพอจะเอาไปใช้งานได้

ส่วนค่าเฉลี่ยระยะยาวคือผลลัพธ์ของค่าเฉลี่ยระยะสั้น (หลัง 500ms) คูณด้วย 20 ครั้ง ดังนั้น 20 x 500ms = 10 วินาที มันจะรีเฟรชใหม่ทุก 500ms

เนื่องจากโค้ดไม่ได้ซับซ้อนหรือยาวมาก พี่คิดว่ามันน่าจะอธิบายตัวมันเองได้

มีบางส่วนในโค้ดที่ใส่ไว้เพื่อให้พี่ได้รับข้อมูลย้อนกลับ (feedback) ว่าเกิดอะไรขึ้นบ้างขณะขับรถ จะได้ปรับปรุงโค้ดในจุดนั้นๆ ได้

ส่วนพวกนี้ไม่จำเป็นสำหรับการรันโปรแกรมหลัก

ส่วนที่มีประโยชน์ที่สุดคือพี่สามารถเห็นการขยับของวาล์วได้ เลยรู้ว่ามันตอบสนองต่อซอฟต์แวร์ยังไง

ประโยชน์อันดับสองคือการดูว่าค่าเฉลี่ยระยะยาวกำลังทำอะไรอยู่ มันควรจะอยู่ใกล้ 500mV ให้มากที่สุด ซึ่งมันก็ทำได้ดี

พี่เพิ่มสวิตช์เลือก 6 ทางเพื่อเลือกว่าจะดูค่าอะไรขณะขับรถ

พี่ใช้เกจ O2 ตัวที่สอง ซึ่งหลักๆ ก็คือโวลต์มิเตอร์ 0 ถึง 1V มาส่งค่าแสดงผล

เนื่องจากมันเป็นเกจแบบแคบ แม้แต่ตัวเกจเองก็หายากแล้วในปัจจุบัน

ทุกวันนี้เป็นแบบไวด์แบนด์ (wideband) หมดแล้ว ซึ่งนั่นอาจเป็นโปรเจกต์ต่อไป แต่คอนเซปต์นี้ก็ยังใช้ได้เหมือนเดิม

เวลาตอบสนอง (response time) ขึ้นอยู่กับรอบเครื่อง (RPM) อยู่ระหว่าง 400ms ถึง 100ms การทำให้เร็วกว่า 100ms ไม่ได้มีประโยชน์เพิ่ม พี่เลยจำกัดความเร็วไว้ที่ 100ms

สำหรับเครื่องพี่ นั่นคือที่ 2400 RPM ครับ เกินกว่านั้นเวลาตอบสนองจะคงที่ที่ 100ms

สำหรับการนับรอบเครื่อง พี่ใช้เซ็นเซอร์ฮอลล์ (Hall sensor) จากระบบจุดระเบิด แต่ถ้าไม่มีสัญญาณมันก็ยังทำงานได้

อุปกรณ์นี้สร้างขึ้นมาเฉพาะสำหรับเครื่องยนต์ Dodge ขนาด 512 ลูกบาศก์นิ้ว ที่ใช้ LPG แต่พี่มองเห็นการประยุกต์ใช้ได้อีกมาก แม้แต่คาร์บูเรเตอร์น้ำมันเบนซินก็ได้ประโยชน์จากสิ่งนี้ แค่ต้องมีช่องทางเข้าอากาศในตำแหน่งที่เหมาะสม

นั่นคือระหว่างเวนจูรี (venturi) กับวาล์วปีกผีเสื้อ (throttle valve)

วิธีนี้มีข้อเสียอยู่อย่างหนึ่ง คือมีขีดจำกัดของรอบเครื่องสูงสุดที่มันจะยังมีประสิทธิภาพ เพราะขนาดของบายพาสวาล์วมีจำกัด

เครื่องยนต์นี้ใช้อากาศปริมาณมหาศาล แต่จนถึงตอนนี้มันยังมีประสิทธิภาพจนถึงประมาณ 3000 RPM ซึ่งเพอร์เฟกต์สำหรับการขับขี่ในชีวิตประจำวันแล้ว

มันไม่ได้ออกแบบมาเพื่อใช้ตอนเหยียบเต็ม (WOT) อยู่แล้ว

ระดับประสิทธิภาพยังขึ้นอยู่กับว่าส่วนผสมพื้นฐาน (base mixture) เองใกล้เคียงแค่ไหน ยิ่งใกล้ค่าที่ถูกต้องมากเท่าไหร่ ก็ยิ่งมีประสิทธิภาพมากขึ้นเท่านั้น

มันยังขึ้นกับขนาดของเครื่องยนต์ด้วย ยิ่งเครื่องเล็กประสิทธิภาพยิ่งดี เนื่องจากเครื่องยนต์ส่วนใหญ่มีขนาดเล็กกว่า 512 ลูกบาศก์นิ้ว พี่ว่าน่าจะโอเค

การใช้เซ็นเซอร์แบบแคบ พี่ก็ยังจะติดอยู่กับอัตราส่วน 14.7 / 1 (สำหรับ LPG จะอยู่ที่ประมาณ 15.5 / 1) แต่มันก็ใกล้พอสำหรับพี่แล้ว

พี่เองยังทึ่งเลยว่ามันทำงานได้ดีขนาดนี้

โดยรวมแล้วเป็นแกดเจ็ตที่เจ๋งดีสำหรับใช้ในชีวิตประจำวัน จัดไปวัยรุ่น!

ชิ้นส่วนหลักสำหรับห้องเผาไหม้

  • Arduino Nano/Uno (เอาไว้ควบคุมวาล์วแบบแม่นยำ และประมวลผลสัญญาณจากเซนเซอร์อนาล็อก)
  • MOSFET แบบ Logic Level (สำหรับขับคอยล์วาล์ว Bosch แบบอยู่กับที่ ที่ใช้ไฟ 12V, 1A)
  • เซนเซอร์วัดออกซิเจนในไอเสีย (O2 Sensor) แบบ Narrowband ของ Bosch หรือยี่ห้ออื่น (รุ่น 1-wire ใช้ง่ายสุด แต่ต้องติดตั้งในท่อไอเสียที่ร้อนจัดถึงจะทำงานได้!)
  • วาล์วแบบอยู่กับที่ของ Bosch (เป็นแอคชูเอเตอร์สำหรับควบคุมอากาศบายพาส)
  • (คำเตือน: วงจรนี้ควบคุมเครื่องยนต์ LPG ที่ใช้แก๊สอัดแรงดันสูงซึ่งติดไฟและระเบิดง่ายมาก ห้ามนำไปติดตั้งใช้งานบนรถที่วิ่งบนถนนสาธารณะโดยไม่ได้ทดสอบความปลอดภัยอย่างเข้มงวดก่อน เพื่อป้องกันไม่ให้เกิดเหตุคันเร่งค้าง!)

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

apps:
  - "1x Arduino IDE"
author: "rebos"
category: "Motors & Robotics"
components:
  - "1x Bosch stationairy valve"
  - "1x lamba sensor"
  - "1x Arduino Nano"
  - "1x Air/Fuel Ratio Gauge"
description: "Precision combustion analysis! Override ancient mechanical carburetors by reading high-voltage Bosch O2 sensors directly, utilizing intense stoichiometric mathematics via Arduino to dynamically actuate physical LPG stepper valves."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/8d846cf4-5827-4861-bfdc-6342038ce5f5.ino"
encryptedPayload: "U2FsdGVkX1/rZr+wRnSPyW1RG6jX831Px36pr6uegvjuIUOYWbv++k/Q5lO/OTIqTNRCvqYSSDelrwFd8v+VIHiukLBEMpnExPPrc/BTbFo="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/airfuel-controller-for-lpg-engines-fa17bd_cover.jpg"
lang: "en"
likes: 4
passwordHash: "abc83eaca0d467e7f96766956bd3e165fb12abb40e77c79bf730ae0459e31281"
price: 2450
seoDescription: "Arduino Nano project to control Air/Fuel mixture in LPG engines for better fuel economy and engine performance optimization."
tags:
  - "Cars"
  - "Passenger Vehicles"
  - "Energy Efficiency"
title: "จัดการเชื้อเพลิง LPG ตึงๆ กับ Arduino Nano"
tools: []
videoLinks: []
views: 11680