หน้าแรก ดูโปรเจกต์ทั้งหมด
Intermediate

โปรเจกต์ Digital Speedometer ไปยัง Instrument Cluster ของรถยนต์ผ่าน CAN Bus

การใช้ Arduino CAN bus shield และ Digital speedometer กับ LCD-display ใน Instrument cluster ของรถยนต์

โปรเจกต์ Digital Speedometer ไปยัง Instrument Cluster ของรถยนต์ผ่าน CAN Bus
56,433 การดู
12 ถูกใจ

รายการอุปกรณ์และเครื่องมือ

1x 16 MHz Crystal
-
2x Ceramic Disc Capacitor, 150 pF
-
1x Resistor 10k ohm
-
2x Resistor 4.75k ohm
🛒 สั่งซื้อ
2x Ceramic Disc Capacitor, 18 pF
-
1x TJA1055
-
1x Screw Block Terminal 5-R3.5
🛒 สั่งซื้อ

แอปพลิเคชันและแพลตฟอร์ม

1x Autodesk EAGLE
เว็บ Official

รายละเอียดและวิธีทำ

Start of the Project

ทุกอย่างเริ่มต้นขึ้นในช่วงฤดูร้อนปี 2020 เมื่อผมซื้อ Audi TT ปี 2002 มาคันหนึ่ง ซึ่งต่างจากรถคันก่อนๆ ของผม เพราะมันไม่มี Digital Speedometer ในหน้าจอ LCD เล็กๆ ของชุดเรือนไมล์ (หรือ Driver Information System DIS ใน Audi) เนื่องจากการขาด Digital Speedometer ผมจึงตัดสินใจที่จะสร้างมันขึ้นมาเอง พูดให้สั้นลงคือ ผมคิดว่าจะใช้ประโยชน์จากโปรเจกต์เดิมที่มีอยู่ใน GitHub [1] และได้เขียน Code สำหรับการตั้งค่านั้นก่อน แต่ในไม่ช้าผมก็ตระหนักว่าการตั้งค่าที่ใช้ในโปรเจกต์เดิมนั้นแตกต่างจากของผม ผมจึงต้องเริ่มใหม่ทั้งหมด

Basic Idea

หน้าจอ DIS ของ Audi TT จะแสดงสถานี Radio หรือ CD-track ในส่วนบน 1 ใน 3 ของหน้าจอ แผนของผมคือการแทนที่ข้อมูล Radio นั้นด้วย Digital Speedometer จากโปรเจกต์ ที่กล่าวถึงก่อนหน้านี้ ผมพบว่า Radio ส่งข้อมูลไปยังชุดเรือนไมล์ผ่านสาย Data แบบทางเดียว 3 เส้น แต่เมื่อผมถอด Radio ของผมออกมา ผมกลับพบว่า Radio ของผมไม่ได้ใช้สาย 3 เส้นนี้ แต่ใช้ CAN bus แทน

Audi Radio ที่ไม่มี CAN bus (รุ่นปี -2001)

  • การเชื่อมต่อ Data แบบทางเดียวระหว่าง Radio และชุดเรือนไมล์
  • ใช้สาย 3 เส้นในการส่ง Data (DATA, CLOCK, ENABLE) (ซึ่งตอนแรกผมคิดว่ารถของผมมีสายเหล่านี้)

Audi Radio ที่มี CAN bus (รุ่นปี 2002-)

  • การเชื่อมต่อ Data แบบสองทาง (Half-duplex) ระหว่าง Radio และชุดเรือนไมล์ โดยใช้ CAN bus [2]
  • อัตราการส่งข้อมูล (Data transmission rate) 100 kbps (Infotainment CAN) [3][4]
  • ใช้สาย 2 เส้นในการส่ง Data (CAN-High, CAN-Low) (ซึ่งรถของผมใช้ระบบนี้)
ขั้วต่อ Audi Chorus: CAN-Low (สีน้ำตาล-ส้ม) และ CAN-High (สีม่วง-ส้ม)
Pinout ของ Audi Chorus

Reading vehicle speed data

ก่อนที่ผมจะเชื่อมต่อกับ CAN bus ด้วย Arduino แผนเดิมของผมคือการดึงสัญญาณความเร็วรถจากสาย GALA (Graduated Audio Level Adjustment) ของ Radio ซึ่ง GALA จะเพิ่มระดับเสียง Radio อัตโนมัติตามความเร็วของรถ แต่เนื่องจากรถของผมมี CAN bus จึงไม่จำเป็นต้องใช้สาย GALA และชุดเรือนไมล์จะส่งข้อมูลความเร็วรถบน Bus ทุกๆ 200 ms ผมจึงใช้ CAN-messages เหล่านี้ในโซลูชัน Digital Speedometer ของผม

Designing Fault Tolerant CAN-shield for Arduino

หลังจากหาข้อมูลเกี่ยวกับ CAN bus (โดยเฉพาะในรถกลุ่ม VW) ผมพบว่า Bus ที่ใช้ในรถของผมคือระบบที่เรียกว่า Fault Tolerant CAN bus [4] สำหรับผม นั่นหมายความว่าผมไม่สามารถใช้ CAN-shields สำเร็จรูปที่มีขายทั่วไปสำหรับ Arduino ได้

ผมตัดสินใจออกแบบ Circuit board สำหรับ CAN-shield และรวม Arduino Nano เข้าไว้ด้วยกัน ส่วนประกอบหลักที่จำเป็นสำหรับ CAN-shield ได้แก่

  • MCP2515 Stand-Alone CAN Controller พร้อม SPI Interface (ทำให้สื่อสารกับ Arduino ผ่าน SPI ได้ง่าย)
  • TJA1055 Enhanced fault-tolerant CAN transceiver
  • 16 MHz Crystal Oscillator
  • Resistors, Capacitors และ Screw terminal block
  • Circuit board

เอกสาร TJA-1055T Application Hints [5] มีประโยชน์มากตอนที่ผมกำหนดขนาด Resistors และ Capacitors ผมได้อ้างอิง Arduino CAN Tutorial [6] ในขณะที่วาดการเชื่อมต่อระหว่าง Arduino และ MCP2515

ผมออกแบบ Circuit board ใน Autodesk Eagle โดยผมไม่ได้กังวลเรื่องรายละเอียดการออกแบบมากนัก เพราะผมรู้ว่าการผลิตและการจัดส่ง Board จะต้องใช้เวลาของมันเอง ผมสั่งผลิต Printed Circuit Board จาก Itead.cc

การออกแบบ Circuit Board ใน Autodesk Eagle
Printed Circuit Board ที่ผลิตเสร็จแล้ว
ผลิตภัณฑ์สำเร็จรูป

Receiving and sending CAN-frames

ผมใช้ Library MCP2515 ที่ยอดเยี่ยมสำหรับ Arduino ซึ่งช่วยให้ผมส่งและรับ Frames บน CAN bus ได้อย่างง่ายดาย การใช้ Library นี้ตรงไปตรงมามากเนื่องจากถูกพัฒนามาอย่างดี ในส่วนของ Code ด้านล่างนี้คือตัวอย่างการรับและส่ง CAN frames

// Receive



struct can_frame canMsg;



void loop() {



if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {

if(canMsg.can_id == 0x351){ // ID for speed information on CAN-Bus



lv = canMsg.data[1];

uv = canMsg.data[2]

velocity = ((uv<<8)+lv-1)/190;

}

}

}

// Send



struct can_frame canMsg2;

const uint8_t SPACE = 0x20;

const uint8_t KMH_MESSAGE [8] = {SPACE, SPACE, 0x4b, 0x4d, 0x2f, 0x48, SPACE, SPACE}; //ASCII for ' KM/H '



void setup() {



canMsg2.can_id = 0x263; // Message ID for the second row of the DIS

canMsg2.can_dlc = 8; // Length 8 bytes

for(int j=0; j<8; j++){

canMsg2.data[j] = KMH_MESSAGE[j];

}



void loop() {



mcp2515.sendMessage(&canMsg2);



delay(40); // The car radio sends it own radio station data every 0,8s to

// the instrument cluster, so I have to send my data with much

// higher rate, so the display won't start to blink

}

CAN IDs

ผมพบรายการ Identifier ของข้อความ Audi CAN bus บน Canhack.de [7] และพบ ID สำหรับบรรทัดข้อความที่หนึ่งและสองของหน้าจอ DIS นอกจากนี้ผมยังพบ ID สำหรับข้อมูลความเร็วรถจาก txboard.de [8] อีกด้วย

Tested CAN IDs:

  • 0x261 ข้อความ DIS บรรทัดแรก (ความยาว: 8 bytes; รูปแบบ: ASCII)
  • 0x263 ข้อความ DIS บรรทัดที่สอง (ความยาว: 8 bytes; รูปแบบ: ASCII)
  • 0x635 ไฟส่องสว่าง Radio (ความยาว: 3 bytes; จากซ้ายไปขวา: ไฟพื้นหลังหน้าจอ Radio, ไฟพื้นหลังปุ่ม Radio, (?); (มืดสุด 0x0 - สว่างสุด 0x64)

CAN ID 0x351 (8 bytes จากซ้ายไปขวา):

  • 1. Ignition: 0x8 คือเปิด Ignition
  • 2. LV ค่าความเร็วรถตัวล่าง ("เมื่อเครื่องยนต์ทำงานและรถหยุดนิ่ง ค่าตัวล่างจะเปลี่ยนเป็น 1")
  • 3. UV ค่าความเร็วรถตัวบน
  • 4. ไม่ทราบค่า (Unknown)
  • 5. ไม่ทราบค่า (Unknown)
  • 6. อุณหภูมิภายนอก 1: (ค่า Decimal)/2 - 40 องศาเซลเซียส
  • 7. อุณหภูมิภายนอก 2: (ค่า Decimal)/2 - 40 องศาเซลเซียส (เป็นไปได้ว่ามีเซนเซอร์อุณหภูมิภายนอกสองตัว?)
  • 8. ไม่ทราบค่า (Unknown)

การคำนวณความเร็วรถ:

ความเร็วในหน่วย km/h = ((UV << 8) + LV - 1) / 200

ข้อความที่มี ID 0x351 ที่ตรวจจับได้บน CAN bus: 8 0 0 0 0 60 60 0

ในขณะที่ตรวจจับ รถเปิด Ignition ไว้แต่เครื่องยนต์ไม่ได้ทำงาน CAN frame บ่งชี้ว่า Ignition เปิดอยู่, อุณหภูมิในโรงรถของผมคือ 8 องศาเซลเซียส และความเร็วรถคือศูนย์ ซึ่งถือว่าถูกต้อง

Timeline

  • 1/19/2021: ผมยังไม่สามารถทดสอบ Speedometer ในการใช้งานจริงได้ เพราะเป็นฤดูหนาวและผมขับรถคันนี้เฉพาะในช่วงฤดูร้อนเท่านั้น โชคดีที่ส่วนที่ยากที่สุดผ่านพ้นไปแล้ว และผมมีผลิตภัณฑ์สำเร็จรูปอยู่ในมือ ส่วนที่เหลือของโปรเจกต์นี้คือการเขียนโปรแกรมและทดสอบการใช้งานจริง
  • 3/8/2021: อุปกรณ์ถูกติดตั้งไว้ใต้ Dashboard เรียบร้อยแล้ว และพร้อมสำหรับการทดสอบและพัฒนาต่อไป
การออกแบบ Casing สำหรับตัวอุปกรณ์
Casing ที่เสร็จสมบูรณ์
การเชื่อมต่ออุปกรณ์เข้ากับชุดสายไฟ (Wiring harness)
อุปกรณ์ที่ติดตั้งอยู่ใต้ Dashboard ข้างสวิตช์ไฟ
  • 3/27/2021: ผมนำรถออกไปขับ และหลังจากปรับปรุง Code เล็กน้อย Speedometer ก็เริ่มทำงานได้อย่างถูกต้อง
Digital Speedometer ที่ทำงานได้อย่างสมบูรณ์

Sources

ผมใช้ข้อมูลต่อไปนี้จาก GitHub-project [1] ที่กล่าวถึงก่อนหน้า ใน Code ของ GALA Speedometer ของผม:

  • ความยาวข้อความคงที่ 18-bytes
  • Byte สุดท้ายคือ Checksum
  • วิธีการคำนวณ Checksum

[1] GitHub: derpston/Audi-radio-DIS-reader

[2] Volkspage: VW Self Study Programme 186

[3] Volkspage: VW Self Study Programme 238

[4] Volkspage: VW Self Study Programme 269

[5] TJA-1055T Application Hints

[6] circuitdigest.com: Arduino CAN Tutorial

[7] canhack.de: Audi RNS-E CAN Aufschlüsselung

[8] tx-board.de: ID 0x351

Author

Jussi Ristiniemi

นักศึกษาที่ Tampere University, Finland

ชั้นปีที่ 2 สาขา Electrical Engineering

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: digital-speedometer-to-cars-instrument-cluster-via-can-bus-9ee5ca
2450 บาท
PromptPay QR Code

ประเมิน Project

อยากได้งานคล้ายโปรเจคนี้? กดไปหน้าประเมินราคา

เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า

รีวิวจากคนใช้งานจริง

รีวิวจากลูกค้าและคนที่เคยใช้งาน

ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย

กำลังโหลดรีวิว...