ESP32 เป็นไมโครคอนโทรลเลอร์ยอดนิยมในสาย IoT เนื่องจากมีประสิทธิภาพสูง ราคาไม่แพง และมีฟังก์ชันการสื่อสารไร้สายอย่าง Wi‑Fi และ Bluetooth ในตัว แต่สิ่งที่หลายคนอาจยังไม่ทราบคือ ESP32 มี CAN controller อยู่ภายในชิป
หมายความว่า ESP32 สามารถนำมาใช้สื่อสารด้วย CAN bus ได้โดยตรง โดยไม่ต้องใช้ CAN controller ภายนอกเหมือนในไมโครคอนโทรลเลอร์หลายรุ่น
ความสามารถด้าน CAN ของ ESP32 ได้แก่
- รองรับมาตรฐาน CAN 2.0A (11‑bit ID)
- รองรับมาตรฐาน CAN 2.0B (29‑bit ID)
- รองรับความเร็วสูงสุด 1 Mbps

หมายเหตุ: ESP32 ยังไม่รองรับ CAN FD
CAN controller และ CAN transceiver ต่างกันอย่างไร
จุดที่ผู้เริ่มต้นมักสับสนคือคำว่า controller และ transceiver ซึ่งในระบบ CAN ทั้งสองส่วนนี้ทำหน้าที่ต่างกันชัดเจน
- CAN controller
ทำหน้าที่จัดการ protocol ของ CAN เช่น frame format, arbitration, error handling และ timing
→ ในกรณีของ ESP32 ส่วนนี้มีอยู่แล้วภายในชิป - CAN transceiver
ทำหน้าที่แปลงสัญญาณดิจิทัลจาก CAN controller ให้เป็นสัญญาณไฟฟ้าแบบ CANH / CANL สำหรับส่งบนสายบัสจริง
→ ต้องต่ออุปกรณ์เพิ่มภายนอก
ตัวอย่าง CAN transceiver ที่นิยมใช้กับ ESP32 เช่น SN65HVD230 ซึ่งทำงานที่แรงดัน 3.3V เหมาะกับ ESP32 โดยตรง

ภาพรวมการต่อ ESP32 เป็น CAN bus node
การสร้าง ESP32 ให้ทำหน้าที่เป็น CAN bus node ต้องใช้อุปกรณ์หลักเพียงไม่กี่อย่าง ได้แก่
- บอร์ด ESP32 (เช่น ESP32 DevKit)
- CAN transceiver
- สาย CANH และ CANL
แนวคิดการต่อวงจรแบบง่ายคือ
- ขา TX และ RX ของ CAN controller ใน ESP32 ต่อเข้ากับ TX / RX ของ CAN transceiver
- ใช้ไฟเลี้ยง 3.3V และ GND ร่วมกัน
- ต่อ CANH และ CANL เข้ากับ CAN bus

แม้ชื่อขา TX / RX จะคล้าย UART แต่สัญญาณ CAN เป็นคนละระบบกับ Serial UART
TWAI คืออะไร
ในเอกสารของ Espressif จะไม่เรียก CAN ตรง ๆ แต่ใช้ชื่อว่า TWAI (Two‑Wire Automotive Interface) ซึ่งเป็นชื่อที่ใช้เรียกโมดูล CAN controller ภายใน ESP32
Espressif ได้พัฒนา TWAI Library ขึ้นมาเพื่อช่วยให้ผู้พัฒนาเขียนโปรแกรมใช้งาน CAN bus บน ESP32 ได้ง่ายขึ้น โดยผู้ใช้ Arduino IDE สามารถเรียกใช้งานได้ทันทีหลังจากติดตั้ง ESP32 board support
TWAI Library ทำหน้าที่เป็นตัวกลางระหว่างโปรแกรมของผู้ใช้กับ CAN controller ภายในชิป เช่น
- การตั้งค่า baud rate
- การกำหนดโหมดการทำงานของโหนด
- การรับและส่ง CAN frame
- การจัดการ error และสถานะของบัส
อ่านรายละเอียดเพิ่มเติมได้ที่นี่
ภาพรวมการใช้งาน TWAI Library บน Arduino IDE
แม้ว่าเอกสารทางการของ Espressif จะอธิบาย TWAI ในบริบทของ ESP-IDF แต่สำหรับผู้เริ่มต้น Arduino IDE เป็นจุดเริ่มที่ง่ายกว่า และแนวคิดการใช้งานก็ยังเหมือนเดิม
ภาพรวมขั้นตอนการใช้ TWAI บน Arduino IDE มีเพียง 3 ขั้นตอนหลัก
- กำหนดค่า (Configuration)
- เริ่มต้นการทำงาน (Start driver)
- รับ–ส่งข้อมูลบน CAN bus
ตัวอย่างที่ 1: การเริ่มต้นใช้งาน TWAI (Initialization)
ตัวอย่างนี้แสดงโครงสร้างพื้นฐานที่สุดของการใช้งาน TWAI บน Arduino IDE โดยตั้งค่าให้ ESP32 ทำงานในโหมดปกติ และรับทุก CAN ID
#include "driver/twai.h"
// กำหนดขา TX / RX ที่เชื่อมกับ CAN transceiver
#define CAN_TX_PIN GPIO_NUM_21
#define CAN_RX_PIN GPIO_NUM_22
void setup() {
Serial.begin(115200);
// 1) General configuration: กำหนดขาและโหมดการทำงาน
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(
CAN_TX_PIN,
CAN_RX_PIN,
TWAI_MODE_NORMAL
);
// 2) Timing configuration: ตั้งค่า baud rate เป็น 500 kbps
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
// 3) Filter configuration: รับทุก CAN ID
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
// ติดตั้ง TWAI driver
if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
Serial.println("TWAI driver installed");
} else {
Serial.println("TWAI driver install failed");
return;
}
// เริ่มต้นการทำงานของ TWAI
if (twai_start() == ESP_OK) {
Serial.println("TWAI driver started");
} else {
Serial.println("TWAI driver start failed");
}
}
void loop() {
// ยังไม่ทำอะไรใน loop
}ตัวอย่างนี้เหมาะสำหรับ
- ตรวจสอบการต่อวงจร
- เช็ก baud rate
- เตรียม ESP32 ให้พร้อมเป็น CAN node
ตัวอย่างที่ 2: การรับข้อมูลจาก CAN bus
เมื่อ TWAI driver เริ่มทำงานแล้ว (จากตัวอย่างที่ 1) เราสามารถรับข้อมูลจาก CAN bus ได้ในฟังก์ชัน loop() โดยใช้ twai_receive()
void loop() {
twai_message_t message;
// รอรับข้อความเป็นเวลา 1 วินาที
if (twai_receive(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
Serial.print("Received ID: 0x");
Serial.println(message.identifier, HEX);
if (!message.rtr) {
Serial.print("Data: ");
for (int i = 0; i < message.data_length_code; i++) {
Serial.print(message.data[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
}แนวคิดสำคัญของตัวอย่างนี้คือ
- ESP32 จะรอรับ CAN frame จากบัส
- เมื่อมีข้อมูลเข้ามา จะนำ ID และ data มาแสดงผ่าน Serial Monitor
ตัวอย่างที่ 3: การส่งข้อมูลออกไปบน CAN bus
ESP32 สามารถส่ง CAN frame ออกไปได้โดยการสร้างโครงสร้าง twai_message_t และเรียกใช้ twai_transmit() ตัวอย่างนี้สร้างฟังก์ชัน sendCanMessage() เพื่อสำหรับเรียกใช้งาน โดยข้อความที่ส่งอยู่ในตัวแปร tx_mag.data[i] ซึ่งในที่นี้ได้กำหนดเป็นตัวเลข 0-7 ผู้อ่านสามารถปรัแก้ข้อความที่ต้องการส่งเองได้
void sendCanMessage() {
twai_message_t tx_msg;
tx_msg.identifier = 0x100; // CAN ID
tx_msg.extd = 0; // Standard frame (11-bit ID)
tx_msg.rtr = 0; // Data frame
tx_msg.data_length_code = 8; // ข้อมูล 8 ไบต์
for (int i = 0; i < 8; i++) {
tx_msg.data[i] = i;
}
if (twai_transmit(&tx_msg, pdMS_TO_TICKS(1000)) == ESP_OK) {
Serial.println("CAN message sent");
} else {
Serial.println("CAN message send failed");
}
}หากต้องการส่งข้อมูลเป็นระยะ ๆ สามารถเรียกฟังก์ชันนี้จาก loop() โดยใช้ millis() ควบคุมเวลา
มองภาพรวมอีกครั้ง
การใช้งาน TWAI Library บน Arduino IDE สามารถสรุปได้สั้น ๆ ดังนี้
- กำหนดค่า CAN controller ผ่าน TWAI configuration
- เริ่มต้น driver ใน
setup() - ใช้
twai_transmit()และtwai_receive()ในloop() - รายละเอียดการใช้งาน TWAI อ่านเพิ่มเติมไดที่นี่

Leave a Reply