Съдържание:

CAN протокол - Да, можем !: 24 стъпки
CAN протокол - Да, можем !: 24 стъпки

Видео: CAN протокол - Да, можем !: 24 стъпки

Видео: CAN протокол - Да, можем !: 24 стъпки
Видео: НОВИНКА! Самая дешевая со слежением за ЧЕЛОВЕКОМ камера видеонаблюдения Icsee Xmeye 2024, Юли
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 през 80 -те години на миналия век за обслужване на автомобилната индустрия.
  • Той стана широко разпространен през годините поради своята здравина и гъвкавост на прилагане. Използва се с военна техника, селскостопанска техника, промишлена и сградна автоматизация, роботика и медицинско оборудване.

Стъпка 3: МОЖЕ - Функции

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 (Redundant Cyclic Check или Redundancy Check), който е същият като цифра за проверка на информация, той ще бъде идентифициран от CRC.

Стъпка 9: Четири вида рамки (рамки)

Четири вида рамки (рамки)
Четири вида рамки (рамки)

Важно е да се отбележи, че протокол вече изчислява CRC и изпраща ACK и EOF сигнали, които са неща, които вече са направени от CAN протокола. Това гарантира, че изпратеното съобщение няма да пристигне по грешен начин. Това е така, защото ако създава проблем в CRC (Redundant Cyclic Check или Redundancy Check), който е същият като цифра за проверка на информация, той ще бъде идентифициран от CRC.

Четири вида рамки (рамки)

Предаването и приемането на данни в CAN се основава на четири типа рамки. Типовете рамки ще бъдат идентифицирани чрез вариации в контролните битове или дори чрез промени в правилата за писане на рамки за всеки случай.

  • Рамка за данни: Съдържа данните за предавателя за приемника (ите)
  • Remote Frame: Това е заявка за данни от един от възлите
  • Рамка за грешки: Това е кадър, изпратен от всеки от възлите при идентифициране на грешка в шината и може да бъде открит от всички възли
  • Рамка за претоварване: Служи за забавяне на трафика в шината поради претоварване на данни или забавяне на един или повече възли.

Стъпка 10: Схема - Подробности за връзките

Схема - Подробности за връзките
Схема - Подробности за връзките

Стъпка 11: Верига - улавяне на данни

Верига - улавяне на данни
Верига - улавяне на данни

Дължини на вълните, получени за стандартна CAN с 11-битов ID

Стъпка 12: Верига - улавяне на данни

Верига - улавяне на данни
Верига - улавяне на данни

Дължини на вълните, получени за разширена CAN с 29-битов ID

Стъпка 13: Верига - улавяне на данни

Верига - улавяне на данни
Верига - улавяне на данни

Данни, получени от логическия анализатор

Стъпка 14: Библиотека Arduino - МОЖЕ

Библиотека Arduino - МОЖЕ
Библиотека Arduino - МОЖЕ

Показвам тук двете опции, където можете да инсталирате библиотеката CAN Driver

Arduino IDE библиотечен мениджър

Стъпка 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Стъпка 16: Изходен код на предавателя

Изходен код: Включва и настройка ()

Ще включим CAN библиотеката, ще стартираме сериала за отстраняване на грешки и ще стартираме CAN шината при 500 kbps.

#include // Включва библиотека CAN void setup () {Serial.begin (9600); // inicia сериен параметър за отстраняване на грешки 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"); // caso não seja possível iniciar o controlador while (1); }}

Стъпка 17: Изходен код: Цикъл (), Изпращане на стандартен CAN 2.0 пакет

Използвайки стандартния CAN 2.0, изпращаме пакет. 11-битовият идентификатор идентифицира съобщението. Блокът с данни трябва да има до 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 bytes Serial.println ("Enviando pacote … "); 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: Изходен код: Loop (), Изпращане на разширен CAN 2.0 пакет

В тази стъпка идентификаторът има 29 бита. Той започва да изпраща 24 бита ID и отново пакетира 5 байта и се отказва.

// 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 шестоъгълник) = 24 бита предварително въведени в aqui 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 // Включва библиотека CAN void setup () {Serial.begin (9600); // inicia сериен параметър за отстраняване на грешки while (! Serial); Serial.println ("Рецептор МОЖЕ"); // Inicia или barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Стъпка 20: Изходен код: Loop (), получаване на пакета и проверка на формата

Опитахме се да проверим размера на получения пакет. Методът CAN.parsePacket () ми показва размера на този пакет. Така че, ако имаме пакет, ще проверим дали е удължен или не.

void loop () {// Теста за проверка на таманхо до прием на рецепта int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// проверява се за pacote é estendido Serial.println ("Estendido"); }

Стъпка 21: Източник: Loop (), Проверява дали е отдалечен пакет

Тук проверяваме дали полученият пакет е заявка за данни. В този случай няма данни.

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

АЗ НЕ

Препоръчано: