Po kilku wyprawach w Ameryce Północnej, dojrzała we mnie idea zainstalowania w samochodzie jakiegoś bardziej zaawansowanego odtwarzacza muzyki i nawigację GPS. Po pierwsze, potrzebuję wiele piosenek podczas jazdy na bardzo długich dystansach non-stop. Po drugie, gdy okazuje się, że zagubiony jestem na pustyni lub górach, pomocna może okazać się lokalizacja na mapie przy użyciu GPS. My Jeep Wrangler oryginalnie miał proste radio z odtwarzaczem CD. Nadszedł czas, aby wymienić je na coś trochę bardziej przydatnego.
Najbardziej popularne są urządzenia oparte na Androidzie, które często są prostym zamiennikiem dla standardowego radia w samochodzie. Może wydawać się to być dobrym rozwiązaniem, ale ja przede wszystkim, wymagałem od nowego urządzenia jak największej elastyczności. Oznacza to, że gdy narodzi się jakiś nowy pomysł, moje urządzenie powinno być otwarte na rozbudowę, dodanie nowych funkcji i poprawę funkcjonalności. Obawiałem się również ograniczeń w odniesieniu do map w systemach Android. Potrzebowałem absolutnej swobody zainstalowania map dowolnego obszaru przed wyruszeniem w kolejne podróże.
Podjąłem decyzję zbudowania mojego urządzenia na bazie Raspberry Pi, komputera na jednej płycie o wielkości karty kredytowej. Działa on pod kontrolą system operacyjnego Raspbian, opartego na Linuksie. Aby mogła zmaterializować się moja wizja potrzebny był ekran dotykowy, oraz wiele innych części, zobacz pełną listę komponentów sprzętowych poniżej. Oprogramowanie było kolejnym bardzo ważnym elementem. Myślę tu programach użytkowych takich jak odtwarzacz muzyki, nawigacja i oczywiście menu główne, które połączyłoby wszystkie niezależne programy w jedną, spójną aplikację.
Byli już inni przede mną, którzy wykorzystali Raspberry Pi w podobnym celu. Patrząc wokoło postanowiłem spróbować najpopularniejsze rozwiązanie oparte o Kodi, otwarte oprogramowanie multimedialne. Kodi posiada wiele funkcji, mnóstwo wtyczek i może być łatwo modyfikowany. Niestety, integracja z systemem nawigacji Navit była dużą przeszkodą. Jest to możliwe, ale występują problemy z obsługą ekranu dotykowego. Zdałem sobie również sprawę, że dodanie zewnętrznych aplikacji do Kodi, takich jak menu główne na przykład nie jest takie proste. Kodi jest świetnym odtwarzaczem multimedialnym, ale ja potrzebowałem czegoś więcej. Chciałem wyjść poza możliwości odtwarzania muzyki i filmów.
Musiałem zrezygnować z Kodi. Program ten sprawiał że cały projekt był zbyt skomplikowany. Z drugiej jednak strony Navit, system nawigacji ze śledzeniem GPS, współpracujący z mapami z kilku źródeł, przede wszystkim OpenStreetMap to aplikacja, która w pełni spełniała moje wymagania. Miałem zatem mapy i nawigację, brakowało jednak odtwarzacza muzyki. Patrząc na listę dostępnych programów na Raspberry Pi, wybrałem i zainstalowałem VLC Media Player, dość dobrą aplikację dostępną na wielu platformach i często używana pod Windowsami. Początkowo VLC sprawował się dość dobrze, lecz po krótkim czasie widoczne były problemy. VLC okazał się być zbyt wolny, czasami nie był w stanie obsłużyć zmian piosenek. Głównym tego powodem było buforowanie odtwarzanych plików i brak przyspieszenia sprzętowego. VLC nie okazał się był odpowiednim komponentem w moim projekcie.
Zdałem sobie sprawę, że jest absolutnie koniecznym jest odtwarzacz muzyki z przyspieszeniem sprzętowym. Nie chcemy przecież mieć żadnych nagłych i niespodziewanych przerw podczas słuchania muzyki w czasie jazdy. Jedyną dostępnym tego typu odtwarzaczem jest omxplayer, napisany specjalnie dla GPU Raspberry Pi. Niestety, jest to program jedynie działający z linii poleceń, nie ma on interfejsu graficznego. Pliki z muzyką uruchamia się poprzez wydawanie komend z linii systemu Linux. Na szczęście, istnieją projekty open-source, które dodają GUI do omxplayer. Zdecydowałem się użyć interfejs noszący nazwę TBOPlayer napisany w języku Python.
Mając zainstalowaną nawigację GPS i dobrze działający odtwarzacz multimedialny, mojemu systemowi brakowało centralnego składnika, który pozwoliłby na łatwe przechodzenie między wszystkimi aplikacjami. W tym celu, postanowiłem napisać proste menu. W pierwszej wersji główny ekran menu miał cztery ikony umożliwiające przełączanie między programami nawigacji, odtwarzaczem, kalkulatorem i pulpitem windows. Ten ostatni dodałem aby mieć dostęp do linii komend terminala, kalendarza, edytora tekstu lub jakiejkolwiek innej aplikacji w zależności od doraźnych potrzeb.
Po wielu miesiącach pracy, narodził się baliosOPC (balios On-Board Personal Computer) czyli personalny komputer pokładowy. Jest to coś więcej niż nawigacja GPS i odtwarzanie muzyki, dlatego zasługuje aby być określany jako komputer samochodowy lub w carputer. Wiem, że jak na razie ma on bardzo ograniczoną liczbę funkcji, ale to dopiero początek. Stworzyłem bardzo elastyczną platformę otwartą do rozbudowy.
Zgodnie z założeniem, baliosOPC łączy w sobie wszystkie cechy dostarczane przez uruchamiane przez niego aplikacje. Dodatkowo posiada on wszystkie funkcje, jakie dostarcza środowisko graficzne Raspbian. Niezależne programy połączone są ze sobą i mogą być uruchamiane z ekranu głównego czyli menu baliosOPC. Wszystkie aplikacje zawsze pracują w trybie pełnoekranowym.
Ekran główny
Jest to mój własny mini program, który ma jeden ekran umożliwiający dostęp do kilku niezależnych aplikacji. Gdy dotknie się ikonę na ekranie, wskazany program przejmuje kontrolę. Jeden z przycisków w ramce ekranu LCD jest zakodowany jako kombinacja <Alt-Tab>. W ten sposób można z każdego innego programu wrócić do ekranu głównego. Jest tak naprawdę zwykłe przełączanie miedzy oknami na pulpicie. Zgodnie z założeniem, nie wszystkie aplikacje należące do baliosOPC są uruchamiane w czasie startu systemu. Niektóre z nich, te rzadziej używane są startowane tylko wtedy, gdy są potrzebne. Mój program sprawdza, czy aplikacja istnieje w systemie. Jeżeli nie, to jest startowana. W przypadku przeciwnym sterowanie przekazywane jest do istniejącego w systemie procesu. Istnieje zabezpieczenie zapobiegające uruchamianiu więcej niż jednej kopii tego samego programu.
Aplikację nawigacji samochodowej Navit można kastomizować, moje zmiany obejmują:
Muzyka i wideo to TBOPlayer
Na początku zrobiłem tylko małe zmiany kodu w celu integracji odtwarzacza z baliosOPC. Wszystkie najważniejsze aplikacje starują równolegle w celu uzyskania jak najkrótszego czasu startu systemu. TBOPlayer jest najwolniejszym programem na starcie. Dodałem dodatkowe polecenia systemu w tle, wymuszające przejście do ekranu głównego. Wszystko dlatego, że TBOPlayer pokazuje się na ekranie jako ostatni, a ja chciałem, aby cały system witał użytkownika ekranem głównym.
Kalkulator to galculator
Nie można uruchomić programu galculator w trybie całoekranowym. Aby obejść to ograniczenie, w tle dodałem polecenia systemowe wysyłające naciśnięcie klawisza <F11> natychmiast po uruchomieniu programu. W ten sposób kalkulator wypełnia cały ekran. Nie korzystam z kalkulatora cały czas, dlatego też, nie jest on uruchamiany w momencie startu systemu. galculator staruje dopiero wtedy, gdy jest potrzebny, tzn. jest otwierany z menu głównego.
Computer Desktop is LXDE Desktop (typical Windows style desktop)
Wszystkie aplikacje w obrębie baliosOPC uruchamiane na pierwszym ekranie środowiska graficznego. Gdy przełączymy się na ekran numer dwa mamy zwykły pusty pulpit do pracy. Jest to jak każdy inny, znany nam wszystkim tradycyjny komputer PC. Aby wprowadzić polecenia, hasła itd., można korzystać tu z klawiatury ekranowej lub podłączyć poprzez USB fizyczną klawiaturę.
Sam możesz spróbować stworzyć podobny system oparty na tej same idei. Przejdź do strony pobierania. Znajdziesz tam programy i skrypty, które napisałem pracując nad moim baliosOPC.
Zewnętrzne przechowywanie danych
Ramka ekranu LCD zawiera gniazdo kart SD. Zwykle mam przygotowanych kilka kart z muzyką i filmami. Można je łatwo zmieniać. Po włożeniu nowej karty pamięci SD, montowana jest ona automatycznie i wszystkie pliki dostępne są natychmiast w odtwarzaczu multimedialnym.
Programowalne przyciski
Pięć przycisków w ramce ekranu może być zaprogramowanych jako dowolne klawisze klawiatury. Na razie mam zakodowane je jako strzałki w górę i w dół, Enter, Escape i <Alt-Tab>. Szósty klawisz po lewej to przycisk wyłączania zasilania podłączony do GPIO w Raspberry Pi. Gdy przycisk zasilania jest wciśnięty przez ponad 2 sekundy program działający w tle przejmuje kontrolę i wydaje polecenie halt bezpiecznego zamknięcia całego systemu.
Zewnętrzna klawiatura i myszka
Ramka ekranu posiada jedno gniazdo USB. Używając jednak koncentrator USB mogę podłączyć jednocześnie zewnętrzną klawiaturę i myszkę. W ten sposób łatwo mogę wykonywać wszystkie doraźne zmiany w systemie.
Zdalne połączenie z laptopem
Podłączyłem kabel Ethernet na stałe do Raspberry Pi. Drugi koniec kabla znajduje się pod schowkiem z prawej strony. Podłączając kabel Ethernet do laptopa i używając programu Putty jestem w stanie zalogować się do Raspberry Pi. Za pomocą ftp mogę również swobodnie przesyłać pliki między RPi i laptopem.
Potencjometr siły głosu
Umieściłem gałkę w przedniej konsoli pod ekranem LCD. Podłączony jest on bezpośrednio do wzmacniacza. Potencjometr posiada on trzy funkcje: siła głosu, ustawianie tonów wysokich i niskich. Nie ukrywajmy, fizyczny kontroler jest bardzo wygony, dużo lepszy niż podobna funkcja na ekranie. Podczas jazdy, gdy włączone są światła, gałka podświetlona jest w kolorze zielonym, tak jak cała konsola mojego Jeepa
Automatyczne wyłączanie
Komputery wymagają pewnego czasu aby wyłączyć się poprawnie. Jest to poważny problem podczas instalowania ich w samochodach. Chcemy mieć wygodny sposób ich wyłączania i powinno nastąpić to automatycznie, tak jak w przypadku konwencjonalnych odbiorników radiowych. Odcięcie źródła prądu bez odpowiedniego zamknięcia systemu nie jest zdrowe dla komputerów na dłuższą metę. Tak dzieje się gdy kluczyk wyjęty jest ze stacyjki. W tym momencie odcięte jest zasilanie akcesoriów określane jako ACC. Konieczne jest pewne opóźnienie, aby mieć wystarczająco dużo czasu na zamknięcie systemu operacyjnego. W tym celu zaprojektowałem system trzech przekaźników podłączonych do GPIO (General Purpose Input/Output) w Raspberry Pi. Przekaźniki wysyłają sygnał i niestandardowy program działający w tle decyduje, kiedy należy zainicjować proces wyłączania. Zakodowałem dodatkowy czas oczekiwania po wyłączeniu ACC, a przed zamknięciem systemu. To dlatego, że nie chcę zawsze wyłączać komputera w sytuacjach gdy kluczyk wyjęty jest ze stacyjki i w krótkim czasie umieszczony jest tam z powrotem.