After several expeditions in North America, I matured with the idea to install more advanced music player and GPS navigation. First, I needed many songs while driving very long distances non-stop. Secondly, when it turns out that I am lost in the desert or the mountains, it may be helpful to obtain the location on map using the GPS. My Jeep Wrangler had simple radio with CD player. It was time to replace it with something a little more useful.
The most popular are the Android devices that often are a simple replacement for the stock car radio. This may sound like a good solution, but above all, I wanted the flexibility from a new device. This means that when a new idea is born, my device should be open to expansion, adding new features and improving the functionality. I was also worried about limited and hard to get maps for Android media centers. I needed an absolute freedom to install maps of any region I want when preparing for next travels.
I made a decision to build my device around Raspberry Pi, a credit card-sized single-board computer. The operating system it runs is Raspbian, a Linux distribution. For my vision to materialize a touch screen and many other parts were required, see the full list of hardware components below. Software was another extremely important part. I am talking here about music player, navigation and of course main menu screen that would link all the independent programs into one cohesive application.
There were others before me, who took similar route using Raspberry Pi. Looking around I decided to try the most popular solution based on Kodi, an open-source media player. Kodi has many features, tons of plugins, and can be easily modified. Unfortunately, integration with Navit car navigation system was a big obstacle. It is possible, but there were problems with touch screen support. I also realized that adding third-party applications to Kodi, such as the main menu, for example, is not so simple. Kodi is a great media player, but I needed more than that. I wanted to go beyond the ability of playing music and videos.
I had to abandon Kodi. It made the whole project to complex. On the other hand Navit, the navigation system with GPS tracking that accepts maps from several sources, notably OpenStreetMap was an application that fully meet my requirements. I had maps and navigation, but I was missing a music player. Looking at the list of available programs on Raspberry Pi, I picked and installed VLC media player, a nice cross platform application often used in Windows. At first, VLC held up well, but more testing uncovered problems. VLC proved to be too slow, sometimes it was not able to handle switching song. It was due to buffering and the lack of the hardware acceleration. VLC not proved to be a suitable component in my project.
I realized that hardware accelerated media player is absolutely required. You do not want any sudden and unexpected music interruptions while driving. The only one that is available is a native omxplayer, specifically written for the Raspberry Pi's GPU. Unfortunately, this is a command line player; it means it has no graphical interface. You play songs by issuing commands from Linux command line. Fortunately, some open-source projects add GUI to omxplayer. I decided to use TBOPlayer interface written in Python.
Having installed GPS navigation and working well media player, my system was missing a central component that would allow easy switching between all the applications. For that part, I decided to write a simple menu. For the initial release the main screen menu had icons giving four option allowing switching between programs like navigation, media player, calculator, and X desktop. The latter I added in case I need access to the command line, to calendar, view text documents, or run any other application depending on ad-hoc needs.
After many months of work, baliosOPC (balios On-board Personal Computer) was born. It is something more than a GPS navigation and music player, and therefore it deserves to be called car computer, or carputer. I know it has very limited number of features so far, but this is only the beginning. I have created a very flexible platform open to expansion.
By design, baliosOPC combines all the features provided by the independent applications it runs. This is in addition to all the features that Raspbian GUI environment has to offer. Programs are linked together and can be accessed from the baliosOPC main menu or home screen. All the applications always run in the full screen mode.
This is my custom tiny program, which has single screen allowing access to several independent applications. When you touch the icon on the screen, indicated program takes control. One of the buttons in the LCD screen frame is encoded as
Navit car navigation system can be customized, my changes include:
Music and Video are TBOPlayer
At the beginning, I made only miner code changes in order to integrate player into baliosOPC. All major important applications start in parallel to achieve the shortest boot time. TBOPlayer is the slowest one to start. I added additional system commands in the background forcing the transition to the main screen. This is because TBOPlayer shows on the screen as the last, and I wanted to make sure that user is greeted from home screen.
Calculator is galculator
You cannot start galculator program in the maximized mode. To go around this limitation, I added a system command sending <F11> keystroke in the background immediately after program starts. This way, calculator fills the entire screen. I do not use calculator all the time, therefore, it is not activated when system starts. galculator is submitted only when needed, it means it is opened from the main menu.
Computer Desktop is LXDE Desktop (typical Windows style desktop)
All applications within baliosOPC run on the first screen of the desktop environment. When you switch to the screen number two, you have a normal blank desktop to work with. It is like any other, known to the all of us traditional PC. To enter commands, passwords etc., you can use the onscreen keyboard or attached via USB the physical keyboard.
You can try to create a similar system based on the same idea. Go to the download page. You will find programs and scripts that I wrote while working on my baliosOPC.
External data storage
The LCD screen frame contains SD card slot. Usually, I have some cards prepared with music and movies. They can be switched easily. After you insert a new SD memory card it is mounted automatically, and all files are available immediately in the media player.
Programmable physical buttons
Five buttons in the screen frame can be programmed as any keys on the keyboard. For now, I coded them as up and down arrows, Enter and Escape keys, and <Alt-Tab>. The sixth key on the left is the power-off button connected to GPIO in Raspberry Pi. A daemon program takes control when button is pressed for over 2 seconds and issues the 'halt' command in order to safely shutdown the entire system.
External keyboard and mouse
The frame of the screen has a single USB port. However, using a USB hub I can simultaneously connect an external keyboard and mouse. This way, I can easily do any ad-hoc changes in the system.
Laptop remote connection
I permanently plugged the Ethernet cable to the Raspberry Pi. The other end is located under the glove compartment. When connecting an Ethernet cable to my laptop and using Putty I am able to login to the Raspberry Pi. Using ftp, I can also easily transfer files between RPi and laptop.
Volume rotary button
placed the knob in the front console under the LCD screen. It is connected directly to the amplifier. Rotary encoder has three functions: volume, treble, and bass. We have to be honest; the physical controller is very convenient, much better than a similar function on the screen. When driving lights are on, the knob is lighted in green to match the rest of the console in my Jeep.
Computers require some time to turn off correctly. This is a serious problem when installing them in cars. We want to have a convenient way to shut them down and it should take place automatically, like in the case of conventional radios. Cutting power off without proper shutdown is not healthy for computers in the long run. This happens when key is removed from the ignition. At this point, accessories power referred as ACC is cut off. It is necessary to have some delay, enough time to close the operating system. For this purpose, I designed a system of three relays connected to GPIO (General Purpose Input / Output) in Raspberry Pi. Relays send a signal, and custom background program decides when to initiate the shutdown process. I coded additional wait time after switching off the ACC power, and before the shutdown. This is because not always I do want to turn the computer off in situations when the ignition key is removed, and placed back in a short period of time.