PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   Универсальный "OBD" для безмозглых автомобилей (http://pccar.ru/showthread.php?t=9586)

Urvin 27.08.2009 23:52

Универсальный "OBD" для безмозглых автомобилей
 
http://funkyimg.com/u2/432/873/torpedo_modest.png

Disclaimer:
  • Это сугубо универсальная связка устройство-программа, позволяющая завести данные о состоянии автомобиля в компьютер;
  • Устройство и программа созданы для первоначального старта пользователей в деле ввода данных в компьютер, а также с целью получения и обмена опытом и мыслями, всеобщего благоденствия и радио "Радонеж";
  • Автор не несет ответственности за сожженные компьютеры, микропроцессоры и автомобили в результате действий исполнителя;
  • Автор будет крайне огорчен и раздосадован в результате использования идентифицирующих эту работу частей в сторонних проектах, а особенно под названиями "Смотрите, какую приборку вчера забабахал" и т.п.
1. Электроника и электротехника

1.1 Ядро
Ключевая часть устройства заключается в одном-единственном микроконтроллере pic16F877a, к которому в свою очередь подключаются различные датчики, кнопки и прочие аналоговые и цифровые устройства. Распиновка микропроцессора с точки зрения созданной программы указана на схеме. Синим выделены используемые аналоговые входы (на них замеряется напряжение относительно земли, но не более 5В), фиолетовым - цифровые и зеленым ножки, к которым подключается преобразователь компьютерных сигналов.
Передача трансмиссии шифруется резистивным делителем.
Питание устройства осуществляется с интерфейса USB или внешнего источника питания +5В.

1.2 Датчики
1.2.1 Тахометр, спидометр
В различных автомобилях кодирование оборотов и скорости может быть выполнено различными средствами. Для ВАЗ-2110 имеем:
Цитата:

Спидометр работает совместно с электронным датчиком скорости автомобиля, установленном на коробке передач. Принцип его действия основан на эффекте Холла. Датчик выдает прямоугольные импульсы напряжения (нижний уровень - не более 1 В, верхний - не менее 5 В) с частотой, пропорциональной скорости вращения ведущи колес. 6 импульсов датчика соответствуют 1 м пути автомобиля.
Таким образом, к соответствующему входу микроконтроллера подключается цепь из транзистора и двух резисторов, позволяющая передавать в микроконтроллер лишь информацию о состоянии импульса и защищающая его от повышенных напряжений. Обработка импульсов осуществляется программным способом. Дополнительно считается пройденное расстояние.
Минимальной измеряемой скоростью является 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-порта

Серийный код устройства возвращается программой MProg после его прошивки. Неоходимо заполнить все поля данных в соответствии с картинкой (1), затем нажать кнопку прошивки(2). При этом все usb-устройства, за исключением собранного лучше отсоединить. В поле (3) будет возвращен серийный номер устройства.
Имя com-порта зависит от системы. В Windows оно имеет вид Com#, в Linux - /dev/ttyS# (при использовании USB преобразователя - /dev/ttyUSB#).

2.3 Калибровка значений датчиков
Калибровка значений стрелочных датчиков производится путем изменения файла torpedo.ini. Параметр min отвечает за показание датчика, в котором стрелка должна находиться в нулевом положении, max - в максимальном.
Для тахометра и спидометра введен дополнительный параметр factor - умножитель. Для уровня топлива и температуры охлаждающей жидкости дополнительный флаг invert для датчиков, работающих в обратном ключе.
Калибровка значения бортового напряжения зависит от напряжения питания микроконтроллера. Параметр maxvoltage позволяет определить поправку на максимальное напряжение, параметр limitvoltage определяет значение напряжения, ниже которого загорается лампа разрядки аккумулятора.
Для цифровых датчиков можно установить маску инвертирования. Биты, поступающие с микропроцессора будут инвертированы в том случае, если напротив них в маске будет установлена единица. В настройках маска записывается целым десятичным числом в диапазоне [0,255].

2.4 Скриншоты программы
http://funkyimg.com/t2/892/006/modest_screenshot.png http://funkyimg.com/t2/440/423/torpe...est_ubuntu.jpg

2.5 Самостоятельная разработка программ
Общение с устройством возможно по двум интерфейсам: com (max-232, микросхема ft232 работает как переходник uart-usb) и usb.
В обоих случаях необходимо выбрать асинхронный режим, 9600бод. После подключения, устройство возвращает восемь байт с информацией о состоянии автомобиля. Расшифровку показаний см. в исходном коде прошивки.
Посланная команда 177 обнулит значение одометра.
Общение по интерфейсу usb происходит через библиотеку ftd2xx.dll. Подробнее о ее фукциях см. на сайте производителя.
Также вместе с программой поставляется ее исходный код.


3. Ссылки
Прошивка микроконтроллера 02.09.09
Приложение для ПК + исходные коды 31.10.09
Драйвера для FT232Rl.

DDenis 28.08.2009 00:15

шикарная штука.
Сорри за глупый вопрос, а на машинах с автоматом также датчик скорости устроен?

Urvin 28.08.2009 00:40

Думаю, также

serg_wolf 28.08.2009 09:14

Urvin - ты крут!

Входы пика через диоды мож?....

St@rz 28.08.2009 13:51

Сильно. :yes4:
А почему не стал делать для готового устройства. Очень удобно бы получилось. Тем более что оно недорогое и доступное. Проще купить его чем спаять и прошить самодельное.
Планировал сделать такое как отмечать закончу. :)

Tores 28.08.2009 14:24

Респект автору, завтра будем испытывать :)

St@rz 28.08.2009 14:38

Urvin, может поправишь программу для arduino Nano?
У тебя это гораздо быстрее выйдет. :yes4:

Urvin 28.08.2009 14:43

serg_wolf, Дополнительных диодов не надо - будут только мешать работе МК

St@rz, у меня критическое отторжение Arduino как дорогой игрушки. Да и получается, что это очень сложная система для простых задач - как никто не покубает бухгалтерам четырехядерных писюков. В добавок цена Arduino - 700 рублей, эта же схема со всей обвязкой уместится в 450. При подключении к COM - еще на 150 рублей дешевле.
Другое дело, что в Arduino уже правильно сидят сложнораспаиваемые элементы и не требуется программатор.
Выбор уже зависит от кривизны рук и любознательности исполнителя.
Мой выбор - за микроконтроллерами - всяко железнее и полезнее.

Про правку программы - я по программированию ардуины ничего досконально не читал, потому уйдет некоторое время.
Вообще попробую.

Tores, ждем отчета. Если нароешь инфу по датчику скорости в твоей машине и заснимешь сигнал на осциллограф, можно будет и считалку импульсов сделать.



ёперный театр! Забыл схему шифратора КПП
UPD: добавил

Urvin 28.08.2009 17:53

Что у меня выходит для 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);
                }
        }                       
                       
}

Если программа и мои предположения верны, то в написанной мной приборке будут показываться подаваемые на arduino значения.

St@rz 28.08.2009 20:48

Цитата:

Сообщение от Urvin (Сообщение 108927)
Уж насколько ненавижу "теоретическое" программирование... Устройства у меня нет, потому исхожу из предположений и документации.

Urvin, если тебе интересно, то могу подарить тебе одну штуку arduino. Предполагаю что наличие у тебя этого устройства будет полезно для всех. :bye:


Часовой пояс GMT +4, время: 02:49.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot