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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2015, 13:46   #31
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

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

Лучше распиновку смотреть, а не по цвету ориентироваться.
http://citroens-club.ru/forum/index.php?showtopic=8919
autowp вне форума   Ответить с цитированием
Старый 08.09.2015, 15:41   #32
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Спаяно всё вместе, перепаяна TJA1050 на TJA1054. Здесь платка очень помогла!
Платку можно насадить и припаять на пины H/L Кан шилда, перевернув ее микросхемой вниз, получится компактно. Я себе так сделал.
xmetal вне форума   Ответить с цитированием
Старый 09.09.2015, 12:55   #33
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

autowp да ктож знал!
А Вообще пофиг. Она чисто под проект бралась.
T_r_D вне форума   Ответить с цитированием
Старый 03.10.2015, 16:22   #34
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Пока до машины не добрался, но пришла ардуина 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   #35
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

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

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

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


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

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

Цитата:
#include <SPI.h>
#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","L EFT","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<len; 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);}
}
}
}
Вложения
Тип файла: rar log.rar (4.7 Кб, 612 просмотров)

Последний раз редактировалось T_r_D; 11.10.2015 в 12:50.
T_r_D вне форума   Ответить с цитированием
Старый 07.10.2015, 17:33   #36
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

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

Ну нулевой байт, а первые 13 бит. Ну и уже если первый байт, то не 33, а 32 (2^5)
Миниатюры
Нажмите на изображение для увеличения
Название: 0B6.jpg
Просмотров: 979
Размер:	20.2 Кб
ID:	41204  
autowp вне форума   Ответить с цитированием
Старый 07.10.2015, 19:01   #37
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

Цитата:
У меня это 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) младший бит, доподлинно установить не представляется возможным.
Я решил, что он округляет, поэтому такая формула.
autowp вне форума   Ответить с цитированием
Старый 08.10.2015, 13:26   #38
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

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

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

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

Последний раз редактировалось T_r_D; 10.10.2015 в 14:03.
T_r_D вне форума   Ответить с цитированием
Старый 10.10.2015, 15:49   #39
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Прикинул, по радио получилось так:
Для АМ два байта 2 19 это и есть 531, то есть считать ничего не нужно.
Для FM получилась такая формула X/20+50, например два байта 2 244, это будет 756/20+50=87.8, 4 и 136 - 1160/20+50=108
xmetal вне форума   Ответить с цитированием
Старый 10.10.2015, 15:59   #40
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от xmetal Посмотреть сообщение
Прикинул, по радио получилось так:
Для АМ два байта 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

А для одометра есть идеи?
T_r_D вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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