- מבוא ל- CAN
- השוואה בין CAN לעומת SPI & I2C
- יישומי פרוטוקול CAN
- כיצד להשתמש בפרוטוקול CAN בארדואינו
- רכיבים נדרשים
- תרשים מעגל
- חיבור בין שני מודולי CAN MCP2515
- תכנות Arduino לתקשורת CAN
- הסבר קוד צד משדר CAN (Arduino Nano)
- הסבר על קוד המקלט של CAN (Arduino UNO)
- עבודה בתקשורת CAN בארדואינו
כיום כל מכונית ממוצעת מורכבת מכ -60 עד 100 יחידות חיישנים בה לצורך חישה והחלפת מידע. מכיוון שמייצרי מכוניות הופכים את המכונית שלהם לחכמה יותר ויותר עם תכונות כמו נהיגה אוטונומית, מערכת כריות אוויר, ניטור לחץ אוויר בצמיגים, מערכת בקרת שיוט וכו '. המספר הזה צפוי רק להגיע גבוה. שלא כמו חיישנים אחרים, חיישנים אלה מעבדים מידע קריטי ומכאן שיש להעביר את הנתונים מחיישנים אלה באמצעות פרוטוקולי תקשורת רכב סטנדרטיים. לדוגמא, נתוני מערכת בקרת שיוט כמו מהירות, מיקום מצערת וכו 'הם ערכים חיוניים הנשלחים ליחידת הבקרה האלקטרונית (ECU).כדי להחליט על רמת האצה של המכונית, תקשורת שגויה או אובדן נתונים כאן עלולים להוביל לתקלות קריטיות. מכאן שבניגוד לפרוטוקולי תקשורת סטנדרטיים כמו UART, SPI או I2C, מעצבים משתמשים בפרוטוקולי תקשורת לרכב אמינים בהרבה כמו LIN, CAN, FlexRay וכו '.
מתוך כל הפרוטוקולים הזמינים, CAN משמש יותר ויותר פופולרי. כבר דנו מהו CAN וכיצד CAN עובד. לכן, במאמר זה נבחן את היסודות שוב ואז לבסוף נחליף נתונים בין שני ארדואינו באמצעות תקשורת CAN. נשמע מעניין נכון! אז בואו נתחיל.
מבוא ל- CAN
CAN aka Controller Area Network הוא אוטובוס תקשורת סדרתי המיועד ליישומים תעשייתיים ורכביים. זהו פרוטוקול מבוסס הודעות המשמש לתקשורת בין מספר מכשירים. כאשר מספר מכשירי CAN מחוברים יחד כמו שמוצג להלן, החיבור יוצר רשת המתנהגת כמו מערכת העצבים המרכזית שלנו ומאפשרת לכל מכשיר לדבר עם כל מכשיר אחר בצומת.
יכולים רשת תכלול רק שני חוטי CAN גבוהה ויכול נמוך עבור העברת נתונים דו-כיוונית כפי שפורטה לעיל. בדרך כלל מהירות התקשורת עבור CAN נעה בין 50 Kbps ל- 1 Mbps והמרחק יכול לנוע בין 40 מטר ב -1 Mbps ל -1000 מטר ב 50 Kpbs.
פורמט של הודעת CAN:
בתקשורת CAN הנתונים מועברים ברשת כפורמט מסר מסוים. פורמט הודעה זה מכיל מקטעים רבים אך שני מקטעים עיקריים הם המזהה והנתונים המסייעים לשליחה ולהגיב להודעות באוטובוס CAN.
מזהה או מזהה CAN: המזהה ידוע גם בשם מזהה CAN או המכונה גם PGN (מספר קבוצת פרמטרים). הוא משמש לזיהוי התקני ה- CAN הקיימים ברשת CAN. אורך המזהה הוא 11 או 29 סיביות בהתבסס על סוג פרוטוקול ה- CAN המשמש.
CAN סטנדרטי: 0-2047 (11 סיביות)
מורחב CAN: 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.
כיצד להשתמש בפרוטוקול CAN בארדואינו
מכיוון שארדואינו אינו מכיל שום יציאת CAN מובנית, משתמשים במודול CAN בשם MCP2515. מודול CAN זה מתממשק עם Arduino באמצעות תקשורת SPI. בואו נראה עוד על MCP2515 בפירוט וכיצד הוא מתממשק עם Arduino.
MCP2515 יכול מודול:
למודול MCP2515 יש בקר CAN MCP2515 שהוא משדר CAN במהירות גבוהה. החיבור בין MCP2515 ל- MCU הוא באמצעות SPI. לכן קל להתממשק לכל מיקרו-בקר בעל ממשק SPI.
למתחילים שרוצים ללמוד CAN Bus, מודול זה ישמש כהתחלה טובה. לוח CAN SPI זה אידיאלי לאוטומציה תעשייתית, אוטומציה ביתית ופרויקטים אחרים המשובצים ברכב.
תכונות ומפרט של MCP2515:
- משתמש במהירות גבוהה משדר CAN יכול TJA1050
- מידה: 40 × 28 מ"מ
- בקרת SPI להרחבת ממשק Multi CAN bus
- מתנד קריסטל 8MHZ
- התנגדות סופית 120Ω
- בעל מפתח עצמאי, מחוון LED, מחוון הפעלה
- תומך בהפעלת CAN של 1 Mb / s
- פעולת המתנה נוכחית נמוכה
- ניתן לחבר עד 112 צמתים
Pinout של MCP2515 יכול מודול:
שם סיכה |
להשתמש |
VCC |
סיכת כניסת חשמל 5V |
GND |
סיכת קרקע |
CS |
SPI SLAVE בחר סיכה (פעיל נמוך) |
כך |
עופרת פלט עבדים של קלט מאסטר SPI |
סִי |
עופרת קלט עבדים של פלט מאסטר SPI |
SCLK |
סיכת שעון SPI |
INT |
סיכת הפרעה MCP2515 |
במדריך זה נראה כיצד לשלוח נתוני חיישני לחות וטמפרטורה (DHT11) מ- Arduino Nano ל- Arduino Uno באמצעות מודול אוטובוס CAN MCP2515.
רכיבים נדרשים
- ארדואינו UNO
- ארדואינו ננו
- DHT11
- צג LCD 16x2
- MCP2515 מודול CAN - 2
- פוטנציומטר 10k
- קרש לחם
- חוטי חיבור
תרשים מעגל
חיבור בצד משדר CAN:
רכיב - סיכה |
ארדואינו ננו |
MPC2515 - VCC |
+ 5 וולט |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5 וולט |
DHT11 - GND |
GND |
DHT11 - OUT |
A0 |
חיבורי מעגל בצד מקלט CAN:
רכיב - סיכה |
ארדואינו UNO |
MPC2515 - VCC |
+ 5 וולט |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5 וולט |
LCD - V0 |
ל- PIN של מרכז פוטנציומטר 10K |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E. |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5 וולט |
LCD - K |
GND |
חיבור בין שני מודולי CAN MCP2515
H - יכול גבוה
L - יכול נמוך
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
ה |
ה |
ל |
ל |
לאחר כל החיבורים, החומרה שלי נראתה כך למטה
תכנות Arduino לתקשורת CAN
ראשית עלינו להתקין ספרייה ל- CAN בארדואינו IDE. ממשק MCP2515 CAN מודול עם Arduino הופך להיות קל יותר באמצעות הספרייה הבאה.
- הורד את קובץ ה- ZIP של ספריית Arduino CAN MCP2515.
- מתוך IDE של ארדואינו: סקיצה -> כלול ספרייה -> הוסף ספריית.ZIP
במדריך זה קידוד מחולק לשני חלקים אחד כקוד משדר CAN (Arduino Nano) ושני כקוד מקלט CAN (Arduino UNO) שניהם נמצאים בתחתית דף זה. ההסבר לכך הוא כדלקמן.
לפני כתיבת תוכנית לשליחה וקבלה של נתונים וודא שהתקנת את הספרייה בעקבות השלבים שלעיל ומודול ה- CAN MCP2515 מאותחל בתוכנית שלך כדלקמן.
אתחל את מודול ה- CAN MCP2515:
על מנת ליצור חיבור עם 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_250. CAN_50
מהירויות שעון זמינות:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. הגדר מצבים.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
הסבר קוד צד משדר CAN (Arduino Nano)
בחלק המשדר, Arduino Nano התממשק עם מודול ה- CAN MCP2515 דרך סיכות SPI ו- DHT11 שולח נתוני טמפרטורה ולחות לאוטובוס CAN.
ראשית כלולות הספריות הנדרשות, ספריית SPI לשימוש בתקשורת SPI, ספריית MCP2515 לשימוש בתקשורת CAN וספריית DHT לשימוש בחיישן DHT עם Arduino . בעבר התממשקנו DHT11 עם Arduino.
#לִכלוֹל
כעת מוגדר שם הסיכה של DHT11 (סיכה OUT) המחובר ל- A0 של Arduino Nano
#define DHTPIN A0
וגם, ה- DHTTYPE מוגדר כ- DHT11.
#define DHTTYPE DHT11
CanMsg לסוג הנתונים struct לאחסון בפורמט המסר יכול.
struct 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 באמצעות הפקודה הבאה
mcp2515.reset ();
עכשיו MCP2515 מוגדר מהירות של 500KBPS ו- 8MHZ כשעון
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
ו- MCP2525 מוגדר במצב רגיל
mcp2515.setNormalMode ();
בלולאת הריק ():
ההצהרה הבאה מקבלת את ערך הלחות והטמפרטורה ומאחסנת במשתנה שלם h ו- t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
הבא את יכולה מזהה ניתנת כמו 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.
הסבר על קוד המקלט של CAN (Arduino UNO)
בחלק המקלט, Arduino UNO התממשק עם תצוגת LCD MCP2515 ו- 16x2. כאן ה- Arduino UNO מקבל את הטמפרטורה והלחות מאוטובוס CAN ומציג את הנתונים שהתקבלו ב- LCD.
ראשית כלולות הספריות הנדרשות, ספריית SPI לשימוש בתקשורת SPI, ספריית MCP2515 לשימוש בתקשורת CAN וספריית LiquidCrsytal לשימוש 16x2 LCD עם Arduino .
#לִכלוֹל
בהמשך מוגדרים סיכות ה- LCD המשמשות לחיבור ל- Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Struct סוג נתונים מוכרז לאחסון בפורמט המסר יכול.
struct can_frame canMsg;
הגדר את מספר הסיכה אליו מחובר SPI CS (10 כברירת מחדל)
MCP2515 mcp2515 (10);
בהתקנה בטלה ():
ראשית ה- LCD מוגדר למצב 16x2 ומוצגת הודעת קבלת פנים.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("מעגל מעגל"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); עיכוב (3000); lcd.clear ();
התחל את תקשורת ה- SPI באמצעות ההצהרה הבאה.
SPI.begin ();
בשלב הבא מאפס את ה- MCP2515 באמצעות הפקודה הבאה.
mcp2515.reset ();
עכשיו MCP2515 מוגדר מהירות של 500KBPS ו- 8MHZ כשעון.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
ו- MCP2525 מוגדר במצב רגיל.
mcp2515.setNormalMode ();
הבא בלולאה בטלה ():
ההצהרה הבאה משמשת לקבלת ההודעה מאוטובוס ה- 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 ("Temp:"); lcd.print (y); עיכוב (1000); lcd.clear ();
עבודה בתקשורת CAN בארדואינו
לאחר שהחומרה מוכנה, העלה את התוכנית עבור משדר CAN ומקלט CAN (תוכניות מלאות מפורטות להלן) בלוחות הארדואינו בהתאמה. כאשר מופעל ואתה אמור לראות את ערך הטמפרטורה לקרוא DHT11 יישלח אחר Arduino באמצעות תקשורת CAN ויוצג על LCD של 2 nd Arduino כפי שניתן לראות בתמונה למטה. השתמשתי גם בשלט החשמלי שלי כדי לבדוק אם הטמפרטורה המוצגת על גבי LCD קרובה לטמפרטורת החדר בפועל.
את העבודה המלאה תוכלו למצוא בסרטון המקושר למטה. אם יש לך שאלות השאיר אותן בסעיף ההערות או השתמש בפורומים שלנו לשאלות טכניות אחרות.