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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

T_r_D 14.07.2015 00:46

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?

Поделитесь кто что знает!
Я в этом совсем новенький.

Bersenev 14.07.2015 13:23

В общем ты путаешь два понятия:

первое - это протокол по которому общаются устройства в твой машине, и он в каждой машине свой ( иногда даже разный в машинах одной и той же марки ), именно его ты и привёл в качестве примера.

второе - это 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 об/мин.

Если конечно прокол снимался на холостых оборотах.

T_r_D 14.07.2015 21:34

Bersenev спасибо тебе огромное.
В моём протоколе это лишь кусок.
У меня есть два лога- один без запуска двигателя, а второй с запуском и работой на ХХ.
Ту часть которую привёл это с запуском.
Но похоже это не тот ID поскольку на незапущенном двигателе он тоже меняется.
Если поможешь, то могу выслать два лога.

Какой программой можно анализировать траффик с ком порта?
А то эта угадайка на долго.

И если не сложно объясните мне как при помощи ардуины OBD II запросы слать и принимать ответы.
лог без запуска (выборка по ID с убиранием повторяющихся сообщений)

также попробовал написать
if (canId = 8)
{
C = (buf[3]*256+buf[2])/16;
Serial.println(C);
}
И получил пляшущие цифры ни малейшим образом не намекающие на обороты!

T_r_D 15.07.2015 22:09

Короче понятно.
Нужно идти стандартным путём- ELM327+Arduino

Bersenev 15.07.2015 23:28

Цитата:

Сообщение от T_r_D (Сообщение 332786)
И если не сложно объясните мне как при помощи ардуины OBD II запросы слать и принимать ответы.

Для тех кому лень читать WIKI (а там всё очень подробно описано), вот пример как запрашивать скорость автомобиля по OBDII

Код:

#include
#include

INT32U canId = 0x000;

unsigned char len = 0;
unsigned char buf[8];
char str[20];
boolean IsSend = false;

unsigned long IsSend_millis = 0;

unsigned char vspeed[8] = {2, 1, 13, 0, 0, 0, 0, 0};

unsigned char count = 0;

MCP_CAN CAN0(10);

void setup()
{
  Serial.begin(9600);
 
START_INIT:

  if(CAN0.begin(CAN_500KBPS) == CAN_OK)
    {
      Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
            Serial.println("CAN BUS Shield init fail");
            Serial.println("Init CAN BUS Shield again");
            delay(100);
            goto START_INIT;
    }
 
  pinMode(18, INPUT);
 
}

void loop()
{
    if(!IsSend)
    {
      CAN0.sendMsgBuf(0x7DF, 0, 8, vspeed);
      IsSend = true;
      IsSend_millis = millis();
    }
    if(!digitalRead(18))                       
    {
      CAN0.readMsgBuf(&len, buf);           
      canId = CAN0.getCanId();

      if( (canId == 0x7E8) && (buf[0] == 3) && (buf[1] == 0x41) && (buf[2] == 0xD))
      {
        Serial.println(buf[3]);
        IsSend_millis = millis()-2500;
          Serial.print("Speed: ");
          Serial.println(buf[3]);
      }
    }
    if( IsSend )
    {
      if( IsSend_millis + 3000 < millis() )
      {
        Serial.print("----");
        IsSend = false;
        IsSend_millis = millis();
      }
    }
}

Скетч посылает запросы раз в три секунды, пока не придёт первый ответ. После этого посылается два запроса в секунду.

Только номера пинов надо задать свои.

Bersenev 15.07.2015 23:39

Цитата:

Сообщение от T_r_D (Сообщение 332786)
также попробовал написать
if (canId = 8)
{
C = (buf[3]*256+buf[2])/16;
Serial.println(C);
}
И получил пляшущие цифры ни малейшим образом не намекающие на обороты!

И не удивительно,

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, а уже потом выполняем все действия, вот тогда получим правильное значение

Bersenev 15.07.2015 23:54

Цитата:

Сообщение от T_r_D (Сообщение 332786)
Какой программой можно анализировать траффик с ком порта?
А то эта угадайка на долго.

А это как повезёт, по работе приходится искать в протоколах в основном скорость и уровень топлива, иногда на это уходит часов шесть, а иногда 5 минут.

Я сделал себе программу для анализа протокола, протокол формирует этот скетч.

Код:

#include
#include

INT32U canId = 0x000;

unsigned char len = 0;
unsigned char buf[8];
char str[20];
int count = 0;

MCP_CAN CAN0(10);

void setup()
{
  Serial.begin(38400);
  while(!Serial){}
 
START_INIT:

  if(CAN0.begin(CAN_500KBPS) == CAN_OK)
    {
      Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
            Serial.println("CAN BUS Shield init fail");
            Serial.println("Init CAN BUS Shield again");
            delay(100);
            goto START_INIT;
    }
   
  pinMode(18, INPUT);
}

void loop()
{
     
    if(!digitalRead(18))                       
    {
      CAN0.readMsgBuf(&len, buf);             
      canId = CAN0.getCanId();                   
     
      Serial.print("<");Serial.print(canId);Serial.print(",");
      for(int i = 0; i       {
        Serial.print(buf[i]);Serial.print(",");
      }
      Serial.print(">");
      Serial.println();
    }
}

Так что можешь сделать файл этим скетчем, отправь мне, а я посмотрю.

Только для того что бы найти обороты надо сделать следующее:

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

Для скорости почти тоже самое, только надо равномерно разогнать машину километров до 40 - 50-ти, а потом также спокойно остановиться.

Для уровня топлива нужны протоколы до и после заправок.

T_r_D 16.07.2015 00:59

С имеет тип unsigned int. Задаётся в начале поэтому и небыло в куске.
С байт ты прав, но там числа получались до 65000.
Можно попробовать ещё раз.

Твой скетч тоже что и мой, только вывод строк в другом формате.
у меня в хексе и без всяких скобок и разделителей кроме ":" между ID и сообщением, а у тя с доп символами.
Ща перепишу свой чтоб выводилось в твоём формате.

С посылкой по OBD II ща попробую сам разобраться :)
Реально мне с ардуиной пока очень сложно так как опыта программирования МК у меня нет.

PS А что делает строчка?
INT32U canId = 0x000;
и отличается ли она от моей
unsigned char canId = CAN.getCanId();

Bersenev 16.07.2015 08:00

Цитата:

Сообщение от T_r_D (Сообщение 332786)
также попробовал написать
if (canId = 8)
{
C = (buf[3]*256+buf[2])/16;
Serial.println(C);
}
И получил пляшущие цифры ни малейшим образом не намекающие на обороты!

и ещё по этому куску, речь действительно шла про 2 и 3-ий байты, но индексы в скетче у них 1 и 2, то есть правильно это должно выглядеть так

C = buf[2];
C = (C*256+buf[1])/16;

Bersenev 16.07.2015 08:10

Цитата:

Сообщение от T_r_D (Сообщение 332910)

PS А что делает строчка?
INT32U canId = 0x000;
и отличается ли она от моей
unsigned char canId = CAN.getCanId();

Объявляет переменную canId, только в твоём случае она динамическая, так как создаётся внутри цикла.

Но самое главное у тебя здесь ошибка, так как идентификаторы могут быть 11-ти или 29-битные (в зависимости от системы адресации в конкретной can шине), а ты выделяешь под него один байт, то есть всего восемь бит.

Правильно должно быть так

unsigned long canId = CAN.getCanId();

или так

INT32U canId = CAN.getCanId();

Bersenev 16.07.2015 22:16

Идентификатор 520, байты 0 и 1

C = buf[0];
C = (C*256+buf[1])/8;

Только файлы можно просто прикреплять к сообщению, а не вставлять их в текст

T_r_D 16.07.2015 23:37

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);
}
}
}

Bersenev 17.07.2015 00:01

Цитата:

Сообщение от T_r_D (Сообщение 333019)
Какой прогой анализируешь?

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

Цитата:

Сообщение от T_r_D (Сообщение 333019)
PS. А что ещё можно извлечь из данного лога?

Из этого лога только обороты, так как для них он и делался, вроде ещё попалась температура ОЖ, но не факт. Для всего есть своя методика, но меня по работе интересует в основном скорость и уровень топлива

Bersenev 17.07.2015 00:04

Цитата:

Сообщение от T_r_D (Сообщение 333019)
if (canId = 520)

А надо

if (canId == 520)

T_r_D 17.07.2015 00:28

Bersenev всё- заработало, ещё раз спасибо!
А остальные цифры в 520 что-то значат?
Возможно ли что в одном ID два параметра находятся?

А в принципе видимо из этих данных можно выловить всё о машине что касается двигателя?

Как сделать лог для всего остального?
Ну например той же температуры ОЖ, скорости, напряжения, уровня топлива и самое главное расхода топлива?

И можно ли каким-то стандартным софтом анализировать протокол?
Хочу хоть примерно понять.

PS. Температура ОЖ там врядли была. она ровнялась температуре окружающей среды :)

Bersenev 17.07.2015 00:59

Цитата:

Сообщение от T_r_D (Сообщение 333025)
Bersenev всё- заработало, ещё раз спасибо!
А остальные цифры в 520 что-то значат?
Возможно ли что в одном ID два параметра находятся?

Конечно возможно, даже в одном байте разные биты могут отвечать за разные датчики.

Цитата:

Сообщение от T_r_D (Сообщение 333025)
А в принципе видимо из этих данных можно выловить всё о машине что касается двигателя?

Можно, но сложно, если нет описания протокола.

Цитата:

Сообщение от T_r_D (Сообщение 333025)
Как сделать лог для всего остального?
Ну например той же температуры ОЖ, скорости, напряжения, уровня топлива и самое главное расхода топлива?

Для ОЖ просто зависти машину и ждать подъёма температуры градусов на десять. Для скорости равномерно разогнать машину до 40 - 50 км/ч и также спокойно остановиться. Напряжение не искал, но я бы просто померял его с помощью ардуино. Для топлива снимаем протокол, потом заливаем 10-20 литров и снова снимаем, для верности ещё заливаем и ещё раз снимаем протокол, потом анализируем три протокола. Расхода топлива в протоколе нет, его надо рассчитывать на основе других данных.

Цитата:

Сообщение от T_r_D (Сообщение 333025)
И можно ли каким-то стандартным софтом анализировать протокол?
Хочу хоть примерно понять.

я не знаю такого софта, все канхакеры, что находилось в сети, мне не подошли.

Цитата:

Сообщение от T_r_D (Сообщение 333025)
PS. Температура ОЖ там врядли была. она ровнялась температуре окружающей среды :)

ид 1362 , байт 1 и 2. формула скорее всего такая

(buf[1]*256 + buf[2])/256

то есть в байте 1 температура в градусах, а в байте 2 значение после запятой. У тебя в логе она поднялась с 37.8 до 39.2

T_r_D 17.07.2015 01:36

Цитата:

Конечно возможно, даже в одном байте разные биты могут отвечать за разные датчики.
ТОгда нужно будет проконтролить не идёт ли чего нить ещё с оборотами вместе.

Цитата:

ид 1362 , байт 1 и 2. формула скорее всего такая

(buf[1]*256 + buf[2])/256

то есть в байте 1 температура в градусах, а в байте 2 значение после запятой. У тебя в логе она поднялась с 37.8 до 39.2
Завтра проверю.

И если будет время запишу лог разгона и торможения.

По поводу напряжения- хочется всётаки понять где оно там спрятано.

По поводу топлива- алгоритм-то понятен. Надо только лейку найти и доехать в канистру 20л бензина налить, вот только как потом ровно по 10 литров налить?
А второй канистры нету.

По поводу расхода- понятно. Там наверняка берётся из расчёта времени открытия форсунок и может быть давления в рампе.

T_r_D 17.07.2015 21:11

Вложений: 1
Снял лог.
Разгон 0-60 и потом 60-0 с отпущенным газом.
Файл приложил.
В архиве txt

Про температуру.
Вчера ты написал
Цитата:

ид 1362 , байт 1 и 2. формула скорее всего такая

(buf[1]*256 + buf[2])/256

то есть в байте 1 температура в градусах, а в байте 2 значение после запятой. У тебя в логе она поднялась с 37.8 до 39.2
Скорее всего не 37.8, а 18.9 так как тепмература на улице не могла быть 40 градусов :)
Ща схожу проверю в машине.

Bersenev 17.07.2015 23:38

ид 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 ночно не температура ОЖ

T_r_D 17.07.2015 23:49

Bersenev
1362 это какой-то таймер и обновляется раз в секунду.

По поводу скорости- я примерно до 60 разогнался. Может чуть меньше.

в 909 скорость в милях?

В итоге всётаки выходит что мне проще читать через OBD II данные.
Мне на самом деле нужно просто повторить показания на экране бортового компа.
А всё остальное это уже баловство.
А на экране отображается
1 Расход на 100
2 Моментальный расход
3 Расстояние которое можно проехать до заправки
4 Трип счётчик

Из всего что мне нужно- расход на 100 и моментальный.
Как я понимаю дёрнуть из протокола ситра будет это очень не просто.

Так что думаю что сделаю проще.
В диаг разъём вставлю ELM, а с него уже буду брать данные.
Так проще и про ELM всё рассказано уже.

А свой CAN Shield переделаю на комфорт шину и оттуда буду читать температуру за бортом, нажатие кнопок на магнитоле и руле и сообщения от магнитолы на дисплей.

То что ты расшифровал в логе по скорости- проверю.

Bersenev 18.07.2015 00:19

Цитата:

Сообщение от T_r_D (Сообщение 333086)

В итоге всётаки выходит что мне проще читать через OBD II данные.
Мне на самом деле нужно просто повторить показания на экране бортового компа.
А всё остальное это уже баловство.
А на экране отображается
1 Расход на 100
2 Моментальный расход
3 Расстояние которое можно проехать до заправки
4 Трип счётчик

Ничего этого в OBDII нет, всё это вычисляется на основании других показаний. А вот выудить эти данные из кан шины которая идёт на родной монитор вполне возможно, если только бортовой компьютер реализован не в самом мониторе. Если же в мониторе, но в шине ничего этого не будет.

T_r_D 19.07.2015 01:19

Bersenev А это мы скоро узнаем :)
TJA1054T уже давно заказана и едет из китая.
Переделаю шилд под комфорт шину и буду ловить дальше пакеты и надеюсь расшифровывать их при твоём участие.
И тут ещё у народа наработки есть. Так что думаю всё получится.

А про то что данных которые мне нужны нету в шинах это я понимаю.
Но одно дело искать в небольшом количестве данных, а другое выуживать это из тонны.

Я пришёл к мнению что данные о машине и трипе буду снимать torque, а с комфорт шины перехватывать сообщения для дисплея чтоб его заменить без потерь и нажатие разных кнопок в машине.

В итоге цель выглядит так:
Выкинуть дисплей на котором отображаются
Параметры машины что писал выше (по одному параметру и меняются при нажатии кнопки на лепестке дворников). Если torque их покажет, то не нужны.
Градусник. Тоже если torque покажет, то не нужен.
Текстовые сообщения от систем автомобиля (открытая дверь, риск обледенения и так далее)
Текстовые сообщения от магнитолы (хотя я думаю что это один и тот же пакет или несколько пакетов)

Отлавливание нажатий кнопок на руле и подрулевых.
Отлавливание нажатия кнопок на магнитоле.

Штатная голова пока останется в машине в виде радио и усилителя для планшета. Планшету будет выделена функция утраченного дисплея бортовика+ torque+ навигация+ музыки с флешки.
Если приём радио меня устроит или я дойду до покупки внешнего FM USB приёмника, то голову тоже вытащу и спаяю усилитель.

T_r_D 19.07.2015 16:31

TJA1054 приехала.
Время ща нет, но в следующее воскресенье вытравлю платку и соединю с шилдом.
Подключу к машине или не успею- не знаю.

T_r_D 01.08.2015 12:35

Пока ни как не собирусь с платой. Время совсем нет.
Но покопал инет пока жду elm327 и пишут что он не умеет читать с ситроена данные по топливу.

Поэтому созрела идея, но найти ни чего путного не могу.
Короче что нужно FT раскапывать- понятно.
Там всё это есть и чувствует себя хорошо.
Но что делать с софтом? Не смотреть же это через терминал!
И тут пришла идея! А можно ли сделать так, чтоб ардуина прикинулась elm327 для планшета и torque?
Тогда можно torque кормить любой инфой которой пожелаешь!

autowp 11.08.2015 23:04

Приветствую.

Я тут мимо проходил и заметил, что могу быть полезным:
http://autowp.github.io/ - я тут насобирал кой чего по CAN Comfort ... в 0x221 расход упоминается (правда не уверен, что тот, который надо, это все-таки расход по выбранному режиму треккомпа, но как отправная точка сгодится)

Ну и это, если есть чего добавить, you are welcome https://github.com/autowp/autowp.github.io

T_r_D 15.08.2015 09:52

autowp Я видел твои изыскания.
Очень помогут.
Ща правда новая работа и время ноль и второе- не хочу гадить шилд за 700р переделкой. Так что закажу дешёвые can-bus платки и на них перепаяю.

Пришёл ELM327. Проверил.
В принципе он всё показывает. Немного не совпадает с бортовиком, но это где-то можно подкорректировать.
Выдаёт кучу ненужных мне параметров, но в их числе и нужные.
Такие как мгновенный расход и расход на 100. Ещё из полезного температуру охлаждайки показывает и напряжение.

От комфорт шины теперь требуются кнопки, температура окружающей среды и то что сыпет магнитола на экран. Плюс всякие ништяки типо открытых дверей, ICE Alert.

Второй вопрос уже более актуальный- как связаться с ардуиной с андройда?
Причём чипы USB у китайских CH341.
Я с андройдом ну совсем не друг и понять не могу не фига.

Нужно будет написать мелкую прогу чтоб отображалась полосой на экране на которой будет собственно сообщения от магнитолы, о открытых дверях, температуре и так далее.

autowp 15.08.2015 15:29

Сообщения ICE и т.п. ты видел в моём файле. Показывать их легко. Но надо будет предварительно снять дисплей и забрутфорсить весь спиок, потому что передаются они дисплею кодами, а текст зашит в нём самом. Я свой и еще один забрутфорсил, но от машины к машине список меняется (дополняется).

Взаимодействовать с андроидом достаточно не сложно. На китайском usb-uart ещё не пробовал, но под ft232 код готовый есть.

T_r_D 06.09.2015 22:47

Чего-то фигня с почтой России какая-то!
Очень долго всё идёт.
Уже попробовать хочется!

По поводу софтины. Нашёл вот такую
http://www.danielespinetti.it/2012/1...s-control.html
Сорри за сторонний ресурс.

Время попробовать опять таки нет.

autowp
Я кстати хотел узнать как передаётся инфа дисплею, а ты уже ответил. :)
Кстати какая распиновка на дисплее разъёма? CAN шину хочу для экспериментов с его разъёма взять.

Дисплей я и так сниму. Новая рамка всётаки почтой пришла. Ща потихоньку планшет туда приделываю.

Как его брутофорсить? У меня стандартный строчечный.
Скорее не от машине к машине, а от типа дисплея к типу.
И скорее всего по шине идут все данные, а то замена дисплеев была бы не возможна.

autowp 06.09.2015 23:55

Цитата:

Сообщение от T_r_D (Сообщение 337439)
Как его брутофорсить? У меня стандартный строчечный.
Скорее не от машине к машине, а от типа дисплея к типу.

Да прям так: поочередно выставлять на шине каждый код сообщения об ошибке. Благо, их всего 255 и большинство я уже внёс в таблицу.

>>И скорее всего по шине идут все данные, а то замена дисплеев была бы не возможна.

Не исключено, что она и невозможна, формально. Просто самые базовые коды сообщений пересекаются, а различия в редких никто и не замечает на практике.

T_r_D 08.09.2015 13:07

Ну чтож- всё приехало!
Ура.
Собственно список:
Ардуина: 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
Но пока под андройд я писать ни чего не умею.

autowp 08.09.2015 13:46

Лучше бы TJA1055 брал. Обратно совместима, но с некоторым улучшениями.

Лучше распиновку смотреть, а не по цвету ориентироваться.
http://citroens-club.ru/forum/index.php?showtopic=8919

xmetal 08.09.2015 15:41

Цитата:

Сообщение от T_r_D (Сообщение 337555)
Спаяно всё вместе, перепаяна TJA1050 на TJA1054. Здесь платка очень помогла!

Платку можно насадить и припаять на пины H/L Кан шилда, перевернув ее микросхемой вниз, получится компактно. Я себе так сделал.

T_r_D 09.09.2015 12:55

autowp да ктож знал!
А Вообще пофиг. Она чисто под проект бралась.

T_r_D 03.10.2015 16:22

Пока до машины не добрался, но пришла ардуина 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 буду на ней.

T_r_D 07.10.2015 12:28

Вложений: 1
Итак.
Добрался до машины, подключился и снял два лога.
Первый это лог с включённым зажиганием, а второй просто магнитола.

На готовых логах мне кто объяснит как прочитать сообщение на экране от магнитолы? В логе сверху написано что было на дисплее в этот момент.

Лог снят скетчем из сообщения 7 http://www.pccar.ru/showpost.php?p=332906&postcount=7
(первое число ID а далее сообщение)


autowp За табличку отдельное спасибо!

Ловите скетч который я правлю и пишу. Там всё передаётся в сериал порт и соответственно всё подписано.

Цитата:

#include
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len = 0;
unsigned char buf[8];
INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные
int incomingByte = 0;
int Y = 1;

//Все проверенные параметры
float Themperature = 0;
int RPM = 0;
int ARCFL = 0;
float Speed = 0;
float ILPK = 0;
int Odometr = 0;

//Кнопки на руле
char* SEERINGWHILEMESSAGE[] = {"All release","VOLUME DOWN","VOLUME UP","VOLUME MUTE","TRACK FORWARD"};
int SWK = 0;
int SWSV = 0;

//Кнопки на магнитоле
char* RADIOKEY[] = {"All release","MENU","MODE","DARK","ESC","UP","DOWN","LEFT","RIGHT"};
int RK = 0;

//Частота и бэнды
char* RADIOBAND[] = {"FM1","FM2","FM AST","AM"};
int RB = 0;
float RFR = 0;

//Магнитола ON/OFF
char* RADIOPOWER[] = {"OFF","ON"};
int RP = 0;

//Источник радио
char* RADIOSOURCE[] = {"Radio","CD","CD Changer"};
int RS = 0;

//Громкость
int VOL = 0;

void setup()
{
Serial.begin(115200);

START_INIT:

if(CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz))
{
Serial.println("Init OK!");
}
else
{
Serial.println("Init fail");
delay(100);
goto START_INIT;
}
Serial.println("a = All mesage");
Serial.println("b = Speed");
Serial.println("c = RPM");
Serial.println("d = Instant fuel consumption /100Km");
Serial.println("e = Run on current fuel level");
Serial.println("f = Themperature");
Serial.println("g = Steering while Scroll value");
Serial.println("h = Steering while");
Serial.println("i = Radio key");
Serial.println("j = Radio ON/OFF");
Serial.println("k = Radio source");
Serial.println("l = Radio band and frequency");
Serial.println("m = Volume");
}


void loop()
{
if (Serial.available() > 0)
{incomingByte = Serial.read();}

if (incomingByte == 97)
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();
Serial.print("<");
Serial.print(canId);
Serial.print(",");
for(int i = 0; i {
Serial.print(buf[i]);
Serial.print(",");
}
Serial.println(">");
}
}


else
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();

if(canId == 246) //0F6
{
Themperature = buf[6];
Themperature = (Themperature / 2) - 39.5;

Odometr = ((int)buf[2] * 256 | buf[3]);
Odometr = ((int)Odometr * 256 | buf[4]);

if (Odometr != Y)
{
Serial.print("Odometr: ");
Serial.print(Odometr);
Serial.print(" ");
Serial.print(buf[2]);
Serial.print(" ");
Serial.print(buf[3]);
Serial.print(" ");
Serial.println(buf[4]);
Y = Odometr;
}
}

//Обороты и скорость
if(canId == 182) //0B6
{
RPM = (int)buf[0] << 5 | buf[1] >> 3;
Speed = ((int)buf[2] << 8 | buf[3]);
Speed = Speed / 100;
}

//Километры на остатке топлива и моментальный расход
if(canId == 545) //221
{
ARCFL = (int)buf[3] << 8 | buf[4];
ILPK = ((int)buf[1] << 8 | buf[2]);
ILPK = ILPK / 10; // Если -1 то показаний нет

// Serial.print("Rest of run to finish: ");
// Serial.println((int)buf[5] << 8 | buf[6]);
}

//Кнопки на руле справа
if(canId == 543) //21F
{
SWSV = buf[1];
if(buf[0] == 0){SWK = 0;}
if(buf[0] == 4){SWK = 1;}
if(buf[0] == 8){SWK = 2;}
if(buf[0] == 12){SWK = 3;}
if(buf[0] == 128){SWK = 4;}
}

//Кнопки магнитолы
//последнии два байта какой-то мусор
//проподает при выключении магнитолы
if(canId == 997) //3E5
{
if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[5] == 0){RK = 0;}
if(buf[0] == 64){RK = 1;} //Menu 64
if(buf[1] == 16){RK = 2;} //Mode 16
if(buf[2] == 4){RK = 3;} //Dark 4
if(buf[2] == 16){RK = 4;} //Esc 16
if(buf[5] == 64){RK = 5;} //UP 64
if(buf[5] == 16){RK = 6;} //DOWN 16
if(buf[5] == 1){RK = 7;} //LEFT 1
if(buf[5] == 4){RK = 8;} //RIGHT 4
}

//Включено или нет радио, источник на радио
if(canId == 357) //165
{
if (buf[0] == 192){RP = 1;} else {RP = 0;}
if (buf[2] == 16){RS = 0;}
if (buf[2] == 32){RS = 1;}
if (buf[2] == 48){RS = 2;}
}

//Банды и частота радио
//первые 2 меняются иногда, последнии 3 незнамо что (мусор или уровень сигнала),
//частота и мусор не пропадают при отключении магнитолы
if(canId == 549) //225
{
if(buf[2] == 16){RB = 0; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM1
if(buf[2] == 32){RB = 1; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM2
if(buf[2] == 64){RB = 2; RFR = buf[3] * 256 + buf[4];RFR = RFR / 20 + 50;}//FM AST
if(buf[2] == 80){RB = 3; RFR = buf[3] * 256 + buf[4];} //AM
}

if(canId == 421) //1A5
{
VOL = buf[0];
}

//Выводим данные.
if (incomingByte == 98){;Serial.print("Speed: "); Serial.println(Speed);}
if (incomingByte == 99){Serial.print("RPM: "); Serial.println(RPM);}
if (incomingByte == 100){Serial.print("Instant fuel consumption /100Km: "); Serial.println(ILPK);}
if (incomingByte == 101){Serial.print("Run on current fuel level: "); Serial.println(ARCFL);}
if (incomingByte == 102){Serial.print("Themperature: "); Serial.println(Themperature);}
if (incomingByte == 103){Serial.print("Steering while Scroll value: "); Serial.println(SWSV);}
if (incomingByte == 104){Serial.print("Steering while: "); Serial.println(SEERINGWHILEMESSAGE[SWK]);}
if (incomingByte == 105){Serial.print("Radio key: "); Serial.println(RADIOKEY[RK]);}
if (incomingByte == 106){Serial.print("Radio ON/OFF: "); Serial.println(RADIOPOWER[RP]);}
if (incomingByte == 107){Serial.print("Radio source: "); Serial.println(RADIOSOURCE[RS]);}
if (incomingByte == 108){Serial.print("Radio band and frequency: "); Serial.print(RADIOBAND[RB]); Serial.print(" "); Serial.println(RFR);}
if (incomingByte == 109){Serial.print("Volume: "); Serial.println(VOL);}
}
}
}

autowp 07.10.2015 17:33

Вложений: 1
Цитата:

Нулевой байт. Ну да- это обороты, но меньше в 33 раза
Так что нужно умножать на 33. Для того чтоб вычислить это 33 пришлось ELM327 подключать.
Повнимательнее.

Ну нулевой байт, а первые 13 бит. Ну и уже если первый байт, то не 33, а 32 (2^5)

autowp 07.10.2015 19:01

Цитата:

У меня это ID 246 в DEC и само сообщение 128,60,17,29,39,91,91,160.
246 в DEC это и есть 0x0F6


Цитата:

Если в DEC считать, то 91/2-39.5 то почти всё правильно.
Если 91 перевести в HEX то получается билиберда.
Так что может нужно не 39,5 вычитать, а 39? Откуда вообще взято было 39,5?
Это взято из дальнейшего замера где на дисплее было 4, а по расчётам получалось 3,5.
Не понимаю связи между "перевести в HEX то получается билиберда" и "Так что может нужно не 39,5 вычитать, а 39".

На сколько я помню, 39.5, а не 39, как раз для того, чтобы после округления получалось точно как на дисплее.
На шине температура дается на 1 бит более точно, чем на экране. Дисплей или округляет, или отбрасывает (floor) младший бит, доподлинно установить не представляется возможным.
Я решил, что он округляет, поэтому такая формула.

T_r_D 08.10.2015 13:26

Итак, разобрались чутка.
В скетч ща внесу то что заработало.

Кто с одометром поможет и с радио?

Вот такие числа и реальный пробег
Последнее меняется раз в 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

xmetal 10.10.2015 15:49

Прикинул, по радио получилось так:
Для АМ два байта 2 19 это и есть 531, то есть считать ничего не нужно.
Для FM получилась такая формула X/20+50, например два байта 2 244, это будет 756/20+50=87.8, 4 и 136 - 1160/20+50=108

T_r_D 10.10.2015 15:59

Цитата:

Сообщение от xmetal (Сообщение 340062)
Прикинул, по радио получилось так:
Для АМ два байта 2 19 это и есть 531, то есть считать ничего не нужно.
Для FM получилась такая формула X/20+50, например два байта 2 244, это будет 756/20+50=87.8, 4 и 136 - 1160/20+50=108

Для FM таже формула вышла только вот так :)
((byte3 * 256) + byte4) / 2 + 500

А для одометра есть идеи?


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

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