![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
![]() Новичок ![]() ![]() Группа: Пользователи Сообщений: 43 Регистрация: 8.10.2013 Пользователь №: 65 978 ![]() ![]() |
Может, кому надо вариант подешевле.
Всё, что для этого надо, это Arduino Uno, два CAN шильда. Обратите внимание, что по ссылке цена сразу за два CAN шильда! Ардуину можно и не UNO, а допустим, Nano, меньше места занимает, но Uno можно запитать прям от бортовой сети 12в, приклеив на встроенный стабилизатор радиатор на всякий случай. Он может работать до 20в. Соединяем всё это по этой схеме: ![]() Сразу говорю, я художник не великий, поэтому нарисовал это в среде Fritzing, где уже есть готовые элементы, но CAN адаптеры немного другие, у которых ещё куча нам не нужных выводов, главное - у нужных названия совпадают. То же самое с разъёмом - каких надо нет, главное номера контактов - CAN L - 2, CAN H - 13. Разъём на радио называется С2, А вообще распиновка тут. Провода на самом деле на разъёме расположены один под другим, а не в одном ряду с разных концов. Можно было бы раздобыть разъёмы (только где?) как на схеме чтоб готовое устройство воткнуть между радио и машиной, но я тупо перерезал провода 2 и 13, удлиннил и вывел наружу через верхнюю крышку для опытов. На схеме слева - провода в машину, справа - в радио. В общем, когда это всё смотали, распаковываем прикреплёный скетч с либой как есть в одну директорию. Либу чуть-чуть изменил, добавил скорость 83,3 кбит/с (думал у меня такая скорость, оказалась 125). Есть разные версии этой либы, не совсем совместимые, с той что у меня точно работает. Скетч пересылает пакеты от шины в радио и наоборот, по пути в радио подменяет D на P, в общем в скетче прокомментировал где что. Думаю, потом ещё может какие фишки добавить, а может ну его нафиг. Сам всё настроил и дописал вчера, проверил, всё работает на RT 2008+, теперь надо это всё красиво собрать и напечатать коробочку на 3D принтере. Подобные устройства есть, но цена у них - 150 евро или типа того, а то что получилось у меня и 15 не стоит. Когда сканировал и вылавливал пакеты, провода от машины к радио соединял вместе и к ним подключал один из адаптеров. ![]() -------------------- Chrysler Grand Voyager RT, квадрат, 2.8 дизель, 2008 г.
|
|
|
![]() |
![]()
Сообщение
#2
|
|
![]() Новичок ![]() ![]() Группа: Пользователи Сообщений: 43 Регистрация: 8.10.2013 Пользователь №: 65 978 ![]() ![]() |
Всё, нашёл, переделал - всё работает в движении! Навигацию в туннеле не проверял.
новый скетч для ардуино: Код #include "mcp_can.h" #include <SPI.h> unsigned long rxId; byte len; byte rxBuf[8]; char msgString[128]; byte txBuf0[] = {0x00, 0x00, 0x80, 0x20, 0x50, 0xFF, 0x0C}; // включен P, мотор заведён, тормоз отпущен. byte txBuf1[] = {0x00, 0x00, 0x84, 0x21, 0x44, 0xFF, 0x0C}; // включен D, мотор заведён, тормоз нажат. MCP_CAN CAN0(10); // на десятом пине CS от адаптера "в машину". MCP_CAN CAN1(9); // на десятом пине CS от адаптера "в радио". void setup() { Serial.begin(115200); // инициализация CAN0 bus, baudrate: 125k@8MHz Если шина медленная, на более старых моделях, // надо вместо CAN_125KBPS написать CAN_83K3BPS - 83,3Kbit/s, но там хз, может и коды другие. if(CAN0.begin(MCP_ANY, CAN_125KBPS, MCP_8MHZ) == CAN_OK){ Serial.print("CAN0: Init OK!\r\n"); CAN0.setMode(MCP_NORMAL); } else Serial.print("CAN0: Init Fail!!!\r\n"); // инициализация CAN1 bus, baudrate: 125k@8MHz Если шина медленная, на более старых моделях, // надо вместо CAN_125KBPS написать CAN_83K3BPS - 83,3Kbit/s но там хз, может и коды другие. if(CAN1.begin(MCP_ANY, CAN_125KBPS, MCP_8MHZ) == CAN_OK){ Serial.print("CAN1: Init OK!\r\n"); CAN1.setMode(MCP_NORMAL); } else Serial.print("CAN1: Init Fail!!!\r\n"); } void loop(){ if(!digitalRead(2)){ // на втором пине INT от адаптера со стороны машины. Считываем, если он в LOW. CAN0.readMsgBuf(&rxId, &len, rxBuf); // читаем из шины и посмотрим, пропускать ли дальше в радио. if(rxId == 0x20E){ // в сообщениях с этим ID передаются данные о положении ручки. if(rxBuf[2]==txBuf1[2] && // сравниваем не все байты, а только постоянные при rxBuf[4]==txBuf1[4] && // положении ручки в D. Другие меняются на rxBuf[5]==txBuf1[5] && // заглушенном двигателе и отпущенной педали тормоза. rxBuf[6]==txBuf1[6]){ memcpy(rxBuf, txBuf0, 7); // заменяем D на P } } if (rxId == 0x211){ // здесь передаётся так же скорость rxBuf[2] = 0x00; // во втором rxBuf[3] = 0x00; // и третьем байте всегда ставим в 0 } CAN1.sendMsgBuf(rxId, 0, len, rxBuf); // отсылаем в радио } if(!digitalRead(3)){ // на третьем пине INT от адаптера со стороны радио. CAN1.readMsgBuf(&rxId, &len, rxBuf); // Считываем, если он в LOW CAN0.sendMsgBuf(rxId, 0, len, rxBuf); // и пересылаем дальше в машину } } Или тут с библиотекой: ![]() Сообщение отредактировал asix - 6.11.2017, 11:07 -------------------- Chrysler Grand Voyager RT, квадрат, 2.8 дизель, 2008 г.
|
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 19.7.2025, 12:21 | ![]() |
|
Мы в соцсетях:
![]() |