Miesięczne archiwum: luty 2015

CarPI czyli Raspberry Pi w Renault Megane

CarPI jest to zamiennik standardowego wyświetlacza radia Update List występującego w samochodach marki Renault, rozszerzający funkcjonalność całego zestawu o funkcje takie jak:
– nawigacja GPS,
– zestaw głośnomówiący bluetooth,
– możliwość odtwarzania muzyki z dysku USB lub przez bluetooth,
– dodatkowe informacje odczytywane z OBD II.
Dodatkowym założeniem było wykorzystanie oryginalnego radia oraz instalacji, umożliwiające w każdej chwili powrót do oryginalnego wyświetlacza.

Budowa
Układ oparty został o minikomputer Raspberry Pi, króry podłączany jest do głównej płyty urządzenia przez złącze GPIO oraz USB. Aby zminimalizować pobierany na postoju prąd, RPi nie jest cały czas włączone. Jego zasilaniem steruje mikroprocesor AVR, który w momencie wykrycia włączenia radia lub zapłonu włącza główne zasilanie 5V w układzie. Poza tym jego zadaniem jest:
– obsługa klawiatury matrycowej pilota przy kierownicy,
– odczyt stanów zapłonu, radia,
– sterowanie zasilaniem wyświetlacza.
RPi oraz AVR komunikują się za pomocą magistrali I2C. Po wyłączeniu zapłonu, AVR przesyła o tym informację do aplikacji działającej na RPi, która po godzinie na wyłączonym zapłonie zamyka system i wysyła do AVRa polecenie wyłączenia zasilania i przejścia w stan uśpienia.  Schemat urządzenia został przedstawiony poniżej.

carpi-schemat

Komunikacja z radiem
Komunikacja z radiem samochodowym odbywa się trzema torami:
1. Szyna CAN – po tej szynie radio wysyła informację co ma pojawić się na wyświetlaczu a oryginalny wyświetlacz wysyła informacje o naciśniętych klawiszach na pilocie pod kierownicą. Niestety protokół komunikacji nie był nigdzie opisany, ale przy pomocy zbudowanego analizatora CAN oraz dużej ilości cierpliwości udało mi się go rozpracować, na tyle że moja aplikacja emuluje w pełni wszystkie funkcje które obsługiwane są przez standardowy wyświetlacz. Po więcej informacji zapraszam do kodu źródłowego:
https://github.com/milyges/CarPI/blob/master/src/rpi-app/displayemulator.h
https://github.com/milyges/CarPI/blob/master/src/rpi-app/displayemulator.cpp
2. UART – służy do emulacji zmieniarki płyt CD, którą moja aplikacja udaje. Dzięki temu przetwarzaniem cyfrowo-analogowym muzyki odtwarzanej z dysku USB zajmuje się radio (zmieniarka wysyła do radia sygnał audio za pomocą S/PDIF) a nie Raspberry PI, co wpływa na poprawę jakości dźwięku w stosunku do karty dźwiękowej zintegrowanej w RPi. Kod emulatora zmieniarki bazuje na dokumentacji dostępnej w internecie i znajduje się:
https://github.com/milyges/CarPI/blob/master/src/rpi-app/changeremulator.h
https://github.com/milyges/CarPI/blob/master/src/rpi-app/changeremulator.cpp
3. AUX – do analogowego wejścia radia podpięte zostało wyjście audio modułu bluetooth.

Oprogramowanie
Raspberry Pi pracuje pod kontrolą systemu operacyjnego Raspian (bazującego na Debianie). Zainstalowany jest serwer X.Org, manager okien OpenBox i kilka innych, niezbędnych do prawidłowego działania programów. Główna aplikacja, sterująca wszystkich napisana została w języku C++, przy wykorzystaniu biblioteki Qt. Cały kod opublikowany został na GitHubie (link niżej).

Nawigacja GPS
Do nawigacji GPS został wykorzystany program Navit. Jego kod źródłowy został delikatnie zmodyfikowany aby usunąć część funkcjonalności (np. podświetlanie możliwych znaków do wpisania w nazwie miejscowości), które nie działały zbyt dobrze. Zmodyfikowany został również plik konfiguracyjny, usunięte zostały wszystkie niepotrzebne warstwy oraz punkty POI aby mapy były jak najbardziej czytelne.

Obługa OBDII
Główna aplikacja na RPi, komunikuje się po USB z adapterem OBD II, opartym o popularny układ ELM327. W chwili obecnej służy to do pokazania dodatkowych wskaźników:
– temperatury powietrza zasysanego
– ciśnienia doładowania
– ciśnienia paliwa w listwie Common Rail
– temperatury cieczy chłodzącej
– obliczonego obciążenia silnika
– napięcia w instalacji elektrycznej
Jest to tak na prawdę taki bajer, który nie był projektowany od początku a pojawił się pod wpływem chwilowego impulsu 😉

Obudowa wyświetlacza, tzw. daszek
Wykonany został na bazie oryginalnego: wycięty został większy otwór, przygotowana ramka na nowy wyświetlacz. Następnie ramka została wklejona w otwór a wolna przestrzeń wypełniona matą oraz żywicą. Dalej wszystko zostało zaszpachlowane do równa, wyczyszczone papierem wodnym i pomalowane podkładem i farbą. Pierwszy raz robiłem coś takiego, było bardzo dużo poprawek, ale wydaje mi się że wyszło przyzwoicie.

Obsługa
Całość dodatkowych funkcji obsługuje się wykorzystując pilot pod kierownicą, co pozwala na obsługę w trakcie jazdy bez odrywania rąk od kierownicy. Przycisk na dole pilota, służący normalnie do zmiany płyty w zmieniarce, wykorzystany został do wejścia w tryb menu. W tym trybie możemy albo zmienić ekran, albo wejść w menu nawigacji.
Po menu nawigacji poruszamy się wykorzystując przyciski: Vol+/Vol- jako góra dół, SRC+/SRC- jako prawo/lewo, przycisk Mute jako enter a przycisk Load (ten na dole) jako Escape. Na początku wprowadzanie nazw miejscowości i ulic wydaje się toporne, ale po kilku razach już wpisuje się w miarę szybko i sprawnie.

Kosztorys i czas trwania
Projekt od analizy komunikatów CAN z radia do finalnej wersji powstawał około roku (głównie wieczorami po pracy). Dużą część elektroniki miałem, więc ciężko mi wycenić:
– Raspberry Pi: około 130zł
– Wyświetlacz: 100zł
– Moduł bluetooth: 80zł
– Moduł GPS: 50zł
– Pozostała elektronika: myślę że do 50zł
Razem około: 410zł

Galeria zdjęć

Zdjęcia prezentują poszczególne fazy projektu od prototypu aż po gotowy układ zamontowany w samochodzie.

Filmy

Poniżej umieszczam kilka filmów prezentujących możliwości urządzenia oraz rozwój oprogramowania.

IdyllaOS

IdyllaOS był to projekt otwartego systemu operacyjnego, który rozwijałem w latach 2005-2011.

Główne cechy systemu:

  • Jądro: monolityczne z dynamicznie ładowanymi modułami
  • Zgodność ze standardem multiboot
  • Funkcje systemowe: w większości zgodne z standardem POSIX
  • Biblioteka standardowa: port biblioteki newlib
  • Aplikacje: pliki wykonywalne w formacie ELF
  • Struktura katalogów: zgodna z FHS (Filesystem Hierarchy Standard)
  • Obsługiwane procesory:
    • i686 oraz lepsze (wersja 32 bitowa)
    • amd64 (wersja 64 bitowa)
  • Obsługiwane urządzenia:
    • Dyski: ATA/IDE
    • Napędy: ATAPI
    • Karta graficzne: VGA (tryb tekstowy), BochsVBE (tryb graficzny)
    • Klawiatury: AT
    • Szyna PCI
  • Obsługiwane systemy plików:
    • Ext2 (w trybie tylko do odczytu)
    • Ramfs (system plików przechowujący informacje w pamięci RAM)

Projekt ten został wykorzystany jako mój projekt inżynierski (treść pracy oraz prezentacja dostępne są do pobrania poniżej).

Całość kodu źródłowego dostępna jest nadal na SourceForge.net w repozytoriach GIT oraz SVN (wcześniejsze wersje).

Na systemie działały popularne aplikacje jak GNU Nano, GCC, GNU Binutils, GNU Grep, GNU Make, itp. System potrafił kompilować aplikację pod samego siebie (brakło kilku rzeczy aby sam potrafił się skompilować).

W ostatnich wersjach dorobił się nawet prostej obsługi socketów oraz protokołów ARP, IP oraz UDP.

Screenshoty:

Poniżej zamieszczam screenshoty z systemu działającego po QEMU (niestety zbyt wiele się nie zachowało):

Do pobrania:

ECU – Test dynamicznego wyprzedzenia zapłonu

Dziś wreszcie dotarła „lampa stoboskopowa” (a tak na prawdę układ migający silną diodą LED), do ustawiania zapłonu i mogłem przetestować czy układ dynamicznego wyprzedzenia zapłonu w ogóle działa. Po naniesieniu znakóœ na testowy wentylator z komputera, wyszło jak na filmie poniżej (wentylator podaje impulsy 2x częściej dlatego naniesione są 2 znaki co 180°, powoduje to też zmniejszenie obserwowanego wyprzedzenia dwukrotnie)

Całość wydaje się działać OK. Zostały kosmetyczne poprawki w kodzie AVRa i całość po ustawieniu kąta 0° zostanie zainstalowana w motórze.

ETZ 125/150 ECU (a właściwie na razie ICU)

Projekt ECU (w chwili obecnej jest to bardziej ICU – Ignition Control Unit) do MZ ETZ 125/150 powstał głównie z chęci nauczenia się projektowania i oprogramowywania modułów sterujących pracą silnika spalinowego (w tym wypadku, jedno cylindrowego, dwusuwowego). W chwili obecnej moduł ten posiada takie funkcje jak:

  • Sterowanie cewką zapłonową
  • Prosty immobilizer (blokada zapłonu) wykorzystujący technologię rfid
  • Odcięcie zapłonu powyżej podanych obrotów
  • Możliwość dynamicznej zmiany kąta wyprzedzenia zapłonu w oparciu o podaną mapę (w zależności od obrotów)
  • Możliwość podglądu parametrów silnika oraz zmian w konfiguracji modułu poprzez port USB

Budowa

Moduł oparty został o mikrokontroler AVR Atmega32u4 firmy Atmel. Posiada on sprzętowe wsparcie USB, które zostało wykorzystane do komunikacji z komputerem. Wszystkie wejścia/wyjścia odizolowane są od instalacji motocykla przez optoizolatory, co pozwoliło wyeliminować sporą część zakłóceń powstających w instalacji. Dodatkowo zasilanie zostało zabezpieczone diodą transil na napięcie 45V a mosfet sterujący cewką zapłonową transilem na napięcie 120V. Całość zostałą zamknięta w aluminiowej obudowie która pełni rolę dodatkowego ekranu. Dane o położeniu wału korbowego, pobierane są z oryginalnego impulsatora. Schemat urządzenia znajduje się poniżej:

Schemat ETZ ECU

Oprogramowanie mikrokontrolera

Oprogramowanie napisane zostało w całości w języku C, kody źródłowe można znaleźć na moim GitHubie.

Aplikacja diagnostyczna

Do komunikacji z modułem, służy aplikacja uruchamiana na komputerze PC, która napisana została w C++ z wykorzystaniem bibliotek Qt w wersji 4. Jest ona również dostępna na moim GitHubie. Jej wygląd prezentuje się jak na poniższym screenshocie:

Aplikacja diagnostyczna

Efekt końcowy

Co do walorów użytkowych, na razie ciężko coś powiedzieć. Udało mi się na nim odpalić silnik, jednak z racji braku czasu i możliwości jazdy (pogoda oraz nie poskładany do końca motocykl), ciężko określić czy wszystko działa jak należy. Zdjęcia poniżej pokazują zmontowany moduł.

Możliwość rozbudowy

W module zostały przewidziane możliwości rozbudowy, bez konieczności modyfikacji układu. Przewidziane są dodatkowe wejścia/wyjścia do:

  • Czujnika temperatury silnika, opartego o PT100
  • Czujnika otwarcia przepustnicy
  • Sterowania serwami ssania oraz wolnych obrotów

W chwili obecnej nie są one używane, ale być może zostaną jeszcze w jakiś sposób wykorzystane.

ETZ – ECU i odpalamy

Po 2 dniach walki z elektryką, świecą zapłonową, gaźnikiem odpaliła na moim autorskim module zapłonowym. Moduł wymaga jednak kilku poprawek jeśli chodzi o wejście sygnału, jest nieco inne niż przewidywałem. Okazało się (a raczej nie doczytałem), że zapłony tupu A i B posiadały iskrę wyzwalaną innym zboczem: typ A zboczem narastającym a typ B opadającym. W moim module przygotowane było wszystko pod zbocze opadające. Z racji że nie wziąłem kodów źródłowych ze sobą (wystarczy zmienić zbocza INT0 i INT1 miejscami), musiałem na szybko polutować układ zmieniający sygnał składający się z jednego tranzystora NPN oraz opornika (wcześniej zapłon występował w DMP a nie GMP). Po tych zmianach oraz zmniejszeniu przerwy na świecy z fabrycznej na nieco mniejszą zapaliła za pierwszym razem. Miłym zaskoczeniem jest to, że po podłączeniu przewodów alternatora, wzbudza się przy zasilaniu regulatora przez diodę LED bez równoległego opornika (choć przy nieco wyższych obrotach). Zmierzone napięcie ładowania to 13,5V na wolnych obrotach i 14,4V przy wyższych.

Na razie wszystko wisi luzem, ale wiązki dodatkowe już położone także następnym razem będzie można już je ładnie upinać. Do zrobienia zostało:

  • założyć pokrywę sprzęgła + regulacja sprzęgła
  • montaż czerwonych elementów (odwlekam ile się da aby nic nie obić).
  • regulacja gaźnika
  • rozwiązanie problemów z immobilizerem (antena łapie nie do końca jakbym chciał)
  • poprawki w kodzie ECU + testy zmiany wyprzedzenia zapłonu
  • nowy prędkościomierz
  • naklejki, tabliczka znamionowa, lusterka, itp.
  • przegląd, przerejestrować i w drogę 🙂

Trochę zdjęć i filmów z dziś: