W ramach przypominania sobie programowania, rozgryzania problemów, zajmowania się czymś twórczym i innych takich stworzyłem widoczny poniżej prototyp/proof of concept czegoś, co można nazwać komputerem pokładowym.
Zbudowanie takiego urządzenia wbrew pozorom nie jest takie proste. Nie są dostępne żadne sygnały, jak jest to w przypadku silników z wtryskiem paliwa, gdzie np. zlicza się czas wtrysku znając wydajność wtryskiwacza.
Spis treści
Budowa prototypu
Stan obecny: prototyp ukończony, sprawdzone działanie, wyciągnięte wnioski.
Kod na GitHub
Moimi założeniami były:
- użycie LCD do prezentacji danych,
- użycie gotowych modułów dla przyspieszenia budowy,
- komunikacja przewodowa dla uproszczenia konstrukcji i zmniejszenia liczby potencjalnych usterek.
Na LCD prezentowane są (być powinny 🙂 ) informacje:
- temperatura pokrywy rozrządu silnika,
- napięcie akumulatora,
- godzina i minuty,
- poziom napełnienia zbiornika paliwa w postaci paska i procentowej (*),
- spalanie paliwa na 100 km.
* – nie wykonałem z powodu braku czasu przed wyjazdem, ale jest to kwestia znalezienia przewodu, wpięcia się w niego i podłączenia do Arduino przez dzielnik napięcia.
Użyte czujniki i układy
- przepływomierze: 2x PC006377,
- odległościomierz: TLE4905,
- temperatura: DS18B20 (1-Wire),
- RTC: DS3231,
- LCD: 2004A z modułem konwertera na I2C,
- napięcie akumulatora: dzielnik R, ADC,
- poziom paliwa: dzielnik R, ADC,
- buzzer: NN.
Umiejscowienie czujników
O ile dzielniki napięć, LCD z konwerterem, brzęczyk i RTC ulokowałem przy Arduino, o tyle pozostałe czujniki musiały znaleźć się w komorze silnika.
Czujnik temperatury umieściłem w wyprofilowanym kawałki płaskownika przykręcanym do obudowy rozrządu. Jest to miejsce, które dość dobrze powinno wskazywać temperaturę, gdyż pod pokrywą aluminiową ciągle tłoczony jest olej.
Przepływomierze znalazły swoje miejsce przed pompą paliwa (tuż za filtrem) oraz na powrocie paliwa za gaźnikiem. Podczas demontażu okazało się, że wężyk igielitowy dobrze zapiekł się na króćcu przepływomierza powrotnego, przez co urwałem go.
Jeśli chodzi zaś o sygnał niezbędny do zliczania odległości – zdecydowałem się na maksymalne uproszczenie. Teoretycznie sygnał mogłem otrzymać z prędkościomierza lub przekładni skrzyni napędzającej licznik, jednak w rzeczywistości wiązałoby się to ze stworzeniem impulsatora przeliczającego obroty linki licznika. Musiałbym to urządzenie dopasować do skrzyni oraz mocowania linki lub licznika i mocowania linki. Dodatkowo nie mogłoby ono być zbyt duże z powodu małej przestrzeni w samochodzie.
Poszedłem zatem drogą na skróty – znając obwód koła (przybliżony), jestem w stanie obliczyć dystans przebyty na podstawie wiedzy ile obrotów ono zrobiło. Podobnie jak działa system ABS, lecz w mniej zintegrowany sposób.
Do elementu wymiennego, jakim jest przegub metalowo-gumowy półosi zdecydowałem się przykleić miniaturowy magnes neodymowy. W tym celu nawierciłem otwór o wymiarach nieco większych od magnesu, a sam magnes wkleiłem na popularny szary klej dwuskładnikowy. Następnie dopasowałem dodatkowe ramię mające utrzymać hallotron w odpowiedniej odległości oraz pozycji i przytwierdziłem je za pomocą śruby do wahacza. Wybrałem wahacz lewy, gdyż znajduje się on blisko otworu dla przewodów przechodzących przez ścianę grodziową.
Opis budowy
Początkowo planowałem użyć wyświetlacza 2×16, który pokazywałby temperaturę, godzinę i poziom paliwa zgodnie z obrazkiem poniżej. Doszedłem jednak do wniosku, że skoro zostało mi całkiem sporo wolnych portów wejściowych – mogę spróbować zrobić coś na kształt wskaźnika spalania.Dokupiłem wyświetlacz 4×20 oraz moduł przejściówki do sterowania nim po I2C (w celu zmniejszenia liczby użytych pinów), a następnie przeniosłem posiadany kod na większy wyświetlacz. Uzyskane miejsce w pierwszej linii uzupełniłem o wskazanie woltomierza podającego wartość napięcia przed stabilizatorem napięcia, ale po dzielniku napięcia (dobranym, by nie przekroczyć maksymalnego napięcia na porcie). Na większości zdjęć widać wskazania przed kalibracją – ok. 4,25 V.
Zdając sobie sprawę z konieczności poprowadzenia kilku grubych przewodów z rejonu komory silnika, przez cały samochód, do konsoli środkowej, zastosowałem gniazda oraz wtyki po trzy przewody dla każdego czujnika. Wybrane przeze mnie przewody, z racji przebywania w komorze silnika, dobierałem pod kryterium nietopliwości/niepalności izolacji. Wszystkie przewody sygnałowe, po zwinięciu, pokazane są na poniższym zdjęciu.
Na płytce uniwersalnej zalutowałem klon Arduino od SparkFun (choć nie jest brandowany), model Pro Micro. Zawiera on mikrokontroler Atmega 32U4. Wokół Arduino zalutowałem niezbędne rezystory dzielników napięć oraz układ stabilizatora napięcia 5 V do zasilania całości. Z powodu rozszerzania początkowych założeń płytka główna musiała zostać rozszerzona o inną, mieszczącą na sobie RTC oraz buzzer.
Możliwe jest zasilanie komputera przez złącze micro USB lub przez dedykowane ku temu złącze 2 pin.
Wyświetlacz zamocowałem na prowizorycznie wygiętym kawałku tworzywa sztucznego, dzięki czemu mogłem zamocować go do konsoli, a następnie przetestować podczas jazdy.
Schemat prototypu nie jest zbyt skomplikowany, w większości zawiera złącza, choć najważniejsze w nim jest odpowiednie połączenie czujników wymagających przerwań – a tych na ProMicro jest mało. Poza tym rezystory podciągające linie I2C oraz OneWire, stabilizator 7805 w typowej aplikacji.
rezultaty
Komputer pokładowy wskazywał z dobrą dokładnością godzinę oraz napięcie akumulatora (błąd rzędu 0,1 – 0,2 V względem wskazań taniego multimetru). Nie byłem w stanie zmierzyć dokładności pomiaru temperatury względem przyrządu odniesienia jednak zakładam, że fabrycznie skalibrowany czujnik nie powinien mieć dużej odchyłki (±0.5°C dokładności w zakresie od -10°C do +85°C). Temperatura podczas dłuższej jazdy utrzymywała się na poziomie 115 – 120°C, zatem w normie dla silników chłodzonych powietrzem. Jednokrotnie udało mi się przekroczyć temperaturę 125°C.
Niestety pomiar odległości i zużytego paliwa był obarczony zbyt dużym błędem, żeby nazwać to miernikiem czy nawet wskaźnikiem. Rozstrzał wyników wahał się momentami od kilku (np. 3) do kilkudziesięciu (np. 60) litrów paliwa.
Mimo uzyskania niezadowalających rezultatów przy pomiarze zużycia paliwa uważam ten projekt za udany. Pozwolił mi zapoznać się z możliwościami pomiarów, dostępnością elementów i ich jakością oraz środowiskiem Arduino.
opis kodu
Kod na GitHub
Program zaczyna się standardowo od wczytania bibliotek, następnie deklarowane są wypełnienia jednego znaku wyświetlacza do wykorzystania przy pasku wskaźnika poziomu paliwa.
W sekcji — variables to be defined by user — można dokonać prostej konfiguracji – pojemności zbiornika paliwa, poziomu sygnalizacji dziękowej rezerwy, pinu buzzera, dystansu pomiarowego oraz obwodu koła.
Po sekcji zawierającej deklaracje zmiennych pora na funkcje i wprowadzenie ustawień wyświetlacza, a następnie pierwsze wypełnienie wyświetlacza danymi i przypisanie przerwań do odpowiednich pinów.
Funkcja void temp() odpowiada za komunikację, konwersję informacji oraz wyświetlenie temperatury w formie czytelnej na ekranie. W celu zabezpieczenia przed zachowaniem na ekranie niechcianych znaków po spadku temperatury wprowadziłem czyszczenie ostatniego znaku jeśli czujnik wskaże poniżej 100°C.
Bardzo zbliżone zadanie do poprzedniego wykonuje funkcja void rtc(), tzn. komunikuje się z RTC, pobiera z niego dane, przelicza na wartości czytelne dla ludzi, po czym dopasowuje formę i wyświetla na LCD.
void buzz(char &buzzDIS) służy załączeniu sygnału dźwiękowego buzzera.
Pasek poziomu paliwa oraz procentowe wskazanie wypełnienia zbiornika wyliczane są przez funkcję void fuel(). Na podstawie odczytanej wartości napięcia przez wejście A1 ADC wyliczany jest obecny poziom benzyny. Jeśli jego poziom wzrośnie powyżej 80% (tankowanie), a wcześniej zarejestrowano spadek poniżej określonego w ustawieniach użytkownika progu, informacja dźwiękowa zostanie wyłączona. Jeśli jest to pierwszy przebieg programu i jest mało paliwa lub jego poziom spadnie poniżej progu – załączany jest sygnał buzzera.
Następnie rysowany jest pasek poziomu paliwa z dokładnością do ½ znaku na długości 10 znaków (zatem dla 21 litrów jeden znak to 2,1 l). Dla ułatwienia odczytu pozycja 11 zapełniana jest pionową linią oznaczającą koniec. W kolejnych komórkach prezentowana jest wartość procentowa, która uprzednio sprawdzana jest pod kątem liczby znaków, ażeby zapobiec np. podwójnemu rysowaniu znaku %.
void voltage() to funkcja matematycznie przeliczająca wartość napięcia przy znanym dzielniku rezystorowym oraz prezentująca dane na LCD.
void rpm() to nieukończona próba zliczania impulsów (ogólnie rzecz biorąc niepożądanych) występujących na zasilaniu w celu wyznaczenia liczby obrotów silnika podczas jego pracy. Sygnał napięciowy zmierzony podczas pracy silnika na gnieździe zapalniczki wygląda jak poniżej.
Pomiar zużycia paliwa odbywa się w funkcji void consumption(float copyFlow1, float copyFlow2, float copyWheel). Pobiera ona liczbę impulsów obu przepływomierzy oraz hallotronu mierzącego liczbę obrotów koła.
Znając liczbę impulsów na jeden litr (na podstawie dokumentacji producenta) oblicza różnicę między wartościami wskazanymi przez przepływomierze i przelicza na litry.
Do obliczenia spalania wstępnie obliczany jest przejechany dystans oraz przeliczane jest to na ułamek stu kilometrów.
Dalsza część to formatowanie wyświetlania na LCD, a w przypadku braku impulsów z hallotronu – wskazanie spalania na jednostkę czasu (godzinę).
Pętla główna – loop(), w której starałem się zawrzeć jak najmniej kodu – używanie przerwań wymaga szybkości działania pętli.
Co sekundę aktualizowane są wartości temperatury, napięcia i obrotów.
Co piętnaście sekund aktualizowany jest czas i poziom paliwa w zbiorniku.
W celu zwiększenia precyzji pomiar spalania wykonywany jest co określony przez użytkownika (a przeze mnie eksperymentalnie) dystans. Wartości są kopiowane, liczniki zerowane, funkcja obliczeniowa wywoływana i przerwania działają od nowa.
wnioski
- Czujnik temperatury, a właściwie jego przewód, uległ stwardnieniu po dość krótkim czasie, co sugeruje jego przegrzanie. Należy znaleźć inne miejsce prowadzenia go lub przewód o izolacji odpornej na temperaturę.
- Czujnik temperatury warto wymienić na taki o zwiększonym zakresie – DS18B20 ma zakres do 125°C, co dla silnika chłodzonego powietrzem okazało się wartością momentami zbyt niską.
- Należy zadbać o zwiększenie precyzji pomiaru odległości oraz przepływu paliwa poprzez zwiększenie liczby impulsów na obrót koła.
- Zmniejszenie liczby przewodów (a optymalnie komunikacja bezprzewodowa) uprościłaby budowę samego urządzenia.
- Bardziej profesjonalne mocowanie hallotronu z pewnością zwiększy prestiż projektu.
- Kalibracja układu obliczającego zużycie paliwa powinna zostać przeprowadzona kilkukrotnie, ale dopiero po zwiększeniu precyzji pomiaru. Błędy wynikające z małej liczby impulsów mogą powodować duże przekłamania spalania chwilowego.
- Jeśli to możliwe warto dodać wskaźnik średniego spalania i przejechanego dystansu od ostatniego kasowania.
- Przy stosowaniu przepływomierzy warto stosować wężyki paliwowe nie zrobione z igielitu z powodu ich twardnienia i trudnościach przy demontażu.
- Użyć bardziej odpowiedniego wyświetlacza.
Wersja docelowa
Wkrótce