Модуль CAN-BUS

Матеріал з Вікі-знання або навчання 2.0 в ТНТУ
Перейти до: навігація, пошук

Зміст

Вступ

CAN-BUS є одна з найбільш поширених промислових шин , через можливість передачі на велику відстань , високу швидкість зв'язку та високий ступінь надійності. Він широко використовується в якості автомобільної діагностичної шини, а також на сучасних верстатах. CAN-Bus використовує Microchip MCP2515 CAN контролер з MCP2551 CAN трансивер, з'єднання CAN здійснюється через стандартний 9-смуговий SUB-D для використання з кабелем OBD-II, він ідеально підходить для автомобільного CAN застосування.Shield також має вхід карти Micro SD, який дозволяє зберігати діагностичну інформацію в SD-карті безпосередньо, що робить цей Shield придатним для застосування реєстрації даних.
'Модель: AS54887CAN'
CAN-BUS Shield1.jpg

Особливості

  • Arduino Mega і Leonardo сумісний
  • Реалізує CAN V2.0B зі швидкістю до 1 Мбіт / с
  • SPI інтерфейс до 10 МГц
  • Стандартні (11 біт) і розширені (29 біт) данневі і віддалені кадри
  • Два буфера прийому з пріоритетним зберіганням повідомлень
  • Стандартний роз'єм Sub-D 9
  • Два світлодіодних індикатора

Вхід SD карти для зберігання інформації

Використання

Установка устаткування

Підключіть CAN-BUS Shield на Arduino.And перш ніж підключати Arduino до комп'ютера за допомогою кабелю USB.
CAN-BUS Shield .jpg

Завантажити програму

1. Завантажити CAN-BUS файл Вихідний код для Arduino 1.0 і запустити його в бібліотеках файлу в Arduino-1.0 програма.: .. \ Arduino-1.0 \ libraries.

Якщо ім'я папки включають «-master», просто видаліть його.

2. Відкрийте Arduino-1,0, в ньому знаходиться 8 прикладів: receive_check ,send and receive_interrupt and so on. send and receive_check Open CAN BUS examples receive.jpg Open CAN BUS examples send.jpg
2.1 Код програми: // demo: CAN-BUS Shield, send data

  1. include <mcp_can.h>
  2. include <SPI.h>

// the cs pin of the version after v1.1 is default to D9 // v0.9b and v1.0 is default D10 const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN); // Set CS pin

void setup() {

   Serial.begin(115200);

START_INIT:

   if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
   {
       Serial.println("CAN BUS Shield init ok!");
   }
   else
   {
       Serial.println("CAN BUS Shield init fail");
       Serial.println("Init CAN BUS Shield again");
       delay(100);
       goto START_INIT;
   }

}

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7}; void loop() {

   // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
   CAN.sendMsgBuf(0x00, 0, 8, stmp);
   delay(100);                       // send data per 100ms

} 2.2 Receive data // demo: CAN-BUS Shield, receive data with check mode // send data coming to fast, such as less than 10ms, you can use this way


  1. include <SPI.h>
  2. include "mcp_can.h"


// the cs pin of the version after v1.1 is default to D9 // v0.9b and v1.0 is default D10 const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN); // Set CS pin

void setup() {

   Serial.begin(115200);

START_INIT:

   if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
   {
       Serial.println("CAN BUS Shield init ok!");
   }
   else
   {
       Serial.println("CAN BUS Shield init fail");
       Serial.println("Init CAN BUS Shield again");
       delay(100);
       goto START_INIT;
   }

}


void loop() {

   unsigned char len = 0;
   unsigned char buf[8];
   if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
   {
       CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
       unsigned char canId = CAN.getCanId();
       
       Serial.println("-----------------------------");
       Serial.println("get data from ID: ");
       Serial.println(canId);
       for(int i = 0; i<len; i++)    // print the data
       {
           Serial.print(buf[i]);
           Serial.print("\t");
       }
       Serial.println();
   }

} 3. Завантажити два приклади на дві дошки окремо. Виберіть дошку за допомогою шляху: Сервіс -> Послідовний порт -> COMX. Зверніть увагу, за якою платою призначається в якості вузла «send», і яка плата призначається в якості «receive» вузла.

4. Відкрийте «Serial Monitor» на «receive» COM, ви отримаєте повідомлення, відправлене з «send» вузла. Тут зображено заздалегідь підготоване сигнальне повідомлення «0 1 2 3 4 5 6 7».

CAN BUS message1.jpg

Посилання

1. Встановіть BaudRate

Ця функція використовується для ініціалізації швидкості передачі даних системи CAN Bus.

Доступні швидкості обміну перераховані follоws:

CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_250KBPS, CAN_500KBPS і CAN_1000KBPS

2. Встановити Receive маску і фільтр

Є два регістрів маски і 5 регістрів фільтра на чіпі контролера, які гарантують отримання данних від цільового пристрою. Вони корисні, особливо у великій мережі, що складається з безлічі вузлів.

Існує дві функції, щоб використовувати ці маски і фільтру регістрів:

Init_Mask (unsigned char num, unsigned char ext, unsigned char ulData); & init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);;

«» «num» «» представляє який регістр використовується. «» «ext» «» представляє статус кадру. 0 означає, що це маска або фільтр для стандартного кадру. 1 означає, що він протягом тривалого кадру.

«» «UlData» «» представляє вміст маски фільтра.

3. Перевірка Receive

MCP2515 може працювати або в режимі опитування, де програмне забезпечення перевіряє прийнятий кадр, або за допомогою додаткових пінів, щоб сигналізувати, що кадр був отриманий або передача завершена. Використовується наступна функція для опитування отриманих кадрів.

INT8U MCP_CAN :: checkReceive (void);

Функція повертає 1, якщо кадр прибуває, і 0, якщо нічого не приходить.

4. Отримати CAN ID

Коли деякі дані приходять, використовується наступна функція, щоб отримати CAN ідентифікатор вузла «send».

INT32U MCP_CAN :: getCanId (void)

5. Send

CAN.sendMsgBuf (INT8U id, INT8U ext, INT8U len, data_buf);

Це функція для передачі даних на шину. В якому:

«» «id» «» відображає ідентифікатор данних

«» «ext» «» представляє статус кадру. «0» означає стандартну рамку. «1» означає, що розширений кадр.

«» «Len» «» представляє довжину цього кадру.

«» «Data_buf» «» зміст повідомлення.

Наприклад, в прикладі «send», ми маємо:

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};

CAN.sendMsgBuf(0x00, 0, 8, stmp); //send out the message 'stmp' to the bus and tell other devices this is a standard frame from 0x00.


6. Receive

Наступна функція використовується для прийому даних на вузлі «receive»:

CAN.readMsgBuf(unsigned char len, unsigned char buf); Ця функція може отримати тільки кадри, які відповідають вимогам масок і фільтрів.

«» «Len» 'представляє довжину даних.

«» «buf» «», де ви зберігаєте дані.

Ресурси

  • [1] CAN-BUS файл Вихідний код для Arduino 1.0
  • [2] технічний опис
  • [3] технічний опис
Особисті інструменти
Google AdSense
реклама