BMW E36 Instrument Cluster

Introducere

  • Voi realiza un simulator de curse folosind un ceas de bord de la un BMW Seria 3 E36 pentru a afisa diferite informatii din Asseto Corsa, necesare unui pilot de curse.

Descriere generală

  • Utilizatorul se va juca Asseto Corsa, iar ceasurile de bord vor indica viteza, turatia, nivelul de combustibil si temperatura apei din motor.
  • Voi face acest lucru folosind Shared Memory, pentru a comunica intre procese.
  • Pentru Shared Memory, am folosit Python pentru ca exista module specializate in acest sens, iar codul se scrie mult mai repede decat s-ar face in C/C++.

Schema bloc

Componente

Schema Electrica

Ceasurile de bord

Pinii din spate

Componente arse

Software Design

Pentru a realiza acest proiect, am folosit diferite biblioteci de Python:

  • mmap (alocare memorie)
  • ctypes (pentru c_int32, c_float si c_wchar)
  • serial (comunicare intre Python si Seriala de Arduino)

Alte biblioteci ce pot fi folosite pentru implementarea cu o singura placuta de Arduino:

  • struct - realizeaza o conversie intre valorile din Python si structurile de C, care in Python sunt reprezentate ca obiecte bytes

Cum functioneaza codul?

Folosind un script de Python, preiau informatiile din Assetto Corsa, pe care ulterior, folosind biblioteca Serial, le trimit catre doua placute de Arduino. Cele doua placute de Arduino asteapta un numar exact de octeti pe seriala (4 bytes), pentru a fi sigur ca datele primite sunt aceleasi cu cele trimise.

In functie de valoarea primita, folosind metoda de map() pentru a translata spatiul de valori 750 rpms (motor la relantiu) → 7500 rpms (turatia maxima) in spatiul de valori 50Hz → 350Hz. Ceasurile de E36 functioneaza pe baza de frecventa. Pe masina, viteza si turatia sunt citite de niste senzori magnetici. Senzorul de viteza se afla in diferential. Un ciclu in diferential, ca si la arbore, este reprezentat de un dinte si o pauza. Astfel, in Arduino as avea nevoie de un semnal dreptunghiular care specifica frecventa, avand un duty cycle de 50%. Acest lucru este oferit de functia tone() din Arduino.

Diferential de E36:

Senzor viteza:

De ce am folosit 2 placute de Arduino?

Am folosit 2 placute de Arduino pentru ca eram destul de constrans de timp. Am ars o pereche de ceasuri si a trebuit sa caut altele. Pentru a folosi o singura placuta de Arduino, era nevoie de o incapsulare a informatiilor folosind biblioteca struct din Python sau realizarea unui protocol de comunicatie, care ar putea fi ceva de genul: 1 octet de inceput, 1 octet rpm, 1 octet viteza, 1 octet temp, 1 octet gas, 1 octet de final. Problema la aceasta abordare era legata de limitarea lui Arduino Uno. Functia tone() foloseste Timer 2, iar eu trebuia sa fac tone() pe doi pini: pinul care controleaza viteza si cel care controleaza turatia. Pentru a face asta, trebuie apelata functia noTone() dupa fiecare apel de functie tone(). Nu am reusit sa gasesc delay-ul potrivit intre cele 2 apeluri de tone() pentru a putea mentine viteza si turatia constanta. Fie aveam fluctuatii pe turatie daca viteza ramanea prea timp pe timer, fie invers.

Din aceste motive de timp si limitari hardware, am preferat sa folosesc 2 placute.

Probleme intalnite

O problema de care m-am lovit in timp ce testam codul a fost aceasta: numarul de octeti asteptati de catre Arduino. Initial, asteptam un numar pozitiv de octeti, ceea ce nu era corect. Existau situatii in care primeam 3 sau 5 octeti, iar viteza se schimba de la 140 km/h la 3 km/h. Teribil!

A doua problema a fost reprezentata de apelul functiei tone() pe doi pini distincti. Momentan nu am gasit un delay potrivit pentru a avea acuratete ridicata intre informatiile din joc si ceasuri, fara sa existe fluctuatii.

Rezultate obtinute

Cu ajutorul cunostintelor de PM si SO dobandite in acest semestru, plus muuuuulte ore de cautat pe internet si testat, am reusit sa duc la bun sfarsit acest proiect, pe care eu il vad original. Am trecut prin foarte multe stari emotionale, de la agonie la extaz si inapoi, dar pot spune ca satisfactia de la final a meritat fiecare efort.

Concluzii

A fost un proiect extrem de interesant si captivant pentru mine si imi doresc sa trec mai departe: controlul unor functii din masina folosind o aplicatie pe telefon. Ex: pornire motor, pornire / oprire lumini, deschidere / inchidere geamuri sau usi, etc.

Download

Demo YouTube

Bibliografie

pm/prj2021/avaduva/bmw_e36_instrument_cluster_-_racing_simulator.txt · Last modified: 2021/05/31 18:05 by dragos.manolea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0