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.

        LIcznik po rozebraniu
      

 

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).