diff --git a/CanHacker.h b/CanHacker.h index 1e79947..3047c5b 100644 --- a/CanHacker.h +++ b/CanHacker.h @@ -65,7 +65,7 @@ class CanHacker { static const char BEL = 7; static const uint16_t TIMESTAMP_LIMIT = 0xEA60; - CAN_CLOCK canClock = MCP_16MHZ; + CAN_CLOCK canClock = MCP_8MHZ; bool _timestampEnabled = false; bool _listenOnly = false; bool _loopback = false; diff --git a/README.md b/README.md index 08d0149..8f8a9e2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ -# CanHacker (lawicel) CAN adapter on Arduino + MCP2515 +

+ +

+ +

CANHacker CAN Adapter

+

Arduino Nano & MCP2515 Board

-Use that [Library](https://github.com/autowp/arduino-mcp2515) to communicate with MCP2515 ## Features -Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol. +Implement communication with CAN bus via MCP2515 by CANHacker (lawicel) protocol. - send & receive can frames - supports standart (11 bit) & extended (29 bit) frames @@ -12,26 +16,23 @@ Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol - supports filter by ID (mask + code) - interface using [Stream](https://www.arduino.cc/en/Reference/Stream): ability to work with Serial, SoftwareSerial, Ethernet and other - supported can baudrates from 10Kbps up to 1Mbps -- supported modules with different oscillators (8, 16, 20 MHz), 16 MHz is default, use setClock if your oscillator is not 16MHz -- support [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (application for Windows) +- supported modules with different oscillators (8, 16, 20 MHz), 8 MHz is default, use setClock if your oscillator is not 8MHz +- support [CanHacker](https://www.mictronics.de/img/2009/12/CANHackerV2.00.01.zip) (application for Windows) - support [CANreader](https://github.com/autowp/CANreader) (application for Android) ## Documentation [English](docs/en/) -[Русский](docs/ru/) - ## Library Installation -1. Install [MCP2515 Library](https://github.com/autowp/arduino-mcp2515) -2. Download the ZIP file from https://github.com/autowp/arduino-canhacker/archive/master.zip +1. Install [MCP2515 Library](https://github.com/souravbaghz/arduino-mcp2515) +2. Download the ZIP file from https://github.com/souravbaghz/arduino-canhacker/archive/master.zip 3. From the Arduino IDE: Sketch -> Include Library... -> Add .ZIP Library... 4. Restart the Arduino IDE to see the new "canhacker" library with examples -Testes with Arduino Nano. -On Arduino Uno have problem with too long boot period and losing first command - -## Contributing +Testes with Arduino Nano Only. -Feel free to open issues, create pull requests and other contributions +## Repository History +- Originally from [autowp](https://github.com/autowp/arduino-canhacker.git) Kudos to him :) +- Forked & Modified by [souravbaghz](https://github.com/souravbaghz/arduino-canhacker) diff --git a/docs/en/README.md b/docs/en/README.md index 95150da..b81ac33 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -1,10 +1,8 @@ -# CanHacker (lawicel) CAN adapter on Arduino + MCP2515 - -Use that [Library](https://github.com/autowp/arduino-mcp2515) to communicate with MCP2515 +# CANHacker CAN Adapter on Arduino + MCP2515 ## Features -Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol. +Implement communication with CAN bus via MCP2515 by CANHacker (lawicel) protocol. - send & receive can frames - supports standart (11 bit) & extended (29 bit) frames @@ -12,23 +10,35 @@ Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol - supports filter by ID (mask + code) - interface using [Stream](https://www.arduino.cc/en/Reference/Stream): ability to work with Serial, SoftwareSerial, Ethernet and other - supported can baudrates from 10Kbps up to 1Mbps -- supported modules with different oscillators (8, 16, 20 MHZ), 16 MHZ is default, use setClock if your oscillator is not 16MHZ -- support [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (application for Windows) +- supported modules with different oscillators (8, 16, 20 MHZ), 8 MHZ is default, use setClock if your oscillator is not 8MHZ +- support [CanHacker](https://www.mictronics.de/img/2009/12/CANHackerV2.00.01.zip) (application for Windows) - support [CANreader](https://github.com/autowp/CANreader) (application for Android) +## Pins Connection + +|MCP2515 Pin|Arduino Pin| +|-----------|-----------| +| VCC | 5V | +| GND | GND | +| CS | D10 | +| SO | D12 | +| SI | D11 | +| SCK | D13 | +| INT | D2 | + + ## Library Installation -1. Install [MCP2515 Library](https://github.com/autowp/arduino-mcp2515) -2. Download the ZIP file from https://github.com/autowp/arduino-canhacker/archive/master.zip +1. Install [MCP2515 Library](https://github.com/souravbaghz/arduino-mcp2515) +2. Download the ZIP file from https://github.com/souravbaghz/arduino-canhacker/archive/master.zip 3. From the Arduino IDE: Sketch -> Include Library... -> Add .ZIP Library... -4. Restart the Arduino IDE to see the new "canhacker" library with examples +4. You may need to restart the Arduino IDE to see the new "canhacker" library with examples -Testes with Arduino Nano. -On Arduino Uno when works with CanHacker for windows have problem with too long boot period and losing first command +Testes with Arduino Nano Only. ## Usage -Example +Upload the below sketch to work with CANHacker Windows: ``` #include @@ -39,29 +49,80 @@ Example #include #include +#include const int SPI_CS_PIN = 10; const int INT_PIN = 2; +const int SS_RX_PIN = 3; +const int SS_TX_PIN = 4; + CanHackerLineReader *lineReader = NULL; CanHacker *canHacker = NULL; +SoftwareSerial softwareSerial(SS_RX_PIN, SS_TX_PIN); + void setup() { Serial.begin(115200); while (!Serial); SPI.begin(); + softwareSerial.begin(115200); Stream *interfaceStream = &Serial; + Stream *debugStream = &softwareSerial; + - canHacker = new CanHacker(interfaceStream, NULL, SPI_CS_PIN); + canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN); + //canHacker->enableLoopback(); // uncomment this for loopback lineReader = new CanHackerLineReader(canHacker); pinMode(INT_PIN, INPUT); } void loop() { - canHacker->processInterrupt(); - lineReader->process(); + CanHacker::ERROR error; + + if (digitalRead(INT_PIN) == LOW) { + error = canHacker->processInterrupt(); + handleError(error); + } + + error = lineReader->process(); + handleError(error); +} + +void handleError(const CanHacker::ERROR error) { + + switch (error) { + case CanHacker::ERROR_OK: + case CanHacker::ERROR_UNKNOWN_COMMAND: + case CanHacker::ERROR_NOT_CONNECTED: + case CanHacker::ERROR_MCP2515_ERRIF: + case CanHacker::ERROR_INVALID_COMMAND: + return; + + default: + break; + } + + softwareSerial.print("Failure (code "); + softwareSerial.print((int)error); + softwareSerial.println(")"); + + digitalWrite(SPI_CS_PIN, HIGH); + pinMode(LED_BUILTIN, OUTPUT); + + while (1) { + int c = (int)error; + for (int i=0; i Include Library... -> Add .ZIP Library... -4. Перезапустите Arduino IDE, чтобы увидеть "canhacker" в списке библиотек и примеров - -Протестировано с Arduino Nano. -На Arduino Uno при работе через CanHacker для Windows, есть проблема с слишком долгой перезагрузкой и потерей первой комманды - -## Использование - -Пример - -``` -#include -#include - -#include -#include -#include - -#include - -const int SPI_CS_PIN = 10; -const int INT_PIN = 2; - -CanHackerLineReader *lineReader = NULL; -CanHacker *canHacker = NULL; - -void setup() { - Serial.begin(115200); - while (!Serial); - SPI.begin(); - softwareSerial.begin(115200); - - Stream *interfaceStream = &Serial; - - canHacker = new CanHacker(interfaceStream, null, SPI_CS_PIN); - lineReader = new CanHackerLineReader(canHacker); - - pinMode(INT_PIN, INPUT); -} - -void loop() { - canHacker->processInterrupt(); - lineReader->process(); -} -``` - -## Протокол - -Протокол CanHacker (lawicel) описан в [документации к приложению CanHacker](http://www.mictronics.de/projects/usb-can-bus/) - -Библиотека реализует его не полностью. [Поддерживаемые комманды приведены здесь](protocol.md). - -## Содействие - -Приветствуются любые способы участия в коде. \ No newline at end of file diff --git a/docs/ru/protocol.md b/docs/ru/protocol.md deleted file mode 100644 index 660345c..0000000 --- a/docs/ru/protocol.md +++ /dev/null @@ -1,188 +0,0 @@ -Протокол CanHacker (lawicel) описан в [документации к приложению CanHacker](http://www.mictronics.de/projects/usb-can-bus/) - -Библиотека реализует его не полностью. Поддерживаемые комманды приведены ниже. - -### `C[CR]` - -Эта команда переключает CAN контроллер из операционного режима в режим сброса. Контроллер более не вовлечен в какое-либо взаимодействие с CAN. - -Комманда доступна только в операционном режиме, запущеннос командой `O` ранее. - -Возвращает: [CR] или [BEL] - -### `L[CR]` - -Эта комманда переключает CAN controller в режим Только Чтение. Комманда открытия канала (`O`) не требуется после исполнения `L`. - -Используйте `C` для возврата в режим сброса. - -Возвращает: [CR] - -### `Mxxxxxxxx[CR]` - -Установить код фильтра. Эта комманда доступна только в режиме сброса. - -xxxxxxxx - код в hexadecimal - -Значение по-уолчанию после загузки 0x00000000 для приема всех сообщений. - -Возвращает: [CR] или [BEL] - -### `mxxxxxxxx[CR]` - -Установить маску фильтра. Эта комманда доступна только в режиме сброса. - -xxxxxxxx - маска в hexadecimal - -Значение по-уолчанию после загузки 0xFFFFFFFF для приема всех сообщений. - -Возвращает: [CR] или [BEL] - -### `N[CR]` - -Серийный номер устройства. - -Возвращает: Nxxxx[CR] - -xxxx - серийный номер в цифро-алфавитных символах. - -### `O[CR]` - -Эта комманда переключает CAN контроллер из режима сброса в операциооный режим. Контроллер вовлечен во взаимодействие с CAN. Комманда достуна только после установки скорости коммандой `S` ранее или контроллер переведен в режим сброса коммандой `C`. - -Возвращает: [CR] or [BEL] - -### `riiiL [CR]` - -Комманда пердает стандартный remote 11 Bit CAN фрейм. Комманда доступна только в операционном режиме после исполнения комманды `O`. - -``` -iii - идентификатор в hexadecimal (000-7FF) -L - код длины сообщения (0-8) -``` - -Возвращает: [CR] или [BEL] - -### `RiiiiiiiiL [CR]` - -Комманда пердает расширенный remote 29 Bit CAN фрейм. Комманда доступна только в операционном режиме после исполнения комманды `O`. - -``` -iiiiiiii - идентификатор в hexadecimal (00000000-1FFFFFFF) -L - код длины сообщения (0-8) -``` - -Возвращает: [CR] или [BEL] - -### `Sn[CR]` - -Эта комманда устанавливает скорость CAN в одно из предопределеных состояний. -Команда доступна после включения или после перевода конроллера в режим сброса командой `C`. - -Следующие скорости доступны: - -``` -S0 - 10Kbps -S1 - 20Kbps -S2 - 50Kbps -S3 - 100Kbps -S4 - 125Kbps -S5 - 250Kbps -S6 - 500Kbps -S7 - 800Kbps -S8 - 1Mbps -``` - -Возвращает: [CR] или [BEL] - -### `tiiiLDDDDDDDDDDDDDDDD[CR]` - -Комманда пердает стандартный 11 Bit CAN фрейм. Комманда доступна только в операционном режиме после исполнения комманды `O`. - -``` -iii - идентификатор в hexadecimal (000-7FF) -L - код длины сообщения (0-8) -DD - Байт данных в hexadecimal (00-FF). Количество байт должно соответствовать коду длины сообщения -``` - -Возвращает: [CR] или [BEL] - -### `TiiiiiiiiLDDDDDDDDDDDDDDDD[CR]` - -Комманда пердает расширенный 29 Bit CAN фрейм. Комманда доступна только в операционном режиме после исполнения комманды `O`. -``` -iiiiiiii - идентификатор в hexadecimal (00000000-1FFFFFFF) -L - код длины сообщения (0-8) -DD - Байт данных в hexadecimal (00-FF). Количество байт должно соответствовать коду длины сообщения -``` - -Возвращает: [CR] или [BEL] - -### `V[CR]` - -Чтение версии программного обеспечения и платы - -Возвращает: Vhhff[CR] - -``` -hh - версия платы -ff - версия программного обеспечения -``` - -### `v[CR]` - -Чтение подробной версии программного обеспечения - -Возвращает: vmami[CR] - -``` -ma - мажорный номер версии -mi - минорный номер версии -``` - -### `Zv[CR]` - -Эта комманда включает или выключает метки времени в получаемых сообщениях. По-умолчнию - выключено. - -Если метки времени включены, получаемые сообщения содержат дополнительные 2 байта на конце, в которых закодирована временная метка в миллисекнудах. - -Счетчик времени начинается с 0x0000 и переполняется на 0xEA5F, что эквивалентно 59999мс. - -Каждый инкремент временной метки соответствует 1мс из 60000мс окна. - -### Входящие фреймы - -Все вхоядщие фреймы передаются сразу после получения, опционально с временной меткой. - -Опрос не требуется. Отправляются в следующем формате: - -11 bit ID фрейм -``` -tiiiLDDDDDDDDDDDDDDDD[ssss][CR] -``` - -11 bit ID Remote фрейм -``` -riiiL[ssss][CR] -``` - -29 bit ID фрейм -``` -TiiiiiiiiLDDDDDDDDDDDDDDDD[ssss][CR] -``` - -29 bit ID Remote фрейм -``` -RiiiiiiiiL[ssss][CR] -``` - -``` -r - идентификатор для Remote 11 bit фрейма -R - идентификатор для Remote 29 bit фрейма -t - идентификатор для 11 bit фрейма -T - идентификатор для 29 bit фрейма -i - идентификатор (000-7FF) или (00000000-1FFFFFFF) -L - код длины (0-8) -DD - байты данных (00-FF) -ssss - опциональная метка времени (0000-EA5F) -```