เชื่อมต่อ OBD-II Hack ข้อมูลรถ ด้วย Python และ Ubuntu ที่สร้างบน VM VirtualBox

วันนี้ผมจะมาสาธิตวิธีการเขียน Python เชื่อมต่อกับข้อมูลรถยนต์ ในอนาคตรถจะเสมือนเป็นคอมพิวเตอร์เครื่องหนึ่งเลยทีเดียว ถ้าเราสามารถเก็บข้อมูลการใช้งานรถยนต์เพื่อดูพฤติกรรมคนขับได้ คงจะดีไม่ใช่น้อย เพราะข้อมูลเหล่านี้มีลักษณะเป็น Streaming อย่างหนึ่ง ซึ่งสามารถนำ Tools ที่จัดการกับเรื่องนี้ได้ไม่ยาก เช่น Apache Kafka เป็นต้น

แต่สิ่งหนึ่งที่ยาก คือ ทำอย่างไรจึงจะได้ข้อมูลเหล่านั้นมา?
ผมจะมาเริ่มทีละขั้นตอน

  1. เตรียมอุปกรณ์ คือ ตัวอ่าน OBD2 ELM327 แบบปลายสายอีกด้านเป็น USB โดยสามารถหาซื้อได้ใน EBay ผมซื้อไว้ตั้งแต่ปี 2561

2. สร้าง Virtual Machine ก่อน โดยเริ่มจากติดตั้ง Oracle VM VirtualBox ซึ่งมี Icon ตามรูปนี้ ตรงนี้ผมจะไม่ลงรายละเอียดมากนัก

3. เมื่อได้ VM VirtualBox แล้ว ให้เราสร้าง VM เลือกระบบปฏิบัติการเป็น Linux และเลือกเวอร์ชั่นเป็น Ubuntu version 20.04.xx ตรงนี้ผมขอไม่ลงรายละเอียดเช่นกัน

4. เมื่อได้ VM มาแ้ว ต้องทำการเซตค่า USB ก่อน เสียบสาย OBDII กับเครื่องให้เรียบร้อย จากนั้นให้กดที่ Settings > USB > Add new USB filter โดยให้เลือกอันที่ระบุว่าเป็น USB Serial Controller เพื่อให้เวลาเสียบตัวอ่าน OBD2 แล้วสามารถรับส่งข้อมูลกันได้

5. Start VM ขึ้นมา

6. หลังจากนี้เราจะทำงานบน Terminal ทำการตรวจสอบก่อนว่าพอร์ต usb ของเราทำงานที่พอร์ตไหนด้วยคำสั่ง

dmesg | grep tty

ของผมจะขึ้นว่า /dev/ttyUSB0

7. แก้ไข Permission ของพอร์ตที่เราพบ มิฉะนั้น python obd จะหา Port ไม่เจอ ด้วยคำสั่ง

sudo chmod o+rw /dev/ttyUSB0

8. ติดตั้ง pip (ถ้าเคยลงอยู่แล้วก็ข้ามไป) และ Library ของ OBD ด้วยคำสั่ง

sudo apt install python3-pip 
pip install obd

ทั้งนี้สามารถไปศึกษาเพิ่มเติมได้ใน
https://python-obd.readthedocs.io/en/latest/#installation

9. เมื่อติดตั้งเสร็จแล้ว มาเริ่มต้นเขียน Code ง่ายๆ คือ “การเริ่มต้นเชื่อมต่อครั้งแรก” โดยให้เขียนตามนี้ Save ลงไฟล์ ในที่นี้ขอใช้ชื่อไฟล์ว่า pyOBD2_Test.py

import obd
obd.logger.setLevel(obd.logging.DEBUG)
ports = obd.scan_serial()
print(ports) # ถ้าทำถูกต้อง จะต้องโชว์ [‘/dev/ttyUSB0’]
connection = obd.OBD(portstr=‘/dev/ttyUSB0’)
connection.status()

10. ต่อสายเข้ากับรถที่มีระบบ OBDII ในที่นี้ผมใช้เป็น Toyota Hilux Vigo Champ ปี 2014 เครื่อง 2KD-FTV สตาร์ทเครื่องยนต์ เมื่อเครื่องยนต์ติด ให้พิมพ์คำสั่งใน Terminal

python3 pyOBD2_Test.py

ถ้าทุกอย่างสมบูรณ์ OBD2 จะต้องเชื่อมต่อกับ VM ได้ โปรแกรมจะแสดงค่า Baud Rate ที่ตรวจพบโดยอัตโนมัติ เช่น 38400 และมีค่าใน Package ปรากฎออกมา

11. ทดลองดึงค่ารอบเครื่องยนต์ ด้วยคำสั่ง

import obd
obd.logger.setLevel(obd.logging.DEBUG)
ports = obd.scan_serial()
print(ports) # ถ้าทำถูกต้อง จะต้องโชว์ [‘/dev/ttyUSB0’]
connection = obd.OBD(portstr=‘/dev/ttyUSB0’)
connection.status()
cmd = obd.commands.RPM() #แสดงรอบเครื่อง
print(connection.query(cmd))

หน้าจอจะแสดงรอบเครื่อง ดังในรูปที่ปรากฎ (747.5 revolutions_per_minute)

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

ขับเคลื่อนโดย Blogger.