บอร์ด RejsaCAN-ESP32-S3 เหมาะสำหรับนักพัฒนาที่ต้องการสร้างโปรเจคเกี่ยวกับรถยนต์ ควบคุมหรืออ่านค่าอุปกรณ์บนรถได้ผ่าน CAN BUS พร้อมการเชื่อมต่อไร้สายทั้ง Wi-Fi 2.4 GHz และ Bluetooth 5 (LE) เหมาะสำหรับงาน IoT นำข้อมูลของรถ หรือเซ็นเซอร์ที่ต่อกับบอร์ด ส่งไปยัง App, Cloud หรือเก็บไว้ใน SD Card บนบอร์ด ตัวบอร์ดออกแบบให้มีขนาดเล็กพอที่จะติดตั้งในรถยนต์ได้
ตัวบอร์ดพัฒนามาจากรุ่นก่อนที่ใช้ MCU ESP32 ซึ่งรุ่นนี้เปลี่ยนไปใช้ ESP32-S3 โดยสเปคหลักแล้วใกล้เคียงกัน แต่ ESP32-S3 มี Main processor ที่ใหม่กว่าคือ Xtensa 32-bit LX7 dual core ส่วน ESP32 เป็นรุ่น LX6 การเชื่อมต่อ Bluetooth ซึ่งบน ESP32-S3 เป็น BLE 5.0 แล้วบนบอร์ดรุ่นก่อนหน้า ESP32 ต้องใช้ชิป USB to Serial ในการสื่อสาร หรืออัพโหลดโปรแกรมผ่าน PC แต่บน ESP32-S3 มีพอร์ต USB ในชิปมีส่วนควบคุม USB Serial/JTAG อยู่แล้ว ทำให้ไม่ต้องต่อชิปเพิ่ม ส่วนฟังชั่นอื่นบนบอร์ดที่น่าสนใจยังอยู่ เช่น
- Auto shutdown ให้บอร์ดเข้าโหมด sleep เมื่อตรวจสอบรถไม่มีการขับ สามารถดูรายละเอียดของระบบนี้ ได้จากบทความที่แล้ว และสามารถปรับให้ทำงานตลอดได้ผ่านจั้มเปอร์ always on หรือนักพัฒนาสามารถแก้ไขในโปรแกรมได้เอง
- 3V3 HIGH DRIVER ปกติขา ESP32-S3 สามรถจ่ายแรงดัน 3.3V ที่ประมาณ 10-20mA สามารถต่อหลอด LED เล็กๆได้พอ แต่บางงานอาจต้องต่อเซ็นเซอร์ หรือหน้าจอเข้ากับบอร์ด การมีขา 3V3 HIGH DRIVER ทำให้บอร์ดสามารถควบคุมการจ่ายไฟให้กับอุปกรณ์อื่นได้ เช่นเมื่ออยู่ใน sleep mode ลดการใช้พลังงานหรือตามเงื่อนไขในโปรแกรม
- Extra UART RX/TX เพิ่มพอร์ต serial ซึ่งบอร์ดที่ใช้ ESP32 ไม่มี
- SD card reader ทำให้บอร์ดสามรถบันทึกข้อมูลลงใน SD CARD ได้ผ่านพอร์ต SPI
- 3Dprint ผู้พัฒนาโปรเจคนี้ ยังได้ออกแบบกล่องสำหรับใส่บอร์ด ใครที่มีเครื่อง 3d-printer สามารถดาวน์โหลดไปปริ้นได้ที่ Github
ทดสอบโปรแกรมตัวอย่างใน GitHub ของโปรเจค
เมื่อเราเข้าดูส่วน Example จะเห็นได้ว่ามีโปรแกรมตัวอย่างใน Github ของบอร์ดที่ใช้ ESP32-S3 เช่น
- ESP32-S3 – SPI settings for SD card reader เป็นโปรแกรมตัวอย่างตั้งค่าพอร์ต SPI จากนั้นอ่านชื่อและขนาดไฟล์ใน SD Card
- ESP32-S3 – listen to all CAN broadcasts printed over USB โปรแกรมแสดงทุกข้อมูลที่ส่งอยู่บน CAN BUS ของรถ
- ESP32-S3 – simple first test in car โปรแกรมทดสอบอ่านค่ารอบเครื่องยนต์ ถ้ารอบเกินกำหนดให้ LED บนบอร์ดสว่าง
- Test AUTO-OFF keeping board on after engine stops โปรแกรมตัวอย่าง เมื่อตรวจสอบว่าเครื่องหยุดทำงานให้ MCU ส่งสัญญาณไปที่ชิป Switching Regulator หยุดจ่ายไฟ ทำให้ MCU ปิดการทำงาน
ซึ่งในรีวิวนี้เราจะมาทดสอบ โปรแกรมตัวอย่างที่ 2 และ 3 กัน
บอร์ด ESP32 หรือ ESP32-S3 ที่ใช้ main processor Xtensa 32-bit จะมีส่วนจัดการเชื่อมต่อ CAN BUS เรียกว่า Two-Wire Automotive Interface (TWAI) รอบรับมาตรฐาน ISO11898-1 รองรับ Standard Frame Format (11-bit ID) และ Extended Frame Format (29-bit ID) ทำให้เราเพียงต่อชิปแปลงสัญญาณ (transceiver) เพิ่ม ผู้อ่านสามารถศึกษาเพิ่มได้ที่เอกสารอ้างอิง
ตั้งค่าใน ESP32-S3 บน Arduino
ก่อนที่เราจะทดสอบบอร์ดกับรถ เนื่องจากโปรแกรมตัวอย่างเขียนบน Arduino ดังนั้นเราต้องตั้งค่าให้ตรงกับบอร์ดก่อน
- ตั้งค่าให้ Arduino รองรับ ESP32 ถ้าผู้อ่านยังไม่ได้ติดตั้ง ให้ทำการติดตั้งก่อน โดยวิธีโดยคร่าวๆคือไปที่ File>>Preferences เพิ่มลิงค์ URL ในช่วง Additional boards manager URLs ดังภาพ จากนั้นไปที่ Tools >> Board… >> Board Manager ค้นหาชื่อ ESP32 จากนั้นกด INSTALL (รายระเอียดการสามารถค้นได้จากอินเตอร์เน็ต)
- เมื่อติดตั้งเสร็จแล้ว ไปที่ Board >> esp32 >> เลือก ESP32S3 Dev Module
- จากนั้นกำหนดค่า Config ของบอร์ดดังภาพ ถ้าทุกอย่างไม่มีข้อผิดพลาด ให้ลองเปิดโปรแกรมตัวอย่างของโปรเจค แล้วกด “Verify” ส่วนหน้าต่าง output ต้องไม่แสดง error ออกมา
ในส่วนของบอร์ด RejsaCAN-ESP32-S3
เตรียมบอร์ด RejsaCAN-ESP32-S3 ที่ใช้ในการรีวิว
สาย USB C สำหรับ Upload โหลดโปรแกรม และส่งข้อมูลมายัง PC
จากบอร์ดถ้าเรานำมาเขียนเป็นวงจร จะมีสายชุดไฟมี 4 เส้น คือสายไฟเข้าขั้วบวกจากรถ ,สาย GND
ชุดสายสัญญาณมี 2 เส้นคือ CAN_H และ CAN_L ซึ่งถ้าเราดูจากคอนเน็กเตอร์ตัวผู้ของ ODB2 ขาสัญญาณทั้ง 4 จะอยู่ในหมายเลขขาดังภาพ
ทดลองกับรถ Mazda 2 ปี 2018 ซึ่งตำแหน่งพอร์ต OBD-2 จะอยู่บริเวณใต้พวงมาลัย ใกล้สวิสต์เปิดกระโปรงหน้ารถ เมื่อต่อบอร์ดเข้ากับพอร์ต OBD-II ของรถ จะอยู่ในลักษณะดังภาพ
ในการทดสอบนี้โปรแกรมตัวอย่างส่งค่าข้อมูลผ่าน Serial port เราจึงต้องเชื่อมกับ notebook ผ่านสาย USB เข้ากับบอร์ดดังภาพ
ตัวอย่างที่ 1 show all message on the bus
จากโค้ดจะเห็นได้ว่า ในส่วน setup กำหนดค่าให้กับพอร์ต CAN BUS จากนั้นให้พอร์ตเริ่มทำงาน ในส่วน loop ถ้ามีการตรวจสอบมีการส่งข้อมูลบนบัสเข้ามา จะprint รายละเอียดของ message ค่าผ่าน Serial port จากนั้นวนปริ้นข้อมูลใน message จนครบ
จากผลการทดสอบ จะเห็นได้ว่าและเรากดปุ่ม start/stop engine บอร์ดจะจับ message ทั้งหมดที่อยู่ใน CAN BUS ของรถ เมื่อเราเปิด Serial monitor ใน Arduino จะได้ลักษณะข้อมูลดังภาพ
ตัวอย่างที่ 2 read RPM and alert
ตัวอย่างนี้เป็นการอ่านค่ารอบเครื่องยนต์ของรถ ซึ่งจากโค็ดส่วน setup จะเหมือนกับตัวอย่างที่แล้ว แต่ในส่วน loop มีฟังชั่น CANsend() ที่มีหน้าที่สร้าง message ตามรูปแบบ CAN Bus Data Frame และส่งข้อมูลไปบนบัส
จากนั้นฟังชั่น CANrecv() จะคอยตรวจสอบ message ในบัส ถ้า message นั้นมี ID (0x0C) ของ RPM จะดึงข้อมูลส่วนที่เหลือมาคำนวณ และปริ้นค่าผ่าน Serial port สูตรและข้อมูลดูได้จาก Wikipedia พอได้ค่า rpm แล้ว ถ้าโปรแกรมตรวจสอบได้ว่า มีค่าเกิน 2000 rpm กำหนดให้ LED สีเหลืองสว่าง หรือถ้าไม่ใช่ให้ดับ ผลลัพท์บอร์ดแสดงข้อมูลใน Serial monitor ดังภาพ
สรุป
บอร์ด RejsaCAN-ESP32-S3 ก็เป็นบอร์ดที่น่าสนใจ ด้วยฟังชั่นการเชื่อมต่อไร้สาย การอุปกรณ์ภายนอกที่ง่ายเช่น เซ็นเซอร์ หรือหน้าจอ ก็ทำได้บน Arduino ที่มี Libraries มากมาย ซึ่งถ้าคุณเป็นมือใหม่ อยากเข้าใจระบบ อุปกรณ์บนรถ ทำโปรเจค DIY เราแนะนำให้หาบอร์ดนี้มาทดลองดู ถึงแม้โปรเจคใน GitHub นี้อาจจะยังถูกพัฒนาได้ไม่นาน พวกเอกสาร Tutorial และโค้ดตัวอย่างอาจจะน้อยอยู่ แต่ก็มีการอัพเดทอย่างต่อเนื่อง
ถ้าคุณต้องการสร้างโปรเจคที่มีการทำงานเฉพาะเงื่อนไขการทำงานที่ออกแบบเอง มีการอ่านค่า สั่งงานจากอุปกรณ์อื่น เก็บค่า เชื่อมต่อผ่าน WI-FI Bluetooth ได้ และคุณมีพื้นฐานความเข้าใจมาตรฐานการสื่อสาร CAN BUS เข้าใจการใช้ API ของ ESP32 โดยเฉพาะส่วน TWAI บอร์ดนี้เหมาะสำหรับโปรเจคนี้
ถ้าโปรเจคของคุณต้องการนำค่าของรถยนต์มาใช้โดยคุณอาจมีเวลาจำกัด ในการมาดูเรื่องมาตรฐานต่างๆ รุ่นรถ ปีไหนรองรับบ้างและส่วนของ CAN BUS ไม่ใช่ส่วนสำคัญ เราแนะนำให้ใช้อุปกรณ์ ODB2 reader ที่มีอยู่แล้วเช่นชิป ELM327 และใช้ MCU เข้าไปอ่านจากชิปอีกที เหมาะสำหรับโปรเจคนี้มากกว่า
ฉันต้องขอขอบคุณ Magnus ที่ส่งบอร์ดมาให้เราศึกษาและรีวิวในครั้งนี้ บอร์ดนี้ทำขึ้นเพื่อเสริมเท่านั้น ดังนั้นจึงไม่มีจำหน่าย และถ้าต้องการต้องสร้างบอร์ดขึ้นมาเอง
Hi, I’m Tinnapop, you can call me ‘tin’. I’m Electronics hobbyist. I don’t know everything Just wanted to share my experience.