Мазмуну:

CAN протоколу - Ооба, биз кыла алабыз !: 24 кадам
CAN протоколу - Ооба, биз кыла алабыз !: 24 кадам

Video: CAN протоколу - Ооба, биз кыла алабыз !: 24 кадам

Video: CAN протоколу - Ооба, биз кыла алабыз !: 24 кадам
Video: ЛЮБОВЬ С ДОСТАВКОЙ НА ДОМ (2020). Романтическая комедия. Хит 2024, Ноябрь
Anonim
Image
Image
Колдонулган ресурстар
Колдонулган ресурстар

Жакында менин YouTube каналымдын жолдоочулары сунуштаган дагы бир тема CAN (Controller Area Network) протоколу болду, биз бүгүн ага токтолобуз. CAN бир эле учурда сериялык байланыш протоколу экенин түшүндүрүү маанилүү. Бул тармакка туташкан модулдардын ортосундагы синхронизм автобуска жөнөтүлгөн ар бир билдирүүнүн башталышына карата аткарылганын билдирет. Биз CAN протоколунун негизги түшүнүктөрүн киргизүүдөн баштайбыз жана эки ESP32 менен жөнөкөй куралды аткарабыз.

Биздин схемада, ESPлер кожоюн жана кул катары иштей алышат. Сизде бир эле убакта бир нече микроконтроллер өткөрүлүшү мүмкүн, анткени CAN автоматтык түрдө баарынын кагылышуусу менен алектенет. Бул долбоордун баштапкы коду супер жөнөкөй. Муну карап көр!

1 -кадам: Колдонулган ресурстар

  • ESP WROOM 32 эки модулу NodeMcu
  • WaveShare'ден эки CAN transceivers
  • Байланыш үчүн секиргичтер
  • Логикалык анализатор
  • ESP жана анализатор үчүн үч USB кабели
  • Автобус катары кызмат кылуу үчүн 10 метр буралган жуп

2 -кадам: CAN (Controller Area Network)

CAN (Controller Area Network)
CAN (Controller Area Network)
  • Бул 1980 -жылдары Robert Bosch GmbH тарабынан унаа тармагына кызмат кылуу үчүн иштелип чыккан.
  • Ал бышыктыгынан жана ишке ийкемдүүлүгүнөн улам көп жылдар бою кеңири таралган. Бул аскердик техника, айыл чарба техникасы, өнөр жай жана имараттарды автоматташтыруу, робототехника жана медициналык жабдуулар менен колдонулат.

3 -кадам: БОЛОТ - Өзгөчөлүктөр

БОЛОТ - Өзгөчөлүктөрү
БОЛОТ - Өзгөчөлүктөрү
БОЛОТ - Өзгөчөлүктөр
БОЛОТ - Өзгөчөлүктөр
  • Эки зымдуу сериялык байланыш
  • Бөлүнүп кетиши мүмкүн болгон ар бир кадрга максимум 8 байт пайдалуу маалымат
  • Дарек түйүнгө эмес, билдирүүгө багытталган
  • Билдирүүлөргө артыкчылык берүү жана "кармалып турган" билдирүүлөрдү өткөрүү
  • Каталарды аныктоо жана сигнал берүү боюнча эффективдүү жөндөм
  • Мульти-мастер мүмкүнчүлүгү (бардык түйүндөр автобуска кирүүнү талап кыла алат)
  • Multicast мүмкүнчүлүгү (бир эле учурда бир нече кабыл алуучу үчүн бир билдирүү)
  • 40 метрлик автобуста 1 Мбит / с чейин өткөрүү ылдамдыгы (шинанын узундугу жогорулаганда тарифти төмөндөтүү)
  • Конфигурациянын ийкемдүүлүгү жана жаңы түйүндөрдү киргизүү (бир автобуска 120 түйүнгө чейин)
  • Стандарттык жабдыктар, арзандыгы жана жакшы жеткиликтүүлүгү
  • Жөнгө салынган протокол: ISO 11898

4 -кадам: Circuit колдонулат

Circuit колдонулат
Circuit колдонулат

Бул жерде менде Transceivers бар. Ар бир тарапта бирөө бар, алар жуп зымдар менен туташкан. Бири жөнөтүү үчүн, экинчиси маалыматтарды алуу үчүн жооптуу.

5 -кадам: Өткөрүү линиясынын чыңалуусу (дифференциалдуу аныктоо)

Электр өткөргүч чыңалуусу (дифференциалдуу аныктоо)
Электр өткөргүч чыңалуусу (дифференциалдуу аныктоо)

CANда доминант бит Zero.

Line Differential Detection ызы -чуу сезгичтигин (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да маалыматтарды берүү жана кабыл алуу кадрлардын төрт түрүнө негизделген. Кадрдын түрлөрү башкаруу биттеринин вариациялары, ал тургай, ар бир учур үчүн кадр жазуу эрежелеринин өзгөрүшү менен аныкталат.

  • Маалымат алкагы: алуучу (лар) үчүн өткөргүч маалыматтарды камтыйт
  • Remote Frame: Бул түйүндөрдүн биринен маалымат сурап алуу
  • Error Frame: Бул автобустагы катаны аныктоодо түйүндөрдүн бири тарабынан жөнөтүлгөн жана бардык түйүндөр тарабынан аныкталышы мүмкүн болгон кадр
  • Ашыкча жүктөө алкагы: Автобустагы трафикти бир же бир нече түйүндөрдө ашыкча жүктөө же кечигүү үчүн кечиктирүү үчүн кызмат кылат.

10 -кадам: Район - Байланыштардын чоо -жайы

Район - Байланыштардын чоо -жайы
Район - Байланыштардын чоо -жайы

11 -кадам: Район - Маалыматтарды тартуу

Район - Маалыматтарды тартуу
Район - Маалыматтарды тартуу

11-биттик ID менен стандарттык CAN үчүн алынган толкун узундугу

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 катардагы пара мүчүлүштүктөрдү оңдоо (! Сериялык); Serial.println ("Transmissor CAN"); // Inicia o barramento CAN 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possibil invisar or controlador while (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 mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bayt Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 эм он алтылык CAN.write ('h'); // 1º байт CAN.write ('e'); // 2º байт CAN.write ('l'); // 3º байт CAN.write ('l'); // 4º байт CAN.write ('o'); // 5º байт CAN.endPacket (); // encialra pacote para envio Serial.println ("Enviado."); кечигүү (1000);

18 -кадам: Булак коду: Loop (), Extended CAN 2.0 пакетин жөнөтүү

Бул кадамда ID 29 битке ээ. Ал 24 бит ID жөнөтө баштайт жана дагы бир жолу 5 байтты таңгактайт жана чыгат.

// Usando CAN 2.0 Estendido // Envia um pacote: ал 29 битти аныктоодо (артыкчылыктуу, окуядагы) // 8 байттагы Serial.println ("Enviando pacote estendido…") блогу; CAN.beginExtendedPacket (0xabcdef); // id 11259375 ондук (abcdef em hexa) = 24 бит алдын ала жазылган CAN.write ('w'); // 1º байт CAN.write ('o'); // 2º байт CAN.write ('r'); // 3º байт CAN.write ('l'); // 4º байт CAN.write ('d'); // 5º байт CAN.endPacket (); // encialra pacote para envio Serial.println ("Enviado."); кечигүү (1000); }

19 -кадам: Алуучу Source Code

Булак коду: камтыйт жана орнотуу ()

Дагы, биз CAN китепканасын кошобуз, мүчүлүштүктөрдү оңдоо үчүн серияны баштайбыз жана CAN автобусун 500 кбит / с баштап баштайбыз. Эгер ката кетсе, бул ката басылып чыгат.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia катардагы пара мүчүлүштүктөрдү оңдоо (! Сериялык); Serial.println ("Receptor CAN"); // Inicia o barramento CAN 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possibil invisar or controlador while (1); }}

20 -кадам: Булак коду: Loop (), пакетти алуу жана форматты текшерүү

Биз алган пакеттин көлөмүн текшерүүгө аракет кылдык. CAN.parsePacket () методу мага бул пакеттин көлөмүн көрсөтөт. Ошентип, бизде пакет бар болсо, анын узартылганын же узартылбаганын текшеребиз.

void loop () {// Туура эмес маалымат пакетиSize = CAN.parsePacket (); if (packetSize) {// Негизги бет Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

21 -кадам: Булак: Loop (), Бул алыскы пакет экендигин текшерүү

Бул жерде, биз алынган пакет маалымат сурамы экенин текшеребиз. Бул учурда эч кандай маалымат жок.

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

22 -кадам: Булак коду: Loop (), маалыматтын узундугу суралган же алынган

Эгерде алынган пакет суроо болсо, биз суралган узундукту көрсөтөбүз. Биз андан кийин маалыматтын узундугун көрсөтүүчү Data Length Code (DLC) алабыз. Акыр -аягы, биз алынган узундугун көрсөтөбүз.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// se pacote recebido é de recuisidão, indicamos complico soicitado Serial.print ("re requsitou o compimento"); Serial.println (CAN.packetDlc ()); // DLC (Data Length Code, que indica o compimento dos dados)} else {Serial.print ("e compimento"); // акысыз көрсөтмө Serial.println (packetSize);

23 -кадам: Булак коду: Loop (), эгер маалыматтар алынса, анда басып чыгарат

Биз маалыматтарды (сериялык мониторго) басып чыгарабыз, бирок алынган пакет суроо -талап болбосо гана.

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

24 -кадам: Файлдарды жүктөп алыңыз

PDF

МЕН ЖОК

Сунушталууда: