Πίνακας περιεχομένων:

Πρωτόκολλο CAN - Ναι, μπορούμε !: 24 βήματα
Πρωτόκολλο CAN - Ναι, μπορούμε !: 24 βήματα

Βίντεο: Πρωτόκολλο CAN - Ναι, μπορούμε !: 24 βήματα

Βίντεο: Πρωτόκολλο CAN - Ναι, μπορούμε !: 24 βήματα
Βίντεο: Κάνουμε Squats στην Σαντορίνη #shorts 2024, Νοέμβριος
Anonim
Image
Image
Πόροι που χρησιμοποιήθηκαν
Πόροι που χρησιμοποιήθηκαν

Ένα άλλο θέμα που πρότειναν πρόσφατα οι ακόλουθοι του καναλιού μου στο YouTube ήταν το πρωτόκολλο CAN (Controller Area Network), στο οποίο θα εστιάσουμε σήμερα. Είναι σημαντικό να εξηγήσουμε ότι το CAN είναι ένα ταυτόχρονο πρωτόκολλο σειριακής επικοινωνίας. Αυτό σημαίνει ότι ο συγχρονισμός μεταξύ των μονάδων που είναι συνδεδεμένες στο δίκτυο εκτελείται σε σχέση με την αρχή κάθε μηνύματος που αποστέλλεται στο δίαυλο. Θα ξεκινήσουμε με την εισαγωγή των βασικών εννοιών του πρωτοκόλλου CAN και θα εκτελέσουμε μια απλή συναρμολόγηση με δύο ESP32.

Στο κύκλωμά μας, τα ESP μπορούν να λειτουργήσουν και ως Master και ως Slave. Μπορείτε να έχετε πολλούς μικροελεγκτές που εκπέμπουν ταυτόχρονα, επειδή το CAN αντιμετωπίζει αυτόματα τη σύγκρουση όλων. Ο πηγαίος κώδικας αυτού του έργου είναι εξαιρετικά απλός. Τσέκαρέ το!

Βήμα 1: Χρησιμοποιημένοι πόροι

  • Δύο μονάδες ESP WROOM 32 NodeMcu
  • Δύο πομποδέκτες CAN από το WaveShare
  • Μπλουζάκια για συνδέσεις
  • Λογικός αναλυτής για λήψη
  • Τρία καλώδια USB για ESP και αναλυτή
  • 10 μέτρα στριμμένο ζευγάρι για να λειτουργήσει ως λεωφορείο

Βήμα 2: CAN (Network Controller Network)

CAN (Δίκτυο περιοχής ελεγκτή)
CAN (Δίκτυο περιοχής ελεγκτή)
  • Αναπτύχθηκε από τη Robert Bosch GmbH τη δεκαετία του 1980 για να εξυπηρετήσει την αυτοκινητοβιομηχανία.
  • Έχει διαδοθεί με την πάροδο των ετών λόγω της ευρωστίας και της ευελιξίας εφαρμογής. Χρησιμοποιείται με στρατιωτικό εξοπλισμό, γεωργικά μηχανήματα, βιομηχανικούς και αυτοματισμούς κτιρίων, ρομποτική και ιατρικό εξοπλισμό.

Βήμα 3: CAN - Χαρακτηριστικά

CAN - Χαρακτηριστικά
CAN - Χαρακτηριστικά
CAN - Χαρακτηριστικά
CAN - Χαρακτηριστικά
  • Σειριακή επικοινωνία δύο συρμάτων
  • Έως 8 byte χρήσιμων πληροφοριών ανά πλαίσιο, με δυνατότητα κατακερματισμού
  • Διεύθυνση που κατευθύνεται στο μήνυμα και όχι στον κόμβο
  • Εκχώρηση προτεραιότητας σε μηνύματα και αναμετάδοση μηνυμάτων "σε αναμονή"
  • Αποτελεσματική ικανότητα εντοπισμού και σηματοδότησης σφαλμάτων
  • Δυνατότητα Multi-Master (όλοι οι κόμβοι μπορούν να ζητήσουν πρόσβαση διαύλου)
  • Δυνατότητα πολλαπλής διανομής (ένα μήνυμα για πολλούς δέκτες ταυτόχρονα)
  • Ποσοστά μεταφοράς έως 1Mbit / s σε λεωφορείο 40 μέτρων (μείωση του ρυθμού με την αύξηση του μήκους του διαύλου)
  • Ευελιξία διαμόρφωσης και εισαγωγής νέων κόμβων (έως 120 κόμβοι ανά δίαυλο)
  • Τυπικό υλικό, χαμηλό κόστος και καλή διαθεσιμότητα
  • Ρυθμιζόμενο πρωτόκολλο: ISO 11898

Βήμα 4: Χρησιμοποιείται κύκλωμα

Κύκλωμα που χρησιμοποιείται
Κύκλωμα που χρησιμοποιείται

Εδώ, έχω τους πομποδέκτες. Υπάρχει ένα σε κάθε πλευρά και συνδέονται με ένα ζεύγος καλωδίων. Ο ένας είναι υπεύθυνος για την αποστολή και ο άλλος για τη λήψη δεδομένων.

Βήμα 5: Τάσεις γραμμής μετάδοσης (διαφορική ανίχνευση)

Τάσεις γραμμής μετάδοσης (διαφορική ανίχνευση)
Τάσεις γραμμής μετάδοσης (διαφορική ανίχνευση)

Στο CAN, το κυρίαρχο bit είναι το Zero.

Διαφορική ανίχνευση γραμμής μειώνει την ευαισθησία θορύβου (EFI)

Βήμα 6: ΜΠΟΡΕΙΤΕ ΜΟΡΦΗ ΠΡΟΤΥΠΩΝ ΚΑΙ ΠΛΑΙΣΙΩΝ

Μορφή προτύπων και πλαισίων CAN
Μορφή προτύπων και πλαισίων CAN

Τυπική μορφή με αναγνωριστικό 11-bit

Βήμα 7: ΜΠΟΡΕΙΤΕ ΜΟΡΦΗ Πρότυπα και Πλαίσια

Μορφή προτύπων και πλαισίων CAN
Μορφή προτύπων και πλαισίων CAN

Εκτεταμένη μορφή με αναγνωριστικό 29-bit

Βήμα 8: ΜΠΟΡΕΙΤΕ ΜΟΡΦΗ ΠΡΟΤΥΠΩΝ ΚΑΙ ΠΛΑΙΣΙΩΝ

Είναι σημαντικό να σημειωθεί ότι ένα πρωτόκολλο υπολογίζει ήδη το CRC και στέλνει σήματα ACK και EOF, τα οποία είναι πράγματα που έχουν ήδη γίνει από το πρωτόκολλο CAN. Αυτό εγγυάται ότι το μήνυμα που αποστέλλεται δεν θα φτάσει με λάθος τρόπο. Αυτό οφείλεται στο γεγονός ότι εάν εμφανίσει πρόβλημα στο CRC (Redundant Cyclic Check or Redundancy Check), το οποίο είναι ίδιο με ένα ψηφίο ελέγχου πληροφοριών, θα αναγνωριστεί από το CRC.

Βήμα 9: Τέσσερις τύποι πλαισίων (πλαίσια)

Τέσσερις τύποι πλαισίων (πλαίσια)
Τέσσερις τύποι πλαισίων (πλαίσια)

Είναι σημαντικό να σημειωθεί ότι ένα πρωτόκολλο υπολογίζει ήδη το CRC και στέλνει σήματα ACK και EOF, τα οποία είναι πράγματα που έχουν ήδη γίνει από το πρωτόκολλο CAN. Αυτό εγγυάται ότι το μήνυμα που αποστέλλεται δεν θα φτάσει με λάθος τρόπο. Αυτό οφείλεται στο γεγονός ότι εάν εμφανίσει πρόβλημα στο CRC (Redundant Cyclic Check or Redundancy Check), το οποίο είναι ίδιο με ένα ψηφίο ελέγχου πληροφοριών, θα αναγνωριστεί από το CRC.

Τέσσερις τύποι πλαισίων (πλαίσια)

Η μετάδοση και λήψη δεδομένων στο CAN βασίζεται σε τέσσερις τύπους πλαισίων. Οι τύποι πλαισίων θα αναγνωρίζονται από παραλλαγές στα bits ελέγχου ή ακόμα και από αλλαγές στους κανόνες γραφής πλαισίου για κάθε περίπτωση.

  • Πλαίσιο δεδομένων: Περιέχει δεδομένα πομπού για τον (τους) δέκτη (ες)
  • Απομακρυσμένο πλαίσιο: Αυτό είναι ένα αίτημα για δεδομένα από έναν από τους κόμβους
  • Error Frame: Είναι ένα πλαίσιο που αποστέλλεται από οποιονδήποτε από τους κόμβους κατά τον εντοπισμό ενός σφάλματος στο δίαυλο και μπορεί να ανιχνευθεί από όλους τους κόμβους
  • Πλαίσιο υπερφόρτωσης: Εξυπηρετεί την καθυστέρηση της κυκλοφορίας στο δίαυλο λόγω υπερφόρτωσης δεδομένων ή καθυστέρησης σε έναν ή περισσότερους κόμβους.

Βήμα 10: Κύκλωμα - Λεπτομέρειες συνδέσεων

Κύκλωμα - Λεπτομέρειες Συνδέσεων
Κύκλωμα - Λεπτομέρειες Συνδέσεων

Βήμα 11: Κύκλωμα - Λήψη δεδομένων

Κύκλωμα - Καταγραφή δεδομένων
Κύκλωμα - Καταγραφή δεδομένων

Μήκη κύματος που λαμβάνονται για τυπικό CAN με 11-bit ID

Βήμα 12: Κύκλωμα - Λήψη δεδομένων

Κύκλωμα - Καταγραφή δεδομένων
Κύκλωμα - Καταγραφή δεδομένων

Μήκη κύματος που λαμβάνονται για εκτεταμένο CAN με 29-bit ID

Βήμα 13: Κύκλωμα - Καταγραφή δεδομένων

Κύκλωμα - Καταγραφή δεδομένων
Κύκλωμα - Καταγραφή δεδομένων

Δεδομένα που λαμβάνονται από τον αναλυτή λογικής

Βήμα 14: Βιβλιοθήκη Arduino - CAN

Βιβλιοθήκη Arduino - ΜΠΟΡΕΙ
Βιβλιοθήκη Arduino - ΜΠΟΡΕΙ

Δείχνω εδώ τις δύο επιλογές όπου μπορείτε να εγκαταστήσετε τη Βιβλιοθήκη προγράμματος οδήγησης CAN

Arduino IDE Library Manager

Βήμα 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Βήμα 16: Πηγαίος κώδικας πομπού

Πηγαίος κώδικας: Περιλαμβάνει και εγκαθιστά ()

Θα συμπεριλάβουμε τη βιβλιοθήκη CAN, θα ξεκινήσουμε τη σειρά για τον εντοπισμό σφαλμάτων και θα ξεκινήσουμε το δίαυλο CAN στα 500 kbps.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Transmissor CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // δεν υπάρχει δυνατότητα να ελέγξετε τον έλεγχο ενώ (1); }}

Βήμα 17: Πηγαίος κώδικας: Loop (), Αποστολή τυπικού πακέτου CAN 2.0

Χρησιμοποιώντας το πρότυπο CAN 2.0, στέλνουμε ένα πακέτο. Το αναγνωριστικό 11-bit προσδιορίζει το μήνυμα. Το μπλοκ δεδομένων πρέπει να έχει έως 8 byte. Ξεκινά το πακέτο με ID 18 σε δεκαεξαδικό. Συσκευάζει 5 byte και κλείνει τη λειτουργία.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em δεκαεξαδικό CAN.write ('h'); // 1º byte CAN.write ('e'); // 2º byte CAN.write ('l'); // 3º byte CAN.write ('l'); // 4º byte CAN.write ('o'); // 5º byte CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); καθυστέρηση (1000)?

Βήμα 18: Πηγαίος κώδικας: Loop (), Αποστολή ενός εκτεταμένου πακέτου CAN 2.0

Σε αυτό το βήμα, το ID έχει 29 bit. Αρχίζει να στέλνει 24 bits ID και, για άλλη μια φορά, συσκευάζει 5 byte και τερματίζεται.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifica 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 bits preenchidos até aqui CAN.write ('w'); // 1º byte CAN.write ('o'); // 2º byte CAN.write ('r'); // 3º byte CAN.write ('l'); // 4º byte CAN.write ('d'); // 5º byte CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); καθυστέρηση (1000)? }

Βήμα 19: Πηγαίος κώδικας δέκτη

Πηγαίος κώδικας: Περιλαμβάνει και εγκαθιστά ()

Και πάλι, θα συμπεριλάβουμε τη βιβλιοθήκη CAN, θα ξεκινήσουμε τη σειρά εντοπισμού σφαλμάτων και θα ξεκινήσουμε το δίαυλο CAN στα 500 kbps. Εάν παρουσιαστεί σφάλμα, αυτό το σφάλμα θα εκτυπωθεί.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Receptor CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // δεν υπάρχει δυνατότητα να ελέγξετε τον έλεγχο ενώ (1); }}

Βήμα 20: Πηγαίος κώδικας: Loop (), Λήψη του πακέτου και Έλεγχος της μορφής

Προσπαθήσαμε να ελέγξουμε το μέγεθος του πακέτου που ελήφθη. Η μέθοδος CAN.parsePacket () μου δείχνει το μέγεθος αυτού του πακέτου. Έτσι, εάν έχουμε ένα πακέτο, θα ελέγξουμε εάν είναι επεκταμένο ή όχι.

void loop () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); εάν (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

Βήμα 21: Πηγή: Loop (), Έλεγχος για να διαπιστωθεί εάν πρόκειται για απομακρυσμένο πακέτο

Εδώ, ελέγχουμε αν το λαμβανόμενο πακέτο είναι αίτημα δεδομένων. Σε αυτή την περίπτωση, δεν υπάρχουν δεδομένα.

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

Βήμα 22: Πηγαίος κώδικας: Loop (), Μήκος δεδομένων που ζητήθηκε ή λήφθηκε

Εάν το ληφθέν πακέτο είναι αίτημα, δηλώνουμε το ζητούμενο μήκος. Στη συνέχεια λαμβάνουμε τον κωδικό μήκους δεδομένων (DLC), ο οποίος υποδεικνύει το μήκος των δεδομένων. Τέλος, υποδεικνύουμε το μήκος που ελήφθη.

Serial.print ("Pacote com id 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 (Data Length Code, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento Recebido Serial.println (packetSize);

Βήμα 23: Πηγαίος κώδικας: Loop (), Εάν τα δεδομένα ληφθούν, τότε εκτυπώνει

Εκτυπώνουμε (στη σειριακή οθόνη) τα δεδομένα, αλλά μόνο εάν το ληφθέν πακέτο δεν είναι αίτημα.

// 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

ΕΓΩ ΔΕΝ

Συνιστάται: