๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Information

๐Ÿš— ์ž๋™์ฐจ CAN ํ†ต์‹ , ์ด์ œ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋น„๋ฒ• ๋Œ€๊ณต๊ฐœ!

by 41asjfkaerasfeava 2025. 12. 5.
๐Ÿš— ์ž๋™์ฐจ CAN ํ†ต์‹ , ์ด์ œ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋น„๋ฒ• ๋Œ€๊ณต๊ฐœ!
๋ฐฐ๋„ˆ2 ๋‹น๊ฒจ์ฃผ์„ธ์š”!

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.

๐Ÿš— ์ž๋™์ฐจ CAN ํ†ต์‹ , ์ด์ œ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋น„๋ฒ• ๋Œ€๊ณต๊ฐœ!

 

 

 

๋ชฉ์ฐจ

  1. CAN ํ†ต์‹ , ์™œ ์•Œ์•„์•ผ ํ• ๊นŒ์š”?
  2. CAN ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
    • CAN ํ†ต์‹ ์˜ ํŠน์ง•
    • CAN ๋ฉ”์‹œ์ง€ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ ํ•ด๋ถ€
  3. CAN ํ†ต์‹ ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋‹ค๋ฃจ๋Š” ์‹ค์งˆ์ ์ธ ๋ฐฉ๋ฒ•
    • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ์„ ํƒ: USB-to-CAN ์žฅ์น˜์˜ ํ™œ์šฉ
    • ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ ํ™œ์šฉ: CAN ๋ถ„์„๊ธฐ(CAN Analyzer)์˜ ํž˜
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ: Python python-can ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  4. CAN ํ†ต์‹  ๋ฐ์ดํ„ฐ ํ•ด์„ ๋ฐ ๋ถ„์„์˜ ๋…ธํ•˜์šฐ
    • DBC ํŒŒ์ผ์˜ ์—ญํ• ๊ณผ ์ค‘์š”์„ฑ
    • ์ผ๋ฐ˜์ ์ธ ์ฐจ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํŒŒ์•…
  5. ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ CAN ํ†ต์‹  ์‹ค์Šต์„ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ• ํŒ

CAN ํ†ต์‹ , ์™œ ์•Œ์•„์•ผ ํ• ๊นŒ์š”?

CAN(Controller Area Network) ํ†ต์‹ ์€ ํ˜„๋Œ€ ์ž๋™์ฐจ์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์—”์ง„ ์ œ์–ด, ์ œ๋™ ์‹œ์Šคํ…œ, ์—์–ด๋ฐฑ, ์‹ฌ์ง€์–ด ์ธํฌํ…Œ์ธ๋จผํŠธ ์‹œ์Šคํ…œ๊นŒ์ง€, ์ฐจ๋Ÿ‰ ๋‚ด ๋ชจ๋“  ์ „์ž ์ œ์–ด ์žฅ์น˜(ECU, Electronic Control Unit)๋“ค์€ CAN์„ ํ†ตํ•ด ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์œ ๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์ฐจ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฐœ๋ฐœ์ž, ์—”์ง€๋‹ˆ์–ด, ์—ฐ๊ตฌ์ž์—๊ฒŒ CAN ํ†ต์‹ ์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ๋‹จ์ˆœํ•œ ์ง€์‹์„ ๋„˜์–ด ๋ฏธ๋ž˜ ์ž๋™์ฐจ ๊ธฐ์ˆ ์„ ์ดํ•ดํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์—ญ๋Ÿ‰์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ CAN ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ฐจ๋Ÿ‰ ์ง„๋‹จ, ์ž์œจ ์ฃผํ–‰, ํŠœ๋‹ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„  ๋“ฑ ๋ฌด๊ถ๋ฌด์ง„ํ•œ ๋ถ„์•ผ์—์„œ ํ˜์‹ ์„ ์ด๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋ณต์žกํ•˜๊ฒŒ๋งŒ ๋А๊ปด์กŒ๋˜ CAN ํ†ต์‹ ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งˆ์Šคํ„ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์‹ค์งˆ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

CAN ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

CAN ํ†ต์‹ ์˜ ํŠน์ง•

CAN์€ ๋ฒ„์Šค(Bus) ํ˜•ํƒœ์˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ECU๊ฐ€ ํ•˜๋‚˜์˜ ๊ณตํ†ต๋œ ํ†ต์‹ ์„ (CAN-High, CAN-Low)์— ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜(Message-based) ํ†ต์‹ ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ์ˆ˜์‹ ์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉฐ, ๋ฉ”์‹œ์ง€์˜ **์‹๋ณ„์ž(Identifier)**๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฉ”์‹œ์ง€์ธ์ง€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, CAN์€ CSMA/CD + NDA(Carrier Sense Multiple Access/Collision Detection with Non-destructive Arbitration) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ, ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ํ†ต์‹ ์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ์‹๋ณ„์ž์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ถฉ๋Œ ์—†์ด ํ†ต์‹  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋น„ํŒŒ๊ดด์  ์ค‘์žฌ(Non-destructive Arbitration) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ•ญ์ƒ ๋จผ์ € ์ „์†ก๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

CAN ๋ฉ”์‹œ์ง€ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ ํ•ด๋ถ€

CAN ๋ฉ”์‹œ์ง€๋Š” ์ •ํ•ด์ง„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ”„๋ ˆ์ž„(Frame) ํ˜•ํƒœ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ **ํ‘œ์ค€ ํ”„๋ ˆ์ž„(Standard Frame, 11-bit ID)**์„ ๊ธฐ์ค€์œผ๋กœ ์ค‘์š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SOF (Start Of Frame): ํ”„๋ ˆ์ž„ ์‹œ์ž‘์„ ์•Œ๋ฆฌ๋Š” ๋‹จ์ผ 'Dominant'(๋…ผ๋ฆฌ '0') ๋น„ํŠธ.
  • Arbitration Field (์ค‘์žฌ ํ•„๋“œ): ๋ฉ”์‹œ์ง€์˜ **์‹๋ณ„์ž(ID, 11๋น„ํŠธ)**๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ID์˜ ๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  • Control Field (์ œ์–ด ํ•„๋“œ):
    • RTR (Remote Transmission Request): 'Dominant'์ผ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„, 'Recessive'์ผ ๊ฒฝ์šฐ ์›๊ฒฉ ์š”์ฒญ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
    • IDE (Identifier Extension): 'Dominant'์ผ ๊ฒฝ์šฐ ํ‘œ์ค€ ํ”„๋ ˆ์ž„, 'Recessive'์ผ ๊ฒฝ์šฐ ํ™•์žฅ ํ”„๋ ˆ์ž„(29-bit ID)์ž…๋‹ˆ๋‹ค.
    • DLC (Data Length Code): ๋ฐ์ดํ„ฐ ํ•„๋“œ์˜ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, 0๋ถ€ํ„ฐ 8๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • Data Field (๋ฐ์ดํ„ฐ ํ•„๋“œ): ์‹ค์ œ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ตœ์†Œ 0๋ฐ”์ดํŠธ์—์„œ ์ตœ๋Œ€ 8๋ฐ”์ดํŠธ๊นŒ์ง€ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CRC Field (์ˆœํ™˜ ์ค‘๋ณต ๊ฒ€์‚ฌ ํ•„๋“œ): ์ˆ˜์‹  ๋…ธ๋“œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœํ•˜๊ธฐ ์œ„ํ•œ 15๋น„ํŠธ ์ฒดํฌ์„ฌ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • ACK Field (์‘๋‹ต ํ•„๋“œ): ์ˆ˜์‹  ๋…ธ๋“œ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์‹ ํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • EOF (End Of Frame): ํ”„๋ ˆ์ž„ ๋์„ ์•Œ๋ฆฌ๋Š” 7๊ฐœ์˜ 'Recessive'(๋…ผ๋ฆฌ '1') ๋น„ํŠธ.

์ด์ฒ˜๋Ÿผ ๊ตฌ์กฐํ™”๋œ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด์„ํ•˜๋Š” ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.

CAN ํ†ต์‹ ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋‹ค๋ฃจ๋Š” ์‹ค์งˆ์ ์ธ ๋ฐฉ๋ฒ•

CAN ํ†ต์‹ ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•œ ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ์„ ํƒ: USB-to-CAN ์žฅ์น˜์˜ ํ™œ์šฉ

์ž๋™์ฐจ์˜ CAN ๋ฒ„์Šค์— ์ ‘๊ทผํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฐจ๋Ÿ‰๊ณผ PC๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์žฅ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ USB-to-CAN ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์žฅ์ : PC์˜ USB ํฌํŠธ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ„๋„์˜ ๋ณต์žกํ•œ ์„ค์น˜ ๊ณผ์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋น„๊ต์  ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ๋Œ€์˜ ์ œํ’ˆ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ œํ’ˆ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ์ถœ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์š” ์ œํ’ˆ: PEAK-System (PCAN), IXXAT, Kvaser, ๊ทธ๋ฆฌ๊ณ  ์ €๊ฐ€ํ˜• ์˜คํ”ˆ ์†Œ์Šค ํ•˜๋“œ์›จ์–ด ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋ฒ”์šฉ์„ฑ์ด ๋†’๊ณ  ๋“œ๋ผ์ด๋ฒ„ ์ง€์›์ด ์ž˜ ๋˜๋Š” PCAN-USB ๋˜๋Š” Kvaser Leaf Light์™€ ๊ฐ™์€ ์ œํ’ˆ๊ตฐ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ ํ™œ์šฉ: CAN ๋ถ„์„๊ธฐ(CAN Analyzer)์˜ ํž˜

ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘๋œ CAN ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง, ๊ธฐ๋ก, ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด CAN ๋ถ„์„๊ธฐ ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค.

  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • ๋ฒ„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง: ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€(ID, ๋ฐ์ดํ„ฐ, ์‹œ๊ฐ„ ์ •๋ณด)๋ฅผ ๋ชฉ๋ก ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„ํ„ฐ๋ง: ์›ํ•˜๋Š” ํŠน์ • ID์˜ ๋ฉ”์‹œ์ง€๋งŒ ์„ ๋ณ„ํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์–ด ๋ถ„์„์˜ ํšจ์œจ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
    • ๋กœ๊น…: ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ(์˜ˆ: .log, .csv)๋กœ ์ €์žฅํ•˜์—ฌ ๋‚˜์ค‘์— ์žฌ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์†ก์‹ : ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ CAN ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฒ„์Šค์— ์ „์†กํ•จ์œผ๋กœ์จ ์ฐจ๋Ÿ‰์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ๋ฐ˜์‘์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ฒœ ์†Œํ”„ํŠธ์›จ์–ด: ํ•˜๋“œ์›จ์–ด ์ œ์กฐ์‚ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์†Œํ”„ํŠธ์›จ์–ด(์˜ˆ: PEAK-System์˜ PCAN-View)๋Š” ํ•„์ˆ˜์ ์ด๋ฉฐ, ์ „๋ฌธ ๋ถ„์„์„ ์œ„ํ•ด์„œ๋Š” Vector CANoe๋‚˜ **BUSMASTER(์˜คํ”ˆ ์†Œ์Šค)**์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ํˆด์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ: Python python-can ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋‹จ์ˆœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋„˜์–ด ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋‚˜ ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ CAN ํ†ต์‹ ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์€ Python ์–ธ์–ด์™€ python-can ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

  • python-can์˜ ์ด์ :
    • ๋ฒ”์šฉ์„ฑ: PEAK, Kvaser, SocketCAN ๋“ฑ ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต์ผ๋œ API๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ์‰ฌ์šด ์‚ฌ์šฉ๋ฒ•: ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ CAN ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ (์ˆ˜์‹ ):
      import can
      # CAN ๋ฒ„์Šค ์—ฐ๊ฒฐ (์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž๊ฒŒ ์„ค์ •)
      bus = can.interface.Bus(channel='can0', bustype='socketcan')
      # ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
      while True:
          msg = bus.recv()
          if msg:
              print(f"ID: {msg.arbitration_id:#x}, Data: {msg.data.hex()}")

CAN ํ†ต์‹  ๋ฐ์ดํ„ฐ ํ•ด์„ ๋ฐ ๋ถ„์„์˜ ๋…ธํ•˜์šฐ

CAN ๋ฐ์ดํ„ฐ๋Š” ๋‹จ์ˆœํžˆ 16์ง„์ˆ˜ ์ˆซ์ž์˜ ๋‚˜์—ด๋กœ ๋ณด์ด์ง€๋งŒ, ์ด ์ˆซ์ž๋ฅผ ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

DBC ํŒŒ์ผ์˜ ์—ญํ• ๊ณผ ์ค‘์š”์„ฑ

CAN ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐ ์žˆ์–ด DBC(Database Container) ํŒŒ์ผ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. DBC ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง€ ์ •์˜: ํŠน์ • ID๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์‹œ์ง€์ธ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: 0x200์€ 'EngineRPM' ๋ฉ”์‹œ์ง€)
  • ์‹ ํ˜ธ ์ •์˜: ๋ฉ”์‹œ์ง€ ๋‚ด์—์„œ ํŠน์ • ๋ฐ”์ดํŠธ ๋˜๋Š” ๋น„ํŠธ ๋ฒ”์œ„๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ๋Ÿ‰์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: 2๋ฐ”์ดํŠธ๋ถ€ํ„ฐ 3๋ฐ”์ดํŠธ๊นŒ์ง€๋Š” ์—”์ง„ RPM ๊ฐ’)
  • ์Šค์ผ€์ผ๋ง ๋ฐ ์˜คํ”„์…‹: 16์ง„์ˆ˜ ์›์‹œ ๋ฐ์ดํ„ฐ(Raw Data)๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๊ฐ’(์˜ˆ: RPM, °C, km/h)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ **๋ณ€ํ™˜ ๊ณต์‹(Scale, Offset)**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ค์ œ ๊ฐ’ = (Raw Value $\times$ Scale) + Offset

DBC ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด, CAN ๋ถ„์„๊ธฐ ์†Œํ”„ํŠธ์›จ์–ด์— ์ด๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋ณต์žกํ•œ 16์ง„์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ '์—”์ง„ RPM', '์ฐจ๋Ÿ‰ ์†๋„'์™€ ๊ฐ™์€ ์ง๊ด€์ ์ธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ฐจ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํŒŒ์•…

์ฐจ๋Ÿ‰ ์ œ์กฐ์‚ฌ๋งˆ๋‹ค CAN ID์™€ ๋ฐ์ดํ„ฐ ์ •์˜๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ์ฐจ๋Ÿ‰ ์ง„๋‹จ์šฉ ํ”„๋กœํ† ์ฝœ์ธ **OBD-II (On-Board Diagnostics II)**๋ฅผ ํ†ตํ•ด ๊ณตํ†ต์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. OBD-II๋Š” ISO 15765-4 (CAN) ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ํŠน์ • ์„œ๋น„์Šค ID(PID, Parameter ID)๋ฅผ ์š”์ฒญํ•˜์—ฌ ์—”์ง„ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ:
    • ์š”์ฒญ ID: $0x7DF$ (๊ธฐ๋Šฅ์  ์ฃผ์†Œ)
    • ์š”์ฒญ ๋ฐ์ดํ„ฐ: 02 01 0C (์„œ๋น„์Šค 01, PID 0C: Engine RPM ์š”์ฒญ)
    • ์‘๋‹ต ID: $0x7E8$ (์‘๋‹ต ECU ์ฃผ์†Œ)
    • ์‘๋‹ต ๋ฐ์ดํ„ฐ: 04 41 0C xx yy (xx yy๋ฅผ DBC ํŒŒ์ผ์˜ ์Šค์ผ€์ผ๋ง ๊ณต์‹์— ๋”ฐ๋ผ ๋ณ€ํ™˜ํ•˜์—ฌ RPM ๊ฐ’์„ ์–ป์Œ)

์ด๋Ÿฌํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด CAN ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์ถœ๋ฐœ์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ CAN ํ†ต์‹  ์‹ค์Šต์„ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ• ํŒ

์ด๋ก  ํ•™์Šต๋งŒํผ ์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ CAN ํ†ต์‹ ์„ ์‹ค์Šตํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๊ฐ–์ถ”์„ธ์š”.

  • ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์šฉ: ์‹ค์ œ ์ฐจ๋Ÿ‰์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „, CAN ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ **๊ฐ€์ƒ CAN ๋“œ๋ผ์ด๋ฒ„(์˜ˆ: Linux์˜ SocketCAN)**๋ฅผ ํ™œ์šฉํ•˜์—ฌ PC ๋‚ด๋ถ€์—์„œ ๊ฐ€์ƒ์˜ CAN ํ†ต์‹  ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐ ์—†์ด๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋กœ์ง์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • ๋ฒค์น˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ: ์‹ค์ œ ์ฐจ๋Ÿ‰์˜ ECU๋‚˜ ์ฃผ์š” ์„ผ์„œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ CAN ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐํ•œ ๋ฒค์น˜(Bench) ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋ฉด, ์ฐจ๋Ÿ‰์„ ์›€์ง์ด์ง€ ์•Š๊ณ ๋„ ์•ˆ์ •์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ์—์„œ๋Š” CAN ๋ฒ„์Šค์˜ ์ข…๋‹จ ์ €ํ•ญ(Termination Resistor, $120\Omega$)์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์ตœ์ ํ™”: ์ฐจ๋Ÿ‰์˜ CAN ๋ฒ„์Šค๋Š” ์ดˆ๋‹น ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ๋ฅด๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ(ํŠน์ • ECU์˜ ๋ฉ”์‹œ์ง€)๋งŒ ์ง‘์ค‘์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„์„ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

์ด๋Ÿฌํ•œ ๊ตฌ์ฒด์ ์ธ ๋„๊ตฌ์™€ ๋…ธํ•˜์šฐ๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด, ์ž๋™์ฐจ CAN ํ†ต์‹ ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์›ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋” ์ž์„ธํ•œ ์ฐธ๊ณ ์ž๋ฃŒ๋Š” ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

 

๋” ์ž์„ธํ•œ ์ฐธ๊ณ ์ž๋ฃŒ ๋ณด๊ธฐ