תוכן עניינים:

פרוטוקול CAN - כן, אנחנו יכולים !: 24 שלבים
פרוטוקול CAN - כן, אנחנו יכולים !: 24 שלבים

וִידֵאוֹ: פרוטוקול CAN - כן, אנחנו יכולים !: 24 שלבים

וִידֵאוֹ: פרוטוקול CAN - כן, אנחנו יכולים !: 24 שלבים
וִידֵאוֹ: ככה זה כשיש לך חברה רוסיה 2024, יולי
Anonim
Image
Image
משאבים בשימוש
משאבים בשימוש

נושא נוסף שהציעו לאחרונה עוקבי ערוץ היוטיוב שלי היה פרוטוקול CAN (Controller Area Network), עליו נתמקד היום. חשוב להסביר כי CAN הוא פרוטוקול תקשורת טורית בו זמנית. המשמעות היא שהסנכרון בין המודולים המחוברים לרשת מתבצע ביחס לתחילת כל הודעה שנשלחת לאוטובוס. נתחיל בהצגת מושגי היסוד של פרוטוקול CAN ונבצע הרכבה פשוטה עם שני ESP32.

במעגל שלנו, ה- ESPs יכולים לפעול כאדון וגם כעבד. אתה יכול לקבל מספר מיקרו -בקרים שמשדרים במקביל, מכיוון שה- CAN מתמודד עם התנגשות של הכל באופן אוטומטי. קוד המקור של הפרויקט הזה הוא סופר פשוט. תבדוק את זה!

שלב 1: שימוש במשאבים

  • שני מודולים של ESP WROOM 32 NodeMcu
  • שני משדרי CAN מ- WaveShare
  • מגשרים לחיבורים
  • מנתח לוגי ללכידה
  • שלושה כבלי USB למחשבי ESP ומנתח
  • 10 מטרים של זוג מעוות לשמש אוטובוס

שלב 2: CAN (רשת אזור בקר)

CAN (רשת אזור בקר)
CAN (רשת אזור בקר)
  • הוא פותח על ידי רוברט בוש GmbH בשנות השמונים כדי לשרת את תעשיית הרכב.
  • היא הפכה נפוצה עם השנים בשל החוסן שלה וגמישות היישום. הוא משמש עם ציוד צבאי, מכונות חקלאיות, אוטומציה תעשייתית ובניית, רובוטיקה וציוד רפואי.

שלב 3: CAN - תכונות

CAN - תכונות
CAN - תכונות
CAN - תכונות
CAN - תכונות
  • תקשורת טורית דו-חוטית
  • מקסימום 8 בתים של מידע שימושי לכל מסגרת, עם פיצול אפשרי
  • כתובת המופנית להודעה ולא לצומת
  • הקצאת הודעות עדיפות והעברת הודעות "בהמתנה"
  • יכולת אפקטיבית לאתר ולזהות שגיאות
  • יכולת רב-מאסטר (כל הצמתים יכולים לבקש גישה לאוטובוס)
  • יכולת שידור מרובי (הודעה אחת למספר מקלטים בו זמנית)
  • קצבי העברה של עד 1Mbit / s באוטובוס של 40 מטר (הפחתת התעריף עם הגדלת אורך הסוס)
  • גמישות התצורה והכנסת הצמתים החדשים (עד 120 צמתים לאוטובוס)
  • חומרה סטנדרטית, עלות נמוכה וזמינות טובה
  • פרוטוקול מוסדר: ISO 11898

שלב 4: מעגל בשימוש

מעגל בשימוש
מעגל בשימוש

הנה, יש לי את משדרי השידור. יש אחד מכל צד, והם מחוברים על ידי זוג חוטים. האחד אחראי על השליחה והשני על קבלת נתונים.

שלב 5: מתח קווי שידור (זיהוי דיפרנציאלי)

מתח קווי הילוכים (זיהוי דיפרנציאלי)
מתח קווי הילוכים (זיהוי דיפרנציאלי)

ב- CAN, הסיביט הדומיננטי הוא אפס.

זיהוי קו דיפרנציאלי מפחית את רגישות הרעשים (EFI)

שלב 6: פורמט תקנים ומסגרות מסוג CAN

פורמט תקנים ומסגרות CAN
פורמט תקנים ומסגרות CAN

פורמט סטנדרטי עם מזהה 11 סיביות

שלב 7: פורמט תקנים ומסגרות מסוג CAN

פורמט תקנים ומסגרות CAN
פורמט תקנים ומסגרות CAN

פורמט מורחב עם מזהה 29 סיביות

שלב 8: פורמט תקנים ומסגרות מסוג CAN

חשוב לציין כי פרוטוקול כבר מחשב את ה- CRC ושולח אותות ACK ו- EOF, שהם דברים שכבר נעשים על ידי פרוטוקול CAN. זה מבטיח שההודעה שנשלחה לא תגיע בצורה הלא נכונה. הסיבה לכך היא שאם זה נותן בעיה ב- CRC (בדיקה מחזורית מיותרת או בדיקת יתירות), שהיא זהה לספרת בדיקת מידע, היא תזוהה על ידי ה- CRC.

שלב 9: ארבעה סוגי מסגרות (מסגרות)

ארבעה סוגי מסגרות (מסגרות)
ארבעה סוגי מסגרות (מסגרות)

חשוב לציין כי פרוטוקול כבר מחשב את ה- CRC ושולח אותות ACK ו- EOF, שהם דברים שכבר נעשים על ידי פרוטוקול CAN. זה מבטיח שההודעה שנשלחה לא תגיע בצורה הלא נכונה. הסיבה לכך היא שאם היא נותנת בעיה ב- CRC (בדיקה מחזורית מיותרת או בדיקת יתירות), שהיא זהה לספרת בדיקת מידע, היא תזוהה על ידי ה- CRC.

ארבעה סוגים של מסגרות (מסגרות)

שידור וקליטה של נתונים ב- CAN מבוססים על ארבעה סוגים של מסגרות. סוגי המסגרות יזוהו על ידי וריאציות בסיבי הבקרה או אפילו על ידי שינויים בכללי כתיבת המסגרת לכל מקרה.

  • מסגרת נתונים: מכיל את נתוני המשדר עבור המקלט (ים)
  • מסגרת מרוחקת: זוהי בקשה לנתונים מאחד הצמתים
  • מסגרת שגיאה: זוהי מסגרת שנשלחת על ידי כל אחד מהצמתים בעת זיהוי שגיאה באוטובוס וניתן לזהות אותה על ידי כל הצמתים
  • מסגרת עומס יתר: משמשת לעיכוב התנועה באוטובוס עקב עומס נתונים או עיכוב בצומת אחד או יותר.

שלב 10: מעגל - פרטי חיבורים

מעגל - פרטי חיבורים
מעגל - פרטי חיבורים

שלב 11: מעגל - לכידת נתונים

מעגל - לכידת נתונים
מעגל - לכידת נתונים

אורכי גל המתקבלים עבור CAN סטנדרטי עם מזהה 11 סיביות

שלב 12: מעגל - לכידת נתונים

מעגל - לכידת נתונים
מעגל - לכידת נתונים

אורכי גל המתקבלים ל- CAN מורחב עם מזהה של 29 סיביות

שלב 13: מעגל - לכידת נתונים

מעגל - לכידת נתונים
מעגל - לכידת נתונים

נתונים שהושגו על ידי מנתח הלוגיקה

שלב 14: ספריית Arduino - CAN

ספריית ארדואינו - CAN
ספריית ארדואינו - CAN

אני מציג כאן את שתי האפשרויות שבהן תוכל להתקין את ספריית מנהלי ההתקן של CAN

מנהל ספריית Arduino IDE

שלב 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

שלב 16: קוד מקור המשדר

קוד מקור: כולל והתקנה ()

אנו נכלול את ספריית CAN, נתחיל את סדרת האיתור לאיתור באגים והפעל את אוטובוס CAN במהירות של 500 kbps.

#include // כלול הגדרת בטל של biblioteca () {Serial.begin (9600); // inicia ניפוי סדרתי באף בזמן (! סדרתי); Serial.println ("משדר יכול"); // Inicia o barramento יכול ל 500 kbps אם (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciariar o controlador while (1); }}

שלב 17: קוד מקור: לולאה (), שליחת חבילת CAN 2.0 רגילה

באמצעות CAN 2.0 הסטנדרטי, אנו שולחים חבילה. מזהה 11 הסיביות מזהה את ההודעה. בלוק הנתונים חייב להכיל עד 8 בתים. הוא מתחיל את המנה עם מזהה 18 בהקסדצימלי. הוא אורז 5 בתים וסוגר את הפונקציה.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifiera a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("פקוט Enviando … "); CAN.beginPacket (0x12); // id 18 em CAN.write הקסדצימלי ('h'); // 1º בתים CAN.write ('e'); // 2º בתים CAN.write ('l'); // 3º בתים CAN.write ('l'); // 4º בתים CAN.write ('o'); // 5º בתים CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); עיכוב (1000);

שלב 18: קוד מקור: לולאה (), שליחת חבילת CAN 2.0 מורחבת

בשלב זה, המזהה כולל 29 סיביות. הוא מתחיל לשלוח 24 סיביות מזהה, ושוב חבילות 5 בתים ויוצאים.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifiera a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote estendido …"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 עשרוני (abcdef em hexa) = 24 סיביות preenchidos até aqui CAN.write ('w'); // 1º בתים CAN.write ('o'); // 2º בתים CAN.write ('r'); // 3º בתים CAN.write ('l'); // 4º בתים CAN.write ('d'); // 5º בתים CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); עיכוב (1000); }

שלב 19: קוד המקור של המקלט

קוד מקור: כולל והתקנה ()

שוב, נכלול את ספריית CAN, נתחיל את סדרת האיתור לניפוי באגים והפעלת אוטובוס CAN במהירות של 500 kbps. אם מתרחשת שגיאה, שגיאה זו תודפס.

#include // כלול הגדרת בטל של biblioteca () {Serial.begin (9600); // inicia ניפוי סדרתי באף בזמן (! סדרתי); Serial.println ("קולטן יכול"); // Inicia o barramento יכול ל 500 kbps אם (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciariar o controlador while (1); }}

שלב 20: קוד מקור: לולאה (), קבלת החבילה ובדיקת הפורמט

ניסינו לבדוק את גודל החבילה שהתקבלה. שיטת CAN.parsePacket () מראה לי את גודל החבילה הזו. אז אם יש לנו חבילה, נבדוק אם היא מורחבת או לא.

לולאת void () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("פקוט Recebido."); if (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

שלב 21: מקור: לולאה (), בודק אם מדובר בחבילה מרוחקת

כאן אנו בודקים אם המנה שהתקבלה היא בקשת נתונים. במקרה זה, אין נתונים.

if (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }

שלב 22: קוד מקור: לולאה (), אורך הנתונים המבוקש או התקבל

אם המנה שהתקבלה היא בקשה, אנו מציינים את האורך המבוקש. לאחר מכן אנו מקבלים את קוד אורך הנתונים (DLC), המציין את אורך הנתונים. לבסוף, אנו מציינים את האורך שהתקבל.

Serial.print ("מזהה Pacote com 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// se o pacote recebido é de requisição, indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Code Length Data, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

שלב 23: קוד מקור: לולאה (), אם מתקבלים נתונים, הם מודפסים

אנו מדפיסים (על הצג הטורי) את הנתונים, אך רק אם המנה שהתקבלה אינה בקשה.

// Imprime os dados somente se o pacote recebido não foi de requisição while (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}

שלב 24: הורד את הקבצים

PDF

INO

מוּמלָץ: