โปรเจกต์ Digital Speedometer ไปยัง Instrument Cluster ของรถยนต์ผ่าน CAN Bus
การใช้ Arduino CAN bus shield และ Digital speedometer กับ LCD-display ใน Instrument cluster ของรถยนต์
การใช้ Arduino CAN bus shield และ Digital speedometer กับ LCD-display ใน Instrument cluster ของรถยนต์
ทุกอย่างเริ่มต้นขึ้นในช่วงฤดูร้อนปี 2020 เมื่อผมซื้อ Audi TT ปี 2002 มาคันหนึ่ง ซึ่งต่างจากรถคันก่อนๆ ของผม เพราะมันไม่มี Digital Speedometer ในหน้าจอ LCD เล็กๆ ของชุดเรือนไมล์ (หรือ Driver Information System DIS ใน Audi) เนื่องจากการขาด Digital Speedometer ผมจึงตัดสินใจที่จะสร้างมันขึ้นมาเอง พูดให้สั้นลงคือ ผมคิดว่าจะใช้ประโยชน์จากโปรเจกต์เดิมที่มีอยู่ใน GitHub [1] และได้เขียน Code สำหรับการตั้งค่านั้นก่อน แต่ในไม่ช้าผมก็ตระหนักว่าการตั้งค่าที่ใช้ในโปรเจกต์เดิมนั้นแตกต่างจากของผม ผมจึงต้องเริ่มใหม่ทั้งหมด
หน้าจอ DIS ของ Audi TT จะแสดงสถานี Radio หรือ CD-track ในส่วนบน 1 ใน 3 ของหน้าจอ แผนของผมคือการแทนที่ข้อมูล Radio นั้นด้วย Digital Speedometer จากโปรเจกต์ ที่กล่าวถึงก่อนหน้านี้ ผมพบว่า Radio ส่งข้อมูลไปยังชุดเรือนไมล์ผ่านสาย Data แบบทางเดียว 3 เส้น แต่เมื่อผมถอด Radio ของผมออกมา ผมกลับพบว่า Radio ของผมไม่ได้ใช้สาย 3 เส้นนี้ แต่ใช้ CAN bus แทน
Audi Radio ที่ไม่มี CAN bus (รุ่นปี -2001)
Audi Radio ที่มี CAN bus (รุ่นปี 2002-)


ก่อนที่ผมจะเชื่อมต่อกับ CAN bus ด้วย Arduino แผนเดิมของผมคือการดึงสัญญาณความเร็วรถจากสาย GALA (Graduated Audio Level Adjustment) ของ Radio ซึ่ง GALA จะเพิ่มระดับเสียง Radio อัตโนมัติตามความเร็วของรถ แต่เนื่องจากรถของผมมี CAN bus จึงไม่จำเป็นต้องใช้สาย GALA และชุดเรือนไมล์จะส่งข้อมูลความเร็วรถบน Bus ทุกๆ 200 ms ผมจึงใช้ CAN-messages เหล่านี้ในโซลูชัน Digital Speedometer ของผม
หลังจากหาข้อมูลเกี่ยวกับ CAN bus (โดยเฉพาะในรถกลุ่ม VW) ผมพบว่า Bus ที่ใช้ในรถของผมคือระบบที่เรียกว่า Fault Tolerant CAN bus [4] สำหรับผม นั่นหมายความว่าผมไม่สามารถใช้ CAN-shields สำเร็จรูปที่มีขายทั่วไปสำหรับ Arduino ได้
ผมตัดสินใจออกแบบ Circuit board สำหรับ CAN-shield และรวม Arduino Nano เข้าไว้ด้วยกัน ส่วนประกอบหลักที่จำเป็นสำหรับ CAN-shield ได้แก่
เอกสาร TJA-1055T Application Hints [5] มีประโยชน์มากตอนที่ผมกำหนดขนาด Resistors และ Capacitors ผมได้อ้างอิง Arduino CAN Tutorial [6] ในขณะที่วาดการเชื่อมต่อระหว่าง Arduino และ MCP2515
ผมออกแบบ Circuit board ใน Autodesk Eagle โดยผมไม่ได้กังวลเรื่องรายละเอียดการออกแบบมากนัก เพราะผมรู้ว่าการผลิตและการจัดส่ง Board จะต้องใช้เวลาของมันเอง ผมสั่งผลิต Printed Circuit Board จาก Itead.cc



ผมใช้ 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
}ผมพบรายการ Identifier ของข้อความ Audi CAN bus บน Canhack.de [7] และพบ ID สำหรับบรรทัดข้อความที่หนึ่งและสองของหน้าจอ DIS นอกจากนี้ผมยังพบ ID สำหรับข้อมูลความเร็วรถจาก txboard.de [8] อีกด้วย
Tested CAN IDs:
CAN ID 0x351 (8 bytes จากซ้ายไปขวา):
การคำนวณความเร็วรถ:
ความเร็วในหน่วย km/h = ((UV << 8) + LV - 1) / 200
ข้อความที่มี ID 0x351 ที่ตรวจจับได้บน CAN bus: 8 0 0 0 0 60 60 0
ในขณะที่ตรวจจับ รถเปิด Ignition ไว้แต่เครื่องยนต์ไม่ได้ทำงาน CAN frame บ่งชี้ว่า Ignition เปิดอยู่, อุณหภูมิในโรงรถของผมคือ 8 องศาเซลเซียส และความเร็วรถคือศูนย์ ซึ่งถือว่าถูกต้อง





ผมใช้ข้อมูลต่อไปนี้จาก GitHub-project [1] ที่กล่าวถึงก่อนหน้า ใน Code ของ GALA Speedometer ของผม:
[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
Jussi Ristiniemi
นักศึกษาที่ Tampere University, Finland
ชั้นปีที่ 2 สาขา Electrical Engineering
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย