กลับไปหน้ารวมไฟล์
simple-rallyracing-dashboard-cc5a4f.md

Introduction

ตอนที่พี่เริ่มลงมือโมดิฟายรถ BMW E46 328i Coupe ให้มันพร้อมลุยสนามแข่งหรือแรลลี่สมัครเล่นบ้างเนี่ย พี่ก็รู้ตัวทันทีว่า ต้องมีอิเล็กทรอนิกส์มาช่วยเสริมประสบการณ์การขับขี่ด้วยแหละ

เป้าหมายเริ่มต้นง่ายๆ คือ อยากได้ข้อมูล Data Logging แบบเรียลไทม์ในแอป RaceChrono น่ะ รถ BMW รุ่นเก่าของพี่เนี่ย อัตรารีเฟรชค่าจาก OBDII พวก RPM กับตำแหน่งคันเร่ง มันได้แค่ประมาณ 2-3Hz สูงสุด – เอาไว้ดูภาพรวมคร่าวๆ ก็พอไหว แต่ถ้าจะเอามาทับวิดีโอเป็นเกจมันช้าเกินไปเลยอะ ข้อมูลสำคัญอย่างการลดเกียร์หรือจุดพีคของ RPM/คันเร่งยังเก็บไม่ทันเลย ไม่ว่าจะใช้โมดูลบลูทูธ OBD ตัวไหน (ELM327 ของจีน หรือตัวที่แนะนำราคา 50 ดอลลาร์) ก็ไม่เคยได้ประสิทธิภาพที่ดีขึ้นเลย พี่เลยตั้งเป้าว่า ต้องป้อนข้อมูลให้ RaceChrono อย่างน้อยทุกๆ 100ms หรือก็คือ 10 Hz ให้ได้

Preparations

พี่ก็เริ่มศึกษาว่า หน้าปัดรถ (Instrument Cluster) มันทำงานยังไง จะแฮกเข้าไปยังไง และต้องใช้อะไรบ้างถึงจะเชื่อมต่อกับ RaceChrono ได้ สุดท้ายก็มาจบที่แผนแรก คือใช้บอร์ด Arduino พร้อมโมดูล Bluetooth กับ CAN เพื่อต่อตรงเข้ากับ CANbus ของรถ เพื่ออ่านค่าดิบจาก ECU/DME และอาจจะจากหน่วยควบคุมอื่นๆ ด้วย

พอมีอุปกรณ์ Arduino ฉลาดๆ แบบนี้ มันก็เปิดโอกาสให้เอาไปทำอย่างอื่นได้ด้วย โครงการเลยวิวัฒนาการกลายเป็นแดชบอร์ดแรซซิ่งแบบมินิมอล ที่มี:

  • วงแหวน LED แสดง RPM
  • LCD แสดงข้อมูลพื้นฐานของเครื่องยนต์ (RPM, อุณหภูมิน้ำหล่อเย็น, อุณหภูมิน้ำมันเครื่อง..)
  • ตัวบ่งชี้เกียร์/เปลี่ยนเกียร์ ที่อ่านเกียร์ปัจจุบันจากคันเกียร์บนรถเกียร์ธรรมดา

ระหว่างทำโปรโตไทป์ พี่ใช้ตัวจำลอง (Simulator) ของ Arduino นะ เพราะการลงมือต่อวงจรจริงๆ มันช้ากว่าการลองผิดลองถูกในซิมฯ อยู่เยอะ พี่เป็นสาย IT มากกว่าสายช่างไฟน่ะ 555+

AVR Simulator tools used

เริ่มแรกพี่ใช้ Tinkercad นะ แต่ก็พบว่า มันไม่สามารถเพิ่มไลบรารีจากภายนอกได้ ซึ่งพี่จำเป็นต้องใช้เพื่อจำลองฮาร์ดแวร์จริงๆ เลยย้ายมาใช้ VirtualBreadboard (เวอร์ชันเก่า 6.0.x) ซึ่งดีกว่าและเร็วกว่ามาก แถมยังมีออสซิลโลสโคปในตัวด้วย แต่พอระบบ .NET อัปเดตแล้วโปรแกรมมันก็พัง ไม่ยอมทำงานอีกเลย ในที่สุดพี่ก็มาจบที่ Proteus และต้องบอกว่า พี่ทึ่งกับฟีเจอร์ของมันมาก มันคือมีดพกสวิสอเนกประสงค์สำหรับการจำลองไมโครคอนโทรลเลอร์และวงจรเลยทีเดียว มีเครื่องมือดีบักเพียบ ทั้ง I2C, SPI, ออสซิลเลเตอร์, จุดหยุดรันโค้ดแบบมีเงื่อนไข และอีกสารพัด รวมถึงการออกแบบ PCB และโมเดล 3D ของชิ้นส่วนด้วย แนะนำสุดๆ สำหรับโปรเจกต์ "ใหญ่" ขึ้นมาหน่อย ราคาก็โอเคเมื่อเทียบกับฟีเจอร์ที่ได้มา

EXPANDED TECHNICAL DETAILS: Data Extraction & Display Principles

สำหรับโปรเจกต์แบบนี้ Arduino มันไม่สามารถแค่ "ถาม" ข้อมูลจาก ECU ของรถได้เฉยๆ นะ มันต้องเชื่อมต่อกับเครือข่ายการสื่อสารของรถต่างหาก ในรถจริงก็คือการต่อเข้ากับ CAN bus ส่วนในเซ็ตอัพแบบจำลอง ก็ต้องใช้ซอฟต์แวร์กลางอย่าง SimHub ในการดึงข้อมูลฟิสิกส์สดๆ (RPM, เกียร์, ความเร็ว, อุณหภูมิน้ำมันเครื่อง) จากเกมที่กำลังรันอยู่ แล้วส่งผ่านการเชื่อมต่อแบบ Serial ไปให้ Arduino

The Shift-Light LED Matrix Engine (TM1638)

นักแข่งมือโปรเนี่ย เขาใช้แถบ LED ที่เห็นชัดเจนเป็น Shift Light เพื่อจะได้ไม่ต้องละสายตาจากสนามแข่งไปมองหน้าปัด ฮาร์ดแวร์ที่เจ๋งมากตัวหนึ่งสำหรับงานนี้ก็คือ TM1638 8-Digit LED / Button / 8-LED Array Board นี่แหละ

Logic ในการส่งข้อมูลออกมา (Output Logic): ลูปหลักของ Arduino จะรอรับข้อมูลจาก Serial อยู่ตลอด พอเจอ PC หลัก (ที่รันโปรแกรมอย่าง SimHub หรือถ้าเป็นรถจริงก็คือโปรแกรมที่ประมวลผลข้อมูลจาก CAN bus) คำนวณ Logic การแมปเสร็จแล้ว — เช่น แปลงค่า RPM ของรถ (0-8000) เป็นค่าสำหรับ LED bar (0-8) — Arduino ก็จะได้รับคำสั่งง่ายๆ อย่างเช่น "เปิดไฟ LED 7 ดวงซะ!" แล้วก็อัพเดทหน้าจอทันทีเลยจ้า

// Optimized code to set shift lights based on a command from the host.
void setShiftLights(byte numberOfLEDs) {
  // 1 = 1 LED, 3 = 3 LEDs, 8 = ALL WARNING LIGHTS FLASHING!
  module.setLEDs( (1 << numberOfLEDs) - 1 ); // Instant binary cascade execution.
}

มาสร้าง Gear Indicator บน OLED 128x64 แบบเทพๆ กันดีกว่า

นอกจากไฟ Shift Lights ธรรมดาๆ แล้ว แดชบอร์ดของเรายังต้องแสดงข้อมูลตัวเลขสำคัญอย่างเช่น ความเร็วหรือเกียร์ได้ด้วย

  • รูปแบบข้อมูลที่ส่งมา (Data Payload): โปรแกรมหลักจะส่งสตริงที่มีโครงสร้างมา เช่น G: 4\nS: 145\n
  • Arduino ของเราก็จะทำการแยก (Parse) สตริงนี้ โดยใช้ตัวอักษรขึ้นบรรทัดใหม่ (\n) เป็นตัวแบ่ง
  • ใช้ไลบรารีอย่าง <Adafruit_SSD1306.h> แล้วก็สั่งแสดงผลด้วยคำสั่งแบบ display.setTextSize(5); เพื่อสร้างข้อความตัวใหญ่ อ่านง่ายสุดๆ
  • ระบบนี้ทำให้เรามี Feedback แบบเรียลไทม์ได้ด้วยนะ เช่น ถ้าโปรแกรมหลักส่งสัญญาณว่าเกียร์ถอยหลังหรือเกียร์มีปัญหา (เช่น currentGear = -1) Arduino ก็สามารถเปลี่ยนหน้าจอให้เป็นตัว 'R' ที่กะพริบ หรือเครื่องหมายอัศเจรีย์ได้เลย

ชุดฮาร์ดแวร์ที่ใช้กันบ่อยๆ

  • Arduino Uno/Nano/Leonardo (ใช้บอร์ดไหนก็ได้ แต่บอร์ดที่มีชิป USB แบบ Native อย่าง ATmega16u2 จะรับสตรีม Serial ที่ Baud Rate สูงๆ ได้เสถียรกว่า)
  • โปรแกรมหลัก (Host Software) (เช่น SimHub สำหรับเล่นเกมแข่งรถ หรือเฟิร์มแวร์ที่เขียนเองสำหรับประมวลผลข้อมูล CAN bus จากรถจริง)
  • โมดูล TM1638 LED Interface (เหมาะมากสำหรับทำ Shift Lights เพราะมี LED และ 7-segment ในตัว)
  • จอ OLED ขนาด 0.96" แบบ I2C หรือโมดูล 4-Digit 7-Segment HT16K33 Backpack เอาไว้ใช้เป็นตัวแสดงผลหลักสำหรับเกียร์หรือข้อมูลอื่นๆ

งานที่ทำสำเร็จไปแล้วในโปรเจคนี้

  • ทำ LCD พร้อมเมนูสำหรับตั้งค่าสีและช่วง RPM ของ NeoPixel ได้เอง แบบปรับแต่งได้เต็มที่และเก็บค่าใน EEPROM
  • ใช้ LED Matrix 8x8 ด้วย SPI มาตรฐาน แทนการใช้ Software SPI แบบในไลบรารี LedControl.h
  • จำลอง DAC สำหรับอ่านค่าเกียร์ — เป็น Digital to Analog converter แบบ 4-bit ง่ายๆ ไว้อ่านสวิตช์ 4 ตัวที่จะติดบนคันเกียร์ แล้วแสดงเกียร์ที่ถูกต้องบน Matrix 8x8 ตามค่าบิตที่ได้
  • เชื่อมต่อ MCP2515 CANbus กับรถจริงสำเร็จ อ่านค่าจาก ECU และแปลงเป็นค่าที่มนุษย์อ่านออกอย่าง RPM, ตำแหน่งคันเร่ง และอุณหภูมิน้ำหล่อเย็น
  • เชื่อมต่อ Bluetooth กับ RaceChrono เพื่อรับข้อมูลแบบเรียลไทม์ ตอนนี้ใช้ได้แค่ Bluetooth2 ในโหมด RFCOMM device ส่วน Bluetooth4LE ต้องใช้ชิปที่ปรับแต่ง Low-Level ได้มากกว่านี้ถึงจะตรงตามข้อกำหนดของ RaceChrono (เช่น ESP32/8266) ยังทำกับบอร์ด HM-10 ที่มีแค่ Serial Config ให้ไม่ได้เลย
  • วัดขนาด ออกแบบ และพิมพ์เคสแดชบอร์ดสำหรับ Arduino และจอต่างๆ ด้วยเครื่องพิมพ์ 3D งานนี้ท้าทายมากเพราะพี่ไม่มีประสบการณ์เลย ออกแบบโมเดลด้วย SketchUp พอพิมพ์ออกมาดูแล้วเท่ดีครับ ชิ้นส่วนทุกอย่างเข้าล็อคกันพอดี ขอบคุณเพื่อนร่วมงานเก่าที่ให้ใช้เครื่องพิมพ์ 3D ระดับโปรของเค้านะ ตอนนี้พี่ซื้อ Ender3 ของตัวเองมาแล้วสำหรับโปรเจคหน้า 😁
RPM shifter พร้อมตัวบอกเกียร์และจอ LCD 16x2

งานที่ยังค้างเติ่งอยู่

  • ส่องข้อความใน CANbus ดูว่ามีข้อมูลเจ๋งๆ อะไรอีกมั้ยที่เอามาประมวลผลได้
  • คอยสังเกตการกินไฟและสัญญาณรบกวนตอนเอาไปติดตั้งจริงในรถ

ไอเดียเพิ่มเติมที่อยากทำต่อ (ถ้ามีเวลา)

  • ควบคุมพัดลมระบายความร้อนแบบไดนามิกด้วย PWM ตามอุณหภูมิน้ำหล่อเย็น เพราะตอนนี้ในรถพี่ วงจรควบคุมพัดลมตายแล้ว เลยใช้แค่สวิตช์/รีเลย์เปิด-ปิด 100% ธรรมดา
  • อุณหภูมิน้ำมันเครื่องไม่มีใน CANbus ของ DME รุ่นนี้ แต่สามารถอ่านผ่าน K-line แบบบริการได้ ยังไม่โฟกัสตอนนี้ แต่มีคนลองทำ Proof of Concept ด้วยการดักจับข้อมูล serial ตอนรันโปรแกรมบริการของ BMW ต้นฉบับที่แสดงอุณหภูมิน้ำมัน **อัพเดต:** วิธีที่ง่ายกว่าน่าจะเป็นการอ่านค่าจากเซนเซอร์วัดอุณหภูมิโดยตรงที่ส่งสัญญาณเข้า ECU
  • ปรับความสว่างของจอแสดงผลอัตโนมัติโดยใช้เซนเซอร์วัดแสง เพิ่มจากการตั้งค่าด้วยมือ จะได้ลดแสงอัตโนมัติตอนกลางคืน สบายตาดี

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

apps:
  - "1x RaceChrono"
  - "1x Arduino IDE"
author: "Ankel2000"
category: "Motors & Robotics"
components:
  - "1x CAN-BUS MCP2515 Module TJA1050 Receiver SPI Module"
  - "1x Arduino UNO"
  - "1x NeoPixel Ring: WS2812 5050 RGB LED"
  - "1x 16x2 1602 LCD Keypad Shield For Arduino"
  - "1x Bluetooth Low Energy (BLE) Module (Generic)"
  - "1x MAXREFDES99# MAX7219 Display Driver Shield"
description: "มาลุยกัน! โปรเจคนี้เราจะจัดให้: 1. ไฟ LED เปลี่ยนเกียร์พร้อมแสดงค่า RPM ตึงๆ 2. ระบบตรวจจับและแสดงเกียร์ธรรมดาแบบวัยรุ่น 3. ส่งค่าผ่าน CAN bus ไปให้ RaceChrono ได้แบบเทพๆ"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/08d992ff-8d2b-4553-931b-f5927ed96e6a.ino"
  - "https://projects.arduinocontent.cc/08d992ff-8d2b-4553-931b-f5927ed96e6a.ino"
encryptedPayload: "U2FsdGVkX18pgvYghHmOqxDl8eHMROnk7h7kDzU7ztXAwJodBr/l+t9fv6i5yMxO+EPMAZl5QoLsD2JcrlQZhDgY62JtVcxY2wwkirIE8J5dEsQOHRhCFGVIvNr0spwy"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/simple-rallyracing-dashboard-cc5a4f_cover.jpg"
lang: "en"
likes: 18
passwordHash: "4a85efd4aebe4e3d83703835638f960a30d3bd8e022703349f66c540baa75b74"
price: 699
seoDescription: "Simple Rally/Racing Dashboard project: Shifter LEDs, RPM display, Manual gearbox sensing, and CAN bus data for RaceChrono."
tags:
  - "cars"
  - "bmw"
  - "canbus"
  - "communication"
  - "data collection"
  - "monitoring"
title: "เกจแดชบอร์ดสายแข่ง งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/3ZTlVa0h-rA"
views: 19174