Универсальный бортовой компьютер для авто своими руками
Бортовой компьютер на ардуино своими руками
Всем одноклубням приветы!)
Появился как-то неожиданно в гараже Днепр МТ-16 и т.к. я только начал вникать в программирование микроконтроллеров то, руки сразу зачесались что-то заколхозить на него) Мной было принято решение сделать бортовой компьютер. Решил, что на дисплее будет отображаться напряжометр, термометр, тахометр и температура с двух бошек.
Ну чтож руки в ноги и отправился писать код) Спустя некоторое время макетная плата приобрела вид хаоса из проводов.
В левом верхнем углу вольтметр, в правом верхнем температура окружающей среды с датчика TMP36, по центру тахометр и внизу справа и слева температура с левой и правой головы соответственно. Снимать температуру решил термопарой типа К. Вольтметр из обычного делителя, для бортовика с головой хватит такого решения. Импульсы оборотов коленвала я снимать решил через оптопару с безконтактной системы зажигания.
Вроде бы все настроено и работает как надо. Проверил на аппарате. Надо бы сделать корпус для дисплея.
Да. Да! Я знаю, что маленький дисплей. Но это же моя первая поделка более менее имеющая вид и цель проекта была получить данные от мотоцикла в наглядном виде, а не на выставку. В дальнейшем хотел делать экран больше.
Сделал вот такую плату. Атмегу взял конечно конскую для таких целей))))) Тут бы и 8 хватило) Но задача была все сделать поскорее, хочется кататься) и на тот момент я в основном писал в ардуино ИДЕ.
#include
- // библиотека для дисплея
#include «max6675.h» // библиотека для термопары
OLED myOLED(SDA, SCL);
extern uint8_t SmallFont[]; // шрифт термометров
extern uint8_t MediumNumbers[]; // шрифт вольтметра
extern uint8_t BigNumbers[]; // шрифт тахометра
extern uint8_t akb[]; // иконка «Аккумулятор»
//extern uint8_t logo[]; // логотип используемый при запуске
extern uint8_t logo2[]; // логотип используемый при запуске
#define volt A1 // пин для вольтметра
#define R1 199.0 // (+) номенал резистора делителя напряжения кОм
#define R2 9.96 // (-) номенал резистора делителя напряжения кОм
#define TMP36 A0 // пин под датчик наружной температуры LM36
#define tachometer 2 // пин тахометра. INTERUPT0
#define thermoDO 5 // пин SO max6675
#define thermoCS_R 6 // пин CS max6675 правая термопара
#define thermoCS_L 8 // пин CS max6675 левая термопара
#define thermoCLK 7 // пин SCK max6675
MAX6675 thermocouple_R(thermoCLK, thermoCS_R, thermoDO); // инициализация правая термопара
MAX6675 thermocouple_L(thermoCLK, thermoCS_L, thermoDO); // инициализация левая термопара
float V, V1, Voltage = 0; // переменная хранящая данные вольтметра
float temp_out; // переменная для наружной температуры
volatile unsigned int RPM = 0; // переменная тахометра
unsigned long tmr1, timer_imp = 0; // переменные для таймеров
void tacho() // Обработчик прерывания от пина INT0
<
RPM=60/((float)(micros()-timer_imp)/1000000); // расчет оборотов
timer_imp=micros(); // засекаем когда был последний импульс
>
void setup()
<
pinMode(volt, INPUT); // пин для вольтметра
pinMode(TMP36, INPUT); // датчик наружной температуры
pinMode(tachometer, INPUT); // пин тахометра
analogReference(INTERNAL); // мерить будем относительно внутреннего опорного напряжения в 1,1в
V = 1.1 / 1024.0 / (R2 / (R1 + R2)); // расчет коэффициента для вольтметра
temp_out = ((analogRead(TMP36) * 1.1 / 1024.0) — 0.5) * 100; // считываем температуру и переводим в градусы
myOLED.begin(SSD1306_128X64); // подключаем дисплей
myOLED.clrScr(); // очищаем дисплей
// myOLED.drawBitmap(30, 0, logo, 64, 64); // рисуем стартовое лого
myOLED.drawBitmap(12, 0, logo2, 100, 63); // рисуем стартовое лого2
myOLED.update(); // выводим все на экран
attachInterrupt(0, tacho, RISING); // устанавливаем прерывания на пине INT0 (D2)
delay(4000); // задержка для стабильности и показа логотипа
>
void loop()
<
Voltage = analogRead(volt) * V; // Вольтметр
if ((micros() — timer_imp) > 300000) RPM = 0; //если сигнала нет больше 300мсек считаем что RPM 0
if (millis() > tmr1) //считываем окружающую температуру по заданному интервалу
<
temp_out = ((analogRead(TMP36) * 1.1 / 1024.0) — 0.5) * 100 ; // считываем температуру и переводим в градусы
tmr1 = millis() + 30000; // задаем интервал 30мс
>
myOLED.clrScr(); // очищаем экран
myOLED.setFont(MediumNumbers); // задаем шрифт MediumNumbers
myOLED.printNumF(Voltage, 1, 18, 0); // пишем напряжение с 1 знаком после запятой. В х0 у0
myOLED.drawBitmap(0, 1, akb, 18, 15); // рисуем иконку аккумулятора
myOLED.drawLine(0, 18, 128, 18); // рисуем верхнюю линию
myOLED.drawLine(0, 48, 128, 48); // рисуем нижнюю линию
myOLED.setFont(SmallFont); // задаем шрифт SmallFont
myOLED.print(«B», 67, 9); // пишем «В» (вольт)
myOLED.print(«RPM», 0, 38); // пишем RPM
myOLED.printNumI(thermocouple_L.readCelsius(), LEFT, 53); // считываем температуру с левой термопары
myOLED.printNumI(thermocouple_R.readCelsius(), RIGHT, 53); // считываем температуру с правой термопары
myOLED.printNumF(temp_out, 1, 95, 0); // пишем наружнюю температуру
myOLED.print(«C», RIGHT, 0); // пишем С (градусы)
myOLED.setPixel(121, 0); // ставим пиксель для обозначения градусов
myOLED.setFont(BigNumbers); // задаем шрифт BigNumbers
myOLED.printNumI(RPM/2/10*10, RIGHT, 21); // пишем обороты с 0 на конце.
myOLED.update(); // выводим все на экран
delay(150); // задержка для стабильности
>
// Generated by : ImageConverter Mono Online
// Generated from : akb.png
// Time generated : Wed, 18 Jan 17 11:27:44 +0100 (Server timezone: CET)
// Image Size : 18×15 pixels
// Memory usage : 33.75 bytes
imagedatatype akb[] PROGMEM=<
0xFC, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x85, 0x05, 0x05, 0x04, // 0x0010 (16) pixels
0x04, 0xFC, 0xFF, 0xC0, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC3, 0xC1, // 0x0020 (32) pixels
0xC0, 0xC0, 0xC0, 0xFF,
>;
Прошивка залита. Плата спаяна. Дисплей работает. Да вообще все работает) И вот на этом моменте планы резко поменялись. И проект был заброшен из-за отсутствия самого виновника торжества это мотоцикла.((((
Но все же решил выложить работу. Вдруг кому-то из нее что-то пригодится. Код писал очень подробно весь, разберется даже школьник. Да там вроде и ничего особо сложного и нет. Где-то даже слишком примитивно все сделано.
Сначала все немного тормознулось из-за того, что я захотел сделать систему зажигания на МК, потом инжектор вкорячить, параллельно все переписать на Си. Ну вобщем как на современных тачках сделать мозги. И однажды все к херам пошло)
Платы кстати у меня остались, кому надо обращайтесь, по сути это готовый показометр на машину или мот.
Бортовой компьютер своими руками? — легко!
Давно была идея сделать бортовой/маршрутный компьютер в авто.
Есть готовые очень неплохие мультитрониксы — но с ними проблема, они не поддерживают наши старые тоетки по OBD (точнее авто не поддерживает OBD диагностику).
Решено сделать свое универсальное устройство, которое будет уметь все и все.
В качестве «мозга» — AVК контроллер Atmel AtMEGA640/1280/2560 серии.
Тем более, что плата готовая и подходящая по всем параметрам и возможному функционалу — давно валяется в загашнике, запасы от старого проекта 🙂
Функционально состоит из 2х частей — слева БП от 220В, справа собственно сам процессор.
Т.к. в авто уже есть 12В — то соответственно БП на 220 — нам не нужен. Сделано для универсальности.
На данной плате все сделано по максимуму именно для универсального применения — можно реализовать от примитивной елочной «мигалки», до системы «умный дом» — на сколько хватит фантазии.
Ну а касательно нашей задачи, функционал будет примерно следующий:
— вывод информации со всех датчиков, как штатных так и допольнительных, а это —
— температура ОЖ ДВС
— температура масла двигателя
— температура ОЖ доп датчик (верхний патрубок радиатора)
— температура масла в АКПП, в поддоне
— температура воздуха во впуске
— давление во впускном коллекторе (наддув)
— время открытия форсунок / % загрузки
— положение дросселя (% открытия)
— напряжение в сети
— ведение логов и возможность записи информации на компьютер (ноутбук) по RS232
Функции маршрутного компьютера:
— скорость/пробег — суммарный/за поездку
— расход средний/за поездку
— снятие ограничителя скорости (для сток мозга)
— текущая передача АКПП (если кому интересно)
Любые доп. функции — кому на сколько хватит фантазии.
Можно как снимать данные с любых датчиков — например, поставить акселерометр (ADXL*) — и измерять ускорение. Либо управлять любыми внешними исполнительными устройствами.
На текущий момент стадия проектирования функционала, для наглядности пара «скринов» — экранчик пока такой, что под рукой было. Со временем может переделаю на графический — посимпатичнее будет внешний вид.
FULLRUN — суммарный пробег/расход топлива
AVG — средняя скорость движения, средний расход топлива
CUR — текущая поездка, пробег/расход
SPD — текущая скорость движения, (можно еще добавить сюда же мгновенный расход топлива)
Вариант представления данных в виде «прогресс бара». На скрине буст и % открытия дросселя.
Все данные даны для примера. Пока на неподключенном к авто устройстве.
Может у кого еще какие мысли и предложения будут — каменты приветствуются.
Продолжение следует … (по мере сил и свободного времени).
H Бортовой компьютер для авто на Arduino своими руками в черновиках Из песочницы
UPD 27.12.2017: Решил дополнить статью что проект был доработан другим пользователем, улучшен скетч в плане автоматической задержки, восстановления связи в случае разрыва соединения и много других нюансов… спасибо. Oleg его почта для вопросов: 2003shef@gmail.com
Его комментарии к переработке:
1.вся проводка и соединение всех модулей и узлов сохранены из первоначального проекта.(кроме подключения блутуз модуля, он теперь на серийном порте «1»)
2.программа жестко заточена под ардуино МЕГА 2560. на серийном порте «0» присутствует Дебаг при условии раскоментирования дефайна.
3.убран параметр задержки между опросами, задержка полностью интелектуальна и динамична, новый запрос не отправится пока не будет получен ответ на предыдущий с учетом таймаута.
4.добавлена функция восстановления связи в случае разрыва соединения (параметром потери связи служит отсутствие оборотов двигателя).
5.для работы требуется библиотека OBD.h вложенная в архив с проектом, этот экземпляр имеет несколько изменений от оригинала который можно скачать из интернета, и без неё скорее всего проект не будет работать или будет нестабилен.
папку нужно скопировать в папку » \Documents\Arduino\libraries»
Android приложение со всеми нюансами в Google Play: OliviaDrive
Мы сможем сделать бортовой компьютер, умеющий считать расход топлива, показывать температуру охлаждающей жидкости, скорость авто, расстояние поездки, потраченный бензин за поездку, обороты двигателя, давление во впускном коллекторе, температуру впускного коллектора, УОЗ, коррекции топлива, вольтаж датчиков кислорода, нагрузку двигателя и многое другое.
Список требуемых деталей для сборки БК
2) LCD2004 жк-модуль
3) Модуль Bluetooth HC-05
4) OBD ELM327 Bluetooth сканер
5) Резистор 10 кОм подстроечный, бипер для звука, 2 кнопки для смены экранов, провода для соединений, корпус
Настройка блютуз модуля HC-05 для работы
Подпаиваем провода к пинам блютуза: (картинку с выходами смотреть в описании требуемых деталей)
#include
SoftwareSerial BTSerial(6, 7); // TX | RX
void setup()
<
Serial.begin(9600);
Serial.println(‘Enter AT commands:’);
BTSerial.begin(38400);
>
void loop()
<
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
>
После успешной загрузки скетча открываем: Сервис->Монитор порта. Далее снизу ставим скорость 9600 бод и NL+CR вместе.
Далее вводим команды по одной и нажимаем [Послать]. После каждого ввода должен быть ответ ok.
AT // (возможно 1 раз вылетит Error, не пугайтесь… это нормально, повторите опять)
AT+NAME=Car //Присваиваем имя модулю Car
AT+ROLE=1 // Переводим модуль в режим Мастер
AT+PSWD=1234 // Ставим пароль 1234 как на OBD ELM327
AT+BIND=AABB,CC,112233 //Прописываем Mac адрес OBD ELM327.
AT+CMODE=1 // Подключение модуля с фиксированным адресом
AT+UART=9600,0,0 // Скорость работы по UART
Заметьте, что mac-адрес вида: «AA:BB:CC:11:22:33» вводится как «AABB,CC,112233». MAC- адрес своего модуля ELM327 можете посмотреть, подключившись для начала на него со своего мобильника. (Стандартные пароли обычно: 1234, 6789, 0000).
Всё, настройка модуля Bluetooth закончена.
Теперь нужно собрать схему Arduino + блютуз + LCD-экран
Схема:
Переменный резистор на 10кОм нужен, чтобы управлять контрастностью монитора, так что если при первом включении вы включите и ничего не увидите, попробуйте отрегулировать контрастность шрифта поворотом резистора.
3. Подключаем дополнительную кнопку для переключения экранов с данными.
[1 кнопка]: один конец от нормально-открытой кнопки подключаем в GND ардуино, а второй конец в пин 10.
[2 кнопка]: GND + пин 9.
Бипер для звуковых предупреждений подключить по следующей схеме «+» к пину 13, а минус к GND ардуино.
Заливаем скетч в Arduino с помощью Aduino IDE 1.0.6 (использовал эту версию).
Единственное, в скетче присутствуют переменные, которую нужно подправить.
Нужно будет обязательно учесть три переменных:
1) ED=1.998 Например объем двигателя в литрах 1.398;
2) VE_correct=1.0; Корректировка объёмного КПД ДВС по таблице: (если расход реально меньше — то уменьшаем значение в процентном соотношении). Если не хотите калибровать добейтесь чтобы при прогретом двигателе мгновенный расход в л/час был в районе половины обьема двигателя;
5)speed_korrect_val=1; Корректировка скорости машины, смотреть по GPS/
Управление
[Кнопка 1], [кнопка 2] — листать экран вперед назад.
При включении при надписи «Connecting»… держать [кнопку 1] вход в режим показывания технологических экранов и параметров отдаваемых ЭБУ в 16-чном формате. Если будете включать БК не в машине то нужно отключить функцию опроса блютуз, надо продолжать держать две кнопки при надписи «Recovery»… до появлении надписи «All off»… а то экран будет все время пустой.
[Кнопка 1] + [кнопка 2]: 4 секунды — Сброс журнала общего пробега и потраченного бензина на втором экране, также это сброс ошибок на экране информации об ошибках.
Скетч:
Старый скетч был удален в плане многих дефектов в работе… новая версия по ссылке вверху статьи… он был доработан пользователем Oleg, спасибо ему большое. его почта для вопросов: 2003shef@gmail.com
Все, идем в машину, вставляем ELM327 в порт, ардуину в зарядку для авто и проверяем.
Бортовой компьютер из старого смартфона
Бортовой компьютер крайне необходимый атрибут любого автомобиля, особенно если вопрос касается просмотра ошибок, опрос датчиков и расхода топлива. Заводские решения конечно же существуют, как пример orionspb.ru/comp/86/, но 8.5к.р. отдать готов не каждый, и я в их числе.
Что понадобится
Смартфон с андроид 4.2 и выше
OBD2 адаптер с bluetooth.
Программа torque
В наличии был старый HTC desire 601.Первое что необходимо сделать это полностью очистить телефон от всего что было на него установлено сбросом до заводских установок. Я пошел дальше и прошил его на кастомную прошивку, без установки Гугл сервисов.(Меньше жрет батарею в режиме ожидания). Все приложения ставил вручную с 4пда. Так же разблокировал рут, в дальнейшем даст более гибкие настройки системы для ПО.
Устанавливаем программу torque, добавляем программы для автоматического разворота дисплея в горизонтальном положении и программу автозапуска для torque.(программ много, легко найти через поиск в гугл).
В настройках torque ставим галочку чтобы приложение включало и включало экран при подключении питания.( Блокировку экрана в системе необходимо убрать).
Настраиваем профиль и выбираем необходимые приборы.
Выбираем место установки и печатаем лицевую панель.
У меня стол для принтера маленький, по этому из двух частей.
Бортовой компьютер для ВАЗ с цветным дисплеем и тачскрином
С приходом в жизнь автолюбителей инжектора и его окончательной победе над карбюратором, появилась необходимость в «его» периодической диагностике. Поскольку стоимость диагностики отечественной машины варьируется от 300 до 500 руб., а квалификация диагноста порой вызывает сильные сомнения, то практически каждому автолюбителю зачастую приходится вникать в суть проблемы (неисправности) самостоятельно. И как минимум без специального адаптера и компьютера тут не обойтись. А если неисправность возникла где-то в пути и вдали от города? Поэтому порой просто необходимо иметь под рукой эдакий «миникомпьютер», который всегда будет в автомобиле и сможет помочь в пути.
Сам я являюсь обладателем автомобиля ВАЗ 11183 (Калина), поэтому далее повествование пойдет о бортовом компьютере для Калины. А в конце будет несколько слов про бортовой компьютер для ВАЗ 2115.
Цены на подобные устройства, мягко говоря, не очень радуют. Самый простой компьютер-кнопка для отображения каких-никаких кодов категорически не устраивает. Ввиду его убогости. Стоимость таких около 600-700 руб. Ну а что-то посерьёзней, с дисплеем, уже порядка 1800-2000 руб. Ну и самые дорогие модели приблизительно по 5000 руб. Поэтому было принято решение собрать бортовой компьютер для себя и с целью экономии денежных средств и с целью саморазвития.
Что я хотел видеть: параметры в режиме реального времени, текущие ошибки и возможность их сбросить. Замер времени разгона 0-100 км/ч (появилось позднее, так. побаловаться. )
Начался поиск информации. Поиск по интернету дал ответы на некоторые вопросы, но до остального пришлось доходить самому.
Итак. Обмен информацией между Электронным Блоком Управления (ЭБУ) и Бортовым Компьютером (БК) происходит при помощи интерфейса K-Line. При этом используются различные протоколы. Вот с этим то как раз и возникает первая трудность. Где взять описание протокола? Мне повезло, я нашел в сети единственное описание протокола для ЭБУ Январь 5. На моей машине 2006 г.в. стоит ЭБУ Январь 7.2+. Подключившись к диагностической линии и запустив программу диагностики, я увидел, что запросы и расшифровка ответов ЭБУ полностью совпадают с найденным описанием. Дело сдвинулось.
Вариант №1. Калина. Кнопочное управление компьютером
Я использовал:
1. Микроконтроллер фирмы Atmel: ATMega8
2. Дисплей от сотового телефона Siemens S65
3. Обвязка. питание, резисторы, конденсаторы и другая мелочевка.
4. Преобразование уровней на сдвоенном компараторе LM293. Просто и доступно.
Питание. Тут всё просто. LM317 формирует стабилизированный ток 20 мА для светодиодов подсветки дисплея. LM7805 стабилизирует напряжение для питания микроконтроллера. Защитный диод 1N6281 рассчитанный на 27 вольт спасет от возможных всплесков напряжения.
При отладке можно использовать +12 вольт с 16-го пина колодки OBD2. А при постоянной работе напряжение на БК должно подаваться при каждом включении зажигания. Т.е. необходимо протянуть провод от замка зажигания к БК.
Тут есть маленькая тонкость. Чтобы продлить срок службы дисплея необходимо перед отключением питания отправить в дисплей определенную последовательность команд. Транзистор на схеме в нормальном режиме работы придавливает вывод контроллера к нулю. Вывод настроен как вход с подтяжкой. Как только напряжение пропадет, на выводе появится логическая единица. Энергии накопленной конденсатором 470 мкФ хватит на то чтобы микроконтроллер успел отправить команду выключения в дисплей. Диод 1N5818 не даст разряжаться конденсатору в «сеть», а так же защищает от переплюсовки при подключении питания.
Прошивка для микроконтроллера написана в среде CodeVisionAVR 2.05 на языке Cи.
Описание протокола есть в приложенных к статье материалах. Кратко пробежимся по основным моментам. Чтобы начать диагностику, нам надо отправить в ЭБУ запрос startCommunication:
Запрос startCommunication:
81 10 F1 81 03
Ответ:
83 F1 10 C1 6B 8F 3F
В ответе C1 означает, что ЭБУ готов с нами работать (на связи).
После этого мы можем запросить у него параметры, отправив запрос:
82 10 F1 21 01 A5
ЭБУ моей машины отвечает:
80 F1 10 26 61 01 3B 90 41 04 00 00 00 00 47 80 00 00 00 52 52 80 18 00 8E 00 5C 00 00 00 00 00 00 00 00 00 FF FF DD A4 47 02 CE
У меня это значение 47. Берем windows калькулятор. Переводим 47 hex в dec. Получаем 71. Дальше 71-40=31°C. На момент снятия данных машина постояла на улице. До конца не остыла.
И так далее… со всеми остальными параметрами.
Запрос ошибок readDTCByStatus:
84 10 F1 18 00 00 00 9D
ЭБУ моей машины отвечает:
88 F1 10 58 02 04 43 E0 14 26 E0 24
Самое сладкое, сброс ошибок clearDiagnosticInformation:
83 10 f1 14 00 00 98
Запрос значений АЦП:
82 10 F1 21 03 A7
Из АЦП взял напряжение на датчике кислорода и на датчике массового расхода. Хотя необходимость этого пункта под сомнением. Думаю вообще убрать. Всё остальное есть в описании.
Плата разведена на одностороннем фольгированном текстолите. Дисплей приклеен при помощи клея «секунда». Защитное стекло для дисплея сделал из коробки от компакт диска. На самоклеящейся бумаге распечатал лицевую часть (черную), наклеил на пластик, совместил, приклеил к плате. Чтобы под стекло не набивалась пыль, промазал обычным герметиком. Доработал напильником посадочное место в ящике для мелочей и просто вставил туда БК. Подключил питание и диагностическую линию. Левая кнопка смена режимов отображения, правая сброс ошибок (в режиме сброса ошибок) и сброс времени разгона на ноль (в режиме замера времени). На плате имеется место для памяти 24LC512. Но она не использовалась (не хватило flash памяти МК на реализацию). Фьюзы МК выставлены на работу от внешнего кварца.
По себестоимости получилось порядка 450 руб
Зимой было очень удобно следить за температурой двигателя при прогреве. А не ждать когда же стрелка от отметки 50 градусов «оторвется»…
Видео работы устройства:
Вариант №2. ВАЗ 2115. Тачскрин
Печатная плата претерпела существенные изменения. Теперь используется микроконтроллер ATMega16A.
При помощи ножа, напильника и шпатлевки по пластику тачскрин был вмонтирован в панель, которую потом обтянул карбоновой пленкой.
По началу прикупил стилус, но потом оказалось что проще «тыкать» пальцем в экран. Залапывается он конечно. Но не более чем на телефонах с сенсорным экраном.
Для повторения рекомендую вариант с тачскрином. Его можно использовать как под Калину, так и под Пятнашку. На этом всё.