- รู้เบื้องต้นเกี่ยวกับ CAN
- การเปรียบเทียบ CAN มากกว่า SPI และ I2C
- สามารถใช้งานโปรโตคอล
- วิธีใช้โปรโตคอล CAN ใน Arduino
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การเชื่อมต่อระหว่างโมดูล MCP2515 CAN สองโมดูล
- การเขียนโปรแกรม Arduino สำหรับการสื่อสาร CAN
- คำอธิบายรหัสด้านเครื่องส่งสัญญาณ (Arduino Nano)
- สามารถรับรหัสด้านข้างอธิบาย (Arduino UNO)
- การทำงานของการสื่อสาร CAN ใน Arduino
ทุกวันนี้รถยนต์ทั่วไปทุกคันประกอบด้วยหน่วยเซ็นเซอร์ประมาณ 60 ถึง 100 หน่วยในการตรวจจับและแลกเปลี่ยนข้อมูล เนื่องจากผู้ผลิตรถยนต์ทำให้รถของพวกเขาฉลาดขึ้นอย่างต่อเนื่องด้วยคุณสมบัติต่างๆเช่นการขับขี่อัตโนมัติ, ระบบถุงลมนิรภัย, การตรวจสอบแรงดันลมยาง, ระบบควบคุมความเร็วคงที่เป็นต้นซึ่งคาดว่าตัวเลขนี้จะสูงขึ้นเท่านั้น ซึ่งแตกต่างจากเซ็นเซอร์อื่น ๆ เซ็นเซอร์เหล่านี้ในการประมวลผลข้อมูลที่สำคัญและด้วยเหตุนี้ข้อมูลจากเซ็นเซอร์เหล่านี้ควรจะมีการสื่อสารโดยใช้มาตรฐานโปรโตคอลการสื่อสารยานยนต์ตัวอย่างเช่นข้อมูลระบบควบคุมความเร็วคงที่เช่นความเร็วตำแหน่งปีกผีเสื้อเป็นต้นเป็นค่าสำคัญที่ส่งไปยังElectronic Control Unit (ECU)ในการตัดสินใจระดับความเร่งของรถการสื่อสารผิดพลาดหรือข้อมูลสูญหายที่นี่อาจนำไปสู่ความล้มเหลวที่สำคัญ ดังนั้นจึงแตกต่างจากโปรโตคอลการสื่อสารมาตรฐานเช่น UART, SPI หรือ I2C นักออกแบบใช้โปรโตคอลการสื่อสารในรถยนต์ที่เชื่อถือได้มากเช่น LIN, CAN, FlexRay เป็นต้น
จากโปรโตคอลที่มีอยู่ทั้งหมด CAN ถูกใช้และเป็นที่นิยมมากขึ้น เราได้พูดคุยกันแล้วว่า CAN คืออะไรและ CAN ทำงานอย่างไร ดังนั้นในบทความนี้เราจะดูเป็นพื้นฐานอีกครั้งและแล้วในที่สุดเราก็จะแลกเปลี่ยนข้อมูลระหว่างสอง Arduinos ใช้การสื่อสาร ฟังดูน่าสนใจ! มาเริ่มกันเลย
รู้เบื้องต้นเกี่ยวกับ CAN
CAN aka Controller Area Networkเป็นบัสสื่อสารแบบอนุกรมที่ออกแบบมาสำหรับงานอุตสาหกรรมและยานยนต์ เป็นโปรโตคอลแบบข้อความที่ใช้สำหรับการสื่อสารระหว่างอุปกรณ์หลายเครื่อง เมื่อเชื่อมต่ออุปกรณ์ CAN หลายเครื่องเข้าด้วยกันดังที่แสดงด้านล่างการเชื่อมต่อจะสร้างเครือข่ายที่ทำหน้าที่เหมือนระบบประสาทส่วนกลางของเราซึ่งทำให้อุปกรณ์ใด ๆ สามารถพูดคุยกับอุปกรณ์อื่น ๆ ในโหนดได้
สามารถเครือข่ายจะประกอบด้วยเพียงสองสายCAN CAN สูงและต่ำสำหรับการส่งข้อมูลแบบสองทิศทางตามที่แสดงไว้ข้างต้น โดยทั่วไปความเร็วในการสื่อสารสำหรับ CAN จะอยู่ในช่วง 50 Kbps ถึง 1Mbps และระยะทางสามารถอยู่ในช่วงตั้งแต่ 40 เมตรที่ 1Mbps ถึง 1,000 เมตรที่ 50kpbs
รูปแบบของข้อความ CAN:
ในการสื่อสาร CAN ข้อมูลจะถูกส่งในเครือข่ายเป็นรูปแบบข้อความเฉพาะ รูปแบบข้อความนี้ประกอบด้วยหลายส่วน แต่สองส่วนหลักคือตัวระบุและข้อมูลที่ช่วยในการส่งและตอบกลับข้อความใน CAN บัส
Identifier หรือ CAN ID:ตัวระบุนี้เรียกอีกอย่างว่า CAN ID หรือเรียกอีกอย่างว่า PGN (Parameter Group Number) ใช้เพื่อระบุอุปกรณ์ CAN ที่มีอยู่ในเครือข่าย CAN ความยาวของตัวระบุคือ 11 หรือ 29 บิตตามประเภทของโปรโตคอล CAN ที่ใช้
มาตรฐาน CAN: 0-2047 (11 บิต)
ขยายสามารถ: 0-2 29 -1 (29 บิต)
ข้อมูล:นี่คือข้อมูลเซ็นเซอร์ / การควบคุมจริงที่ต้องส่งจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง ข้อมูลขนาดอาจมีความยาวตั้งแต่ 0 ถึง 8 ไบต์
รหัสความยาวข้อมูล (DLC): 0 ถึง 8 สำหรับจำนวนไบต์ข้อมูลที่มีอยู่
สายที่ใช้ใน CAN:
โปรโตคอล CAN ประกอบด้วยสายไฟสองสายคือCAN_H และ CAN_Lเพื่อส่งและรับข้อมูล สายไฟทั้งสองสายทำหน้าที่เป็นเส้นที่แตกต่างซึ่งหมายความว่าสัญญาณ CAN (0 หรือ 1) แสดงด้วยความต่างศักย์ระหว่าง CAN_L และ CAN_H หากความแตกต่างเป็นบวกและมากกว่าแรงดันไฟฟ้าขั้นต่ำค่าหนึ่งค่านั้นจะเป็น 1 และถ้าความแตกต่างเป็นลบจะเป็น 0
โดยปกติจะใช้สายเคเบิลคู่บิดสำหรับการสื่อสาร CAN โดยทั่วไปแล้วตัวต้านทาน 120 โอห์มตัวเดียวจะใช้ที่ปลายทั้งสองของเครือข่าย CAN ดังที่แสดงในภาพเนื่องจากสายต้องมีความสมดุลและเชื่อมโยงกับศักยภาพเดียวกัน
การเปรียบเทียบ CAN มากกว่า SPI และ I2C
เนื่องจากเราได้เรียนรู้วิธีใช้ SPI กับ Arduino และ IIC กับ Arduino แล้วให้เราเปรียบเทียบคุณสมบัติของ SPI และ I2C กับ CAN
พารามิเตอร์ | SPI | I2C | สามารถ |
ความเร็ว | 3Mbps ถึง 10Mbps | มาตรฐาน: 100Kbps | 10KBps ถึง 1MBps ขึ้นอยู่กับความยาวของสายไฟที่ใช้ |
เร็ว: 400 Kbps | |||
ความเร็วสูง: 3.4Mbps | |||
ประเภท | ซิงโครนัส | ซิงโครนัส | อะซิงโครนัส |
จำนวนสายไฟ | 3+ (MISO, MOSI, SCK, SS1, SS2 … SS (n)) | 2 สาย (SDA, SCL) | 2 สาย (CAN_H, CAN_L) |
ดูเพล็กซ์ | ดูเพล็กซ์เต็มรูปแบบ | ครึ่งดูเพล็กซ์ | ครึ่งดูเพล็กซ์ |
สามารถใช้งานโปรโตคอล
- เนื่องจากความทนทานและความน่าเชื่อถือของโปรโตคอล CAN จึงใช้ในอุตสาหกรรมต่างๆเช่นยานยนต์เครื่องจักรอุตสาหกรรมการเกษตรอุปกรณ์การแพทย์เป็นต้น
- เนื่องจากความซับซ้อนของการเดินสายใน CAN ลดลงจึงมักใช้ในการใช้งานยานยนต์เช่นรถยนต์
- ต้นทุนต่ำในการใช้งานและราคาส่วนประกอบฮาร์ดแวร์ก็น้อยลงด้วย
- ง่ายต่อการเพิ่มและถอดอุปกรณ์บัส CAN
วิธีใช้โปรโตคอล CAN ใน Arduino
เนื่องจาก Arduino ไม่มีพอร์ต CAN ในตัวจึงใช้โมดูล CAN ที่เรียกว่าMCP2515 โมดูล CAN นี้เชื่อมต่อกับ Arduino โดยใช้การสื่อสาร SPI มาดูรายละเอียดเพิ่มเติมเกี่ยวกับ MCP2515 และวิธีการเชื่อมต่อกับ Arduino
MCP2515 CAN โมดูล:
MCP2515 โมดูลมี MCP2515 ควบคุม CAN ซึ่งเป็นความเร็วสูงจะส่งสัญญาณการเชื่อมต่อระหว่าง MCP2515 และ MCU ผ่าน SPI ดังนั้นจึงง่ายต่อการเชื่อมต่อกับไมโครคอนโทรลเลอร์ที่มีอินเทอร์เฟซ SPI
สำหรับผู้เริ่มต้นที่ต้องการเรียนรู้ CAN Bus โมดูลนี้จะเป็นจุดเริ่มต้นที่ดี บอร์ด CAN SPI นี้เหมาะสำหรับระบบอัตโนมัติในอุตสาหกรรมระบบอัตโนมัติภายในบ้านและโครงการฝังตัวยานยนต์อื่น ๆ
คุณสมบัติและคุณสมบัติของ MCP2515:
- ใช้ตัวรับส่งสัญญาณ CAN ความเร็วสูง TJA1050
- ขนาด: 40 × 28 มม
- การควบคุม SPI เพื่อขยายอินเทอร์เฟซบัส Multi CAN
- ออสซิลเลเตอร์คริสตัล 8MHZ
- ความต้านทานขั้ว120Ω
- มีคีย์อิสระ, ไฟ LED, ไฟแสดงสถานะ
- รองรับการทำงาน 1 Mb / s CAN
- การดำเนินการสแตนด์บายในปัจจุบันต่ำ
- สามารถเชื่อมต่อได้สูงสุด 112 โหนด
Pinout ของโมดูล MCP2515 CAN:
ชื่อพิน |
ใช้ |
VCC |
ขาอินพุตไฟ 5V |
GND |
พินกราวด์ |
CS |
SPI SLAVE เลือกพิน (Active ต่ำ) |
ดังนั้น |
SPI หลักอินพุตเอาต์พุตทาสลีด |
SI |
SPI master output slave นำเข้า |
SCLK |
เข็มนาฬิกา SPI |
INT |
MCP2515 พินขัดจังหวะ |
ในบทช่วยสอนนี้เรามาดูวิธีการส่งข้อมูลเซ็นเซอร์ความชื้นและอุณหภูมิ (DHT11) จาก Arduino Nano ไปยัง Arduino Uno ผ่านโมดูลบัสCAN MCP2515
ส่วนประกอบที่จำเป็น
- Arduino UNO
- Arduino NANO
- DHT11
- จอ LCD 16x2
- MCP2515 CAN โมดูล - 2
- โพเทนชิออมิเตอร์ 10k
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภูมิวงจรรวม
การเชื่อมต่อด้านเครื่องส่งสัญญาณ CAN:
ส่วนประกอบ - พิน |
Arduino นาโน |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - ก.พ. |
D10 (SPI_SS) |
MPC2515 - ส |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - ออก |
A0 |
การเชื่อมต่อวงจรที่ด้าน CAN Receiver:
ส่วนประกอบ - พิน |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - ก.พ. |
10 (SPI_SS) |
MPC2515 - ส |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
จอ LCD - V0.2 |
ถึง PIN ศูนย์โพเทนชิออมิเตอร์ 10K |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E. |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
จอแอลซีดี - D6 |
7 |
LCD - D7 |
8 |
LCD - ก |
+ 5V |
LCD - เค |
GND |
การเชื่อมต่อระหว่างโมดูล MCP2515 CAN สองโมดูล
H - สามารถสูง
L - ต่ำได้
MCP2515 (Arduino นาโน) |
MCP2515 (Arduino UNO) |
ซ |
ซ |
ล |
ล |
เมื่อทำการเชื่อมต่อทั้งหมดแล้วฮาร์ดแวร์ของฉันจะมีลักษณะดังนี้ด้านล่าง
การเขียนโปรแกรม Arduino สำหรับการสื่อสาร CAN
ก่อนอื่นเราต้องติดตั้งไลบรารีสำหรับ CAN ใน Arduino IDE การเชื่อมต่อโมดูล MCP2515 CAN กับ Arduino จะง่ายขึ้นโดยใช้ไลบรารีต่อไปนี้
- ดาวน์โหลดไฟล์ ZIP ของ Arduino CAN MCP2515 Library
- จาก Arduino IDE: Sketch -> Include Library -> Add.ZIP Library
ในการเข้ารหัสการสอนนี้แบ่งออกเป็นสองส่วนส่วนหนึ่งเป็นรหัสเครื่องส่งสัญญาณ CAN (Arduino Nano) และอื่น ๆ เป็นรหัส CAN ตัวรับ (Arduino UNO) ซึ่งทั้งสองส่วนนี้สามารถพบได้ที่ด้านล่างของหน้านี้ คำอธิบายเดียวกันมีดังนี้
ก่อนที่จะเขียนโปรแกรมสำหรับการส่งและรับข้อมูลตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งไลบรารีตามขั้นตอนข้างต้นและโมดูล CAN MCP2515 ได้รับการเริ่มต้นในโปรแกรมของคุณดังต่อไปนี้
เริ่มต้นโมดูล MCP2515 CAN:
ในการสร้างการเชื่อมต่อกับ MCP2515 ให้ทำตามขั้นตอน:
1. กำหนดหมายเลขพินที่เชื่อมต่อ SPI CS (10 โดยค่าเริ่มต้น)
MCP2515 mcp2515 (10);
2. กำหนดอัตราการส่งข้อมูลและความถี่ของออสซิลเลเตอร์
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
อัตรารับส่งข้อมูล:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_250000.
ความเร็วนาฬิกาที่ใช้ได้:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. ตั้งค่าโหมด
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
คำอธิบายรหัสด้านเครื่องส่งสัญญาณ (Arduino Nano)
ในส่วนเครื่องส่ง Arduino Nano เชื่อมต่อกับโมดูล MCP2515 CAN ผ่านหมุด SPI และDHT11 จะส่งข้อมูลอุณหภูมิและความชื้นไปยังบัส CAN
แรกห้องสมุดจำเป็นที่จะถูกรวมห้องสมุด SPI SPI สำหรับการใช้การสื่อสารห้องสมุด MCP2515 สำหรับการใช้ CAN สื่อสารและห้องสมุด DHT สำหรับการใช้เซ็นเซอร์ DHT กับ Arduino ก่อนหน้านี้เราได้เชื่อมต่อ DHT11 กับ Arduino
# รวม
ตอนนี้กำหนดชื่อพินของ DHT11 (ขาออก) ที่เชื่อมต่อกับ A0 ของ Arduino Nano แล้ว
# กำหนด DHTPIN A0
และยังเป็นที่ DHTTYPE ถูกกำหนดให้เป็น DHT11
# กำหนด DHTTYPE DHT11
canMsg struct ชนิดข้อมูลสำหรับการจัดเก็บรูปแบบข้อความ CAN
โครงสร้าง can_frame canMsg;
กำหนดหมายเลขพินที่เชื่อมต่อ SPI CS (10 โดยค่าเริ่มต้น)
MCP2515 mcp2515 (10);
นอกจากนี้วัตถุ dht สำหรับคลาส DHT พร้อมขา DHT ที่มี Arduino Nano และประเภท DHT เนื่องจาก DHT11 ถูกเริ่มต้น
DHT dht (DHTPIN, DHTTYPE);
ถัดไปในการตั้งค่าโมฆะ ():
เริ่มต้นการสื่อสาร SPI โดยใช้คำสั่งต่อไปนี้
SPI.begin ();
จากนั้นใช้ข้อความด้านล่างเพื่อเริ่มรับค่าอุณหภูมิและความชื้นจากเซ็นเซอร์ DHT11
dht.begin ();
ถัดไป MCP2515 จะถูก RESET โดยใช้คำสั่งต่อไปนี้
mcp2515.reset ();
ตอนนี้ MCP2515 ตั้งค่าความเร็วไว้ที่ 500KBPS และ 8MHZ เป็นนาฬิกา
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
และ MCP2525 ถูกตั้งค่าไว้ที่โหมดปกติ
mcp2515.setNormalMode ();
ใน void loop ():
คำสั่งต่อไปนี้รับค่าความชื้นและอุณหภูมิและเก็บในตัวแปรจำนวนเต็ม h และ t
int h = dht.readHumidity (); int เสื้อ = dht.readTemperature ();
ถัดไปรหัส CAN จะได้รับเป็น 0x036 (ตามตัวเลือก) และ DLC เป็น 8 และเราให้ข้อมูล h และ t กับ ข้อมูล และ ข้อมูล และพักข้อมูลทั้งหมดด้วย 0
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // อัปเดตค่าความชื้นใน canMsg.data = t; // อัปเดตค่าอุณหภูมิใน canMsg.data = 0x00; // พักทั้งหมดด้วย 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
หลังจากที่ทุกคนที่จะส่งข้อความไปยัง CAN BUSเราใช้คำสั่งดังต่อไปนี้
mcp2515.sendMessage (& canMsg);
ตอนนี้ข้อมูลอุณหภูมิและความชื้นจะถูกส่งเป็นข้อความไปยัง CAN bus
สามารถรับรหัสด้านข้างอธิบาย (Arduino UNO)
ในส่วนเครื่องรับ Arduino UNO เชื่อมต่อกับจอแสดงผล LCD MCP2515 และ 16x2 ที่นี่ Arduino UNO รับอุณหภูมิและความชื้นจาก CAN บัสและแสดงข้อมูลที่ได้รับใน LCD
แรกห้องสมุดจำเป็นที่จะถูกรวมห้องสมุด SPI SPI สำหรับการใช้การสื่อสารห้องสมุด MCP2515 สำหรับการใช้ CAN สื่อสารและห้องสมุด LiquidCrsytal สำหรับการใช้ 16x2 แอลซีดีพร้อม Arduino
# รวม
ถัดไปจะกำหนดพิน LCD ที่ใช้ในการเชื่อมต่อกับ Arduino UNO
const int rs = 3, th = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
struct ชนิดข้อมูลประกาศสำหรับการจัดเก็บรูปแบบข้อความ CAN
โครงสร้าง can_frame canMsg;
กำหนดหมายเลขพินที่เชื่อมต่อ SPI CS (10 โดยค่าเริ่มต้น)
MCP2515 mcp2515 (10);
ในการตั้งค่าเป็นโมฆะ ():
ขั้นแรกให้ตั้งค่า LCD ที่โหมด 16x2 และข้อความต้อนรับจะปรากฏขึ้น
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("สามารถ ARDUINO"); ล่าช้า (3000); lcd.clear ();
เริ่มต้นการสื่อสาร SPI โดยใช้คำสั่งต่อไปนี้
SPI.begin ();
ถัดไป MCP2515 จะถูก RESET โดยใช้คำสั่งต่อไปนี้
mcp2515.reset ();
ตอนนี้ MCP2515 ตั้งค่าความเร็วไว้ที่ 500KBPS และ 8MHZ เป็นนาฬิกา
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
และ MCP2525 ถูกตั้งค่าไว้ที่โหมดปกติ
mcp2515.setNormalMode ();
ถัดไปใน void loop ():
คำสั่งต่อไปนี้ใช้เพื่อรับข้อความจาก CAN บัส หากได้รับข้อความจะเข้าสู่เงื่อนไข if
ถ้า (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
ในเงื่อนไข if ข้อมูลจะได้รับและจัดเก็บใน c anMsg ข้อมูลที่มีค่าความชื้นและข้อมูลที่มีค่าอุณหภูมิ ค่าทั้งสองจะถูกเก็บเป็นจำนวนเต็ม x และ y
int x = canMsg.data; int y = canMsg.data;
หลังจากได้รับค่าแล้วค่าอุณหภูมิและความชื้นจะแสดงในจอ LCD 16x2 โดยใช้ข้อความต่อไปนี้
lcd.setCursor (0,0); lcd.print ("ความชื้น:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("อุณหภูมิ:"); lcd.print (y); ล่าช้า (1,000); lcd.clear ();
การทำงานของการสื่อสาร CAN ใน Arduino
เมื่อฮาร์ดแวร์พร้อมแล้วให้อัปโหลดโปรแกรมสำหรับเครื่องส่งสัญญาณ CAN และตัวรับสัญญาณ CAN (โปรแกรมที่สมบูรณ์จะได้รับด้านล่าง) ในบอร์ด Arduino ตามลำดับ เมื่อขับเคลื่อนคุณควรสังเกตค่าอุณหภูมิที่อ่านโดย DHT11 จะถูกส่งไป Arduino อื่นผ่านการสื่อสาร CAN และแสดงผลบนหน้าจอ LCD ของ 2 ครั้ง Arduino ที่คุณสามารถเห็นในภาพด้านล่าง ฉันยังใช้รีโมท AC ของฉันเพื่อตรวจสอบว่าอุณหภูมิที่แสดงบน LCD ใกล้เคียงกับอุณหภูมิห้องจริงหรือไม่
สามารถดูการทำงานทั้งหมดได้ที่วิดีโอที่ลิงก์ด้านล่าง หากคุณมีคำถามใด ๆ โปรดทิ้งไว้ในส่วนความคิดเห็นหรือใช้ฟอรัมของเราสำหรับคำถามทางเทคนิคอื่น ๆ