27.08.2009, 23:52 | #1 | |
Старший Пользователь
Регистрация: 13.11.2008
Возраст: 37
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2000\Basin\2111
Сообщений: 250
|
Универсальный "OBD" для безмозглых автомобилей
Disclaimer:
1.1 Ядро Ключевая часть устройства заключается в одном-единственном микроконтроллере pic16F877a, к которому в свою очередь подключаются различные датчики, кнопки и прочие аналоговые и цифровые устройства. Распиновка микропроцессора с точки зрения созданной программы указана на схеме. Синим выделены используемые аналоговые входы (на них замеряется напряжение относительно земли, но не более 5В), фиолетовым - цифровые и зеленым ножки, к которым подключается преобразователь компьютерных сигналов. Передача трансмиссии шифруется резистивным делителем. Питание устройства осуществляется с интерфейса USB или внешнего источника питания +5В. 1.2 Датчики 1.2.1 Тахометр, спидометр В различных автомобилях кодирование оборотов и скорости может быть выполнено различными средствами. Для ВАЗ-2110 имеем: Цитата:
Минимальной измеряемой скоростью является 1 км/ч, максимальной - 255. Для тахометра максимальный предел - 8000 оборотов в минуту. 1.2.2 Аналоговые приборы Датчики, имеющие на выходе от 0 до 15В (аккумуляторная батарея в том числе) подключаются через делитель напряжения, собранный из 20КОм и 10КОм резисторов. На выходе делителя имеем напряжение от 0 до 5 В. 1.2.3 Дискретные цепи 12В В зависимости от характера цепи (общий анод, общий катод) выбирается один из двух вариантов подключения, указанных на схеме. 1.2.4 Кнопки Подключение кнопок также показано на схеме. 1.2.5 Шифратор КПП Исходя из мнения, что в каждый момент времени может быть включена только одна передача или трансмиссия в положении нейтрали, для кодирования этой информации логично воспользоваться шифратором. Шифратор на пять передач + задний ход собран по принципу резистивного делителя и строится на резисторах 1-5 кОм. Нажатые кнопки (сверху вниз на схеме) кодирут передачи 1-5 и задний вход. Отсутствие замыкания на всех кнопках соответствует нейтрали. Подключается к третьему аналоговому входу МК. 1.3 Преобразователь интерфейсов. Подключение микроконтроллера к компьютеру производится через интерфейсы RS-232 или USB. Интерфейс RS-232 формируется при участии микросхемы max232. Схема подключения указана на рисунке. При таком подключении устройству необходим внешний источник питания +5В. Также не забудьте о температурном диапазоне выбираемых микросхем. Интерфейс USB реализуется через микросхему FT232Rl: 1.4 Печатная плата и монтаж Заготовка печатной платы под микропроцессор, FT232Rl и max232 в формате SprintLayout 5 находится в архиве с прошивкой, ссылка на который прикреплена в конце повествования. При должном соотношении пофигизм/аккуратность плата отлично изготовляется методом ЛУТа. 1.5 Программирование МК Исходный код программы и скомпилированная прошивка находится в соответствующем архиве. Программирование возможно как покупным программатором, так и программаторами из говна и палок. 2. Приложение для ПК 2.1 Описание Программа графически напоминает приборную панель автомобилей Lexus с добавлением необходимых для работы элементов. Тахометр, спидометр, индикаторы температуры жидкости и уровня топлива имеют стрелочный характер, номер передачи и напряжение бортовой сети выводятся текстом, прочие индикаторы имеют вид лампочек. На шкале Возможен запуск приложения под Windows, Linux и Mac (На Mac не тестировалось, в ОС Linux подключение возможно через com порт или usb в режиме преобразователя com). Программа позволяет "горячее" подключение и отключение устройства. 2.2 Настройка Перед запуском программу необходимо настроить. Настройка осуществляется изменением файла torpedo.ini в папке с программой (В Linux - ~/.config/Torpedo/torpedo_modest.ini) Код:
[window] pos=@Point(50 50) - положение программы при старте frame=true - наличие системной рамки окна и заголовка alwaysontop=true - расположение ппрограммы поверх остальных [usb] useusb=true - использование в режиме usb (при значении false импользуется com-порт) serial=FTSDH1IL - серийный код устройства, полученный при прошивке (см далее) [com] name=Com5 - имя com-порта Имя com-порта зависит от системы. В Windows оно имеет вид Com#, в Linux - /dev/ttyS# (при использовании USB преобразователя - /dev/ttyUSB#). 2.3 Калибровка значений датчиков Калибровка значений стрелочных датчиков производится путем изменения файла torpedo.ini. Параметр min отвечает за показание датчика, в котором стрелка должна находиться в нулевом положении, max - в максимальном. Для тахометра и спидометра введен дополнительный параметр factor - умножитель. Для уровня топлива и температуры охлаждающей жидкости дополнительный флаг invert для датчиков, работающих в обратном ключе. Калибровка значения бортового напряжения зависит от напряжения питания микроконтроллера. Параметр maxvoltage позволяет определить поправку на максимальное напряжение, параметр limitvoltage определяет значение напряжения, ниже которого загорается лампа разрядки аккумулятора. Для цифровых датчиков можно установить маску инвертирования. Биты, поступающие с микропроцессора будут инвертированы в том случае, если напротив них в маске будет установлена единица. В настройках маска записывается целым десятичным числом в диапазоне [0,255]. 2.4 Скриншоты программы 2.5 Самостоятельная разработка программ Общение с устройством возможно по двум интерфейсам: com (max-232, микросхема ft232 работает как переходник uart-usb) и usb. В обоих случаях необходимо выбрать асинхронный режим, 9600бод. После подключения, устройство возвращает восемь байт с информацией о состоянии автомобиля. Расшифровку показаний см. в исходном коде прошивки. Посланная команда 177 обнулит значение одометра. Общение по интерфейсу usb происходит через библиотеку ftd2xx.dll. Подробнее о ее фукциях см. на сайте производителя. Также вместе с программой поставляется ее исходный код. 3. Ссылки Прошивка микроконтроллера 02.09.09 Приложение для ПК + исходные коды 31.10.09 Драйвера для FT232Rl. Последний раз редактировалось Urvin; 31.10.2009 в 04:09. |
|
28.08.2009, 00:15 | #2 |
Старший Пользователь
Регистрация: 07.03.2008
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2003\Hyundai\Tiburon продан
Сообщений: 110
|
шикарная штука.
Сорри за глупый вопрос, а на машинах с автоматом также датчик скорости устроен? |
28.08.2009, 00:40 | #3 |
Старший Пользователь
Регистрация: 13.11.2008
Возраст: 37
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2000\Basin\2111
Сообщений: 250
|
Думаю, также
|
28.08.2009, 09:14 | #4 |
Старший Пользователь
Регистрация: 04.03.2008
Город: NSK
Регион: 54
Машина: Toyota Camry SV33 3s-fe
Сообщений: 153
|
Urvin - ты крут!
Входы пика через диоды мож?....
__________________
Дорога в тысячу миль, начинается с одного шага... |
28.08.2009, 13:51 | #5 |
Модератор
Регистрация: 27.05.2008
Возраст: 50
Город: Пермь
Регион: 59
Машина: INDESIT/2007
Сообщений: 1,330
|
Сильно.
А почему не стал делать для готового устройства. Очень удобно бы получилось. Тем более что оно недорогое и доступное. Проще купить его чем спаять и прошить самодельное. Планировал сделать такое как отмечать закончу. Последний раз редактировалось St@rz; 28.08.2009 в 14:29. |
28.08.2009, 14:24 | #6 |
Пользователь
Регистрация: 30.06.2009
Возраст: 43
Город: Минск
Регион: Беларусь
Машина: Honda Accord V (cc7) 94'
Сообщений: 44
|
Респект автору, завтра будем испытывать
|
28.08.2009, 14:38 | #7 |
Модератор
Регистрация: 27.05.2008
Возраст: 50
Город: Пермь
Регион: 59
Машина: INDESIT/2007
Сообщений: 1,330
|
Urvin, может поправишь программу для arduino Nano?
У тебя это гораздо быстрее выйдет. Последний раз редактировалось admin; 16.03.2017 в 22:48. |
28.08.2009, 14:43 | #8 |
Старший Пользователь
Регистрация: 13.11.2008
Возраст: 37
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2000\Basin\2111
Сообщений: 250
|
serg_wolf, Дополнительных диодов не надо - будут только мешать работе МК
St@rz, у меня критическое отторжение Arduino как дорогой игрушки. Да и получается, что это очень сложная система для простых задач - как никто не покубает бухгалтерам четырехядерных писюков. В добавок цена Arduino - 700 рублей, эта же схема со всей обвязкой уместится в 450. При подключении к COM - еще на 150 рублей дешевле. Другое дело, что в Arduino уже правильно сидят сложнораспаиваемые элементы и не требуется программатор. Выбор уже зависит от кривизны рук и любознательности исполнителя. Мой выбор - за микроконтроллерами - всяко железнее и полезнее. Про правку программы - я по программированию ардуины ничего досконально не читал, потому уйдет некоторое время. Вообще попробую. Tores, ждем отчета. Если нароешь инфу по датчику скорости в твоей машине и заснимешь сигнал на осциллограф, можно будет и считалку импульсов сделать. ёперный театр! Забыл схему шифратора КПП UPD: добавил Последний раз редактировалось Urvin; 28.08.2009 в 16:26. |
28.08.2009, 17:53 | #9 |
Старший Пользователь
Регистрация: 13.11.2008
Возраст: 37
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2000\Basin\2111
Сообщений: 250
|
Что у меня выходит для arduino Nano v3
Уж насколько ненавижу "теоретическое" программирование... Устройства у меня нет, потому исхожу из предположений и документации. Как я понял, в arduino сидит переходник USB-COM, и компьютер определяет устройство именно как "нечто на ком-порту". Также я понял, что если мы хотим использовать связь с компьютером, у нас пропадают цифровые входы-выходы D0 и D1. У Carduino Nano цифровых входов маловато, потому отказываемся от индикации "Check Engine" и передачи трансмиссии. Увы. Подключение аналоговых датчиков (см. схемы п.1 первого поста): A0 - спидометр; A1 - тахометр; A2 - охлаждающая жидкость; A3 - уровень топлива; A4 - АКБ A5 - [в программе не отображается, но прием налажен] Подключение дискретных цепей: D2 - водительская дверь; D3 - задняя левая дверь; D4 - передняя правая дверь; D5 - задняя правая дверь; D6 - левый поворотник; D7 - правый поворотник; D8 - аварийка; D9 - габариты/ближний свет; D10 - ручной тормоз; D11 - масло; D12 - тормоза; D13 - дальний свет. Программа для arduino следующая: Код:
// Массив значений по портам char resultInput[8]; void setup() { char i; // Обнуление массива значений for(i=0; i<8; i++) { resultInput[i]=0; } // Инициализация цифровых портов for(i=2; i<14; i++) { pinMode(i,INPUT); } // Инициализация порта Serial.begin(9600); } void loop() { // Сбор данных по шести АЦП, диапазон значений [0, 255] for(char i=0; i<6; i++) { resultInput[i]=analogRead(i)/4; } // Перевод состояний на цифровых входах в общее число resultInput[6] = digitalRead(2) + digitalRead(3)*2 + digitalRead(4)*4 + digitalRead(5)*8 + digitalRead(6)*16 + digitalRead(7)*32 + digitalRead(8)*64; resultInput[7] = digitalRead(9) + digitalRead(10)*2 + digitalRead(11)*4 + digitalRead(12)*8 + digitalRead(13)*16; // Если на порт что-то пришло if (Serial.available()>0) { int command = Serial.read(); // Команда - вывести значение одного из портов if (command<=8) { Serial.print(resultInput[command-1]) } // Если команда - вывести все сразу else if (command==15) { Serial.print(resultInput); } } } Последний раз редактировалось admin; 16.03.2017 в 22:49. |
28.08.2009, 20:48 | #10 |
Модератор
Регистрация: 27.05.2008
Возраст: 50
Город: Пермь
Регион: 59
Машина: INDESIT/2007
Сообщений: 1,330
|
Urvin, если тебе интересно, то могу подарить тебе одну штуку arduino. Предполагаю что наличие у тебя этого устройства будет полезно для всех.
Последний раз редактировалось admin; 16.03.2017 в 22:49. |
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
|
|