Если вы любите поиграть в автосимуляторы, вам наверняка всегда хотелось привнести реализма в игру. Сначала вы покупаете руль с 960 градусами, коробкой передач и тремя педалями, а дальше уж как повезет. Мне захотелось визуализацию скорости и оборотов, но китайские поделки с семисегментными светодиодными индикаторами не особо нравились мне эстетически. В какой-то момент я решил распотрошить настоящую приборную панель и понять как можно двигать стрелки через микроконтроллер, но все оказалось проще – можно подкинуть в CAN шину приборки команды, заставив ее думать, что она сейчас работает не с игрой, а с реальным авто.
Увидев похожий проект у кого-то в ютубе, я решил попробовать. Правда там был ETS2 с фурами, где такая приборка выглядела нелепо, но подружить с другой игрой панель выглядело уже реальной задачей. Я купил за символические 10т на разборке приборку от Porsche 970 рест (это тоже пугало, в видео была приборка дореста) и решил рискнуть. Также понадобится Arduino Uno и еще плата для подключения к шине CAN – CAN-BUS Shield V2. Можно купить в России, но можно подождать дней 20 и купить в два раза дешевле на Али.
Далее я решил вообще проверить, работает ли приборка. И вот тут началось самое интересное. У того ютубера нигде не было схемы подключения, а найти схему оказалось еще той задачей (не думал, что так тяжело доставать эти схемы, почти все лежат где-то на обменниках, куда еще тяжело зарегистрироваться). Путем длительного перебора даташитов, была найдена необходимая схема.
Подключение Arduino Can BUS Shield к приборной панели.
Правда, я не автоэлектрик, поэтому понятного тут для меня мало. Благо, для старта надо было определить где питание и контакты кан-шины, с чем я легко справился и нарисовал понятную схему подключения
На всякий случай закину точную модель панели, с которой я проводил эксперименты
Первый тест можно устроить и без программы, чтобы проверить живая ли приборная панель. Подключаем к питание и… ничего не происходит. Но если зажать кнопку сброса пробега, высветится лого и пробег.
Код Arduino для запуска панели.
Это конечно радостно, но надо научить приборку показывать полезные данные. За основу я пытался взять оригинальный код, предложенный автором
https://github.com/VintageCollector/cluster-dashboard-ets2-ats/tree/Porsche-Panamera-970
Данный репозиторий заточен под PlatformIO, которым я никогда не пользовался, поэтому взял все функции, которые были в файлах и закинул в файл Arduino IDE. Так быстрее и проще зашить код на плату. Чтобы минимально запустить приборную панель, нам нужно передавать фрейм зажигания каждые 10мс
uint8_t ignition_frame_on[8] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00};
Все команды передаются в функции canSend(), с разными временными интервалами. Начав с зажигания, можно добавлять другие команды. Например, можно добавить функцию оборотов.
void canSend(){
uint32_t courentTime = millis();
if(courentTime - lastTime > 10){
// 10 ms интервал
// Зажигание
canSendIgnitionFrame();
canSendRPM();
canCounter++;
lastTime = courentTime;
}
}
Добавив еще несколько полезных показаний, можно увидеть уже красивую картинку.
Используя следующую таблицу, можно дополнить исходный код, как душе угодно. Добавить check-engine, лампу ABS, ESP и даже задействовать стандартные функции экрана. CAN команды для приборной панели PORSCHE
В итоге с разной переодичностью можно отправлять следующие основные команды, которые дадут вам отобразить 90% важной телеметрии игры. (спасибо еще раз автору за структуру)
// Отправка данных
void canSend(){
uint32_t courentTime = millis();
if(courentTime - lastTime > 10){
//10 ms interval
// Зажигание
canSendIgnitionFrame();
canSendHandbrake();
canSendSpeed();
canSendSteeringWheel();
canSendRPM();
canSendGear();
canSendMode();
if(canCounter % 20 == 0){ //200 ms interval
canSendLights();
// internal 600ms timer
canSendAbs();
canSendEngineTemp();
canSendAbsCounter();
canSendAirbagCounter();
canSendFuel();
canSendOilTemp();
}
if(canCounter % 15 == 0){ //150 ms interval
canSendvinnumber();
}
if(canCounter % 50 == 0){ //500 ms interval
canSendIndicator();
}
if(canCounter % 100 == 0){ //1000 ms interval
canSendTime();
}
canCounter++;
lastTime = courentTime;
}
}
Теперь когда мы научились отображать синтетические данные на приборку, нужно подумать, как получать данные из игры.
Забегая вперед, скажу, что получилось подружить панель с Assetto Corsa, как изначально и хотел. Правда без SimHub, на питон скрипте, который парсит из области памяти телеметрию. Рассмотрим эту интеграцию в следующей статье.
Весь код сможете найти на моём гитхабе, в одноименном репозитории – lex232/Dashboard-for-autosimulators.git
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.