CAN արձանագրություն. Այո, մենք կարող ենք: 24 քայլ
CAN արձանագրություն. Այո, մենք կարող ենք: 24 քայլ

Բովանդակություն:

Anonim
Image
Image
Օգտագործված ռեսուրսներ
Օգտագործված ռեսուրսներ

Վերջերս YouTube- ի իմ ալիքի հետևորդների կողմից առաջարկված մեկ այլ թեմա էր CAN (Controller Area Network) արձանագրությունը, որի վրա մենք այսօր կկենտրոնանանք: Կարևոր է բացատրել, որ CAN- ը միաժամանակյա սերիական հաղորդակցության արձանագրություն է: Սա նշանակում է, որ ցանցին միացված մոդուլների միջև համաժամացումը կատարվում է ավտոբուս ուղարկված յուրաքանչյուր հաղորդագրության սկզբի համեմատ: Մենք կսկսենք ներկայացնելով CAN արձանագրության հիմնական հասկացությունները և կկատարենք պարզ հավաքում երկու ESP32- ով:

Մեր շրջագծում ESP- ները կարող են հանդես գալ և որպես Վարպետ, և որպես Ստրուկ: Կարող եք ունենալ մի քանի միկրոկոնտրոլեր, որոնք միաժամանակ փոխանցում են, քանի որ CAN- ը ինքնաբերաբար զբաղվում է ամեն ինչի բախմամբ: Այս նախագծի աղբյուրի կոդը չափազանց պարզ է: Ստուգեք այն:

Քայլ 1: Օգտագործված ռեսուրսներ

  • Երկու մոդուլ ESP WROOM 32 NodeMcu
  • Երկու CAN հաղորդիչ WaveShare- ից
  • Թռիչքներ միացումների համար
  • Տրամաբանական անալիզատոր գրավման համար
  • Երեք USB մալուխ ESP- ների և անալիզատորի համար
  • 10 մետր ոլորված զույգ ՝ որպես ավտոբուս ծառայելու համար

Քայլ 2: CAN (վերահսկիչ տարածքային ցանց)

CAN (Վերահսկիչ տարածքային ցանց)
CAN (Վերահսկիչ տարածքային ցանց)
  • Այն մշակվել է Robert Bosch GmbH- ի կողմից 1980 -ականներին `ծառայելու ավտոմոբիլային արդյունաբերությանը:
  • Տարիների ընթացքում այն լայն տարածում է գտել իր հզորության և իրականացման ճկունության շնորհիվ: Այն օգտագործվում է ռազմական տեխնիկայի, գյուղտեխնիկայի, արդյունաբերական և շինարարական ավտոմատացման, ռոբոտաշինության և բժշկական սարքավորումների հետ:

Քայլ 3. ԿԱՐՈ - - Առանձնահատկություններ

CAN - Առանձնահատկություններ
CAN - Առանձնահատկություններ
CAN - Առանձնահատկություններ
CAN - Առանձնահատկություններ
  • Երկալար սերիական հաղորդակցություն
  • Առավելագույնը 8 բայթ օգտակար տեղեկատվություն մեկ շրջանակի համար, հնարավոր է մասնատում
  • Հասցեն ուղղված է հաղորդագրությանը և ոչ թե հանգույցին
  • Հաղորդագրություններին առաջնահերթություն տալը և «սպասման մեջ» հաղորդագրությունների փոխանցումը
  • Սխալները հայտնաբերելու և ազդանշան տալու արդյունավետ ունակություն
  • Multi-master ունակություն (բոլոր հանգույցները կարող են պահանջել ավտոբուսի մուտք)
  • Multicast ունակություն (մեկ հաղորդագրություն միաժամանակ մի քանի ընդունիչների համար)
  • 40 մետր երկարությամբ ավտոբուսում մինչև 1 Մբիթ / վրկ փոխանցման արագություն (փոխադրամիջոցի արագության իջեցում `ավտոբուսի երկարության բարձրացման հետ մեկտեղ)
  • Նոր հանգույցների կազմաձևման և ներդրման ճկունություն (մինչև 120 հանգույց մեկ ավտոբուսի համար)
  • Ստանդարտ սարքավորում, ցածր գին և լավ առկայություն
  • Կարգավորվող արձանագրություն ՝ ISO 11898

Քայլ 4: Օգտագործված միացում

Շղթա Օգտագործված
Շղթա Օգտագործված

Ահա, ես ունեմ Փոխարկիչներ: Յուրաքանչյուր կողմում կա մեկը, և դրանք միացված են զույգ լարերով: Մեկը պատասխանատու է ուղարկելու, իսկ մյուսը ՝ տվյալների ստացման համար:

Քայլ 5. Հաղորդման գծի լարման (դիֆերենցիալ հայտնաբերում)

Հաղորդման գծի լարման (դիֆերենցիալ հայտնաբերում)
Հաղորդման գծի լարման (դիֆերենցիալ հայտնաբերում)

CAN- ում գերիշխող բիթը eroրո է:

Գծի դիֆերենցիալ հայտնաբերումը նվազեցնում է աղմուկի զգայունությունը (EFI)

Քայլ 6: CAN Ստանդարտների և շրջանակների ձևաչափ

CAN Ստանդարտների և շրջանակների ձևաչափ
CAN Ստանդարտների և շրջանակների ձևաչափ

Ստանդարտ ձևաչափ ՝ 11 բիթանոց նույնացուցիչով

Քայլ 7: CAN Ստանդարտների և շրջանակների ձևաչափ

CAN Ստանդարտների և շրջանակների ձևաչափ
CAN Ստանդարտների և շրջանակների ձևաչափ

Ընդլայնված ձևաչափ ՝ 29 բիթանոց նույնացուցիչով

Քայլ 8: CAN Ստանդարտների և շրջանակների ձևաչափ

Կարևոր է նշել, որ արձանագրությունն արդեն հաշվարկում է 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- ում տվյալների փոխանցումը և ընդունումը հիմնված են չորս տեսակի շրջանակների վրա: Շրջանակի տեսակները կբնորոշվեն `հսկիչ բիթերի տատանումներով կամ նույնիսկ յուրաքանչյուր դեպքի համար շրջանակի գրման կանոնների փոփոխությամբ:

  • Տվյալների շրջանակ. Պարունակում է ստացողի (ներ) ի հաղորդիչի տվյալները
  • Հեռակա շրջանակ. Սա հանգույցներից մեկից տվյալների խնդրանք է
  • Սխալների շրջանակ. Այն շրջանակ է, որն ուղարկվում է ցանկացած հանգույցի կողմից ՝ ավտոբուսում սխալ հայտնաբերելիս և կարող է հայտնաբերվել բոլոր հանգույցների կողմից
  • Overանրաբեռնվածության շրջանակ. Այն ծառայում է ավտոբուսում երթևեկը հետաձգելու համար `տվյալների ծանրաբեռնվածության կամ մեկ կամ մի քանի հանգույցների հետաձգման պատճառով:

Քայլ 10. Շղթա - Կապերի մանրամասներ

Շրջան - Կապերի մանրամասներ
Շրջան - Կապերի մանրամասներ

Քայլ 11. Շղթա - Տվյալների գրավում

Շղթա - Տվյալների գրավում
Շղթա - Տվյալների գրավում

Ալիքի երկարություններ, որոնք ստացվել են ստանդարտ CAN- ի համար `11 բիթանոց ID- ով

Քայլ 12. Շղթա - Տվյալների գրավում

Շղթա - Տվյալների գրավում
Շղթա - Տվյալների գրավում

29-բիթանոց ID- ով երկարացված CAN- ի համար ստացված ալիքի երկարություններ

Քայլ 13. Շղթա - Տվյալների գրավում

Շղթա - Տվյալների գրավում
Շղթա - Տվյալների գրավում

Տրամաբանական անալիզատորի կողմից ստացված տվյալները

Քայլ 14: Arduino գրադարան - ԿԱՐՈ Է

Arduino գրադարան - ԿԱՐՈ Է
Arduino գրադարան - ԿԱՐՈ Է

Ես այստեղ ցույց եմ տալիս երկու տարբերակ, որտեղ կարող եք տեղադրել CAN վարորդների գրադարանը

Arduino IDE գրադարանի կառավարիչ

Քայլ 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Քայլ 16. Հաղորդիչի աղբյուրի կոդը

Աղբյուրի ծածկագիր. Ներառում և կարգավորում ()

Մենք կներառենք CAN գրադարանը, կսկսենք վրիպազերծման սերիան և կսկսենք CAN ավտոբուսը 500 կբիթ / վ արագությամբ:

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println («Հաղորդիչը կարող է»); // 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-բիթանոց ID- ն նույնականացնում է հաղորդագրությունը: Տվյալների բլոկը պետք է ունենա մինչև 8 բայթ: Այն փաթեթը սկսում է ID 18 -ով տասնվեցական թվով: Այն փաթեթավորում է 5 բայթ և փակում գործառույթը:

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a menagagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … »); CAN.beginPacket (0x12); // id 18 em hexadecimal 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. Աղբյուրի կոդ ՝ Loop (), ուղարկելով ընդլայնված CAN 2.0 փաթեթ

Այս քայլում ID- ն ունի 29 բիթ: Այն սկսում է ուղարկել 24 բիթ ID և կրկին փաթեթավորում է 5 բայթ և դուրս է գալիս:

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identicala a menagemem (prioridade, evento) // o bloco de dados deve possuir até 8 at 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 կբիթ / վ արագությամբ: Եթե սխալ տեղի ունենա, այս սխալը տպագրվելու է:

#ներառել // Ներառել գրադարան CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println («Ռեցեպտորը կարող է»); // 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); եթե (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

ԻՆՈ

Խորհուրդ ենք տալիս: