![]() |
CITROEN-ARDUINO
Народ, а кто нить дружил Citroen с Arduino+CAN Shield?
Толи я чего-то не понимаю, толи я что-то не правильно делаю. #include #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; INT32U canId = 0x000; void setup() { Serial.begin(115200); START_INIT: if(CAN_OK == CAN.begin(CAN_500KBPS,MCP_8MHz)) { Serial.println("Init OK!"); } else { Serial.println("Init fail"); delay(100); goto START_INIT; } } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId(); // unsigned long canId = CAN.getCanId(); Serial.print("<");Serial.print(canId);Serial.print(","); for(int i = 0; i Serial.print(buf[i]);Serial.print(","); } Serial.print(">"); Serial.println(); } } Пытаюсь отловить обороты. Но получаю на выходе при чтение что-то типо 8 : 1C F0 32 0 4C 30 0 32 68 : 0 0 FF D : 0 0 0 0 0 0 0 B 8 : 1C F0 31 0 4C 30 0 32 48 : 0 30 2 42 C8 3 1 0 5 : 7F FF 0 5 58 0 5 : 7F FF 1 85 D9 0 8 : 1C F0 31 0 4C 30 0 32 32 : 81 5B 48 FE 0 0 68 : 0 0 FF D : 0 0 0 0 0 0 0 C 92 : 0 0 0 8 : 1C F2 31 0 4C 30 0 32 48 : 0 30 2 42 C8 3 1 0 5 : 7F FF 0 5 6B 0 12 : 73 20 1 3D 0 4D : 0 0 0 0 0 0 0 0 И не одного упоминания о 0C Обороты двигателя (Engine RPM)! И почему такие короткие ID у сообщений? Я чего-то не дописал или у ситроенов обороты под другим ID? Поделитесь кто что знает! Я в этом совсем новенький. |
В общем ты путаешь два понятия:
первое - это протокол по которому общаются устройства в твой машине, и он в каждой машине свой ( иногда даже разный в машинах одной и той же марки ), именно его ты и привёл в качестве примера. второе - это OBD II протокол, то есть диагностический протокол, который должен быть реализован в каждой машине, но из практики могу сказать, что есть он почти во всех новых машинах, но не во всех реализован в полном объёме. Данный протокол работает по запросу, то есть ты сначала запрашиваешь у диагностического устройства с ид 7DF, то что тебе нужно, а потом получаешь ответ от устройства с ид. 7E8 ( возможны варианты от 7E8 до 7EF). Вот именно в этом протоколе 0C это обороты двигателя. Более подробно читаем здесь https://en.wikipedia.org/wiki/OBD-II_PIDs#Mode_1_PID_1C Теперь по поводу твоего протокола, как я и говорил у каждой машины он свой, допустим в грузовиках ISUZU мы получаем такое сообщение <217056256,240,125,126,188,18,0,255,255,> вот именно в сообщениях с идентификатором 217056256 в 4-м и 5-м байтах находятся обороты двигателя, при чём для получения нужного числа надо (18*256+188)/8 = 599,5 об/мин твой протокол слишком короткий, что бы точно сказать, что именно именно передаёт обороты двигателя, но скорее всего обороты здесь 8 : 1C F2 31 0 4C 30 0 32 Причем вычисляется так 31 это 49 десятичное, F2 - 242. (49*256+242)/16 = 799,125 об/мин. Если конечно прокол снимался на холостых оборотах. |
Bersenev спасибо тебе огромное.
В моём протоколе это лишь кусок. У меня есть два лога- один без запуска двигателя, а второй с запуском и работой на ХХ. Ту часть которую привёл это с запуском. Но похоже это не тот ID поскольку на незапущенном двигателе он тоже меняется. Если поможешь, то могу выслать два лога. Какой программой можно анализировать траффик с ком порта? А то эта угадайка на долго. И если не сложно объясните мне как при помощи ардуины OBD II запросы слать и принимать ответы. лог без запуска (выборка по ID с убиранием повторяющихся сообщений) также попробовал написать if (canId = 8) { C = (buf[3]*256+buf[2])/16; Serial.println(C); } И получил пляшущие цифры ни малейшим образом не намекающие на обороты! |
Короче понятно.
Нужно идти стандартным путём- ELM327+Arduino |
Цитата:
Код:
#include Только номера пинов надо задать свои. |
Цитата:
C = (buf[3]*256+buf[2])/16; Я не знаю тип переменной C , но в принципе это и не важно. buf[3]*256 - байт умножается на 256 и сохраняется в байт, то есть всегда равно 0. Теперь к нулю прибавляем байт buf[2] и делим на 16 в результате значения от 0 до 15. а надо так, если C имеет тип unsigned int, то C = buf[3]; C = (C*256+buf[2])/16; То есть сначала байт преобразуем в unsigned int, а уже потом выполняем все действия, вот тогда получим правильное значение |
Цитата:
Я сделал себе программу для анализа протокола, протокол формирует этот скетч. Код:
#include Только для того что бы найти обороты надо сделать следующее: Подключить шилд к машине, запустить монитор ком порта, включить зажигание секунд на пять, потом завести машину, потом медленно давить на газ что бы обороты плавно подымались, а потом также плавно опускать обороты до холостых. После этого глушим машину и сохраняем протокол. Вот тогда что бы найти обороты понадобится минут десять. Для скорости почти тоже самое, только надо равномерно разогнать машину километров до 40 - 50-ти, а потом также спокойно остановиться. Для уровня топлива нужны протоколы до и после заправок. |
С имеет тип unsigned int. Задаётся в начале поэтому и небыло в куске.
С байт ты прав, но там числа получались до 65000. Можно попробовать ещё раз. Твой скетч тоже что и мой, только вывод строк в другом формате. у меня в хексе и без всяких скобок и разделителей кроме ":" между ID и сообщением, а у тя с доп символами. Ща перепишу свой чтоб выводилось в твоём формате. С посылкой по OBD II ща попробую сам разобраться :) Реально мне с ардуиной пока очень сложно так как опыта программирования МК у меня нет. PS А что делает строчка? INT32U canId = 0x000; и отличается ли она от моей unsigned char canId = CAN.getCanId(); |
Цитата:
C = buf[2]; C = (C*256+buf[1])/16; |
Цитата:
Но самое главное у тебя здесь ошибка, так как идентификаторы могут быть 11-ти или 29-битные (в зависимости от системы адресации в конкретной can шине), а ты выделяешь под него один байт, то есть всего восемь бит. Правильно должно быть так unsigned long canId = CAN.getCanId(); или так INT32U canId = CAN.getCanId(); |
Идентификатор 520, байты 0 и 1
C = buf[0]; C = (C*256+buf[1])/8; Только файлы можно просто прикреплять к сообщению, а не вставлять их в текст |
Bersenev
Как ты это делаешь шаман? :) Какой прогой анализируешь? Спасибо огромное! Кстати по запросу через OBD II я так ни чего и не понял, но попробую ещё подумать. Вики я всю пересмотрел. PS. А что ещё можно извлечь из данного лога? И проверил ща в машине. Там опять какая-то каша! Без запуска двигателя кажет Скетч приобрёл вид #include #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; unsigned int RPM; INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные void setup() { Serial.begin(115200); START_INIT: if(CAN_OK == CAN.begin(CAN_500KBPS,MCP_8MHz)) { Serial.println("Init OK!"); } else { Serial.println("Init fail"); delay(100); goto START_INIT; } } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId(); if (canId = 520) { RPM = buf[0]; RPM = (RPM*256+buf[1])/8; Serial.print("Engine RPM: "); Serial.println(RPM); } } } |
Цитата:
Цитата:
|
Цитата:
if (canId == 520) |
Bersenev всё- заработало, ещё раз спасибо!
А остальные цифры в 520 что-то значат? Возможно ли что в одном ID два параметра находятся? А в принципе видимо из этих данных можно выловить всё о машине что касается двигателя? Как сделать лог для всего остального? Ну например той же температуры ОЖ, скорости, напряжения, уровня топлива и самое главное расхода топлива? И можно ли каким-то стандартным софтом анализировать протокол? Хочу хоть примерно понять. PS. Температура ОЖ там врядли была. она ровнялась температуре окружающей среды :) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
(buf[1]*256 + buf[2])/256 то есть в байте 1 температура в градусах, а в байте 2 значение после запятой. У тебя в логе она поднялась с 37.8 до 39.2 |
Цитата:
Цитата:
И если будет время запишу лог разгона и торможения. По поводу напряжения- хочется всётаки понять где оно там спрятано. По поводу топлива- алгоритм-то понятен. Надо только лейку найти и доехать в канистру 20л бензина налить, вот только как потом ровно по 10 литров налить? А второй канистры нету. По поводу расхода- понятно. Там наверняка берётся из расчёта времени открытия форсунок и может быть давления в рампе. |
Вложений: 1
Снял лог.
Разгон 0-60 и потом 60-0 с отпущенным газом. Файл приложил. В архиве txt Про температуру. Вчера ты написал Цитата:
Ща схожу проверю в машине. |
ид 1101 скорость в 0 и 1, 2 и 3, 4 и 5, 6 и 7 байтах, но судя по всему в первых трёх парах скорость в милях, а в последней в километрах
Если разгонялся до 60 км/ч, то формула такая (buf[6]*256 + buf[7])/200 Но это ещё надо разбираться, возможно что скорость в км именно в 0 и 1 байтах, тогда (buf[0]*256 + buf[1])/100 что именно верно надо уже проверять экспериментально. также скорость в ид 909 байт 0 и 1 (buf[0]*256 + buf[1])/100 В моторной шине скорость часто идёт с разными ид. Но лучше их брать с шины которая идёт на панель приборов., там она всегда одна. а ид 1362 ночно не температура ОЖ |
Bersenev
1362 это какой-то таймер и обновляется раз в секунду. По поводу скорости- я примерно до 60 разогнался. Может чуть меньше. в 909 скорость в милях? В итоге всётаки выходит что мне проще читать через OBD II данные. Мне на самом деле нужно просто повторить показания на экране бортового компа. А всё остальное это уже баловство. А на экране отображается 1 Расход на 100 2 Моментальный расход 3 Расстояние которое можно проехать до заправки 4 Трип счётчик Из всего что мне нужно- расход на 100 и моментальный. Как я понимаю дёрнуть из протокола ситра будет это очень не просто. Так что думаю что сделаю проще. В диаг разъём вставлю ELM, а с него уже буду брать данные. Так проще и про ELM всё рассказано уже. А свой CAN Shield переделаю на комфорт шину и оттуда буду читать температуру за бортом, нажатие кнопок на магнитоле и руле и сообщения от магнитолы на дисплей. То что ты расшифровал в логе по скорости- проверю. |
Цитата:
|
Bersenev А это мы скоро узнаем :)
TJA1054T уже давно заказана и едет из китая. Переделаю шилд под комфорт шину и буду ловить дальше пакеты и надеюсь расшифровывать их при твоём участие. И тут ещё у народа наработки есть. Так что думаю всё получится. А про то что данных которые мне нужны нету в шинах это я понимаю. Но одно дело искать в небольшом количестве данных, а другое выуживать это из тонны. Я пришёл к мнению что данные о машине и трипе буду снимать torque, а с комфорт шины перехватывать сообщения для дисплея чтоб его заменить без потерь и нажатие разных кнопок в машине. В итоге цель выглядит так: Выкинуть дисплей на котором отображаются Параметры машины что писал выше (по одному параметру и меняются при нажатии кнопки на лепестке дворников). Если torque их покажет, то не нужны. Градусник. Тоже если torque покажет, то не нужен. Текстовые сообщения от систем автомобиля (открытая дверь, риск обледенения и так далее) Текстовые сообщения от магнитолы (хотя я думаю что это один и тот же пакет или несколько пакетов) Отлавливание нажатий кнопок на руле и подрулевых. Отлавливание нажатия кнопок на магнитоле. Штатная голова пока останется в машине в виде радио и усилителя для планшета. Планшету будет выделена функция утраченного дисплея бортовика+ torque+ навигация+ музыки с флешки. Если приём радио меня устроит или я дойду до покупки внешнего FM USB приёмника, то голову тоже вытащу и спаяю усилитель. |
TJA1054 приехала.
Время ща нет, но в следующее воскресенье вытравлю платку и соединю с шилдом. Подключу к машине или не успею- не знаю. |
Пока ни как не собирусь с платой. Время совсем нет.
Но покопал инет пока жду elm327 и пишут что он не умеет читать с ситроена данные по топливу. Поэтому созрела идея, но найти ни чего путного не могу. Короче что нужно FT раскапывать- понятно. Там всё это есть и чувствует себя хорошо. Но что делать с софтом? Не смотреть же это через терминал! И тут пришла идея! А можно ли сделать так, чтоб ардуина прикинулась elm327 для планшета и torque? Тогда можно torque кормить любой инфой которой пожелаешь! |
Приветствую.
Я тут мимо проходил и заметил, что могу быть полезным: http://autowp.github.io/ - я тут насобирал кой чего по CAN Comfort ... в 0x221 расход упоминается (правда не уверен, что тот, который надо, это все-таки расход по выбранному режиму треккомпа, но как отправная точка сгодится) Ну и это, если есть чего добавить, you are welcome https://github.com/autowp/autowp.github.io |
autowp Я видел твои изыскания.
Очень помогут. Ща правда новая работа и время ноль и второе- не хочу гадить шилд за 700р переделкой. Так что закажу дешёвые can-bus платки и на них перепаяю. Пришёл ELM327. Проверил. В принципе он всё показывает. Немного не совпадает с бортовиком, но это где-то можно подкорректировать. Выдаёт кучу ненужных мне параметров, но в их числе и нужные. Такие как мгновенный расход и расход на 100. Ещё из полезного температуру охлаждайки показывает и напряжение. От комфорт шины теперь требуются кнопки, температура окружающей среды и то что сыпет магнитола на экран. Плюс всякие ништяки типо открытых дверей, ICE Alert. Второй вопрос уже более актуальный- как связаться с ардуиной с андройда? Причём чипы USB у китайских CH341. Я с андройдом ну совсем не друг и понять не могу не фига. Нужно будет написать мелкую прогу чтоб отображалась полосой на экране на которой будет собственно сообщения от магнитолы, о открытых дверях, температуре и так далее. |
Сообщения ICE и т.п. ты видел в моём файле. Показывать их легко. Но надо будет предварительно снять дисплей и забрутфорсить весь спиок, потому что передаются они дисплею кодами, а текст зашит в нём самом. Я свой и еще один забрутфорсил, но от машины к машине список меняется (дополняется).
Взаимодействовать с андроидом достаточно не сложно. На китайском usb-uart ещё не пробовал, но под ft232 код готовый есть. |
Чего-то фигня с почтой России какая-то!
Очень долго всё идёт. Уже попробовать хочется! По поводу софтины. Нашёл вот такую http://www.danielespinetti.it/2012/1...s-control.html Сорри за сторонний ресурс. Время попробовать опять таки нет. autowp Я кстати хотел узнать как передаётся инфа дисплею, а ты уже ответил. :) Кстати какая распиновка на дисплее разъёма? CAN шину хочу для экспериментов с его разъёма взять. Дисплей я и так сниму. Новая рамка всётаки почтой пришла. Ща потихоньку планшет туда приделываю. Как его брутофорсить? У меня стандартный строчечный. Скорее не от машине к машине, а от типа дисплея к типу. И скорее всего по шине идут все данные, а то замена дисплеев была бы не возможна. |
Цитата:
>>И скорее всего по шине идут все данные, а то замена дисплеев была бы не возможна. Не исключено, что она и невозможна, формально. Просто самые базовые коды сообщений пересекаются, а различия в редких никто и не замечает на практике. |
Ну чтож- всё приехало!
Ура. Собственно список: Ардуина: http://www.ebay.com/itm/MINI-USB-Nan...item25946c3b1b TJA1054: http://www.ebay.com/itm/380556314485...%3AMEBIDX%3AIT CAN шилд: http://www.ebay.com/itm/311379482437...%3AMEBIDX%3AIT Платка для TJA: http://www.ebay.com/itm/281675279651...%3AMEBIDX%3AIT Спаяно всё вместе, перепаяна TJA1050 на TJA1054. Здесь платка очень помогла! Комп показал INIT OK. В машине ещё не проверял. Надо узнать какого цвета провода CAN на магнитоле. PS. С той Программой не завелась на Андройде она только для UNO, а вот с UNO работает нормально. Завелась с этой http://www.wch.cn/download/CH341SER_ANDROID_ZIP.html Но что делать дальше я не знаю совсем под андройдом. ещё есть вот такая: https://github.com/mik3y/usb-serial-for-android Но пока под андройд я писать ни чего не умею. |
Лучше бы TJA1055 брал. Обратно совместима, но с некоторым улучшениями.
Лучше распиновку смотреть, а не по цвету ориентироваться. http://citroens-club.ru/forum/index.php?showtopic=8919 |
Цитата:
|
autowp да ктож знал!
А Вообще пофиг. Она чисто под проект бралась. |
Пока до машины не добрался, но пришла ардуина Pro micro.
Модифицировал файлы HID.cpp и USBAPI.h чтоб заработали мультимедиа функции. http://stefanjones.ca/blog/arduino-l...ltimedia-keys/ Зашил скетч void setup() { Serial.begin(19200); } void loop() { delay(5000); Remote.play(); Remote.clear(); Serial.println("I work!"); } и о чудо- плеер начинает воспроизведение, а в порт пишется надпись. Тоесть то что мне и нужно! Далее делать буду на этой ардуине, но я уже спаял всё вместе на nano так что снифить CAN буду на ней. |
Вложений: 1
Итак.
Добрался до машины, подключился и снял два лога. Первый это лог с включённым зажиганием, а второй просто магнитола. На готовых логах мне кто объяснит как прочитать сообщение на экране от магнитолы? В логе сверху написано что было на дисплее в этот момент. Лог снят скетчем из сообщения 7 http://www.pccar.ru/showpost.php?p=332906&postcount=7 (первое число ID а далее сообщение) autowp За табличку отдельное спасибо! Ловите скетч который я правлю и пишу. Там всё передаётся в сериал порт и соответственно всё подписано. Цитата:
|
Вложений: 1
Цитата:
Ну нулевой байт, а первые 13 бит. Ну и уже если первый байт, то не 33, а 32 (2^5) |
Цитата:
Цитата:
На сколько я помню, 39.5, а не 39, как раз для того, чтобы после округления получалось точно как на дисплее. На шине температура дается на 1 бит более точно, чем на экране. Дисплей или округляет, или отбрасывает (floor) младший бит, доподлинно установить не представляется возможным. Я решил, что он округляет, поэтому такая формула. |
Итак, разобрались чутка.
В скетч ща внесу то что заработало. Кто с одометром поможет и с радио? Вот такие числа и реальный пробег Последнее меняется раз в 100 метров 17 36 62 | 112339 17 36 63 | 112339 17 36 64 | 112339 17 36 65 | 112339 17 36 66 | 112339 17 36 67 | 112339 17 36 68 | 112339 17 36 69 | 112339 17 36 70 | 112339 17 36 71 | 112339 17 36 72 | 112340 17 36 73 | 112340 17 36 74 | 112340 Для магнитолы данные частота 32 0 16 2 238 | 87.5 32 0 16 2 240 | 87.6 32 0 16 2 242 | 87.7 32 0 16 2 244 | 87.8 32 0 16 2 246 | 87.9 32 0 16 2 248 | 88.0 32 0 16 2 250 | 88.1 32 0 16 2 252 | 88.2 32 0 16 2 254 | 88.3 32 0 16 3 0 | 88.4 32 0 16 3 2 | 88.5 32 0 16 3 4 | 88.6 32 0 16 3 6 | 88.7 32 0 16 3 8 | 88.8 32 0 16 4 136 | 108.0 |||||16 FM1 |||||32 FM2 |||||64 FM AST |||||80 AM 32 0 80 2 19 | 531KHZ 32 0 80 2 20 | 532KHZ 32 0 80 2 21 | 533KHZ 32 0 80 2 255 | 767KHZ |
Прикинул, по радио получилось так:
Для АМ два байта 2 19 это и есть 531, то есть считать ничего не нужно. Для FM получилась такая формула X/20+50, например два байта 2 244, это будет 756/20+50=87.8, 4 и 136 - 1160/20+50=108 |
Цитата:
((byte3 * 256) + byte4) / 2 + 500 А для одометра есть идеи? |
Часовой пояс GMT +4, время: 14:12. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot