Niedawno zakupiłem Mazdę MPV r.2004 w dieslu. Poineważ w poprzednim aucie miałem zamontowany automat do świateł, to jeżdżąc mazdą zupełnie zapominałem o ich włączaniu. Postanowiłem więc zrobić i do tego auta sterownik. W fieście miałem na wyświetlaczu alfanumerycznym 2*16 znaków. Nie chcąc szpecić kokpitu w mazdzie wymyśliłem, że podmienię wyświetlacz oryginalny z zegarów, który u mnie wyświetlał tylko temperaturę zewnętrzną. Niemal idealnie pasuje tu wyświetlacz z nokii 3310/5110 i na tym swój projekt oparłem.
Oczywiście zacząłem od ogólnych założeń:
- Zegarek z datą
i bateryjnym podtrzymywaniem
-
Pomiar temperatury na zewnątrz i wewnątrz
-
Pomiar napięcia instalacji
-
Automatyczne załączanie świateł 2 sekundy po zapaleniu samochodu i ich wyłączanie
po jego zgaszeniu
-
Odczyt parametrów pracy silnika z komputera samochodowego + odczyt kodów błędów
i kasowanie check engine (na razie nie zaimpletowane)
Schemat ideowy układu
Na schemacie widać atmegę 1284 ale układ
został na razie wykonany na kompatybilnej pinowo atmedze 32 pracującej na
zewnętrznym kwarcu o częstotliwości: 6144000 Hz.
Za odmierzanie czasu odpowiedzialny jest układ ds1307 pracujący w swojej
podstawowej konfiguracji z podtrzymywaniem bateryjnym (użyta jest bateria
cr2032).
Wyświetlacz z nokii 3310 powinien pracować przy napięciu 3,3V, użyto więc
buforów w postaci układu 7407, który posiada 6 buforów z wyjściem typu otwarty
kolektor. Diody D1 i D2 obniżają napięcie zasilania lcd do ok 3,5V.
Wejścia z czujnika ciśnienia oleju, świateł i zapłonu są separowane galwanicznie
poprzez transoptory cny17.
Podświetlanie lcd jest niewykorzystane, gdyż korzystam z oryginalengo
podświetlania.
Jako czujniki temperatury zostały wykorzystane oczywiście popularne czujniki
firmy dallas typu ds18b20 pracujące na wspólnym wejściu. W przypadku awarii
czujnika niestety będziemy musieli od nowa programować urządzenie, gdyż jego
numer seryjny zapisany jest w pamięci flash i jego zmiana jest możliwa tylko
poprzez wymianę firmware'u (przynajmniej na razie).
Zmiana oprogramowanie nie wymaga dostępu do płytki, gdyż do procesora został
wgrany bootloader, a złącze uart jest umieszczone w łatwo dostępnym miejscu. Na
razie nie umieściłem w programie wywołania bootloadera, więc wgrywanie programu
wymaga ręcznego restartu procesora (ja umieściłem wyłącznik zasilania obok
złącza z uartem).
Przedstawiam listing programu:
Podprogramy do obsługi zegarka:
Podprogramy do obsługi wyświetlacza z
nokii 3310:
Podprogram do obsługi nokii 3310 nie jest
mojego autorstwa, został zaczerpnięty z sieci. Wprowadziłem trochę modyfikacji,
gdyż podczas montażu wyswietlacza okazało się, że nie będę w stanie zabudować go
normalnie, tylko do góry nogami, więc niektóre procedury zostały odpowiednio
zmienione. Poniżej przedstawiam oryginalny listing znaleziony w sieci (można
porównać, co i jak zostało zmienione):
Krótki opis programu:
Na początku oczywiście deklaracja
zmiennych, typu procesora, częstotliwości, baudrate itp.
Obsługa zegarka odbywa się standardowo przez I2C, nie będę tu więc szczegółowo
wdawał się w opis (jest tego dużo w sieci).
Sposób wyświetlania:
Polecenie "lcdgoxy x,y" określa miejsce od którego zaczniemy wypisywać tekst na
ekranie lcd (mamy 6 wierszy po 14 znaków każdy). Ponieważ wycięcie w
oryginalnych zegarach miałem trochę mniejsze, więc mam ograniczoną liczbę
wierszy do 5 (wiersz nr 1 jest niewidoczny).
Polecenie "lcdstr "napis" x,y" wysyła "napis" do lcd. Parametr x określa, czy
tekst ma mieć rozmiar normalny (1) czy podwójny (2). Parametr y określa, czy
tekst ma być wyświetlony normalnie (0) czy w negatywie (1). Zmienna, którą
wysyłamy musi być typu string, czyli jeśli chcemy wysłać jakąś wartość liczbową
typu byte, integer lub inną, musimy ją przekształcić na stringa np poleceniem:
zmienna_stringowa=str(zmienna_bytowa).
Polecenie "show x,y" wyświetla obrazek. Oczywiście obrazek musi być o dwubitowej
głębi koloru. Ja, podobnie jak autor programu do konwersji bitmapy użyłem
programu FastLCD.
Polecenie "lcdclear" czyści wyświetlacz. I to by było w skrócie tyle o
wyświetlaniu.
Do moich potrzeb na szybko przerobiłem procedury wyświetlania tekstu, natomiast
obrazki w dalszym ciągu wyświetlane są do góry nogami, projektując więc jakiś
obrazek albo należy to zrobić do góry nogami, albo należy przerobić procedurę
odpowiedzialną za wyświetlanie obrazka.
W programie na razie nie ma żadnego menu, gdyż nie miałem czasu na dokładniejsze dopracowanie programu (ale na pewno to niedługo dopracuję). W celu zaprogramowania daty i godziny należy odhaczyć zaremowane linjki:
'_day = 04 : _month = 09 : _year = 13 :
Weekday = 3 'przekonwertuj
'Gosub Setdate
'_sec = 0 : _min = 29 : _hour = 17
'Gosub Settime
i zaprogramować procesor. Następnie linijki te zaremować i ponownie
zaprogramować procesor, gdyż przy każdym restarcie ustawiałaby nam się w/w
data i czas. Oczywiście to zadziała jedynie w przypadku, gdy mamy podłączone
podtrzymywanie bateryjne do ds1307. Nic nie stoi na przeszkodzie aby dopisać
sobie samemu już teraz obsługę ustawiania daty i godziny.
I ostatnia funkcjonalność tego komputerka to odczyt parametrów silnika i kodów błędów. Funkcja ta na razie nie została podłączona, gdyż brakło czasu, niemniej już ją testowałem (jeszcze przed zamontowaniem komputerka w aucie). Aby móc odczytywać w/w parametry i kody należy zaopatrzyć się w interfejs ELM327 z rs232 (są one niedrogie, w granicach 50zł). Należy go podłączyć do komputera samochodowego, wcześniej jednak należy go rozebrać i wpiąć na wejście układu max232 uart z naszego procesora (musimy więc go rozebrać, bo na wyjściu mamy inne poziomy i moglibyśmy zniszczyć procesor). Można oczywiście dorobić sobie przejściówkę rs232/uart i podłączyć nasz komputerek bezpośrednio z elm'em poprzez tę przejściówkę.
Teraz pokrótce opiszę, jak mniej więcej
skomunikować się z komputerem naszego auta.
Zanim odkryłem stronę na wikipedii, gdzie opisane są komendy do odczytu
poszczególnych funkcji i sposobu ich przeliczania:
http://en.wikipedia.org/wiki/OBD-II_PIDs podłączyłem się elmem z komputerem
i używając rs232 sniffera "podsłuchiwałem", jak sobie rozmawiają obydwa
urządzenia.
2 screeny z tej operacji przy użyciu programu scantool a do przechwytywania
użyto "serial port monitor" oraz zapytanie poprzez terminal o prędkość:
Jak widać z 3 screena do odczytu parametrów czy nawet kasowania błedów wcale nie potrzebujemy jakiegoś programu, możemy to zrobić przy pomocy zwykłego terminala (jednak interpretacja wyników jest kłopotliwa, wymaga trochę przeliczeń-choć czasem odczyt jest bezpośredni i wtedy wystarczy tylko zamienić wynik z hexa na dziesiętny).
W programie są procedury do odczytu
niektórych parametrów gdyż, jak wcześniej pisałem, testowałem odpytywanie elm'a
o parametry pracy silnika. Zostało mi więc tylko podłączyć się pod kompa w aucie
na stałe i dopracować te procedurki.
Jak widać z wikipedii komunikacja wygląda dość prosto i nie powinna nikomu
nastręczyć problemów.
Filmik z symulacji w programie ISIS:
A teraz fotki z montażu.
Przeróbka (od lewej oryginał do wycięcia,
po prawej już wycięty fragment)
Dopasowywanie (jeszcze na stole)
Zmontowane i zabudowane w aucie (jeszcze
przed przeróbką programu - wyświetlane do góry nogami) i już po przeróbce
ciąg dalszy nastąpi :)
PS. 27.10.2013
W związku ze zmianą czasu dorobiłem w końcu obsługę ustawiania zegarka, Oprócz tego dodano również procedurę automatycznej zmiany czasu z letniego na zimowy i odwrotnie. Poprawiony listing programu u góry. Teraz czeka mnie optymalizacja, gdyż program zajmuje już niemal całą pamięć atmegi 32.
Filmik w symulacji pokazujący nowododane menu:
02.01.2016
Uaktualniłem schemat i listing o sterowanie webastem, które zrobiłem już 2 lata temu i działa doskonale. Webasto, które posiadam jest webastem cyfrowym i wymaga sterowania cyfrowego, czyli wysłania odpowiedniej sekwencji załączającej po rs232. Po wysłaniu sekwencji należy co 10 sekund wysyłać sekwencję podtrzymującą pracę webasta inaczej webasto się wyłączy i będzie sygnalizować błąd. U mnie, ze względu na uproszczenie programu, wysyłanie sekwencji podtrzymującej jest realizowane co 1 sekundę. Ze względu na to, że nie wiem jak wygląda sprawa licencji to nie udostępniam sekwencji załączającej, wyłączającej i podtrzymującej do webasta. Jeśli ktoś ma zamiar to wykonać, to wyciągnięcie tych sekwencji jest bardzo proste. Wystarczy połączyć się z webastem przy pomocy oryginalnego programu do diagnostyki webasta i jednocześnie wykorzystać rs232 sniffera do podsłuchiwania transmisji. W programie do diagnostyki jest opcja "załącz" i "wyłącz" i wystarczy je wysłać a następnie "wyłowić" sekwencję. Jeśli ktoś chciałby wykorzystać ten sterownik do sterowania webastem analogowym to można to zrobić bez większych przeróbek. Webasto analogowe załączane jest przez podanie masy lub +12V na odpowiednie piny (nie pamiętam już dokładnie czy to masa, czy +12V i na które to piny, ale łatwo można w necie znaleźć opisy). Wystarczy więc wykorzystać przekaźnik z załączania pompy wody (jest on załączany w momencie wysłania sekwencji załącz do webasta cyfrowego). Wentylator jest uruchamiany 4 minuty po uruchomieniu webasta (aby najpierw ciecz w obiegu się nagrzała). Mazda mpv jest oryginalnie wyposażona w webasto, ale pracuje ono tylko podczas jazdy autem, gdy temperatura na dworze spada poniżej 8°C. Ponieważ mazda nie ma elektrycznej pompy cieczy, to musiałem ją dołożyć, przecinając wąż z cieczy chłodzącej (pompkę kupiłem na znanym serwisie aukcyjnym). Ponieważ musi być również uruchomiony nawiew w aucie, to należy się wpiąć w instalację elektryczną tak, aby załączać wentylator nadmuchu (ja zrobiłem to tak, że przeciąłem przewód zasilający przekaźnik z wentylator i wpiąłem się moim przekaźnikiem w ten sposób, że gdy webasto mam wyłączone, to styk zamknięty zamyka przecięty przewód i wentylator działa w normalny sposób. Gdy webasto jest załączone i mijają 4 minuty to przekaźnik się przełącza podając +12V na przekaźnik i tym samym załączając wentylator). Przed opuszczeniem auta należy pamiętać, aby ustawić temperaturę nawiewu na maksimum i włączyć wentylator nadmuchu (ja ustawiam na pozycję 2). Oczywiście obieg powietrza najlepiej przełączyć na wewnętrzny, gdyż szybciej wnętrze zostanie nagrzane. Po osiągnięciu 14°C.wewnątrz auta webasto zostaje wyłączone. Sposobów na włączenie webasta są dwa. Pierwszy to ustawienie godziny, o której ma się załączyć webasto (wybór w menu), drugi to sterowanie pilotem (tu wykorzystałem jakąś starą centralkę z zamka centralnego - przekaźnik wykonawczy na 2 sekundy podaje masę na odpowiednią nóżkę procesora). Na schemacie widać złącza Dsub, poprzez które mam wyprowadzane potrzebne sygnały (pierwotnie nie miałem sterowania webastem, więc na razie przewody do webasta mam lutowane i jak wyciągam sterownik to muszę rozlutowywać przewody).