Приборная панель с цифровой Led индикацией и сбором данных по CAN шине автомобиля
- Войдите на сайт для отправки комментариев
Вообщем, даже не знаю с чего начать.
Немного о себе.
Arduino mega 2560 обладаю около недели. До этого практики програмирования и схемотехники не имел. Работаю инженером-строителем.
Предистория.
Автомобильная практика, и практика по Led подсветке началась, с приобретения Таврии 1100. Была сделана и установлена самостоятельно подсветка подрулевого пространства из dip led на макетных платах. Половина Led не горела, как говорится первый блин комом, но и той половины которая работала, было вполне достаточно для поставленых перед ней целей. Таврия была успешно продана с подсветкой.
Второй опыт был уже на Mitsubishi Colt IV 1994 г.в., который был приобретен после Таврии. На данное авто былы изготовленна и установленна самостоятельно RGB подсветка (на лентах) подножного пространства, бардачка, багажника, и подножного уличного пространства при открывании двери. Преключение цветов осуществлялось с помощью регулятора на 6 положений (используются в старых уселителях). Подсветка имела 2 режима:
Режим 1: Срабатывание подсветки при только открывании дверей.
Режим 2: Постоянное горение.
Авто с подсветкой, было передано Брату.
И вот пока я коплю денежку на очередное авто (Nissan Note), я решил подготовится, и перейти на новый уровень подсветки.
Планируется:
1. Подсветка внутренего пространства автомобиля, RGB с всевозможной регулеровкой цвета и яркости свечения
2. Наружное освещение необходимое, для конфортного пользования автомобилем в ночное время суток: Подсветка, пространства вокруг автомобиля, подсветка наружных ручек
3. Переделка и подсветка панели приборов на led индикацию со сбором нужной информации по CAN шине.
Почему то я решил начать с самого сложного :)
Технический аспект:
1. Управление всем необходимым при помощи Atmega 328 с минимальной обвязкой Arduino ( не целесообразно использовать преобретёную Arduino mega 2560 для этой задачи.
2. Изготовление печатной платы (подложки приборной панели) с Atmega 328 с минимальной обвязкой + CANbus декодера (будет принимать данные по CAN шине и пересылать их на Arduino) и led индикаторами основных показателей (тахометр, спидометр, топливо, температура двигателя). ( Всё SMD)
3. Изготовление накладки на подложку, из прозрачного ПВХ и поклейка на неё плёнок для четкой индикации + тонировка с верху ( что то похожее на Оптитрон)
Начал я с того что хотел получать сначала от датчиков информацию, но по документации выяснилось, что у Nissan Note нет датчика скорости, скорость считывается с датчиков ABS и передаётся от блока ABS по CAN шине бортовому компьютеру.
А если нельзя реализовать всё сразу, то незачем даже начинать :)
Так и возникло желание и необходимость получать нужную информацию по CAN шине, что очень и очень хорошо, меньше проблем с установкой, меньше проводов, зачем чтото считывать отдельно, если датчики автомобиля сделали это уже до тебя, нужно просто спросить их об этом :)
Вообщем начал я рыть, искать статьи, аналоги и тому подобное. К сожалению на Пост Советском пространстве Интернета, информации не много, и примеров почти нет.
А вот Буржуи давно уже сделали устройство и устройства которые обмениваются по CAN шине с автомобилем информацией. Одно, и самое удачное для меня www.youtube.com/watch
www.skpang.co.uk/catalog/arduino-canbus-shield-with-usd-card-holder-p-706.html
Вот страничка с опписанием, demo программой и билииотеками.
Вы спросите почему не купить эту плату и использовать.
Есть ряд причин по которым я не хочу это делать:
1.Высокая цена
2.Ненужная функциональнасть, почти вся
3.Нужно всё поместить в приборную панель
Вообщем нужно переделать этот проэкт, под выполнение своих функций.
Скачал я все файлы, и начал по ним рыться, искать, что же такое шлёт Arduino, что бы в ответ получать Скорость, число оборотов, температуру, и угол открытия дросельной заслонки....
Но так и не нашел.
Я очень надеюсь, что добрые форумчане с этого форума помогут мне с моим проэктом :)
Немного позже выкину наброски, как это всё должно выглядеть.
Всем откликнувшимя заранее благодарность.
Извините за растянутость :)
Неужели не у кого никаких идей нет и наработок по CAN ?
ничего против Вашего проекта не имею, Но мне кажется Вы несколько не верно понимаете форум...Вам следует начать работу над проектом и очень хорошо, что Вы все расписали, а когда начнете проект у Вас станут появляться конкретные вопросы, а то сейчас складывается впечатление, что вот Вы задумали, а форум сделает...в общем мое имхо - больше конкретики в вопросе.
Дело в том что я начал уже :) С самого начала, пока нет не подопытного, и нет спаяного CAN адаптера (а точнее двух адаптеров, для имитации CAN шины в домашних условиях), я решил сделать код, который в зависимости от переменного значения будет зажигать определёное количество светодиодов. Для экономии портов Atmega 328 блыо решено делать это с помощью сдвиговых регистров (8 битных), для задания переменого числа, я использовал потенциометр, код был успешно написан и с помощью форумчан (за что им большое СПАСИБО) сведён в маленькую фунцию код :
Фактически это основной код который будет использоватся для управления индикацией, правда к нему надо еще добавить кусочек кода который будет укравлять RGB подсветкой стрелок приборов опять же в зависимость от переменого числа.
Но вот не задача, число то я задаю вручную, а мне надо его получить от бортового компьютера автомобиля, в моём случае по Can Шине.
Кстати может кто подскажет ответ на такой вопрос :
CAN шина, как я понимаю это способ передачи данных (т.е. порядок пересылки информации по заданому числу каналов (зависит от количество прободов CAN High и CAN Low)) если передожить на язык обычных людей то CAN (Судя по всему-это "слова", "предложения", "абзаци" и т.д, А вот сами данные это протокол OBD2 (что представляет собой "Алфавит" т.е набор символов и з которых в зависимости от протокола формируются и прересылаются пакеты данных)....
Я правильно понимаю структуру?
Так вот. Для решения, данной задачи, а именно задачи обмена информацией между Arduino и блоком ESM надо написать код. Так как я в програмировании полный "ZERO" (как любил говорить мой любимый и увадаемый куратор Дипломного проэкта Легостаев Анатолий Дмитревич), и из личного опыта работы инженером проэктировщиком, в моём случае лучше взять готовый проэкт и переделать его под свои нужды. Найденый мною пример выполняет почти все функции которые мне нужны, а также масса функций которые мне не нужны, поэтому надо его переделать и убрать всё не нужное, но для начала надо разабратся, а как именно он выполняет, нужные мне функции, что бы не наудалять лишнего :).
И я полез в пример :
(КОД ВЗЯТ ИЗ ФАЙЛА ECU_reader_loger.PDE, который находится в архиве Canbus_v3.zip скаченого от сюда code.google.com/p/skpang/downloads/detail) (это я на всякий случай, а то не очень разбираюсь в раззрешениях на использование информации)
И начал искать всё что касается оборотов двигателя (RPM), нахожу 2 упоминания :
Первое :
171 void loop() {
172
173 if(Canbus.ecu_req(ENGINE_RPM,buffer) == 1) /* Request for engine RPM */
174 {
175 sLCD.print(COMMAND,BYTE); /* Move LCD cursor to line 0 */
176 sLCD.print(LINE0,BYTE);
177 sLCD.print(buffer); /* Display data on LCD */
178
179
180 }
И Второе:
276 if(Canbus.ecu_req(ENGINE_RPM,buffer) == 1) /* Request for engine RPM */
277 {
278 sLCD.print(COMMAND,BYTE); /* Move LCD cursor to line 0 */
279 sLCD.print(LINE0,BYTE);
280 sLCD.print(buffer); /* Display data on LCD */
281 file.print(buffer);
282 file.print(',');
283
284 }
Я не програмист, но понимаю что в обоих случаях стоит проверка буфера ENGINE_RPM, на то есть ли в нём что-то, и если есть то это выводится на экран. Судя по этой части строчки Canbus.ecu_req , надо лезть в файл под названием Canbus.cpp в том же архиве.
Изходя из того что в архиве находятся 2 файла Canbus, одно с разширением cpp, а другое h , могу предположить что это библиотека.
Библиотека - (в моём понимании) это набор функций, которые лежат в одном файле, и из которой можно дтянуть нужную тебе не засоряя ненужными код твоей программы.
открываю его (файл с расширением cpp) и ищу опять же всё что связано с RPM :
Нахожу первое :
129 case ENGINE_RPM: // ((A*256)+B)/4 [RPM]
130 engine_data = ((message.data[3]*256) + message.data[4])/4;
131 sprintf(buffer,"%d rpm ",(int) engine_data);
132 break;
Тут я и стопорюсь......
Помогите разобратся, куда дальше идти. как вообще понять что отсылает (либо Arduino либо контролер MCP2515 ) чтобы получить данные, и кто именно из них делает запрос???
Запросы идут автоматом от контролера CAN (MCP 2515) и Arduino просто принимает данные от него???
Или Arduino что то посылает контролеру, а тот соответственно бортовому компьютеру, и получает в замен данные.....
Понял только одно ,что ((A*256)+B)/4 [RPM] это формула которая есть на Wiki en.wikipedia.org/wiki/OBD-II_PIDs используется для вычисления числа оборотов двигателя за минуту .
Заранее благодарен, всем откликнушившимся.
Извините, если заставил подумать что делать ничего не собираюсь, а только жду чтоб форумчане это сделали за меня.
нет ничего хуже рыться в чужом коде.
Ардуино именно посылает запросы на контроллер, структура запроса описана в структуре tCAN (ищи ее описание гдето в скачанных тобою модулях). Запрос отправляется на контроллер с пустыми переременными (строки кода 105-109), и возвращается с контроллера уже заполненными. из последнего кода видим /message.data[2] = pid;/ (строка 104), этот pid приходит в функцию извне и в твоем случае равен константе ENGINE_RPM, которая по моим догадкам описана в файле "WConstants.h".
вотчто мне удалось понять по приведенным тобой примерам.
ENGINE_RPM опписана в заголовочном файле к библиотеке CANBUS :
0x0C это PID кторый отвечает за обороты, но что означает предидущих 2 байта :
102 message.data[0] = 0x02;
103 message.data[1] = 0x01;
Я догадываюсь, что 0х01 - это режим "Show current data" кторый отражает информацию в реальном времени.
Но вот за что отвечает байт 102 message.data[0] = 0x02; ??? Это вопрос №1 ( опять же, догадываюсь, что это размер в байтах кторые будут возвращатся, т.е для исчисления всех показателей нужно максимом 2 байта, в некоторых один....
Но зачем отсылать пустых 5 байт а не 2 ? или надо полюбасу отсылать 8 ? Это вопрос №2 если утверждение правильно)
Не понятно, где искать опписание tCAN ??? вопрос №3
И те файлы которые написаны для MCP 2515, заливаются отдельно на контролер MCP2515 ??? тоже не понятно...
Вообщем вопросов уйма, и небольшая растеряность. :)
в ответе на вопрос номер три скрывается ответ на вопрос номер один, а описание структуры нужно искать в одном из подключенных header'ов в самом начале модуля.
по вопросу номер два - да, нужно отправлять сразу все.. протокол значит такой.
Нашел. на Wiki :
Я был прав, этот байт для задания ответного количества байт, но вот интересно, что с 3го по 7-й байты не используются, и должны быть 0х55..... непонятно чего в примере 0х00 ?!
А вот кто мне ответит на вопрос:
МК MCP2515 шьется отдельно? или его не надо шить?
А как обходишь блок с индикацией заряда аккумулятора? Есть в современных авто (с 2000х примерно) такой прикол, что они без этого блока не посылают возбуждающий ток на ротор генератора. Этот блок анализирует заряд аккумулятора, посылает сигнал на лампу в панели и открывает ход тока к ротору. При этом если лампа перегорела, то в некоторых машинах надо менять лампу, а в некоторых - нормально, и так подаёт. Тем не менее, если ты решил выкинуть приборку и воткнуть туда экран, то должен как-то обойти эту заковырку. Обошёл? Как?
Вопервых я приборку выкидывать не собираюсь..... она остаётся, просто на неё будет крепится новая разведеная плата, а поверх платы, пластиковые напкладки..... в местах, где стоят диоды индикации всего кроме спидометр тахометра, и топлива будут отверстия в моей плате, чтоб всё продолжало индицироватся..... примерно так
Здравствуйте! тема актуальна и для меня. Мне необходимо снимать показания скорости. Думаю подключиться к CAN шине.
«Вы спросите почему не купить эту плату и использовать.
Есть ряд причин по которым я не хочу это делать:
1.Высокая цена
2.Ненужная функциональнасть, почти вся
3.Нужно всё поместить в приборную панель
Вообщем нужно переделать этот проэкт, под выполнение своих функций.»
Полностью согласен. И по этому вопрос: Кто нибуть Строил подобный модуль?
Человек, с другого форума.... говорил что будет пробовать..... напишите ему сюда