Table of Contents

BMW E36 Instrument Cluster

Autor: Dragoș Manolea

Introducere

Descriere generală

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:

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

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

Link GitHub: https://github.com/dragosmanolea/proiect-pm-2021

Arhiva

Demo YouTube

Apasa aici!

Bibliografie

Datasheet pin ceasuri

Export PDF

Documentatie Arduino

Extragere date din Assetto Corsa folosind Python