Nieudana budowa osobnego licznika paliwa.

Nieudana budowa osobnego licznika paliwa.
Wpis w połowie był pisany w roku 2018 a dokończyłem go dopiero w 2020 roku więc niestety urywa się w połowie projekt.

Dawno nic nie pisałem na blogu, tak stwierdziłem że dobrze będzie stworzyć jakiś wpis na temat mojego projektu z licznikiem paliwa do samochodu. Ale o co chodzi przecież każdy samochód posiada takowy licznik pewnie ktoś by pomyślał, niestety w moim samochodzie (Nissan Primera p11.144) uszkodziły się liczniki (a dokładniej nie pokazuje stanu paliwa), a każdy elektromechanik u którego byłem stwierdził że nie podejmie się naprawy, bo i tak nie będzie trwała, ponieważ w tych licznikach występował problem zimnych lutów.

Tak więc zabrałem się za przypominanie elektryki, mimo zawodu mechatronik, po paru latach nie interesowania się tym trochę wiedzy uszło z głowy. Po przekartkowaniu kilku podręczników do elektryki zabrałem się za wygrzebanie płytki stykowej oraz jakiegoś mikroprocesora. Pierwszą wersję zbudowałem z użyciem ATmega8-PA z użyciem frameworka Arduino, co jak wyszło potem nie było najlepszym pomysłem. Następnie znalazłem pełną dokumentacje mojego samochodu, sprawdziłem w jaki sposób pływak podaje wartości, po czym zmierzyłem miernikiem czy wszystko jest w porządku.

Wartość rezystancji jaka jest podawana z pływaka przy danej ilości paliwa.

Po zapoznaniu się z wartościami pływaka zabrałem się za kupno brakujących elementów a dokładnie wyświetlacza LCD 2x16 ze sterownikiem zgodnym z HD4478, żeby mieć gdzie wyświetlać informacje. Oraz napisałem prosty program gdzie miałem tylko policzony procent zawartości zbiornika paliwa oraz wyświetlanie oporności z pływaka .

#include <LiquidCrystal.h>

float r1 = 10000.0;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup()
{
  lcd.begin(16, 2);
}

void loop()
{
  lcd.setCursor(0, 1);
  printPrecent(getOhms());
  delay(3000);
}

float calculatePrecent(float ohms) 
{
 return (ohms / 171.5) * 100; 
}

void printPrecent(float ohms) 
{
  int precent = (int) calculatePrecent(ohms);
  lcd.setCursor(0, 0);
  String progress;
  progress += F("[");
  for(int i = 0; i <= 6; i++)
  {
    progress += F("#");
  }
  progress += F("]");
  lcd.print(progress);
  lcd.setCursor(0, 1);
  lcd.print(ohms);
  lcd.print(String(precent, 2) + "%");
}

float getOhms() 
{
  float Uwyj = (5.0/1024.0) * float(analogRead(0));
  float R = r1 * ( (5.0/Uwyj) - 1);
  return R;
}

Niestety nie w głowie było mi na początku rysować schemat układu całego więc nie mam czym tutaj za bardzo się pochwalić, poza kodem pod framework arduino który był słaby. Przy pierwszych problemach ze stabilnością pomiaru oraz wielkością programu (miałem tylko 8kB pamięci flash),  zdecydowałem się na przepisanie programu do czystego c.

Pierwszym wyzywaniem było skonfigurowanie środowiska programistycznego. Wybrałem Eclipse-cpp 2018-12 oraz zainstalowałem plugin do niego następnie pobrałem ATMEL AVR Toolchain w wersji 3.4 i avrdude w wersji 6.3. Po skonfigurowaniu wszystkiego oraz przetestowaniu mojego programatora USBASP zabrałem się za naukę używania pinów.

Jak już napisałem odpowiedni program w c (który pozostawiał wiele do życzenia) zabrałem się za optymalizacje komponentów, na pierwszy ogień poszedł ekran który zamieniłem na wersję z konwerterem I2C LCM1602. W ten sposób ilość przewodów podłączonych do ekranu zmalała z 12 do 4 oraz pozbyłem się dużego potencjometru do ustawiania kontrastu.

Zastanawiając się nad zasilaniem układu pomyślałem że użyję po prostu napięcia 12V oraz stabilizatora L7805ABV, jednak w praktyce nie wyszło to za dobrze, oraz pierwsza próba przeniesienia układu na płytkę uniwersalną zakończyły się nie powodzeniem. Sam w sobie kawałem ze stabilizatorem oraz bezpiecznikiem działa, wykorzystywałem go nawet jak testowałem układ z napięciem 12V. Jednak zdecydowałem się zastosować finalnie przetwornicę step-down.

W końcu należało by zrobić schemat projektu, i tak dobrze że miałem działający projekt na płytce prototypowej, może nie widać tego w tym wpisie ale układ powstaje już parę miesięcy, robiłem go w wolnych chwilach. Do wykonania schematu użyłem narzędzia dostępnego na stronie easyeda.com.  

Pierwsza wersja schematu. Ładnie nie jest w końcu to mój pierwszy schemat od lat.

Następnie zabrałem się za projektowanie płytki PCB. Serwis easyeda posiada bardzo wygodne narzędzie do projektowania płytek oraz wyznaczania ścieżek. Po kilku próbach stworzyłem coś co miało by prawo działać.

Analizując schemat zacząłem się zastanawiać czy na pewno jest mi potrzeba ATmega8 z taką ilością pinów do tego projektu. W efekcie doszedłem do wniosku że zamiast ATmega8 użyję ATtiny85-20, więc zabrałem się za przebudowanie schematu oraz zamówiłem procesor ATtiny85-20PU. Dodałem jeszcze dodatkowo diodę prostowniczą 1N4148 przed konwersją napięcia.

Wróciłem dokończyć wpis z końca 2018 roku w maju 2020 dalej będzie mało opis jakie jescze zmiany były w projekcie oraz dlaczego to się nie udało

Teraz następuje mały skok w czasie ponieważ byłem trochę zajęty pracą i po nocach przerobiłem projekt na mikroprocesor ATtiny85-20PU, trochę przerobiłem kod programu mikrokontrolera (pod koniec artykułu będzie link do github z projektem).

Niestety nic więcej się nie zachowało ze zdjęć.

Ostatnie wersje schematu wykonałem w lutym 2019 roku (poprzednie na ATmega8 były zrobione w lipcu 2018), i zostawiłem projekt gdyż byłem bardziej zajęty przygotowaniami na wyjazd do Japonii w marcu. Po powrocie i gdy już miałem się zabierać za wytrawianie płytek okazało się że w samochodzie zużyła się uszczelka pod głowicą, a patrząc na to że to dość kosztowna naprawa (ze względu że silnik był na łańcuchu rozrządu) oraz sama karoseria była pordzewiała i krzywa to zadecydowałem o złomowaniu samochodu. W ten sposób projekt licznika paliwa też zakończył życie.

Tak na zakończenie tego wpisu dodam kilka zdjęć z rozbierania nissana (oraz pokażę następce), i trochę to nauczka dla mnie jest że takie projekty powinienem realizować szybciej włącznie z tym wpisem.

Obiecany link do kodu licznika paliwa: Github

Następca :) (2019)