ESP32 เป็นหนึ่งในไมโครคอนโทรลเลอร์สเป็คสูงที่มี CAN controller มาในตัว ทำให้สามารถเขียนโปรแกรมรับ-ส่งข้อมูลผ่าน CAN ได้ง่าย เหมาะกับการเรียนรู้ CAN bus ผ่านการปฏิบัติ โดยบทความนี้จะใช้ ESP32 จำนวน 2 ตัว ในการเขียนโปรแกรมรับ-ส่งข้อมูล และใช้ Acceptance Filter กรองข้อมูลที่เข้ามา
สนับสนุนบทความดี ๆ แบบนี้ได้ โดยเลือกสั่งซื้อสินค้ากับเรา |
|
ราคา 339.00 บาท
|
IOXESP32U บอร์ดพัฒนา ESP32 รุ่นเสานอก ราคา 389.00 บาท |
IOXESP32 บอร์ดพัฒนา ESP32 รุ่นพิเศษ Pin Header ขายาว ราคา 339.00 บาท |
BASE32 บอร์ดขยายขาสำหรับบอร์ด ESP32 ราคา 260.00 บาท |
ราคา 257.00 บาท |
ราคา 271.00 บาท |
การสร้าง CAN Node จำเป็นต้องมีอุปกรณ์อย่างน้อย 2 อย่าง คือ 1) ไมโครคอนโทรลเลอร์ (ที่มี CAN controller มาในตัว) และ 2) CAN Transceiver
ในบทความนี้เลือกใช้บอร์ด IOXESP32 จำนวน 2 บอร์ด เป็นไมโครคอนโทรลเลอร์ เลือกใช้ TJA1050 CAN transceiver module และ IOXESP32 CAN Bus shield เป็น CAN Transceiver
รูปที่ 1 บอร์ด IOXESP32
รูปที่ 2 TJA1050 CAN transceiver module
รูปที่ 3 IOXESP32 CAN Bus shield
ESP32 รองรับการใช้งาน CAN ที่ขาใดก็ได้ โดยต้องกำหนดในโค้ดโปรแกรมว่าใช้งาน CAN ที่ขาใด ในที่นี้เลือกใช้ขา 27 ต่อ RX และ 26 ต่อ TX จึงต่อ TJA1050 เข้ากับ ESP32 ตามขาดังกล่าว ส่วน IOXESP32 CAN Bus shield ต่อ RX เข้ากับ 27 และต่อ TX เข้ากับ 26 อยู่แล้ว
รูปที่ 4 การต่อวงจรบอร์ด ESP32 สร้าง CAN bus
Terminating Resistor มีอยู่บน TJA1050 CAN transceiver module และ IOXESP32 CAN Bus shield อยู่แล้ว จึงไม่ต้องต่อเพิ่มอีก
จากรูปที่ 4 ผู้เขียนแบ่งอุปกรณ์เป็น 2 ชุด คือชุด CAN Node A และชุด CAN Node B และทั้ง 2 ชุดเชื่อมต่อผ่านสาย CAN High และ CAN Low ซึ่งชื่อชุดอุปกรณ์จะถูกนำไปใช้อ้างอิงตัวอย่างการเขียนโปรแกรมต่อไป
บทความนี้เลือกใช้โปรแกรม ArduinoIDE ที่ติดตั้ง Arduino core for the ESP32 ในการพัฒนาโปรแกรม ส่วนไลบรารี่ที่ใช้ในการเขียนโปรแกรมสั่งงาน CAN เลือกใช้ไลบรารี่ที่อยู่บน ESP-IDF ซึ่งมีมาใน Arduino core for the ESP32 อยู่แล้ว (ไม่ต้องติดตั้งเพิ่ม)
การเขียนโปรแกรมสั่งงาน CAN จำเป็นต้อง include ไฟล์ดังนี้ เพื่อให้เรียกใช้คำสั่งเกี่ยวกับ CAN ได้
ใน void setup() สร้างตัวแปร g_config เพื่อใช้ตั้งค่า CAN ดังนี้
สร้างตัวแปร t_config เพื่อใช้ตั้งค่าความเร็วในการรับ-ส่งข้อมูล (Band rate) บนบัสดังนี้
สร้างตัวแปร f_config เพื่อตั้งค่า Acceptance Filter ดังนี้
เรียกใช้ฟังก์ชัน can_driver_install เพื่อให้การตั้งค่ามีผล ดังนี้
เรียกใช้ฟังก์ชัน can_start() เพื่อให้ CAN เริ่มทำงาน ดังนี้
ภาพรวมโค้ดโปรแกรมที่ใช้ตั้งค่า CAN มีดังนี้
พร้อมให้เขียนโปรแกรมรับ-ส่งข้อมูลต่อไป
การส่งข้อมูลเข้าไปที่ CAN bus จำเป็นต้องกำหนดโครงสร้างของ CAN Frame ก่อน โดยสร้างตัวแปรชนิด can_message_t ชื่อ message ดังนี้
ตัวแปรชนิด can_message_t เป็นตัวแปรที่สร้างจาก struct มีโครงสร้างดังนี้
ตัวอย่าง กำหนดค่าในตัวแปร message ส่งข้อความ “Hello!” ด้วยหมายเลข ID 0x10 ด้วยรูปแบบ Standard Frame เขียนโปรแกรมได้ดังนี้
จากนั้นส่งตัวแปร message ลงระบบคิว เพื่อให้ CAN controller นำข้อมูลส่งออก CAN bus ด้วยฟังก์ชัน can_transmit() ได้ดังนี้
ได้โค้ดโปรแกรมใช้ส่งข้อมูลเข้า CAN bus เต็ม ๆ ดังนี้
การรับ CAN Frame จำเป็นต้องสร้าง พื้นที่ ซึ่งเป็นตัวแปรชนิด can_message_t รอไว้ก่อน ตัวอย่างสร้างตัวแปรชื่อ message ดังนี้
ใช้ฟังก์ชัน can_receive() ในการตรวจสอบ และรอรับข้อมูลจาก CAN bus ดังนี้
หากได้รับข้อมูลจาก CAN bus ข้อมูลและ flag ต่าง ๆ จะถูกเก็บไว้ในตัวแปร message ซึ่งมีโครงสร้างตามที่กล่าวไปแล้วในหัวข้อ การส่งข้อมูลเข้า CAN bus
ตัวอย่างการรับข้อมูลจาก CAN bus มาแสดงผลใน Serial Monitor มีดังนี้
โค้ดที่ใช้รับข้อมูลจาก CAN bus เต็ม ๆ มีดังนี้
จากรูปที่ 4 กำหนดให้ CAN Node A เป็นฝั่งส่ง ให้เขียนโปรแกรมดังนี้
กำหนดให้ CAN Node B เป็นฝั่งรับ ให้เขียนโปรแกรมดังนี้
อัพโหลดโปรแกรมลงบอร์ด ESP32 ทั้ง 2 ฝั่ง จากนั้นเปิด Serial Monitor ขึ้นมา ที่ฝั่ง CAN Node A จะแสดงข้อความ Message queued for transmission เพื่อบอกว่าส่งข้อความลง CAN สำเร็จ ที่ฝั่ง CAN Node B แสดงข้อความ Message received ID 0x10: Hello! ซึ่งแสดงว่าฝั่ง Node B ได้รับข้อมูลถูกต้อง
ในตัวอย่างที่ 2 นี้ จะกำหนดให้ทั้ง CAN Node A และ CAN Node B ส่งข้อมูลเวลาปัจจุบันของตนเองเข้า CAN bus เพื่อจำลองการทำงานของ CAN bus จริง ๆ ที่ปกติอุปกรณ์แต่ละตัวในระบบจะส่งข้อมูลของตัวเองออกมาตลอดเวลา
โค้ดโปรแกรมที่ใช้ทดสอบมีดังนี้
จากโค้ดโปรแกรมด้านบน CAN Node A ให้ยกเลิกคอมเม้น (ลบ // หน้าบรรทัดออก) บรรทัดที่ 44 เพื่อกำหนดให้เวลาของ Node A มีหมายเลข ID เป็น 0x11
ที่ CAN Node B ให้ใช้โค้ดเดียวกันนี้ในการทดสอบ แต่ให้ยกเลิกคอมเม้น บรรทัดที่ 45 เพื่อกำหนดให้เวลาของ Node B มีหมายเลข ID เป็น 0x12
หลังจากแก้ไขโปรแกรม และอัพโหลดโปรแกรมแล้ว ใน Serial Monitor ฝั่ง Node A ก็จะได้รับ และแสดงค่าเวลาของ Node B และฝั่ง Node B ก็จะได้รับ และแสดงค่าของ Node A แล้ว
ตัวอย่างนี้ใช้ตัวต้านทานปรับค่าได้ในการทดสอบส่งค่าแอนะล็อกที่ CAN Node A และที่ CAN Node B แสดงผลค่าแอนะล็อกที่รับได้บนโมดูล IOXESP32 4-Digit shield วงจรมีดังนี้
ฝั่ง CAN Node A อัพโหลดโปรแกรมต่อไปนี้
ฝั่ง CAN Node B อัพโหลดโปรแกรมต่อไปนี้
ผลลัพธ์ที่ได้ เมื่อปรับตัวต้านทานปรับค่าได้ ค่าแอนะล็อกที่แสดงผลบนโมดูล IOXESP32 4-Digit shield ก็จะเปลี่ยนไปด้วย เป็นตัวอย่างที่สามารถนำไปปรับใช้รับ-ส่งข้อมูลอื่น ๆ ได้