Вход

Просмотр полной версии : CITROEN-ARDUINO


Страницы : 1 [2]

xmetal
29.03.2016, 11:37
Кажется понял. Андроид сам берет из всего массива то, что ему в данный момент нужно. Например если вместо рдс текста находится мусор, он его не будет смотреть, так как нет команды обновлять рдс текст. Но этот мусор все равно передается. Правильно?

dmit
29.03.2016, 13:03
xmetal
Спасибо за пример сравнения.

По поводу данных.
Ведройд не сохраняет в себе ни каких значений, он тупо считает и выводит то, что на него приходит.

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

Вот что в итоге сотворил.
При каждом приходе интересующего меня ID данные складываются в массив и пишется флаг Compare = true;
Ну а дальше проверяется в основном цикле вышли ли 100мс и состояние флага.
И если вышли и флаг true, то сравниваются массивы и если не равны, то выдаём данные в порт и записываем данные из массива 1 в массив 2 (тоесть с тем, с которым в дальнейшем будем сравнивать).

if ((millis() - time0) > 100 && Compare){
arrcmp = memcmp(DATA,DATA2,161);
if (arrcmp != 0)
{
Serial.write(DATA, 161); //41 + 54 +64
memcpy(DATA2,DATA,161); //Присваиваем массиву DATA2 160 байт массива DATA
}
time0 = millis();
Compare = false;
}


Так по идеи должно работать ещё быстрее

xmetal Стоп- стоп!
У нас есть цикл, в нём есть определение приёма пакета и если приняли, то куча ифов.
На данный момент заменено на switch.
Задетектили приём пакета, пошли вниз по коду, если есть, то изменили что-то в массиве, если нет, то просто сделали пробежку сверху вниз, сравнили массивы и побежали на следующий круг.
В этом цикле как бы не может быть много пакетов.
Если приняли нужный нам пакет, то сравнив у нас естественно массивы не совпали и мы выдали весь пакет целиком в порт, не важно что записали всего один бит, передали всё равно 161 байт. Ну и в буферный масив перекинули данные основного массива чтоб потом сравнивать дальше.

Так что складывание данных только из одного пакета за цикл и сравнение тоже.

Сейчас оптимизировал это свитчем и сделал сравнение только если пришёл интересующий меня пакет. В порт лететь стало меньше. Проблема ушла с кашей.

То что не ловит переодически пакеты это уже где-то с железом косяк. Даже на минимальном скетче есть потери пакетов (просто когда пакеты в консоль выводятся). После пропайки TJA, укорочения хвоста витухи в машине стало полутчше,но всё равно теряет. Видимо вместо дисплея в разъём втыкать нужно чтоб лишних проводов и скруток не было.

На этой недели проверю.

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

xmetal
29.03.2016, 15:38
- сообщения изначально фильтруются уже ?
Нет, не фильтруются. Можно получать сообщения с любым ID который доступен в конкретной кан-шине. В автомобиле как правило несколько кан-шин.

- как часто опрашивается шина в секунду ? Судя по загруженности Ардуино, постоянно со скоростью шины ? Т.е. есть такие одинокие редкие сообщения, который нужно вылавливать с большой непрерывной скоростью опроса ?Данные из кан-шины попадают в буфер (их там 2 вроде) MCP2515, ардуино должна их как можно быстрее считывать, иначе вновь поступающие сообщения будут игнорироваться. MCP2515 работает аппаратно вплоть до 1 Мегабита, так что слабое звено тут Ардуино.


-Нельзя фрагментами делать выборку ? Что например , номер трека как сообщение проскочил один раз и все ... пока не сменишь трек? Как часто повторяются такие данные ?
например, где-то в теории читал , что сообщение повторяется до тех пор пока ему не ответит устройство, которому оно предназначено. Или здесь что-то не так в этом плане ?Все зависит от выдумки разработчиков. Все данные в сообщении и частота его повторения зависит от конкретного разработчика устройства.

T_r_D
29.03.2016, 16:54
xmetal
MCP2515 работает аппаратно вплоть до 1 Мегабита, так что слабое звено тут Ардуино.
Вот тут ты абсолютно прав! Если не поможет подключение прям к разъёму машины без проводов то надо переходить на что-то более шустрое.
Скажем STM32F105. Вот только как мой код туда запихать? Я не такой гуру программирования контроллеров.

Вот кстати что с интерфейсом получилось. В итоге будет полноэкранка, а ща пока так. Место под климат разобрал. Хочу данные о нём и управление сделать с планшета.

Там где написано 104.2MHZ отображается RDS. Надписи меняются раз в 4 секунды.
Там же отображается номер и время CD\CD Changer.
А там где написано MEM 5 отображается в режиме CD общее количество треков на диске, а в режиме ченджера текущий диск и общее количество треков на нём.
Там где в режиме радио отображается POP M, тоесть сведения о PTY данной станции, в режиме CD отображается надпись CD ну и так далее :)

devova
29.03.2016, 16:59
.
Данные из кан-шины попадают в буфер (их там 2 вроде) MCP2515, ардуино должна их как можно быстрее считывать, иначе вновь поступающие сообщения будут игнорироваться. MCP2515 работает аппаратно вплоть до 1 Мегабита, так что слабое звено тут Ардуино.

А может надо взять stm вместо atmega? Вот к примеру єсть ардуіно совмечтимая платка на STM32F103C8T6 http://www.aliexpress.com/item/1pcs-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-arduino/32583160323.html. Она бистреє и памяти больше, как ви думаєте ето можно би било использовать?
Здесь первиє шаги с stm http://2150692.ru/faq/112-quick-start-stm32f103c8t6

T_r_D
29.03.2016, 17:04
dmit. Пока не воткнёшь что-то что может сканировать шину в свой автомобиль ни чего не узнаешь.

У тебя 100% сообщения идут не так как у меня.

Не гадай- подключи и посмотри, а потом уже ищи что тебе нужно. Большая часть сообщений тебе будет вообще не нужна. Я работаю всего с 21 ID, а в шине их у меня за сотню летает.

Вот сегодня займусь отловом сообщения SILENCE в режиме радио и PAUSE в режиме CD\CHANGER.

xmetal
30.03.2016, 00:43
А может надо взять stm вместо atmega? Вот к примеру єсть ардуіно совмечтимая платка на STM32F103C8T6[/url]Надо смотреть какие библиотеки для нее есть, для работы с CAN. Характеристики конечно впечатляют.

UPD. Имеет CAN встроенный, значит либы есть.

T_r_D
30.03.2016, 12:30
xmetal там встроенный кан, только трансивер внешний нужен (tja).
И подходят только 105 и 107. Только они умеют одновременно CAN и USB.
Характеристики у них конечно на несколько порядков круче атмеги.

devova
30.03.2016, 15:55
@T_r_D
Мне через два дня придут CAN модуль и я смогу залить товй скетч, stm мне уже литит из китая, так што как только он прйдет я тоже напишу какиє результати.
Итак у меня возник вопрос/идея: T_r_D у тебя уже много написано кода, как для ардуини так и для андроида, почему би тебе не виложить ето все на GitHub, сделать 2 репозитория(1 для ардуино, 2й для андроида), там би ми могли иметь версии и делать свои изминения. Ето хорошая практика, если нужна помошь с git, я помогу разобратса.

T_r_D
30.03.2016, 17:56
devova потому что мне это не надо.

T_r_D
31.03.2016, 12:05
Так, вроде всё сделал что возможно при сохранении дисплея, теперь полезли дальше.
Для того чтоб магнитола ожила нужно чтоб она видела дисплей. Это решается просто.
Посылаем один ID при первой загрузке ардуины:
5E5 25,A,B,4,C,1,20,11
И раз в 100мс ещё два пакета:
167 9,6,FF,FF,7F,FF,0,0 100мс. Нулевой байт это то, что отображает БК, без остального магнитола не включается.
DF 10,0,50 100мс. Состояние меню.

После этого магнитола включится, начнёт реагировать на кнопки, но ни какие меню открывать не будет. Для открытия меню нужно чтоб была реакция DF.

Ща пока на меню все забью, а буду разбираться с 167 ID, точнее с нулевым байтом чтоб понять какое отображение дисплея чему соответствует. Это для сброса трипа надо.

Garen
31.03.2016, 13:18
Все окна что выводят инфу они поверх всего и вылезают даже когда приложение скрыто.

Дописал PTY лист и сообщение когда идёт поиск PTY

Рамки этим сообщениям сделать надо, но ща тестирование и попытка дружить железки вместе.

сдружились?)

T_r_D
31.03.2016, 16:15
Garen до некоторой степени :)

Готова полностью прослушка, тоесть вывожу на планшет всё, кроме меню настроек, то что по кнопке MENU.
Чтоб его выводить нужно выкидывать дисплей. Сегодня первые попытки по серьёзному сэмулировать дисплей. В принципе обмануть магнитолу просто, это уже сделано. Всё включается и работает. После некоторых танцев заработал лист PTY, СD LIST, окошко PLEASE WAIT, окошко PTY xx NOT FOUND.
Не работает мультифрейм. Выводит только сообщение которое с 0х10 начинается и всё. Посмотрел логи, ща попробую скормить ещё один ID- может пройдёт целиком.
Так же непонятки с трипом.
Докопался до этого в 167 ID. Они разные для двух дисплеев. В машине строчечный дома графический.
По этому ID магнитола определяет наличае дисплея!
C,6,FF,FF,7F,FF,0,0

байт 0
9 -машинка
A - 1
C - 2
При долгом удержании кнопки сброса трипа реагируем только в A и C.
Дисплей отзывается 8A и 4C.

В машине 0,0,0,0,0,0,0,0

байт 0
0 - Data
1 - Моментальный расход на 100
2 - Trip
2 - L/100
2 - Avg Spd
При долгом удержании кнопки сброса трипа реагируем только в 2.
Дисплей отзывается 82

0 - 00000000
1 - 00000001
2 - 00000010
82- 10000010
9 - 00001001
A - 00001010
C - 00001100
8A- 10001010
4C- 01001100

Тоесть можно заметить что 3 бит в машине всегда 0, а дома всегда 1.
Если их игнорировать то:
Тогда
1=9
2=А
82 = 8А

С ни чему не равен- он отдельно.
Можно предположить что за сброс отвечает 7 бит отдельно или вместе с первым.

Так что ещё немного и чего-то достигну.

T_r_D
31.03.2016, 17:25
Итак, судя по логу на первое сообщение мультифрейма отвечает ID 11F.
Всегда одинаково. 0x30,0x0,0xA.
Проверил и для BAND и для LIST. Вот только нажимая на кнопки 1-6 (BAND) меню начало на планшете работать, а на LIST нет. И ни чего интересного в логе не вижу...
Короче копаем дальше...

PS. Кто там интересовался как ловить сообщения из кана? :)
Вот примерно так:
<293,10,D,10,1,0,10,20,38,>
<287,30,0,A,>
<293,21,37,2E,39,46,4D,20,90,>
<305,81,0,0,0,0,>
<223,10,0,70,>
<357,C0,C0,10,0,>
<805,0,1,0,>
<359,9,6,FF,FF,7F,FF,0,0,>
<305,81,0,0,0,0,>
<493,10,>
<357,C0,C0,10,0,>
<613,91,80,A,0,>
<1312,1,0,0,0,1,0,0,0,>
<997,0,0,0,0,0,0,>
<359,9,6,FF,FF,7F,FF,0,0,>
<305,81,0,0,0,0,>
<357,C0,C0,10,0,>
<359,9,6,FF,FF,7F,FF,0,0,>
<305,81,0,0,0,0,>
<480,50,0,A2,80,A0,>
<357,C0,C0,10,0,>
<359,9,6,FF,FF,7F,FF,0,0,>
<347,7,0,0,0,0,0,0,0,>
<305,81,0,0,0,0,>
<421,F2,>
<933,1,FF,FF,FF,7F,0,>
<357,C0,C0,10,0,>
<485,3F,3F,3F,3F,3F,40,F,>
<869,45,31,1B,0,0,>
<677,20,4C,69,6B,65,46,4D,20,>
<359,9,6,FF,FF,7F,FF,0,0,>
<549,A0,10,10,2,F6,>
<305,81,0,0,0,0,>
<223,10,0,70,>
<357,C0,C0,10,0,>
<359,9,6,FF,FF,7F,FF,0,0,>
<805,0,1,0,>
<305,81,0,0,0,0,>
Это как раз попытка посмотреть что идёт ещё. При точно таком же начале банды открываются. Значит есть ещё что-то при помощи чего открывается list of station.
ID тут в DEC

T_r_D
01.04.2016, 11:17
Так, разобрался с мультифреймом радиотекста без дисплея.
Ответ на первый пакет мультифрейма он требует по ID 0х9F, тоесть не по 11F.
Код вот

unsigned char DisplayAcknowledg[3] = {0x30,0x0,0xA};


if(bitRead(DATA[21],5) == 1) //A4 /164
{
if ((buf[0] >> 4) == 0x01){
LengthR = ((buf[0] & 0x0F) * 256 + buf[1]) - 6;
DataBufSizeR = 98;
DATA[96] = buf[6];
DATA[97] = buf[7];
CAN.sendMsgBuf(0x9F, 0, 3, DisplayAcknowledg);
}

if(((buf[0] >> 4) == 0x02) && LengthR > 0) {
if (LengthR > 7)
{
for (int i=0; i < 7;i++) DATA[i + DataBufSizeR] = buf[i+1];
DataBufSizeR = DataBufSizeR + 7;
LengthR = LengthR - 7;
}
else{
for (int i=0; i < LengthR;i++) DATA[i + DataBufSizeR] = buf[i+1];
LengthR = 0;
}
}
}

T_r_D
01.04.2016, 14:05
Всё, разобрался я со всем.
Дисплей для магнитолы, по крайней мере, сэмулирован.

Осталось написать своё меню по кнопке MENU которое я оставлял на потом и собственно магнитола и планшет подружены на 100%.

Дальше пойдут тесты в машине.

UPD.
А не всё так просто :)
Всё вроде работает, но надо посмотреть иерархию меню, пока был дисплей меню друг друга не перекрывали потому что дисплей закрывал старое меню при открытии нового или просто не давал новому у которого приоритет ниже открываться, но я-то это не отслеживал. Так что теперь придётся это отслеживать самому. Например окно громкости стало закрываться через полторы секунды и пытаться перекрыть другие меню, хотя не должно появляться вообще когда другие меню открыты, окна настройки звука закрываются через те же полторы секунды даже если что-то меняешь. Ну короче много мелких и неприятных косячков.
Самопальное меню дописано на 90%.

Но как атомный ледокол "Ленин" идём к светлому будущему :)

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

Вот ссылка на видео того чего достиг.
https://www.dropbox.com/s/2gdlaqvyvdpdst5/VID_20160402_175233.3gp?dl=0

sisoft
05.04.2016, 02:16
Приветствую.

Тоже решил наконец заняться темой интеграции планшета в машину. С мультимедией простой на андроиде всё понятно, но без интеграции с кан шиной было бы не интересно.
машина - Citroen C4 (B5). покупать за 30к готовый планшет с рамкой у китайцев - не интересно. тем более что валяется их дома уже несколько ненужных.

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

В итоге притащил домой дисплей, кан поднялся, но дисплей молчал как партизан, бурно реагируя лишь на ид 0x36. Вернулся в машину, записал дамп зажигания, дома его проиграл дисплею - и чудо, всё работает.
выяснил, что для его зажигания достаточно идов 36 и 165 и дальше в таком виде и экспериментировал, добавляя разный 3й ид в цикл. почитал все сообщения существующие и т.п. (не просто почитал - немного новой информации добавил в https://github.com/sisoftrg/autowp.github.io). Как-то так: https://drive.google.com/file/d/0B3NcGmoJmyxzQVFsNFdBMGZXazA/view?usp=sharing :)

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

T_r_D, планируется ли как-то открыть результаты наработок? имею в виду приложение для андроида.

T_r_D
05.04.2016, 06:57
Все результаты получены при помощи открытого кода который в данной теме я указывал.
Так что каждый может его взять и писать на его основе любые интерфейсы и функционал.

Свой дройдокод я открывать не планирую.

И не поленитесь прочитать эту тему, просто так слать сообщения на дисплей не имеет особого смысла.
Есть такие состояния отображения при которых нужно задействовать более одного id.
Весь нужный и не особо нужный функционал описан в том месте куда вы сейчас добавляете информацию и в этой теме.

Заменить дисплей планшетом полностью можно только проанализировав его поведение совместно с магнитолой и для одного единственного меню с машиной.

Скетч для выуживания из кана 90% нужных id и информации из них тут представлен. В нём есть почти вся информация отображаемая штатным дисплеем. Так что нет смысла проводить какие либо ещё исследования.
Всё остальное возможно только при эмуляции дисплея и его выкидыванием.

autowp
05.04.2016, 21:29
Приветствую....

Pull request'ить будете?
Если нет, то не возражаете, если мы будем это делать?

Dmitry8
05.04.2016, 21:58
в итоге первый день ушёл на аппаратную часть (рисовал\травил\паял драйвер, искал что-бы заюзать под контроллер и т.п.)
Ну а чтобы желающие повторить подвиг не наступали на грабли, есть готовое решение (http://pccar.ru/showthread.php?t=24067)

sisoft
05.04.2016, 22:04
Свой дройдокод я открывать не планирую.

в основном это и интересовало. значит буду пробовать велосипедить своё, на Go mobile.

Pull request'ить будете?
Если нет, то не возражаете, если мы будем это делать?
да, обязательно. просто думал сначала насобирать побольше, но пока до выходных видимо железо трогать не буду (некогда), запулю что есть. а в выходные соберу на столе уже и дисплей и магнитолу.

свою схемотехнику и код думаю тоже опубликую, как (и если) что-то интересное получится %)


Ну а чтобы желающие повторить подвиг не наступали на грабли, есть готовое решение (http://pccar.ru/showthread.php?t=24067)
да, для начинающих отлично. но я не любитель ардуин, а самое главное - в ближнем доступе небыло mcp2515, а заказывать - опять ждать. руки чесались начать с тем, что есть :)

autowp
05.04.2016, 22:16
...

А как вы F103ю серию так применили, у неё же вроде одновременная работа Usb и can невозможна из-за того, что они делят один и тот же участок памяти.
UART?

sisoft
05.04.2016, 22:40
А как вы F103ю серию так применили, у неё же вроде одновременная работа Usb и can невозможна из-за того, что они делят один и тот же участок памяти.
UART?

да, заметил такое ограничение в документации. но на этой плате есть pl2303, так что настроил уарт на 460800 что бы гарантированно влез весь трафик в декодированном текстовом виде и пока этим доволен. далее видимо логику разбора сообщений помещу в прошивку, а наружу буду отдавать только полезные изменения. наподобии того, как сделано в имеющемся здесь скетче от T_r_D.

Dmitry8
05.04.2016, 22:47
далее видимо логику разбора сообщений помещу в прошивку
Мы пошли по другому пути: для обмена используем протокол lawicel (https://github.com/autowp/arduino-canhacker/blob/master/docs/ru/protocol.md) и отправляем все что есть. Так, мне кажется, удобнее дорабатывать софт, чтобы не править прошивку и приложение одновременно. Трафик в нашей шине порядка 40 Кбит/с, не так уж много, можно и "погонять".

T_r_D
06.04.2016, 08:39
Dmitry8 вам не нужно ни чего делать под конкретные задачи, у вас просто анализатор трафика.
Для конкретной задачи прощен нагрузить контроллер чем делать всё на стороне планшета.

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

sisoft нужно использовать 105 иначе будут пропуски пакетов что не есть хорошо.
А с кодом- поосмотрели бы сначала на исходник который я использую и потом уже велосипедели.
Там ни чего сложного нет и база хорошая для своей программы.

Dmitry8
06.04.2016, 09:28
Dmitry8 вам не нужно ни чего делать под конкретные задачи

Откуда Вам знать что нам нужно?


Для конкретной задачи прощен нагрузить контроллер чем делать всё на стороне планшета.

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

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

Интересно о каких косяках речь? Если Вы собрались критиковать плату - делайте это конструктивно.

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

Если Вы имели в виду TJA1050 , то данный драйвер относится к HS-CAN трансиверам и неприменим в сети устройств CAN-INFO автомобилей PSA. Нами же были изучены даташит на TJA1055 (http://cache.nxp.com/documents/data_sheet/TJA1055.pdf?fpsp=1&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf) , который является FT-CAN драйвером и Application Notes Fault-tolerant CAN transceiver (http://cache.nxp.com/documents/application_note/AH0801.pdf?fpsp=1&WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf)
После изучения данных документов от производителя и была составлена наша схема. К тому же устройство , выполненное по данной схеме безотказно работает у меня в машине уже год.

T_r_D
06.04.2016, 11:06
Откуда Вам знать что нам нужно?


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

Интересно о каких косяках речь? Если Вы собрались критиковать плату - делайте это конструктивно.

Если Вы имели в виду TJA1050 , то данный драйвер относится к HS-CAN трансиверам и неприменим в сети устройств CAN-INFO автомобилей PSA. Нами же были изучены даташит на TJA1055 (http://cache.nxp.com/documents/data_sheet/TJA1055.pdf?fpsp=1&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf) , который является FT-CAN драйвером и Application Notes Fault-tolerant CAN transceiver (http://cache.nxp.com/documents/application_note/AH0801.pdf?fpsp=1&WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf)
После изучения данных документов от производителя и была составлена наша схема. К тому же устройство , выполненное по данной схеме безотказно работает у меня в машине уже год.

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

И раз мне не знать что ВАМ нужно, прошу удалиться с обсуждением своих потребностей и коммерческого использования ВАШИХ произведений искусства в свою тему и там всё это обсуждать.
Досвидания

Dmitry8
06.04.2016, 11:42
Вы деньги хотите заработать,

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

а я вам должен в этом помочь?

Боже упаси.

Ну как бы не логично.

Согласен.

И раз мне не знать что ВАМ нужно, прошу удалиться с обсуждением своих потребностей и коммерческого использования ВАШИХ произведений искусства в свою тему и там всё это обсуждать.
Досвидания
Просто Вы в ЭТОЙ теме называете нашу плату "кривой", причём безосновательно, потрудитесь объяснить в чем "кривость". Я же ничего не говорю про ваш "код". Если есть ошибки - укажите на них, чтобы другие их не повторяли. Может выложите свою "не кривую" плату, чтобы все могли увидеть "как надо"?

Что касается моего присутствия в этой теме, так я имею полное право читать/писать в ней, как и другие участники форума. Заметьте, от меня в этой теме ни разу не прозвучало предложение о продаже чего-либо, поэтому ваше утверждение о коммерческом использовании здесь неуместно.

autowp
06.04.2016, 12:26
> Для конкретной задачи прощен нагрузить контроллер чем делать всё на стороне планшета.

Использование какого-то существующего протокола не противоречит возможности "не принимать в планшет лишнее". В протоколе lawicel, например, есть фильтр.
Свой протокол конечно проще, но мне кажется это резко снижает применимость и повторное использование (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D 0%B5_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0 %BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0% B4%D0%B0)

Мне совершенно не нравится протокол canhacker/lawicel по массе признаков, но ... а впрочем к этому надо придти самому.

> ВАШИХ произведений искусства
> Вы деньги хотите заработать, а я вам должен в этом помочь?

Однако наши "произведения искусства" лежат в открытом доступе и готовы к критике
И схемотехника (https://github.com/autowp/CANreader/blob/master/docs/i/canreader-ft.sch.png), и прошивка (https://github.com/autowp/arduino-canhacker), и код андроид-приложения (https://github.com/autowp/CANreader).
А ваши "научные изыскания" природа еще не видела, и, судя по тексту, деньги вы на этом зарабатывать не планируете, а значит есть иные причины скрывать всё это.
Моя версия: вам стыдно.

Но я могу и ошибаться

xmetal
06.04.2016, 13:01
T_r_D можно понять, ветка не коммерческая, зачем рекламировать свои продукты тут, есть же купля/продажа.

autowp
06.04.2016, 13:02
T_r_D можно понять, ветка не коммерческая зачем рекламировать свои продукты тут, есть же купля/продажа.

Никто ничего не предлагает, с чего вы взяли? Где?
Схемы - бесплатные
Прошивки - бесплатные, код открыт
Программа - бесплатная, код открыт

xmetal
06.04.2016, 13:08
autowp, пост 271.

Dmitry8
06.04.2016, 13:19
xmetal, там нет ни слова о продаже, в теме на которую ссылка этого тоже нет.
Зато есть неадекватные высказывания в #276. Ну пусть ответит: в чем "кривость"? Пусть предложит свой вариант.

xmetal
06.04.2016, 13:31
"Готовое решение" подразумевает: платишь - получаешь готовое. Тема съезжает в оффтоп.

T_r_D
06.04.2016, 13:33
Dmitry8
Я достаточно ёмко ответил.
Нет моего варианта. Есть правильный вариант который задуман и реализован компанией Citroen для своего продукта и кривой.
Я написал что надо открыть готовую железку от Citroen и посмотреть что там сделано.

Ну если у вас всё не коммерческое, то где я могу забрать десяток моих новых плат которые по ссылке "готовое решение" бесплатно?

PS.
Про даташит забыл
To prevent a false local wake-up during an open wire at pin WAKE, this pin has a weak pull-up current source towards VBAT. However, in order to protect the transceiver against any EMC immunity issues, it is recommended to connect a not used pin WAKE to pin BAT.

Dmitry8
06.04.2016, 13:55
Dmitry8

PS.
Про даташит забыл
To prevent a false local wake-up during an open wire at pin WAKE, this pin has a weak pull-up current source towards VBAT. However, in order to protect the transceiver against any EMC immunity issues, it is recommended to connect a not used pin WAKE to pin BAT.


И чего? Тут написано: во избежание ложного пробуждения из-за неподключенного пина WAKE , этот пин должен быть "подтянут" резистором на VBAT.
Данная рекомендация выполнена (на схеме R2).
К тому же в схеме не используется "режим сна".

T_r_D
06.04.2016, 14:15
И чего? Тут написано: во избежание ложного пробуждения из-за неподключенного пина WAKE , этот пин должен быть "подтянут" резистором на VBAT.
Данная рекомендация выполнена (на схеме R2).
К тому же в схеме не используется "режим сна".
this pin has a weak
1к- не сильно так...

Так где я могу забрать или как получить мои бесплатные платы?
Чего на этот вопрос не отвечаете-то?

Dmitry8
06.04.2016, 14:26
this pin has a weak
1к- не сильно так...

Не понимаю что вы имеете в виду
Смотрим в апноут (http://cache.nxp.com/documents/application_note/AH0801.pdf?fpsp=1&WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf) на стр. 22 находим схему, а на стр. 28 рекомендацию: "The recommended range for the series resistor being attached to the supply pin BAT is 1k
to 2k."

T_r_D
06.04.2016, 14:29
Не понимаю что вы имеете в виду
Смотрим в апноут (http://cache.nxp.com/documents/application_note/AH0801.pdf?fpsp=1&WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf) на стр. 22 находим схему, а на стр. 28 рекомендацию: "The recommended range for the series resistor being attached to the supply pin BAT is 1k
to 2k."

Rpull резистор 180к просто так там да?

Чо про платы-то?

autowp
06.04.2016, 14:30
this pin has a weak
1к- не сильно так...

Так где я могу забрать или как получить мои бесплатные платы?
Чего на этот вопрос не отвечаете-то?

Зачем вы передергиваете? Бесплатных плат тут никто не предлагал.
Я за свой счёт вам ничего заказывать не имею желания.

И наша, и ваша бесплатность одинакова - ничего материального мы оба не раздаем. Однако мы "немного бесплатнее", потому что выкладываем коечто нематериальное, в отличии от вас.

autowp
06.04.2016, 14:33
Rpull резистор 180к просто так там да?

180К там на схеме "With local wake-up switch", а рядом схема "No local wake-up implemented" и именно она должна рассматриваться.
Рекомендую открыть любой девайс из машины и срисовать схему, там никаких кнопок нет.

Всё таки не понятно, почему мы до сих пор не видим вашей схемы?

sisoft
06.04.2016, 22:41
sisoft нужно использовать 105 иначе будут пропуски пакетов что не есть хорошо.

можно узнать причину возможных пропусков?

Мы пошли по другому пути: для обмена используем протокол lawicel (https://github.com/autowp/arduino-canhacker/blob/master/docs/ru/protocol.md) и отправляем все что есть.

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


а по поводу резистора на Wake спор напрасный. единственное, что явно следует из даташита и апноута - что его номинал не должен превышать 180к. это может быть даже просто прямое соединение с BAT, если функционал спячки не используется. на работу точно не влияет.

Dmitry8
07.04.2016, 08:27
универсальность конечно хорошо, но пока её просто некуда применить.

Универсальность можно применить, например, используя свой девайс с канхакером(приложение для Win), очень удобно.

sisoft
10.04.2016, 23:04
В эти выходные собрал уже систему из радио, дисплея и трансивера (адаптера). В трансивер добавил опциональную генерацию зажигания (ид 0х36) и спокойно наблюдал за шиной при действиях с радио.

Начал велосипедить симулятор дисплея на Kivy. пока пассивный, слушающий только пакеты от радио. соответственно без меню (т.к. его генерирует сам дисплей) и данных от бси.
Внешний вид 1-в-1 скопирован с оригинала - так проще сравнивать что кажет один и другой дисплеи и видеть разницу %)
скрин: http://i.imgur.com/9St7OQH.png


основная масса наработок тут: https://github.com/sisoftrg/citrocan
будет дополняться по мере наличия времени, желания вытаскивать всё это хояйство из машины и прогресса в изучении.

T_r_D
11.04.2016, 08:32
sisoft посмотри в скетче последнем. Там есть все id которые отображает дисплей. С меню настроек аудио,громкости, pty, радио лист, треклист(без cd text- сколько болванок пепрепортил и не разу не пролучилось записать его), а так же надпись please wait и pty XXX not found (или как-то так).
Кстати найти бы id от БСИ... Там должно приходить списком все функции которые поддерживает машина. Ну тоесть битами в байте. Так как ответ генерирует сам дисплей когда меняешь настройки.
Я этим займусь как допилю окончательно программную часть для работы без дисплея. Там на самом деле много нюансов как оказалось.

А в 103 там же одини и те же пины под кан и юсб. Поэтому возможно попасть в передачу кана когда шлёш в юсб. Или их можно разнести? Даташит не очень изучал на самом деле.

sisoft
11.04.2016, 13:27
скетч (который был здесь страниц десяток назад) абсолютно неиформативен, он по сути занимается перекладыванием данных из одних байтов\битов в другие, дальнейший разбор в программе, которая не опубликована.

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

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

в 103 я усб не использую, поэтому проблема не актуальна. уарта более чем достаточно.

T_r_D
11.04.2016, 19:20
sisoft дройд просто отображает инфу и всё. Всю работу делает ардуина.

По сути в дройде только куча текствью которые отображают инфу и всё.
А, ну ещё пересчитывает по формулам данные типо скорости и частоты радио.

T_r_D
12.04.2016, 23:46
Интересно, а есть ли в FT кане напряжение аккума?

PS. Вроде всё написал что хотел, дисплей сэмулировал полностью. В главное меню осталось только конфиг машины добавить. Так что на выходных иду снимать дисплей и тестировать сброс трипа и пытаться найти ID в котором опции машины присутствуют. Дисплей кстати на них отвечает по ID 15B. Когда включаешь и выключаешь.

sisoft
13.04.2016, 00:39
Напряжение точно есть в канах, но именно в этом неизвестно. Найти будет точно не просто, т.к. во 1х оно с большой вероятностью будет с каким-то множителем, во 2х им сложно манипулировать для поиска реакции, в 3х нигде не выводится. Проще сюда же на свой контроллер завести и померить, ацп'шники всё равно не заняты.

Сегодня снял домой на стол модуль управления климатом. Автономно работает не полноценно - не видит кондёра, не включается авто-режим. но как минимум пометил его айдишники и вытащил что смог покрутить %) дублировать показания на планшет уже можно, а вот можно ли управлять - пока не понятно.

T_r_D
13.04.2016, 12:41
Вечером домой приеду и дам инструкцию как с эмулировать дисплей.

С кондишеном интересно- id выложить чтоль. Заменить блок было бы хорошо.

По поводу напряжения- есть идеи. Попробую реализовать

T_r_D
13.04.2016, 23:49
Вот описание ID DF


За открытие меню отвечает второй байт.
50HEX 0101 0000 закрыто
70HEX 0111 0000 открыто

Первый байт отвечает за выбор элемента.
Отображает выбраный элемент в реальном времени если меню вызвано через OK
или последний элемент с которым производились действия если меню вызвано через MENU.
При повторном входе в меню любой кнопкой сбрасывается на первый элемент.
(Реальное положение храниться в дисплее).
1HEX 00000001 Alternative frequencies
3HEX 00000011 Regional mode (00000010, но не включается без RDS)
24HEX 00100100 Radio-text information
41HEX 01000001 Track Intro
42HEX 01000010 Track random play
43HEX 01000011 CD Repeat

Нулевой байт отвечает сразу за 2 функции.
при неактивном меню
10HEX 00010000 любое меню кроме основного (в том числе и настройки аудио)
11HEX 00010001 элемен был деактивирован
12HEX 00010010 элемент был активирован
при активном
90HEX 10010000 основное меню
91HEX 10010001 элемент был активирован - передаётся во время нажатия OK. И код элемента в первом байте
92HEX 10010010 элемент был деактивирован - передаётся во время нажатия OK. И код элемента в первом байте

ID ни как не реагирует на открытие BAND!!! (то меню которое по кнопкам 1-6)

для активации функции надо посылать
12,код элемента,50
для деактивации функции надо посылать
11,код элемента,50

стандартные посылки
Меню закрыто 10,0,50
любое меню открыто 10,0,70
основное меню открыто 90,0,70

Тоесть сначала отлавливаем от магнитолы открытие меню, ну например PTY
Это ID 265 ,байт 1, бит 6.
как только появляется в этом бите 1, то нужно каждые 100мс начинать генерировать в шину 10,0,70.
Иначе не будут работать кнопки навигации на магнитоле, а будут так же управлять или радио или воспроизведением как при закрытом меню.

sisoft
14.04.2016, 02:21
Хорошо. только автономно дисплейное меню содержит меньше пунктов, чем в машине. видимо из бси передаётся информация о конфигурации, в соответсвии с которой дисплей подстраивает своё меню. описанные выше пункты - как раз из автономного режима. те, поддержку которых ещё в каком-то сообщении заявило радио. тоже надо будет найти.

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

тем временем мой симулятор полностью симулирует всё, кроме менюшек всплывающих.
оригинал радио: http://i.imgur.com/XWgY7e7.png, клон: http://i.imgur.com/aOcDhH8.png
оригинал цд: http://i.imgur.com/M3r3OlB.png, клон: http://i.imgur.com/7iSZE4y.png

T_r_D
14.04.2016, 08:38
sisoft
Думаешь что пункты меню передаются в дисплей?

Тогда надо искать мультифрейм.

Почему ты думаешь что пунктов содержится в дисплее меньше?
Думаешь есть отдельный ID который который посылает магнитола говоря какие ей нужны пункты?

sisoft
14.04.2016, 11:24
нет-нет, я не сказал что они передаются в дисплей. я имел в виду, что туда передаётся битовая маска имеющихся функций. причём возможно не одна - бси отдаёт свои функции, радио свои, может ещё кто-то участвовать - на этой шине много девайсов. сами сообщения зашиты в дисплее.

T_r_D
14.04.2016, 12:58
А, ну тогда у нас мысли схожи.
Правда от магнитолы я не предполагал что есть такой пакет

T_r_D
15.04.2016, 00:42
А может кто встречал терминал который может слать строки из файла в COM порт с задержкой?
Хочу хитро кормить снятый лог с машины дисплею.

autowp
15.04.2016, 00:51
А может кто встречал терминал который может слать строки из файла в COM порт с задержкой?
Хочу хитро кормить снятый лог с машины дисплею.

CanHacker

T_r_D
15.04.2016, 13:54
А интересный вопрос- для ченджера рандом,репит, иинтро в ответах по df имеет другие значения или цд и ченджер прользуют одни настройки?
Веди стаптус этих функций унитх в разных id

alpetgor
18.04.2016, 22:42
Добрый день. Хочу прочитать VAN шину в citroen c5 (2002) - не подскажете может где-то уже обсуждалось это, пока не могу ничего найти. Нужно считать нажатие кнопок управления магнитолой. Есть arduino uno, плата mcp2515_can.

T_r_D
19.04.2016, 19:48
alpetgor
Старая шина.
Нужно найти как к ней подключится, тоесть какой контроллер нужен для этого, ну а далее копать протокол.
По ПСА вообще мало какой либо инфы.

T_r_D
21.04.2016, 13:27
Итак, продолжаем.
Чтоб магнитола видила дисплей в шину нужно слать ID 0x167.
А чтоб сбросить трип нужно слать в этот ID в нулевой байт 8 и состояние дисплея.
Тоесть.
Дисплей без удержания кнопки трипа 0x9,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0
А с удержанием кнопки 0x89,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0

Сама кнопка находится в ID 0x221 ,байт 0 бит 3:
Код выглядит так:

unsigned char DisplayTripReset[8] = {0x89,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0};
if (bitRead(buf[0],3) == 1) KeyCount = KeyCount + 1;
if (bitRead(buf[0],3) == 0) KeyCount = 0;
if (KeyCount > 1) CAN.sendMsgBuf(0x167, 0, 8, DisplayTripReset);

При удержании кнопки этот ID повторяется раз в секунду!

Надо ещё проверить реакцию на 8А, а то реальный дисплей только при значении А и С отзывается на кнопку трипа.
Но похоже важен только последний бит в 0 байте.

Как вы уже поняли я это оттестировал в машине.
Всё работает. Осталось найти меню самой машины и проект с заменой дисплея будет завершён.
Дальше буду делать умный БП для планшета, но это уже не относиться к данной теме.

T_r_D
22.04.2016, 16:29
Снял лог, прокрутил дома его. Толи я чо-то не доснимал, толи хз.
Нету показаний опций машины!

sisoft
23.04.2016, 20:42
Есть они, точно. Вчера в пробку попал, пока стоял покрутил всё что знаю что бы сравнить с тем, что получал на столе и, соответственно, что приходит извне (из бси).

в итоге получилось как-то так:
- больше опций в меню (включать задний дворник при ЗХ и т.п.)
- статус функций (включены ли блокировка дверей, пассажирские подушки и т.п.). он был и на столе, но пустой.
- журнал предупреждений (на столе его не находил, даже после посылания ошибок)
- меню настройки многофункциональной клавиши (которая на руле рядом с рециркуляцией)


в целом пока был занят, так что больше ничего не копал. зато приехала рамка под планшет, так что продолжение уже скоро %)

T_r_D
25.04.2016, 05:12
Есть они, точно. Вчера в пробку попал, пока стоял покрутил всё что знаю что бы сравнить с тем, что получал на столе и, соответственно, что приходит извне (из бси).

в итоге получилось как-то так:
- больше опций в меню (включать задний дворник при ЗХ и т.п.)
- статус функций (включены ли блокировка дверей, пассажирские подушки и т.п.). он был и на столе, но пустой.
- журнал предупреждений (на столе его не находил, даже после посылания ошибок)
- меню настройки многофункциональной клавиши (которая на руле рядом с рециркуляцией)


в целом пока был занят, так что больше ничего не копал. зато приехала рамка под планшет, так что продолжение уже скоро %)

Я тебя чего-то не совсем понял!
Ты нашёл ID который передаёт бси и в котором инфа об опциях?
Просто я знаю ID который передаёт дисплей.
Rew Wipe Activ/Inactiv
15B byte 5 208 activ/192 inactiv.
Но это дисплей передаёт статус функции, а откуда он узнаёт какие опции доступны я не нашёл.

А с рамкой всё просто. Нужно сделать пластину и просверлить 4 отверстия в стойках штатного крепления. Тут где-то фотки есть как я сделал.
Я тоже думал что будет быстро :) Фигушки!
Как только думаешь что всё- появляются косяки!
У меня почему-то пропуски пакетов идут жосткие. Ща наверное попробую сменить библиотеку для MCP.
А может просто из за места подключения в машине так происходит...
Так же день потратил на то, чтоб поставить USB HUB.
Но теперь при подключении хаба если в него вставлена и ардуина и флешка, то софтина думает что флешка тоже по её душу и хочет чтоб её назначили программой по умолчанию.
Короче косяк на косяке!
А ещё нужно всему этому питание организовать и управлять им!

PS А что за статус функций? Он у меня на однострочечном дисплеи вроде вообще не отражается.

sisoft
28.04.2016, 21:50
Нет, я пока не искал что-либо от бси, потому что возился без машины. я только знаю, что он есть :)
в принципе у меня есть дамп включения зажигания - попробую в нём покопаться, выфильтровав всё известное и поэкспериментировав с остальным. заниматься отладкой в машине будет менее удобно, поэтому к этой стадии хотел подойти с максимумом знаний и почти готовым софтом, что бы добивать там только данные от бси.

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

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

T_r_D
29.04.2016, 00:16
А штатный дисплей и не выключается! Он всегда работает.
По поводу буфера- идея интересная. Надо подумать. Я как-то это из вида упустил.

Про рамку- ну на оргстекле я плату же закрепил, потом там сооружу стенки и будет коробочка.

Лог я копал как раз. Выкинул всё известное и ни чего не вышло. Не появились пункты на столе. Надо ещё попробовать.

sisoft
29.04.2016, 00:43
дисплей тоже не всегда, только когда на шине активность есть, иначе в глубокой спячке.

сейчас собрал на столе опять дисплей+радио+трансивер, слазил в меню.
в меню трип компьютера только задание дистанции до цели и пустой статус функций, в меню персонализации конфигурация дисплея и смена языка.

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

статус функций это такой список: http://i.imgur.com/rKrIYkL.png
например упомянутая здесь esp выключается отдельной физической кнопкой и статус прилетает сюда явно от бси.


update: всё нашёл. ид 120 добавляет журнал предупреждений, 2e1 - статус функций, 361 - настройки машины, плюс ещё некоторые мелочи. позже оформлю в описание.

T_r_D
29.04.2016, 15:19
2E1 статус функций

byte 0
00000001 Automatic door locking deactivated
00000011 Automatic door locking activated
00000100 Automatic headlamp lighting deactivated
00001100 Automatic headlamp lighting activated
00010000 Passenger's airbag deactivated
00110000 Passenger's airbag activated
01000000 Parking assistance deactivated
11000000 Parking assistance activated

byte 1
00000001 Sport suspension mode activated
00000010 Sport suspension mode deactivated
00000100 Automatic screen wipe deactivated
00001100 Automatic screen wipe activated
00010000 ESP system deactivated
00110000 ESP system activated
01000000 Door unlocking performed
11000000 Door locking performed

byte 2
01000000 Child safety deactivated
11000000 Child safety activated

только 3 байта. С остальными 5 что не делал- ни чего не меняется.

Тоесть 2E1 это просто отображение информации? Изменить в этом меню ни чего нельзя?
Правильно понял?

А 361 это настраиваемые функции?

T_r_D
30.04.2016, 12:41
Поиграл я с 361 ID.

Добился только двух пунктов в каждом по подпункту:
Parking assistance
--->Activation of rear wiper in reverce gear

Lighting and signalling
--->Guide-me-home headlamps 60s

Parking assistance байт 3 равный 0х20
Lighting and signalling байт 2 равный 0х10

пробовал во всех шести байтах ставить значения 0х01, 0х02, 0х04, 0х08, 0х10, 0х20, 0х40, 0х80. Кроме этого ни чего не появилось.
Перебирать все значения чтоль теперь?
Знать бы хотябы сколько там пунктов может быть и сколько в них подпунктов.

UPDATE:
А параметры кстати сохраняются в дисплее!
И отдаёт он их по 0х15B.
байт 2
0х21 Дорожка к дому 15с
0х22 30с
0х24 60с
00100000 активность
00000011 биты время

байт 5
0х00 дворник не активен
0х10 дворник активен
00010000 активность.

T_r_D
30.04.2016, 12:46
Вот что нашёл, но это от DS4
Define the vehicle parameters

This menu allows you to activate or deactivate
the following equipment, classified in different
categories:
-
"Access to the vehicle" (see the "Access"
section):

"Plip action" (Selective unlocking of the
driver's door),

"Unlocking boot only" (Selective
unlocking of the boot).
"Driving assistance":

"Parking brake automatic" (Automatic
electric parking brake; see the "Driving"
section),

"Rear wipe in reverse gear" (Rear
wiper coupled to reverse gear; see the
"Visibility" section),

"Speeds memorised" (Memorising
speeds; see the "Driving" section).
-
"Vehicle lighting" (see the "Visibility"
section):

"Directional headlamps" (Main/additional
directional lighting),

"Daytime lights" (Daytime running lamps).
-
"Interior lighting" (see the "Visibility"
section:

"Follow-me-home headlamps"
(Automatic operation of headlamps after
switching off the ignition),

"Welcome lighting" (Exterior and interior
welcome lighting).

И ещё где-то на каком-то форуме

PERSONALISATION-CONFIGURATION Персонализация-Конфигурация

Define the vehicle parameters Определить параметры автомобиля

Parking assistance Помощь при парковке
---->Activation of rear wiper in reverse gear Активация заднего стеклоочистителя при включении ЗХ

Lighting and signaling Освещение и сигнальные огни
---->Automatic lighting of headlamp (вкл # выкл) Автоматическое включение головного света
---->Guide-me-home headlamp (вкл # выкл) Функция "дорожка к дому" minute таймер в минутах

Driving assistance Помощь при вождении
---->Directional headlamps (вкл # выкл) Поворот фар в зависимости от угла поворота колес

ТОесть если последнее это наше, то нету ещё одного пункта с подпунктом.

sisoft
30.04.2016, 23:04
да, примерно так. я тоже только два пункта нашёл в этом меню, но как минимум вышеупомянуте управление поворотными фарами в нём тоже должно быть, т.к. на такую конфигурацию как у меня они ставятся опционально, дисплей от этого конечно не меняется. может где-то в другом ид'е идёт, либо нужно сочетание 2 каких-то бит.

в 2e1 есть ещё два статуса в байте 2, биты 4 и 5:
10 - STOP - START system deactivated
30 - STOP - START system activated

T_r_D
01.05.2016, 07:27
Странно! Я сегодня проверю. Может реально пропустил, но вроде все проверял в 2Е1.

А ты перебирал все значения байтов в 361? А то я только чтоб еденица была в битах 0-7.
Ну вряд ли это идёт в другом месте. В этом id ещё места куча!

Надо искать тогда машину у которой стоит адаптивный свет и снимать лог если не в этом id.

А ты нашёл как отображать подпунктAutomatic lighting of headlamp (вкл # выкл)?
Я не нашёл!

UPD.
Проверил дома, посылаю 2Е1 00 00 10 00 00 00 00 00
Пункт не появляется на дисплее!
попробовал слать FF FE FF FF FF FF FF FF
тоже не появился!
Ты шлёшь чисто этот ID или весь лог с машины?
Может на это влияет ещё какой ID?

Попробовал те же FF заслать в 361ID изменений тоже нет. Сколько пунктов было, столько и осталось.

T_r_D
02.05.2016, 16:17
И так, сегодня в машине я проверил.
Нету 2Е1!
Возможно он выдаётся только при определённом типе дисплея.
Проверю через пол часика...
Проверил- нет такого ID. Да и фиг с ним!

Но зато! Нашлось напряжение борт сети!
идёт оно в 0E6 байт 5.
Формула:
бит5 в DEC/20 + 7,20

Ну тоесть 0x00 соответствует напряжению 7,2В

T_r_D
06.05.2016, 12:35
Думаю что это одно из заключительных сообщений этой темы.
Я заканчиваю этот проект. Я с эмулировать полностью дисплей.
Осталось от тестировать всё в машине, причесать интерфейс дройда и сделать питание, но это уже не в этой теме.

Спасибо всем кто помогал!

PowerMax
06.05.2016, 17:40
не за что)

Garen
10.05.2016, 11:32
А я вот ищу решение чтобы ничего не пилить, планшет под нужный размер пока найти не удалось.

T_r_D
11.05.2016, 13:44
А вот кстати скетч финальный.

#include <SPI.h>
#include "mcp_can.h"
#include <EEPROM.h>

MCP_CAN CAN(10);
unsigned char len = 0;
unsigned char buf[8];
INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные
unsigned long time0 = -120;

//RDS
int digit1, digit2;

uint8_t DATA[162], DATA2[162] = {};
boolean Flag = false;
boolean Flag2 = false;
int Count = 0;
int Count2 = 0;
int FMS = 0;
int VolCount = 5;
int arrcmp;
boolean Compare = false;

//Menu
boolean Activate = false;
boolean Once = true;
unsigned long time1 = 0;

//Multiframe
int LengthP;
int DataBufSize;
int Scroll = 0;
uint8_t MULTIFRAMEFTMP[3], MULTIFRAMETMP[54], MULTIFRAME[55] = {};
//Multiframe RDTxT
//Package length: 64
int LengthR;
int DataBufSizeR;

int KeyCount = 0;

unsigned long time2 = 0;
unsigned char Ignition[8] = {14, 0, 0, 0x0F, 1, 0, 0, 16}; //Зажигание 0x036
unsigned char DisplayAtOnce[8] = {0x25,0xA,0xB,0x4,0xC,0x1,0x20, 0x11}; //Один раз при старте 0x5E5
unsigned char Display[8] = {0xA,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0}; //Дисплей в режиме трипа (0bit A) 0x167
unsigned char DisplayCloseMenu[3] = {0x10,0x0,0x50}; //Дисплей в режиме не открытого меню 0xDF
unsigned char DisplayOpenMenu[3] = {0x10,0x0,0x70}; //Дисплей в режиме открытого меню 0xDF
unsigned char DisplayOpenMMenu[3] = {0x90,0x0,0x70}; //Дисплей в режиме открытого Main Menu 0xDF
unsigned char DisplayAcknowledg[3] = {0x30,0x0,0xA}; //Ответ дисплея на мультифрейм 11F
unsigned char DisplayTripReset[8] = {0x8A,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0}; //Дисплей в режиме трипа (0bit A). Сброс трипа. 0x167 (сброс работал при 89 проверить с А).
unsigned char DisplayCarOpt[8] = {0x01, 0x03, 0x92, 0x40, 0x00, 0, 0x00, 0x10};
void setup()
{
Serial.begin(230400);
pinMode(9, INPUT);
CAN.begin(CAN_125KBPS,MCP_16MHz);
CAN.sendMsgBuf(0x5E5, 0, 8, DisplayAtOnce);
DATA[14] = 0x20;
// 01 03 92 40 00 C0 00 10
//byte5 for 0x15B C0- Rear wipe inactive, D0 - active

if (EEPROM.read(0) == 0xC0) bitWrite(DATA[161],1,0);
if (EEPROM.read(0) == 0xD0) bitWrite(DATA[161],1,1);
DisplayCarOpt[5] = EEPROM.read(0);
}

void loop()
{
//************************************************** *********
if ((millis() - time2) > 100){
CAN.sendMsgBuf(0x036, 0, 8, Ignition); //Это пакет зажигания.
CAN.sendMsgBuf(0x167, 0, 8, Display);
CAN.sendMsgBuf(0x15B, 0, 8, DisplayCarOpt);

if(bitRead(DATA[30],1) == 1 ||
bitRead(DATA[30],5) == 1 ||
bitRead(DATA[30],7) == 1 ||
bitRead(DATA[36],6) == 1 ||
DATA[15] != 0) {
DATA[14] = 31;
if (bitRead(DATA[36],6) == 0) CAN.sendMsgBuf(0xDF, 0, 3, DisplayOpenMenu);
else CAN.sendMsgBuf(0xDF, 0, 3, DisplayOpenMMenu);
}
else CAN.sendMsgBuf(0xDF, 0, 3, DisplayCloseMenu);
time2 = millis();
}
//************************************************** *********
if ((millis() - time1) == 10000) bitWrite(DATA[36],6,0); //Таймаут главного меню.


if(!digitalRead(9)) // пин 9 можно переназначить
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();

switch(canId){
//____________________________MULTIFRAME____________ ______________________
// if ((buf[0] >> 4) == 0 // Single frame
// if ((buf[0] >> 4) == 0x01 // First Frame
// if ((buf[0] >> 4) == 0x02 // Consecutive Frame
//Length длин дальше идущего пакета не считая этого первого.
case 0x125: // 293DEC 125HEX
if (buf[0] == 1) { //Выход из меню
bitWrite(DATA[30],5,0);
bitWrite(DATA[30],6,0);
bitWrite(DATA[30],7,0);
memset(MULTIFRAMEFTMP, 0, sizeof(MULTIFRAMEFTMP)); //Стираем что было в массиве.
memset(MULTIFRAMETMP, 0, sizeof(MULTIFRAMETMP));
memset(MULTIFRAME, 0, sizeof(MULTIFRAME));
for (int i=0; i<55; i++) DATA[i+41] = 0x00;
}
else {
if (buf[0] == 4) DATA[39] = buf[4]; //Позиция курсора в пределах экрана в меню LIST
if (buf[1] == 112 && buf[0] == 6){ // buf[1] == 112 или buf[0] == 6 Думаю что 6 это без мультифрейма List of track НЕ ДОДЕЛАН
bitWrite(DATA[30],1,0);
bitWrite(DATA[30],7,1);
bitWrite(DATA[30],5,0);
bitWrite(DATA[30],6,0);
bitWrite(DATA[36],6,0); //закрытие MENU
if (buf[4]!=16 && buf[4]!=19 &&
buf[4]!=64 && buf[4]!=65 &&
buf[4]!=66 && buf[4]!=67) DATA[39] = buf[4];
else {
if (buf[4] == 16 || buf[4] == 64) DATA[39] = 0x00;
if (buf[4] == 65) DATA[39] = 0x01;
if (buf[4] == 66) DATA[39] = 0x02;
if (buf[4] == 19 || buf[4] == 67) DATA[39] = 0x03;
}
if (buf[4] == 16) Scroll = 1; //Arrow up
if (buf[4] == 19) Scroll = 2; //Arrow down
if (buf[4] != 16 && buf[5] != 19) Scroll = 0;
DATA[40] = buf[3] + 0x01;
}

if ((buf[0] >> 4) == 0x01){
LengthP = ((buf[0] & 0x0F) * 256 + buf[1]) - 6;
DataBufSize = 0;
MULTIFRAMEFTMP[0] = buf[6];
MULTIFRAMEFTMP[1] = buf[7];
if (buf[1] == 13 || buf[1] == 22 || buf[1] == 31 || buf[1] == 40){ //List of station
FMS = 1; //При нажатии LIST. 13 одна строка, 22 две, 31 три, 40 четыре
if (buf[5] == 64 || buf[5] == 16) DATA[39] = 0x00;
if (buf[5] == 65 || buf[5] == 33) DATA[39] = 0x01;
if (buf[5] == 66 || buf[5] == 50) DATA[39] = 0x02;
if (buf[5] == 67 || buf[5] == 19) DATA[39] = 0x03;
if (buf[5] == 16) Scroll = 1; //Arrow up
if (buf[5] == 19) Scroll = 2; //Arrow down
if (buf[5] != 16 && buf[5] != 19) Scroll = 0;
}
if (buf[1] == 58){ //Band preset
FMS = 2;
if (buf[3] == 16) DATA[39] = 0x00;
if (buf[3] == 32) DATA[39] = 0x01;
if (buf[3] == 48) DATA[39] = 0x02;
if (buf[3] == 64) DATA[39] = 0x03;
if (buf[3] == 80) DATA[39] = 0x04;
if (buf[3] == 96) DATA[39] = 0x05;
Scroll = 0;
}
CAN.sendMsgBuf(0x11F, 0, 3, DisplayAcknowledg);
}

if(((buf[0] >> 4) == 0x02) && LengthP != 0) multiframef(); //проверка
if(((buf[0] >> 4) == 0x02) && LengthP == 0)
{
if (Scroll == 0){
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
for(int i=0;i<=51;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];}

if (Scroll == 1){ //Сдвиг вправо >>>>>
for (int i = 26; i>=0; i--) MULTIFRAME[i+9] = MULTIFRAME[i];
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
for (int i = 0; i<7;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];
}

if (Scroll == 2){ //Сдвиг влево <<<<<
for (int i = 0; i<=26; i++) MULTIFRAME[i] = MULTIFRAME[i+9];
MULTIFRAME[27] = MULTIFRAMEFTMP[0];
MULTIFRAME[28] = MULTIFRAMEFTMP[1];
for (int i = 0; i<7;i++) MULTIFRAME[i+29] = MULTIFRAMETMP[i];
}
for (int i=0; i<54; i++) DATA[i+41] = MULTIFRAME[i];
if (FMS == 1) {bitWrite(DATA[30],5,1); bitWrite(DATA[30],1,0); bitWrite(DATA[30],6,0); bitWrite(DATA[30],7,0);bitWrite(DATA[36],6,0);}
if (FMS == 2) {bitWrite(DATA[30],6,1); bitWrite(DATA[30],1,0); bitWrite(DATA[30],5,0); bitWrite(DATA[30],7,0);bitWrite(DATA[36],6,0);}
}
}
Compare = true;
break;
//___________________________MULTIFRAME RADIOTEXT_________________________
case 0xA4:
if(bitRead(DATA[21],5) == 1) //A4 /164
{
if ((buf[0] >> 4) == 0x01){
LengthR = ((buf[0] & 0x0F) * 256 + buf[1]) - 6;
DataBufSizeR = 98;
DATA[96] = buf[6];
DATA[97] = buf[7];
CAN.sendMsgBuf(0x9F, 0, 3, DisplayAcknowledg);
}

if(((buf[0] >> 4) == 0x02) && LengthR > 0) {
if (LengthR > 7)
{
for (int i=0; i < 7;i++) DATA[i + DataBufSizeR] = buf[i+1];
DataBufSizeR = DataBufSizeR + 7;
LengthR = LengthR - 7;
}
else{
for (int i=0; i < LengthR;i++) DATA[i + DataBufSizeR] = buf[i+1];
LengthR = 0;
}
}
}
Compare = true;
break;
//_________________________________TRIP_____________ ______________________
case 0xB6: //B6 182
DATA[0] = buf[0];DATA[1] = buf[1]; //(int)buf[0] << 5 | buf[1] >> 3; //Обороты
DATA[2] = buf[2];DATA[3] = buf[3]; //((int)buf[2] << 8 | buf[3]) / 100; //скорость
Compare = true;
break;
case 0x221: //HEX221 DEC545//(int)buf[1] << 8 | buf[2]; //моментальный расход / 10, если -1 то показаний нет
DATA[4] = buf[1];DATA[5] = buf[2];

//_________________/////////STEERING WEEL KEY_____________________
bitWrite(DATA[36],3,bitRead(buf[0],3)); //Кнопка на лепистке руля
if (bitRead(buf[0],3) == 1){ //Trip Reset
KeyCount = KeyCount + 1;
if (KeyCount > 1) CAN.sendMsgBuf(0x167, 0, 8, DisplayTripReset);
}
if (bitRead(buf[0],3) == 0) KeyCount = 0;
//__________________________________________________ ______________

Compare = true;
break;
case 0x2A1:
DATA[6] = buf[3];DATA[7] = buf[4]; //2A1 673 //(int)buf[3] << 8 | buf [4]; //Расход на 100км /10
DATA[8] = buf[0]; //Средняя скорость
DATA[9] = buf[1];DATA[10] = buf[2]; //(int)buf[1] << 8 | buf [2]; //Трип
Compare = true;
break;
case 0xF6:
DATA[11] = buf[6]; //0F6 //(buf[6] / 2) - 39; //246 F6//Температура
Compare = true;
break;
//______________________________ERROR MSG_________________________________
case 0x1A1:
if (bitRead(buf[2],7) == 1)
DATA[12] = 0x01;
else
DATA[12] = 0x00; //1A1 //417
DATA[13] = buf[1]; //buf[2]bit[1] X00000000 X=1 when SHOW 0R buf[0] 0x80(128) show, 0x7F(127) hide, 0xff(255) clear (default)
Compare = true;
break;
//________________________________BAT POWER_______________________________
case 0x0E6:
DATA[38] = buf[5];
Compare = true;
break;
//_________________________________VOLUME___________ ______________________
case 0x1A5: //421 1A5
if(bitRead(DATA[30],1) == 0 &&
bitRead(DATA[30],5) == 0 &&
bitRead(DATA[30],6) == 0 &&
bitRead(DATA[30],7) == 0 &&
bitRead(DATA[36],6) == 0 &&
bitRead(DATA[15],0) == 0) {

if (buf[0] <= 30){
DATA[14] = buf[0];
VolCount = 0;
}
else {
if (VolCount < 5) VolCount = VolCount +1;
else DATA[14] = 0x1F; //1A5
}
}
else DATA[14] = 31;

Compare = true;
break;
//__________________________Меню настройки аудио__________________________
case 0x1E5: //485 1E5
if (bitRead(buf[0],7) == 1 || bitRead(buf[1],7) == 1 || bitRead(buf[2],7) == 1 || bitRead(buf[4],7) == 1 ||
bitRead(buf[5],7) == 1 || bitRead(buf[5],4) == 1 || bitRead(buf[6],6) == 1){
if (bitRead(buf[0],7) == 1){DATA[15] = 0x01; DATA[16] = (buf[0] & 0x7F);}// - 63;} //BALANCE L/R ||логическое И с 01111111. Где 0 там всегда 0
if (bitRead(buf[1],7) == 1){DATA[15] = 0x02; DATA[16] = (buf[1] & 0x7F);}// - 63;} //BALANCE RR/FF
if (bitRead(buf[2],7) == 1){DATA[15] = 0x03; DATA[16] = (buf[2] & 0x7F);}// - 63;} //BASS
if (bitRead(buf[4],7) == 1){DATA[15] = 0x04; DATA[16] = (buf[4] & 0x7F);}// - 63;} //TREBLE
if (bitRead(buf[5],7) == 1){DATA[15] = 0x05; DATA[16] = bitRead(buf[5],6);} //LOUD
if (bitRead(buf[5],4) == 1){DATA[15] = 0x06; DATA[16] = bitRead(buf[5],2);} //AUTO VOLUME
if (bitRead(buf[6],6) == 1){DATA[15] = 0x07;
if ((buf[6] & 0x1F) == 3)DATA[16] = 1; //NONE ||//Логическое И c 00011111
if ((buf[6] & 0x1F) == 7)DATA[16] = 2; //CLASSIC
if ((buf[6] & 0x1F) == 11)DATA[16] = 3; //JAZZ-BLUES
if ((buf[6] & 0x1F) == 15)DATA[16] = 4; //POP-ROCK
if ((buf[6] & 0x1F) == 19)DATA[16] = 5; //VOCAL
if ((buf[6] & 0x1F) == 23)DATA[16] = 6; //TECHNO
}
}else DATA[15] = 0x00;
bitWrite(DATA[21],7,bitRead(buf[5],6)); //Значёк АКТИВНО ЛИ LOUDNESS
Compare = true;
break;
//_______________Включено или нет радио, источник на радио________________
case 0x165: //HEX165 DEC357
if (buf[0] == 192)DATA[17] = 0x01; else DATA[17] = 0x00; //ON/OFF
if (buf[2] == 16){DATA[17] = 0x02;} //Radio
if (buf[2] == 32){DATA[17] = 0x03;} //CD
if (buf[2] == 48){DATA[17] = 0x04;} //CD-Changer
if (buf[2] == 64){DATA[17] = 0x05;} //AUX 1
if (buf[2] == 80){DATA[17] = 0x06;} //AUX 2
if (bitRead(buf[0],5) == 1) bitWrite(DATA[18],7,1); else bitWrite(DATA[18],7,0); //Silence/Pause
Compare = true;
break;
//_________________________Банды и частота радио__________________________
//первые 2 меняются иногда, последнии 3 незнамо что (мусор или уровень сигнала),
//частота и мусор не пропадают при отключении магнитолы
case 0x225:
if(DATA[17] == 0x02) //HEX225 DEC549
{
DATA[19] = buf[3];
DATA[20] = buf[4];
DATA[31] = buf[1]; //Станция забита на кнопку 1-6, если 0, то не забита
bitWrite(DATA[18],0,bitRead(buf[2],4)); //FM1 //(int)buf[3] << 8 | buf[4];} //RFR = RFR / 20 + 50;
bitWrite(DATA[18],1,bitRead(buf[2],5)); //FM2
bitWrite(DATA[18],2,bitRead(buf[2],6)); //FM AST
if (bitRead(buf[2],4) == 1 && bitRead(buf[2],6) == 1)bitWrite(DATA[18],3,1); else bitWrite(DATA[18],3,0); //MW (int)buf[3] << 8 | buf[4];
bitWrite(DATA[18],4,bitRead(buf[0],2)); //PTY Scan. Show "PleaseWait". 0,2 показывает одно и то же?
//bitWrite(DATA[18],5,bitRead(buf[0],7)); //после поиска PTY 1- нашли, 0- нет.

if (bitRead(buf[0],2) == 1) Flag = true;
if (bitRead(buf[0],2) == 0 && Flag == true){ //ЭТО НАДО ТЕСТИТЬ!!! РЕАЛЬНО ЛИ ВСЕГДА ПОСЛЕ 2 ПАКЕТОВ ПРОИСХОДИТ ВЫВОД ИНФОРМАЦИИ О ТОМ, НАШЛИ ИЛИ НЕТ PTY .
Count = Count + 1;
if (Count > 2){
if (bitRead(buf[0],7) == 0) {bitWrite(DATA[18],5,1);bitWrite(DATA[18],6,0);} //Serial.println("0");//
if (bitRead(buf[0],7) == 1) {bitWrite(DATA[18],5,0);bitWrite(DATA[18],6,1);} //Serial.println("1");//
Flag = false;
Count = 0;
Flag2 = true;
Count2 = 0;
}
}
if (Flag2 == true){ //Держим окно висящим некоторое время
Count2= Count2 + 1;
if (Count2 == 14){
bitWrite(DATA[18],5,0);
bitWrite(DATA[18],6,0);
Count2 = 0;
Flag2 = false;
}
}
}
Compare = true;
break;
//_________________________________SIGNS____________ ______________________
case 0x1E0: //1E0 480 Символы
/*if(DATA[17] == 0x03) { //Если активен CD
bitWrite(DATA[21],0,bitRead(buf[0],5)); //Track Intro
bitWrite(DATA[21],1,bitRead(buf[0],2)); //Random Play
bitWrite(DATA[21],2,bitRead(buf[1],7)); //CD Repeat
}*/
bitWrite(DATA[21],0,bitRead(buf[0],5)); //Track Intro
bitWrite(DATA[21],1,bitRead(buf[0],2)); //Random Play
bitWrite(DATA[21],2,bitRead(buf[1],7)); //CD Repeat
bitWrite(DATA[21],3,bitRead(buf[2],5)); //RDS
bitWrite(DATA[21],4,bitRead(buf[3],7)); //REG
bitWrite(DATA[21],5,bitRead(buf[4],5)); //Radio text
Compare = true;
break;
/*case 0x1A0:
if(DATA[17] == 0x04){ //Если активен СD- CHANGER (ПРОВЕРИТЬ!)
bitWrite(DATA[21],0,bitRead(buf[0],5)); //Track Intro
bitWrite(DATA[21],1,bitRead(buf[0],2)); //Random Play
bitWrite(DATA[21],2,bitRead(buf[1],7)); //CD Repeat
}
Compare = true;
break;*/
//___________________________________RDS____________ ______________________
case 0x2A5:
if(DATA[17] == 0x02) //2A5 677 RDS
{
if (buf[0] != 0 && buf[1] != 0 && buf[2] != 0 && buf[3] != 0 && buf[4] != 0 && buf[5] != 0 && buf[6] != 0 && buf[7] != 0 && buf[8] != 0){
for(int i = 22; i<=29; i++) DATA[i] = buf[i-22];}
else
{DATA[22] = 0x20;DATA[23] = 0x4E;DATA[24] = 0x4F;DATA[25] = 0x20;
DATA[26] = 0x52;DATA[27] = 0x44;DATA[28] = 0x53;DATA[29] = 0x00;}
}
Compare = true;
break;
//_________________________________TA+PTY___________ ______________________
case 0x265: //HEX265 DEC613
bitWrite(DATA[21],6,bitRead(buf[0],4)); //Значёк TA
bitWrite(DATA[30],0,bitRead(buf[1],7)); //Значёк PTY
bitWrite(DATA[30],1,bitRead(buf[1],6)); //PTY MENU SHOW
if (bitRead(buf[1],6)){
bitWrite(DATA[30],5,0);
bitWrite(DATA[30],7,0);
bitWrite(DATA[36],6,0);
bitWrite(DATA[15],0,0);
}
bitWrite(DATA[30],2,bitRead(buf[1],5)); //Перечёркнутое PTY
bitWrite(DATA[30],3,bitRead(buf[0],5)); //Перечёркнутое RDS и REG
bitWrite(DATA[30],4,bitRead(buf[0],2)); //Перечёркнутое TA
DATA[32] = buf[2]; //PTY Selected Option
DATA[33] = buf[3]; //PTY Station Option
Compare = true;
break;
//_________________________Кнопки на руле справа__________________________
case 0x21F: //21F 543
bitWrite(DATA[34],0,bitRead(buf[0],7)); //Forward >
bitWrite(DATA[34],1,bitRead(buf[0],6)); //Backward <
if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 1) bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0); //Mute
if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 0) bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0); //Vol Up
if(bitRead(buf[0],2) == 1 && bitRead(buf[0],3) == 0) bitWrite(DATA[34],4,1); else bitWrite(DATA[34],4,0); //Vol Down
bitWrite(DATA[34],5,bitRead(buf[0],1)); //Source
DATA[37] = buf[1];
Compare = true;
break;
//_____________________________Кнопки магнитолы___________________________
case 0x3E5: //3E5 997
Activate = false;
bitWrite(DATA[34],6,(bitRead(buf[0],6))); //Menu
bitWrite(DATA[34],7,(bitRead(buf[0],4))); //Tel
bitWrite(DATA[35],0,(bitRead(buf[0],0))); //Clim
bitWrite(DATA[35],1,(bitRead(buf[1],6))); //Trip
bitWrite(DATA[35],2,(bitRead(buf[1],4))); //Mode
bitWrite(DATA[35],3,(bitRead(buf[1],0))); //Audio
bitWrite(DATA[35],4,(bitRead(buf[2],6))); //Ok
bitWrite(DATA[35],5,(bitRead(buf[2],4))); //Esc
bitWrite(DATA[35],6,(bitRead(buf[2],2))); //Dark
bitWrite(DATA[35],7,(bitRead(buf[5],6))); //Up
bitWrite(DATA[36],0,(bitRead(buf[5],4))); //Down
bitWrite(DATA[36],1,(bitRead(buf[5],2))); //Right
bitWrite(DATA[36],2,(bitRead(buf[5],0))); //Left

//ХОЖДЕНИЕ ПО MENU/ОТКРЫТИЕ/ЗАКРЫТИЕ/ПОДТВЕРЖДЕНИЕ
if (bitRead(buf[0],6) == 1) { //ОТКРЫТИЕ MENU
bitWrite(DATA[30],5,0);
bitWrite(DATA[30],6,0);
bitWrite(DATA[30],7,0);
bitWrite(DATA[36],7,0);
bitWrite(DATA[36],6,1);
bitWrite(DATA[36],5,0);
bitWrite(DATA[36],4,0);
time1 = millis(); //Взводим таймаут основного меню.
DATA[39] = 0;
}
/*
4- положение в корне меню
5- 0 корень/1 элементы
6- Menu закрыто/открыто
7- Меню ОК в Menu не видно/видно
*/
if (bitRead(buf[2],4) == 1 && bitRead(DATA[36],7) == 0) bitWrite(DATA[36], 6, 0); //ЗАКРЫТИЕ Menu
if (bitRead(buf[2],6) == 1 && bitRead(DATA[36],6) == 1 && bitRead(DATA[36],5) == 1 && bitRead(DATA[36],7) == 0) {
bitWrite(DATA[36],7,1); //Нажатие на кнопку ОК. Если Menu открыто, то активируем окно с выбором [activate deactivate]
Activate = true;
}

if (bitRead(DATA[36], 6) == 1){ //ОТКРЫТОЕ Menu

if (bitRead(buf[2],4) == 1 ||
bitRead(buf[2],6) == 1 ||
bitRead(buf[5],0) == 1 ||
bitRead(buf[5],2) == 1 ||
bitRead(buf[5],4) == 1 ||
bitRead(buf[5],6) == 1) time1 = millis(); //Сбрасываем таймаут основного меню если нажата какая либо кнопка.

if (bitRead(DATA[36], 4) == 0) DATA[39] = (DATA[39] & B11000111) + (6 << 3); //в бит 3-5 сначала его стираем, потом записываем 6. Это сколько ITEM в меню магнитолы
if (bitRead(DATA[36], 4) == 1) DATA[39] = (DATA[39] & B11000111) + (1 << 3); //итемов в меню машины

if (bitRead(DATA[36],7) == 0){ //Меню по кнопке ОК не выведено- бродим по основному меню
if (bitRead(buf[5],2) == 1 && bitRead(DATA[36], 5) == 0 && (DATA[39] & B00111000) > 0) bitWrite(DATA[36],5,1); //Переместились в MENU в ITEM
if (bitRead(buf[5],0) == 1 && bitRead(DATA[36], 5) == 1) bitWrite(DATA[36],5,0); //Переместились в MENU в ROOT

if (bitRead(buf[5],4) == 1 && bitRead(DATA[36], 5) == 0 && bitRead(DATA[36], 4) == 0) {
bitWrite(DATA[36],4,1); //преместились по корню Menu вниз
DATA[39] = DATA[39] & B11111000;
}
if (bitRead(buf[5],6) == 1 && bitRead(DATA[36], 5) == 0 && bitRead(DATA[36], 4) == 1) {
bitWrite(DATA[36],4,0); //преместились по корню Menu вверх
DATA[39] = DATA[39] & B11111000;
}

if (bitRead(DATA[36],5) == 1){ //Нахождение в Menu итем.
if (bitRead(buf[5],4) == 1 && (DATA[39] & B00000111) < ((DATA[39] & B00111000) >> 3) - 1) DATA[39] = DATA[39] + 1; //перемещение вниз
if (bitRead(buf[5],6) == 1 && (DATA[39] & B00000111) > 0) DATA[39] = DATA[39] - 1; //перемещение вниз
}
}
else //Меню по кнопке ОК выведено- бродим в нём
{
if (Once == true) {
if (bitRead(DATA[36], 4) == 0) { //В меню магнитолы
switch (DATA[39] & B00000111) { //Cтатус элемента.
case 0: if (bitRead(DATA[21],3) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //RDS
case 1: if (bitRead(DATA[21],4) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //REG
case 2: if (bitRead(DATA[21],5) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Radio Text
case 3: if (bitRead(DATA[21],0) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Intro
case 4: if (bitRead(DATA[21],1) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Random
case 5: if (bitRead(DATA[21],2) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Repeat
}
}
if (bitRead(DATA[36], 4) == 1) { //В меню машины
switch (DATA[39] & B00000111) {
case 0:
if (EEPROM.read(0) == 0xC0) bitWrite(DATA[39],7,0);
if (EEPROM.read(0) == 0xD0) bitWrite(DATA[39],7,1);
break;
}
}
}

if (bitRead(buf[5],2) == 1){
bitWrite(DATA[39],7,0); //Нажатие ВПРАВО
Once = false;
}
if (bitRead(buf[5],0) == 1){
bitWrite(DATA[39],7,1); //Нажатие ВЛЕВО
Once = false;
}
if (bitRead(buf[2],4) == 1){
bitWrite(DATA[36],7,0); //Нажатие Esc. Закрываем Меню.
Once = true;
}
if (bitRead(buf[2],6) == 1 && !Activate){
bitWrite(DATA[36],7,0); //Нажатие на OK. Закрываем Меню.
//Сравниваем что есть у элемента и что сейчас выбранно и если не совпадает, то отправляем пакет магнитоле
if (bitRead(DATA[36], 4) == 0) { //В меню магнитолы
switch (DATA[39] & B00000111) {
case 0: if (bitRead(DATA[21],3) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x01); else MenuElement(0x11,0x01); break; //RDS
case 1: if (bitRead(DATA[21],4) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x03); else MenuElement(0x11,0x03); break; //REG
case 2: if (bitRead(DATA[21],5) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x24); else MenuElement(0x11,0x24); break; //Radio Text
case 3: if (bitRead(DATA[21],0) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x41); else MenuElement(0x11,0x41); break; //Intro
case 4: if (bitRead(DATA[21],1) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x42); else MenuElement(0x11,0x42); break; //Random
case 5: if (bitRead(DATA[21],2) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x43); else MenuElement(0x11,0x43); break; //Repeat
}
}
if (bitRead(DATA[36], 4) == 1) { //В меню машины
switch (DATA[39] & B00000111) {
case 0: //Rear Wiper
if (bitRead(DATA[39],7) == 0 && EEPROM.read(0) == 0xD0) {
EEPROM.write(0, 0xC0); //Inactivaited
bitWrite(DATA[161],1,0);
DisplayCarOpt[5] = 0xC0;
}
if (bitRead(DATA[39],7) == 1 && EEPROM.read(0) == 0xC0) {
EEPROM.write(0, 0xD0); //Activaited
bitWrite(DATA[161],1,1);
DisplayCarOpt[5] = 0xD0;
}
break;
}
}
Once = true;
}
Activate = false;
}

}
//____________________________________

Compare = true;
break;
//___________________________________CD_____________ ______________________
case 0x365:
if(DATA[17] == 0x03)
DATA[20] = buf[0]; //HEX365 DEC869 Это сколько всего треков
Compare = true;
break;
case 0x3A5:
if(DATA[17] == 0x03) //3A5 933 Это номер трека и время CD
{
if (buf[3] == 255 && buf[4] == 127){
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
else {
converter(buf[0]);
DATA[22] = digit1;
DATA[23] = digit2;
DATA[24] = 0x2D;
converter(buf[3]);
DATA[25] = digit1;
DATA[26] = digit2;
DATA[27] = 0x3A;
converter(buf[4]);
DATA[28] = digit1;
DATA[29] = digit2;
}
}
Compare = true;
break;
//______________________________CD CHANGER________________________________
case 0x162:
if(DATA[17] == 0x04) DATA[19] = buf[3]; //HEX162 DEC354 Диск
Compare = true;
break;
case 0x1A2:
if(DATA[17] == 0x04) DATA[20] = buf[0]; //1A2 418 Это сколько треков на диске ченджера
Compare = true;
break;
case 0x1E2:
if(DATA[17] == 0x04) //1E2 482 Это трек и время ченджера
{
if (buf[3] == 255 && buf[4] == 127){
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
else {
converter(buf[0]);
DATA[22] = digit1;
DATA[23] = digit2;
DATA[24] = 0x2D;
converter(buf[3]);
DATA[25] = digit1;
DATA[26] = digit2;
DATA[27] = 0x3A;
converter(buf[4]);
DATA[28] = digit1;
DATA[29] = digit2;
}
}
Compare = true;
break;
//_______________________________Car options______________________________
case 0x361:
if (buf[2] == 0x10) bitWrite(DATA[161],0,1); else bitWrite(DATA[161],0,0); //Rear wiper options
Compare = true;
break;
//__________________________________________________ ______________________
} //Switch
} //if DigitalPin 9
//__________________________________________________ ______________________

if ((millis() - time0) > 100 && Compare == true){
arrcmp = memcmp(DATA,DATA2,162);
if (arrcmp != 0)
{
Serial.write(DATA, 162); //41 + 54 +64
memcpy(DATA2,DATA,162); //Присваиваем массиву DATA2 161 байт массива DATA
}
time0 = millis();
Compare = false;
}

} //void loop

void converter(int inpint){
if (inpint < 10){
digit1 = 48;
digit2 = inpint + 48;
}
else{
if (inpint > 89) {digit1 = 9 + 48; digit2 = inpint - 42;}
else if (inpint > 79) {digit1 = 8 + 48; digit2 = inpint - 32;}
else if (inpint > 69) {digit1 = 7 + 48; digit2 = inpint - 22;}
else if (inpint > 59) {digit1 = 6 + 48; digit2 = inpint - 12;}
else if (inpint > 49) {digit1 = 5 + 48; digit2 = inpint - 2;}
else if (inpint > 39) {digit1 = 4 + 48; digit2 = inpint + 8;}
else if (inpint > 29) {digit1 = 3 + 48; digit2 = inpint + 18;}
else if (inpint > 19) {digit1 = 2 + 48; digit2 = inpint + 28;}
else if (inpint > 9) {digit1 = 1 + 48; digit2 = inpint + 38;}
}
}

void multiframef(){
if (LengthP > 7)
{
for (int i=0; i < 7;i++) MULTIFRAMETMP[i + DataBufSize] = buf[i+1];
DataBufSize = DataBufSize + 7;
LengthP = LengthP - 7;
}
else{
for (int i=0; i < LengthP;i++) MULTIFRAMETMP[i + DataBufSize] = buf[i+1];
LengthP = 0;
}
}

void MenuElement(byte OutSend1, byte OutSend2){
unsigned char OutSend[3] = {OutSend1,OutSend2,0x50};
time2 = millis() - 50;
CAN.sendMsgBuf(0xDF, 0, 3, OutSend);
}

T_r_D
11.05.2016, 13:50
Garen
Если в ситроен C4 первой генерации, то Lenovo tab 2 A7.
Встаёт идеально в штатную рамку. Единственное что нужно будет использовать, так это угловые USB, а то с простыми будет тяжко. Я для себя вообще спаял самопал длинной по 5см, а корпус USB просто из термоклея сделал.

T_r_D
13.05.2016, 12:55
Оттестировал в машине скетч который выше- всё работает.
Трип сбрасывается, задний дворник включается.

Так что настройки машины которые делаются при помощи магнитолы и отображаются на дисплеи хранятся в дисплее.

T_r_D
28.06.2016, 12:37
Итак, я наконец запихал это в машину!
https://www.dropbox.com/s/kblf9ba908w0xon/VID_20160628_093347.3gp?dl=0

T_r_D
21.08.2016, 00:15
Эпопея продолжается.

С софтом особо изменений нет, только плеер запихал в дройдософт.
А вот с ардуиной интерестнее!

Дело было вечером- делать было нечего. :)
Поскольку моя софтина под дройд обзавелась плеером и отпала надобность в эмуляторе CD ченджера в виде Yatour, то я его отключил. Но захотелось отключить его красиво. Так что на следующий день я взял ноут и пошёл с диагностическим комплексом в машину отключать ченджер программно.
Отключил и решил заглянуть в ошибки.
Ошибок нашлось много :) В основном по лампочкам так как стоят светодиодные.
НО! Одна из ошибок была связано с модулем приёмника радио.
И гласила она НЕУСТРАНИМАЯ ОШИБКА СЕТИ CAN!!!
Попробовал стереть- фигушки! Возникает снова.
Вот сижу и гадаю из за чего она возникает...
Толи из за того что я шлю три пакета подряд раз в 100мс (тоесть три пакета посылаю, а следующие три через 100мс)из ардуины без задержек, толи косяк на аппаратном уровне.

Может кто знает как правильно слать в кан пакеты? Нужно чего ждать или как?
Или это MCP2515 сама решает когда слать, а когда нет?

PS.
Ещё нашёл как получить текущее напряжение бортовой сети.
ID 0x0E6 байт 5 (если считать с 0).
перевести в DEC
и дальше DEC/20 + 7.2

devova
02.03.2017, 17:55
Тема затронула вопрос о получении даних от комфорт шини сітроена. Также очень интиресним єсть ресурс по разшифровке меседжей http://autowp.github.io/
Но вопрос управления осталса откритим, пробовал кто-ли управлять магнитолой например: менять радио станцию, громкость, режими аудіо входа...
Буду очень рад поделеному опиту.

T_r_D
26.09.2017, 16:47
Привет всем.
Давненько я тут не был.
По теме ситроенов- я добился вот такого:
https://www.dropbox.com/s/6pdmiz28r72dhqx/WhatsApp%20Video%202017-09-26%20at%2014.36.44.mp4?dl=0
Это не ардуина уже конечно, а СТМ, но принцип тот же, только частоты камня побольше.

Дисплей показывает норм, но на нём ща плёнка с завода чтоб не царапать.
Если что это 5" SSD1963 + STM32F103VET6 + TJA1054.
Окончательная сборка будет на F407.

T_r_D
14.12.2017, 01:46
На STM32F407VET6:
https://www.dropbox.com/s/i8iawno4abe30nc/WhatsApp%20Video%202017-12-13%20at%2019.26.03.mp4?dl=0

На заднем плане планшет который живёт уже больше года в машине.

T_r_D
07.04.2018, 19:09
Ребят, спустя почти год, проект можно считать доделанным.
имею в виду СТМ32, на ардуине планшет.
Вот видео- СТМ32+дисплей за рулём, планшет в центре.
https://www.dropbox.com/s/mdkpcs82msg99a1/e-p3.mp4?dl=0
По показаниям.
По левой стороне идут:
Моментальный расход.
Средний расход.
Топливо в баке в литрах.
Средняя скорость.

По правой стороне:
Температура двигателя.
Напряжение
Одометр
Температура за бортом.

Кожух рулевой колонки верхний распечатан на 3D принтере.

(vS)
08.04.2018, 05:59
весь на мониторах ))
зачотно

T_r_D
08.04.2018, 13:15
Ну вот ещё небольшой обзорчик того что я сделал.
Сразу скажу, что после установки STM32+SSD1963 отпала необходимость вывода
информации БК на планшет.
Так что софт будет переписываться для отображения только сведений от магнитолы.
И скорее всего будет всё переведено на один единственный микроконтроллер
STM32F103C8T вместо двух ардуин.
https://www.dropbox.com/s/23c5qdnsh8d58rx/e-p4.mp4?dl=0

T_r_D
11.08.2018, 02:19
Приветы.
Ну в общем, прошло уже достаточно времени и можно сделать выводы.

БК на СТМ вместо штатного тахометра ни разу не заглючил. Всё работает отлично не смотря ни на жару ни на влагу. Уже к этой штуке привык.

Софтина для планшета была переписана и оставлен интерфейс только магнитолы.
На СТМ так и не перевёл потому что лень этим заниматься летом.
С софтиной пришлось немного повозится ибо была переведена в режим неполноэкранности, а андройд этому очень сопротивлялся.
В общем было побеждено и теперь всё нормально.

По функционалу очень доволен- БК и тахометр перед глазами, на планшете есть одновременно и интерфейс магнитолы и карта.

Смотрится всё как штатное, вопросы не однократно задают "где купил?" и утверждающи-вопросительные предположения типа "на алиэкспрессе почём купил?". :)

А-да! Литры в баке не соответствуют действительности!
Из за формы бака естественно.
Машина показывает не литры, а уровень погружения поплавка.
Так что нужно калибровать, а вот как это сделать технически я мало представляю.
Нужна ровная поверхность и 60 литров бензина разлитых по ёмкостям с шагом в 0,6. :)

Vogel
17.01.2019, 23:10
На STM32F407VET6 ...
А Вы могли бы поделиться исходниками для STM32 ? Я как раз заказал себе именно такую же плату.

T_r_D
18.01.2019, 20:18
Могу, только в личку.

Да и "именно такая же плата" не очень поможет.
Должен быть ещё и такой же дисплей и такое же ПО на котором писал я.
Помнится там был косяк с CubeMX для FSMC на поздних версиях.
Так что придётся разбираться.
А если и среда не IAR, то проще будет просто понять как и что, чем переделывать полностью...

Если нужно просто приём и обработка сообщений от CAN шины, то там вообще просто.
А если всё целиком, то я бы сейчас взял бы дисплей уже какой нить нормальный, а не этот хлам. :)

PS.
Ну и таки да, всё до сих пор работает нормально.
Морозов особых не было чтоб затестить, но при -12 работает без нареканий.
Я про БК. Планшет уже оттестирован давно.

Antidk
08.07.2019, 17:32
Если нужно просто приём и обработка сообщений от CAN шины, то там вообще просто.


Да вот интересует, с C4 2 generation одинаковые шины? Как те сообщения что есть вывести на другой экран/экран планшета? Вместо штатного дисплея БК

T_r_D
09.07.2019, 10:43
Должны быть одинаковы.
А чтоб вывести сообщения надо взять в руки паяльник и спаять плату хотя бы под дурину, а можно и с STM сразу разбираться.

В теме есть всё, что нужно для написания кода.

Ps. А если пошерстить АлиЭкспресс, то там можно сейчас найти трансиверы CAN tja1055 или tja1054 по 70р

svoboda120
09.07.2019, 12:26
В теме есть всё, что нужно для написания кода.



В теме может и есть. Но как то все оно разбросано по теме и для не совсем понимающих в программировании найти всю информацию необходимую для скетча сложно. Если бы собрать все в шапку или в первый пост, то возможно легче было бы ориентироваться.
P.S. Если не затруднит посмотрите личные сообщения. Я когда то писал вам, вопрос открыт по прежнему. Может заинтересует.