Hi, Here are the updates I have recently worked on: - migration to KODI stable 14.0 - Raspbian OS from 24 december 2013 - linux kernel 3.18.1 with touchscreen drivers - updates to Radio and Navigation addons
You can install the build using the tutorial link on the right side of the blog. Please don't forget about the forum for any comments.
1. Installation process(fresh install): - write a fresh image with the latest RaspbianOS image from http://www.raspberrypi.org/downloads/ - copy the carpc folder in /home/pi/ on the SD card(get the latest release archive from my Downloads page/updates) - plug the image in RPI, connect an USB keyboard and start it --- use the auto menu to expand file system --- change user password --- enable ssh, disable overscan, disable serial messages --- change Internalisation Options -> Locale and Timezone to your country --- expand disk size to at least 4GB --- enable Boot to Console(mandatory) - restart - type cd /home/pi/carpc/ and then ./carpc-install.sh and then wait for the system to install - after this, you should reboot(sudo reboot) and the system should start
2. Calibrate the touch screen Forget about xinput-calibrator and X11 calibration metods. If you have calibration file(/home/pi/touchscreen_axes_calib) from a previous installation you can use it(put it in /home/pi/). If you don't, then use the touch screen calibration plugin. This plugin works if you set correctly the Raspberry PI resolution in /boot/config.txt. Follow the steps in this video.
3. Add a map for navigation Go to Navit Planet Extractor and download a .bin file for your area. Copy the .bin file in your RPI card in /home/pi/.navit/ folder. Rename the .bin file to map1.bin.
4. Setup the GPS receiver Open the file /home/pi/startup/StartCarPC and find the line gpsd /dev/ttyAMA0 Replace /dev/ttyAMA0 with your gps device file name. Here is how to find the file name: 1. For USB devices. After plugging the device into the usb port type dmesg and you should see somewhere that a new device was mapped on /dev/tty... Most probably the file name would be /dev/ttyACM0. 2. For Serial(UART) modules, using UART TX/RX pins the device will have the file name /dev/ttyAMA0. You can test that the device is connected to a file name by calling cat /dev/ttyAMA0, for example and you should see some NMEA output.
5. Voice configuration for Navit Each time a road indication has to be made, Navit will execute the file /home/pi/.navit/speech.sh with the indication text. This file will play a sound and the speak the indication, through speakers. aplay -r 44100 /home/pi/.navit/notification3.wav & sleep 0.7 && espeak -ven+f4 -s150 -a 150 -p 50 "$1" --stdout | aplay /home/pi/.navit/notification3.wav - the sound that will be played each time before an indication -ven+f4 - female voice number 4 -s150 - speed 150 words per minute -a150 - amplitude -p50 - pitch You can find more settings in the espeak manual If you don't want the voice guidance you can press the speaker button in Navit and it will be turned off.
6. Add FM Radio module, physical buttons or physical rotary encoders Here is my hardware schematic containing: - SV1 - Raspberry PI B, B+ connector - RADIO - SI4703 breakout board - RE1 and RE2 - two rotary encoders
CarPC hardware set-up example
Each function of push buttons, rotary encoders can be configured using the Controller, like in the step below.
7. Configure the Controller
Modify the configuration file(/home/pi/config/gpio_description) like in this post.
8. Set the car logo in the Home screen Put your car logo .png image in /home/pi/config/logo.png.
9. Skin Thanks to Doru we have CarPC-touch_carbon.
10. Issues The forum is available for any issues/suggestions.
I have made some progress on my CarPC project and here are the main changes: - support for Raspberry PI Model B+ - update XBMC to 13.2 stable - update kernel to 3.16.0 - reworked radio(rds is available but not yet enabled because of some high cpu usage - will fix this shortly) - update system available(only ~150MB for download instead of a whole image) - file system restructuring - new skin - forum released(Engineeryng-Diy Forum)
First of all the installation process(this is only for a fresh install, update coming soon): - write a fresh image with the latest Raspbian from http://www.raspberrypi.org/downloads/ - copy the carpc folder in /home/pi/ on the SD card(gt this folder from my Downloads page/updates) - plug the image in RPI and start it --- use the auto menu to expand file system --- change password to 'a' --- enable boot into desktop-> Desktop Log in as user 'pi' at the graphical desktop --- enable ssh, disable overscan, disable serial messages --- Change Internalisation Options -> Locale and Timezone to your country - connect a keyboard and open the terminal or connect using ssh - change user permissions for pi: sudo chmod -R a+rwx /home/pi - type cd /home/pi/carpc/ and then ./carpc-install.sh and then wait for the system to install Note! If you get Cannot mkdir: Permission denied running this script then you should type sudo chmod -R a+rwx /home/pi/carpc/ and then run the script again. - after this, you should reboot(sudo reboot)
Calibrate the touch screen Forget about xinput-calibrator and X11 calibration metods. If you have calibration file(/home/pi/touchscreen_axes_calib) from a previous installation you can use it. If you don't, then use the touch screen calibration plugin. This plugin works if you set correctly the Raspberry PI resolution in /boot/config.txt. Follow the steps in this video.
Add a map for navigation Go to Navit Planet Extractor and download a .bin file for your area. Copy the .bin file in your RPI card in /home/pi/.navit/ folder. Rename the .bin file to map1.bin, map2.bin, map3.bin or map4.bin.
Setup the GPS receiver 1. For USB devices. After plugging the device into the usb port type dmesg and you should see somewhere that a new device was mapped on /dev/tty... Most probably the file name would be /dev/ttyACM0. 2. For Serial(UART) modules. The device will have the file name as /dev/ttyAMA0. You can test that the device is connected to a file name by calling cat/dev/ttyAMA0, for example and you should see some NMEA output. Now, copy this file name and put it in the file /home/pi/StartCarPC in the section: # Start gpsd # /dev/ttyAMA0 - RPI serial port # /dev/ttyACM0 - usb port sudo killall gpsd gpsd /dev/ttyAMA0
Voice configuration for Navit Each time a road indication has to be made, Navit will execute the file /home/pi/.navit/speech.sh with the indication text. This file will play a sound and the speak the indication, through speakers. aplay -r 44100 /home/pi/.navit/notification3.wav & sleep 0.7 && espeak -ven+f4 -s150 -a 150 -p 50 "$1" --stdout | aplay /home/pi/.navit/notification3.wav - the sound that will be played each time before an indication -ven+f4 - female voice number 4 -s150 - speed 150 words per minute -a150 - amplitude -p50 - pitch You can find more settings in the espeak manual If you don't want the voice guidance you can press the speaker button in Navit and it will be turned off.
Configure the Controller The controller can be easily used with Steering wheel controls or other physical controls in your car. You can set the configuration file like in this post.
Change the car logo in the Home screen The car logo is a png file in /home/pi/config/logo.png.
New skin Thanks to Doru, a new skin is available: CarPC-touch_carbon.
Comments moving to forum From now on, a forum is available for any issues/suggestions(http://engineeringdiy.freeforums.org/). Due to this, comments on this blog will be disabled.
After installing the image on an sd card, you have to configure the system for your needs.
Calibrate the touch screen The touch screen calibration involves two steps and you need a keyboard connected: 1. Calibrating the touch screen for X11 applications(like Navit). Open the terminal from Desktop and type xinput_calibrator and follow the indications. After the calibration is completed you have to put the output in a file to make this permanent: sudo nano /usr/share/X11/xorg.conf.d/01-input.conf Put here the output of xinput_calibrator. It will be something like: Section "InputClass" Identifier "calibration" MatchProduct "eGalax Inc. USB TouchController" Option "Calibration" "121 1917 317 1741" Option "SwapAxes" "1" EndSection 2. Calibrating the touch screen for XBMC. In XBMC use the keyboard to go to Programs/Touch Screen Calibration and follow the informations on screen. Note, that in order to make a better calibration you can move the finger on screen towards the point, before pressing enter(as can be seen on minute 0:52 in the video). Touch each point and then press enter to go to the next one. At the end, you have to unplug the touch from usb and then plug it back(works on XBMC Gotham). After this, he calibration is stored permanently in the file /home/pi/touchscreen_axes_calib. You can edit this file to fine tune the position of the cursor if the calibration isn't perfect. calib_x_d and calib_y_d - control the cursor displacement up/down/left/right calib_x_fact and calib_y_fact - some factors obtained in the calibration process(don't edit them) click_confines - defines the area that will be used for click(if the touch moves outside of this area then a drag action will occur) - this area is measured from the first touched point touch_mouse - if you want to use a mouse you have to set this to 0, but some touch screens behave as mouses and you have to set this to 1 in order for them to work(with single click). For the most of the touches this can be 0 if you want to also use a mouse, but if you don't want to use a mouse it doesn't mater, let it be 1.
Change the resolution [XBMC] Using ssh you have to edit the file /home/pi/.xbmc/userdata/advancedsettings.xml and set your resolution. After this restart the whole system and XBMC should run with your new resolution. [LXDE] Connect with ssh and type tvservice -mDMT && tvservice -mCEA and get the desired resolution mode Edit /boot/config.txt and modify according to your preference, for example: hdmi_group=2 hdmi_mode=27 CEA group is 1 and DMT 2.
Add a new map for Navit 1. Go to Navit Planet Extractor and download a .bin file for your area. 2. Copy the .bin file in your RPI card in /home/pi/.navit/ folder 3. Edit the file /home/pi/navit_src/build/navit/navit.xml and search for the entry: <mapset enabled="yes"> <map type="binfile" enabled="yes" data="/home/pi/.navit/Romania.bin"/> </mapset> 4. Add your map name here like this: <mapset enabled="yes"> <map type="binfile" enabled="yes" data="/home/pi/.navit/Romania.bin"/> <map type="binfile" enabled="yes" data="/home/pi/.navit/new_map.bin"/> </mapset>
Setup the GPS receiver 1. For USB devices. After plugging the device into the usb port type dmesg and you should see somewhere that a new device was mapped on /dev/tty... Most probably the file name would be /dev/ttyACM0. 2. For Serial(UART) modules. The device will have the file name as /dev/ttyAMA0. You can test that the device is connected to a file name by calling cat/dev/ttyAMA0, for example and you should see some NMEA output. Now, copy this file name and put it in the file /home/pi/StartCarPC in the section: # Start gpsd # /dev/ttyAMA0 - RPI serial port # /dev/ttyACM0 - usb port sudo killall gpsd gpsd /dev/ttyAMA0
Voice configuration for Navit Each time a road indication has to be made, Navit will execute the file /home/pi/.navit/speech.sh with the indication text. This file will play a sound and the speak the indication, through speakers. aplay -r 44100 /home/pi/.navit/notification3.wav & sleep 0.7 && espeak -ven+f4 -s150 -a 150 -p 50 "$1" --stdout | aplay /home/pi/.navit/notification3.wav - the sound that will be played each time before an indication -ven+f4 - female voice number 4 -s150 - speed 150 words per minute -a150 - amplitude -p50 - pitch You can find more settings in the espeak manual If you don't want the voice guidance you can press the speaker button in Navit and it will be turned off.
Configure the Controller The controller can be easily used with Steering wheel controls or other physical controls in your car. To enable this controller, you have to edit the file /home/pi/StartCarPC and search for the entry: # Start the GPIO Remote #sudo opencarpc-controller /home/pi/gpio_description & You have to change it to: # Start the GPIO Remote sudo opencarpc-controller /home/pi/gpio_description & Now, you can set the configuration file like in this post
Change the car logo in the Home screen If you want to put another car logo you have to edit the file /home/pi/.xmc/addons/skin.CarPC-touch/16x9/Home.xml and find the entry: <posx>580</posx> <posy>205</posy> <width>550</width> <height>550</height> <texture>bmw_logo.png</texture> Here, you can set your new image instead of bmw_logo.png you can put a complete path of the new image.
Set up a WIFI connection If you want to have internet connection, or airplay or control the whole system using the XBMC remotes, you have to setup a wifi hotspot with your phone and then use an USB WIFI dongle(I am using EDIMAX EW-7811UN dongle). The system is configured to automatically connect to a wifi hotspot with the following settings: wpa-ssid "opencarpc" wpa-psk "opencarpc123" You can find these settings in the file /etc/network/interfaces.
In a previous post I have explained how I have interfaced Raspberry PI GPIOs with XBMC, using buttons and rotary encoders. I have reworked the application which controls this and now there are more features available. You can use this post to set up the hardware connections between Raspberry PI GPIO connector and as many buttons and rotary encoders as you like(or you have room for on the RPI GPIO pins).
At this moment my setup has 2 rotary encoders, each of them having also a push button. You can use this tutorial to set up your car steering wheel controls to control this system.
XBMC builtin functions are now supported. For a list of available XBMC builtin functions have a look at this link.
Groups of commands are supported. Commands should be separated by the '+' character. For example: xbmcbuiltin_PlayerControl(previous)+KB_minus will execute both commandsa t once when the corresponding button is pressed, or when the rotary encoder is turned in the correct direction.
Multiple groups of commands are supported. Groups of commands should be separated by the '>' character. When the action is triggered(button pressed or rotary encoder rotated in the correct direction) the commands are executed consecutively. For example: xbmcbuiltin_ActivateWindow(Music)>xbmcbuiltin_ActivateWindow(Videos) When you press the button for the first time XBMC will switch to Music window. When you press it the second time XBMC will switch to Videos window and when pressed again, XBMC will switch back to Music window.
Note: The groups of commands were designed to support multiple programs control. At this moment I am working on external radio support so you can set the volume of radio and volume in XBMC at the same time. This will be available in a future post. This doesn't mean that you can use multiple XBMC commands at once.
To download the latest version, please checkout the Downloads link from the right of the blog, in the openCarPC tools folder. The current version is 1.1.
I have worked on some new features for my CarPC. Here are the changes: First, some videos:
The latest image can be downloaded from the Downloads link on the right of this blog(username:pi, password:a). Note! If you do not have any rotary encoder connected or any buttons with a resistor you need to disable the carpc-controller application. You can do this by editing the file /home/pi/StartCarPC and commenting the line which contains carpc-controller.
Hardware updates: - added ViewHd HDMI to HDMI+audio board - added SI4703 FM Radio module - created an expansion board with fm radio module and three connectors(one for GPS receiver and two for rotary encoders) - added a very cheap board to mix two output channels(RPI and radio) into a single output(which goes to the amplifier, in my case AUX input of the car player)
Software updates: - added loading movie(created by Doru Ignat) - added a python server responsible for controlling the radio module via i2c - added new XBMC plugin for controlling the FM Radio(including storing up to 5 radio stations in a file) - improved carpc-controller to support sending multiple commands for a single button press or encoder turn(e.g. turning right one rotary encoder can increase the volume in XBMC and the volume of radio at the same time) - improved the speed in Navit clicking - improved the Navit OSD for both day and night setup(Navit switches automatically teh setup based on the time of the system). - added time synchronization mechanism based on GPS readings(RPI does not have a real time clock)
The expansion board.
RE1 and RE2 are rotary encoders.
The FM Radio driver and Python server. The FM Radio module is connected using i2c communication interface(GPIO0-SDA and GPIO1-SCL of the PI). The radio driver is contained in the si4703 python class. The Radio server is implemented in the file radio_server.py(which is automatically started at boot time). This server simply opens a socket and waits for data. After any data is received, a couple of if-else statements different radio functions are called base on the incoming data. The available commands are:
seek_right - search for a new station in the right of the current frequency seek_left - search for a new station in the left of the current frequency tune_xx.x - set the current frequency to xx.x MHz volume_xx - set the volume of the radio module to xx. xx should be between 0 and 15 toggle_mute - toggle mute get_frequency - get the current frequency
The server reply with the current frequency for each command.
Simple test. To understand how this radio server-client works you can make the folowing experiment: 1. Plug the gpio expansion board(or wire the radio module to the PI as in the above schematic) 2. [Server] Connect using one ssh window(I use Putty) to the PI and enter the folowing commands: cd radio sudo python radio_server.py The radio server should initialize the radio module and start the server. 3. [Client] go to the radio folder and use radio_client.py to send commands o the radio server, like in the folowing picture:
The file radio_client.py simply opens an UDP socket, puts an '_' character between arguments and send the obtained string to the server socket.
The radioFM XBMC plugin. In order to simplify user interaction I have created a new XBMC plugin(radioFM). Its purpose is to allow interacting with the Radio Server(and with the Radio Module) using the touch screen. In order to be able to use this plugin you need to have the radio_server.py started and the FM module plugged in.
Features:
The current frequency is displayed at the top.
The left and right arrow buttons are for seeking to the next channel(left or right).
The bottom 5 buttons are preset channels(these are kept in a file so they are available after reboot).
The Set/Tune Channels button is used for changing the mode in which the bottom buttons are operating. By default they are in the 'Tune' mode, so if you presss them the radio will tune to that frequency. If you press the Set/Tune Channels button once you will enter the Set mode, which will allow you to store the current channel in which preset button you like(or in all of them... if you want) by pressing it once. You will see that the frequency will be changed.
Connecting two audio sources(RPI and Radio) to one amplifier. In order to correctly hook up two audio sources together(putting them in parallel) for a single output you have to use one schematic from this document. I have used the last schematic. Don't forget to use at least 1% tolerance for the resistors. The new GPIO controller. The GPIO controller is now using the official XBMC client code from xbmcclient.h. Now, you can call a lot more XBMC functions for any button pressed or encoder movement.
TODO List: - update to the latest Raspberry PI firmware(today it is possible but then Navit won't be visible) - remove the calibration file for XBMC(/usr/share/eGalax/touchscreen_axes_calib) and use the values from the Debian calibration file(/usr/share/X11/xorg.conf.d/01-input.conf) - create an XBMC addon to allow calibrating the touch screen for both XBMC and X11 windows and also for calibrating the external encoders and button - create a configuration page(XBMC addon) for the carpc-controller settings - create a better audio mixer unit - create a new page for launching different X11 applications
I have recently worked on adding external controls for my Raspberry PI CarPC project because while driving it is better to have some physical controls to rely on, rather than looking at the touch screen to find the buttons. This post provide information on how to set up buttons or rotary encoders to control XBMC from Raspberry PI.
Rotary encoder
Rotary encoders are very cheap and very nice controls(eBay link). You can find them in car stereos for volume control. You can also use them to browse through menu items or to skip to next song etc. They are looking very similar to a potentiometer, but there are major differences: they can be turned in both directions with infinite steps(you know just the direction of the spin), they provide digital output, a full rotation have a number of steps and they have push button also. Connections for Raspberry PI should be done as follows: + pin to 3.3V GND pin to Raspberry PI GND SW to one GPIO CLK and DT to two GPIOs When the push button is pressed the pin labelled SW is connected to GND. This can be set up as any push button(see below).
Push button
A push button can have two states on or off. There are two ways to hook up a button to a logical circuit(e.g Raspberry PI GPIO's):
We have to use the first setup(with pull up resistor) for the tool to work properly. So, for the push button of the rotary encoder above, we have to cable it like this:
The tool I have created a tool to allow you interface rotary encoders(and also push buttons) with Raspberry PI GPIO's. Also you can set an XBMC command to be executed for click, left rotation and right rotation. The tool can be otbained from my Google Code project(link to page). It is very easy to use it. You just have to accomplish two steps: - copy rpi-xbmc-remote in a place where it can be accessed from anywhere(e.g. /usr/bin) - call it using sudo rpi-xbmc-remote /path/to/configuration/file
The configuration file Example:
ip:localhost
button:7:KB:return
encoder:clk:23:KB:up:dt:24:KB:down
The configuration file can reside anywhere on the disk. It provides a way to define two kind of inputs for XBMC: regular button and rotary encoder.Lines should be less than 100 characters in length. Lines starting with # are comments and are not being processed.
Example of regular button definition:
button:7:KB:return
- 'button' means it is a regular button
- '7' means use GPIO7 for this button
- 'KB' means XBMC device map
"KB" - Standard keyboard map
"XG" - Xbox Gamepad
"R1" - Xbox Remote
"R2" - Xbox Universal Remote
"LI:devicename" - valid LIRC device map where 'devicename' is the actual
name of the LIRC device
- 'return' means XBMC button name to be called(see XBMC keymaps)
Example of rotary encoder definition:
encoder:clk:23:KB:up:dt:24:KB:down
- 'encoder' means it is a rotary encoder
- '23' means use GPIO23 for rotary encoder CLK
- 'KB' means XBMC device map for rotary encoder left turn(same as above)
- 'up' means XBMC button name to be sent for left turn of the rotary encoder
- '24' means use GPIO24 for rotary encoder DT
- 'KB' means XBMC device map for rotary encoder right turn(same as above)
- 'return' means XBMC button name to be called(see XBMC keymaps)
Keep in mind!
You have to put a pull up resistor for every push button you define in the configuration file. If you don't do this then the state of the button will be variable when not pressed(it will oscillate between 0 and 1) and it will behave like it is pressed randomly.
Lately I have tested OpenElec for Raspberry PI and found out that it is very very fast, very very small and also it has some great addons(wifi, bluetooth and more). Speed/size features on an 512MB RaspberryPI: - a complete boot is less than 25 seconds - cpu is around 30% load - memory used is 32% - total system size is less than 300MB
Edit. You can download my build from here(contains eGalax module and XBMC patches). Username is root and password is openelec. The touch screen calibration file should be put in /storage/touchscreen_axes_calib.
Next, I will guide you through the instructions for building(cross compile) latest OpenElec for Raspberry PI with touch screen support. For this tutorial let's assume that you have a Linux machine where you will work.
1. Get the latest OpenElec. git clone git://github.com/OpenELEC/OpenELEC.tv.git
2. Add kernel touch screen module support. Open the file OpenELEC.tv/projects/RPI/linux/linux.arm.conf and search for "CONFIG_INPUT_TOUCHSCREEN". Replace the whole text line with the following lines: CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_USB_COMPOSITE=y CONFIG_TOUCHSCREEN_USB_EGALAX=y 3. Fix ppl version in OpenElec. Open the file OpenELEC.tv/packages/toolchain/math/ppl/meta and change PKG_VERSION from "1.1pre9" to "1.1pre10"
4. Put touch screen calibration file into the system. Navigate to folder OpenELEC.tv/projects/RPI/ and create the file usr/share/eGalaxCalibration/touchscreen_axes_calib. This file should have the following contents: calib_x_d=-21;calib_x_fact=0.658097686;calib_y_d=-50;calib_y_fact=0.408626561;swap_axes=0;click_confines=8 To set up these values please visit this post(at section 4). This step is not needed any more, because you can use the calibration addon to calibrate your screen. Get the calibration addon from my Downloads folder and put it in /storage/.xbmc/addons/
5. Put XBMC 12.3 patch. Get my latest patches from here and put them in the folder OpenELEC.tv/packages/mediacenter/xbmc/patches/
6. Build OpenElec. Navigate to OpenElec folder and type: PROJECT=RPi ARCH=arm make -j3 -j3 option is to use parallel build(if you have more than one cpu's set this number as nb_cpus+1). This option will speed up the build process. The build process will take couple of hours, but you have to come back once(in the first 10 minutes) and press ENTER for the kernel touch screen modifications to be approved.
This is an update for my CarPC project. You can download the latest image from the link on the top right corner of this blog(username:'pi', password:'a'). The main features are: Hardware:
[Media Center] - omxplayer - XBMC 12.2 Frodo - media formats supported: listed here - sources with objects build on 27.July.2013 - skin: CarPC-touch(download current version) - system shutdown button(safely stop xbmc and safely halt) - reload skin button - switch to camera view button - modified spectrum analyzer(OpenGL with no rotation) - eGalax touch screen calibrated - eGalax touch screen click&drag fix - black rectangle behind XBMC removed - patch to add getMousePosition feature to xbmcgui module(used to redirect clicks from the Navigation skin page to X11 using xdotool)
[Navigation] - Navit build from source - Zoom In, Zoom Out buttons - Click sent from XBMC to X11 (Navit Window)
GPS Setup 1. Connect GPS module to UART TX, UART RX, GND and 3.3V or on a usb port. 2. If you are using an UART GPS module, as I did, use this tutorial or any other to setup UART communication. 3. Connect GPS to gpsd: sudo apt-get install gpsd gpsd /dev/ttyAMA0 Adding maps to Navit In order to add new maps to Navit, there is a simple process. First, go to Navit Planet Extractor and download your desired area file(this will be a .bin file). After this, transfer the file to your Raspberry PI in the folder /home/pi/navit_export/build/navit/maps/. Here, you should also update the existing .xml file and add another entry for your new map. My .xml file is looking like this:
Safety: - The wires are 2mm in diameter with good insulation, resistant at temperature variations - I have added fuses(1.5A for the radio, 1A for Raspberry PI, 1A for display, 0.1A for reverse camera trigger, 0.1A for reverse camera video signal)
Bugs: - sound pops(will soon disappear by using this hdmi to hdmi and audio splitter) - Navigation is behind Video Player -> Navigation isn't visible while playing videos(this isn't a big issue)
After working a lot at my CarPC project I have decided to take a break and post about it.
A short preview is here:
You can download the latest image from my Downloads page in the top right corner of this blog. If you want to build it by yourself please follow my previous tutorials but replace the three patches with the single patch from here, which is for XBMC12.2. Also read my previous post to find how to calibrate the screen axes.
Features:
auto start XBMC
eGalax touch screen support with configurable greater area for touch event(8 pixels)
improved skin with larger buttons and smooth transitions(link for the skin)
System Power OFF button
usbmount enabled(so usb MSD's are plug and play)
The new calibration file contains one more entry: click_confines which defines the area for XBMC to distinguish between click and drag actions(touch moves less than 8 pixels before release than action is click, else the action is drag).
I have spent some time lately trying to find a solution to get my 7 inch eGalax touchscreen to work with Raspbian(Debian Wheezy) in XBMC 12 Frodo and finally got it working as I wanted.
My Setup
Raspberry PI model B: ~30$
7 inch display with touchscreen for car rear view camera, from eBay(touchscreen is connected to one USB port): 80$
HDMI male to HDMI male connector(from eBay): <2$
4GB SDHC class 4 card
12V(500mA) AC to DC adapter for powering the display
5V(1A) microUSB AC to DC converter for powering the PI
USB keyboard
Edit: Download the latest image from the top right corner of this blog(username: pi, password: a).
Here is what you need to do in order to have a system with Raspberry PI, Raspbian OS and XBMC 12 Frodo stable with eGalax touchscreen working correctly(which means axes calibrated and click working with just one tap&release action):
1. Get latest Raspbian image from here and flash it to an SD card.
2. Build your own kernel with eGalax touchscreen support, like in this post(you will only need to replace kernel.img file and /lib/modules and /lib/firmware folders on the SD card).
3. Build XBMC 12 on Raspberry PI using this tutorial. Note: After downloading XBMC archive, get this archive and unpack it anywhere. Apply patches to xbmc files:
4. Touchscreen calibration. Create a new file /home/pi/touchscreen_axes_calib on Raspberry PI. It will contain four values for the axes calibration and one value for swapping axes. The simplest way to swap axes is to switch the four wires cable plug's orientation which comes from the touchscreen to the touch controller.
Here is how the calibration was done.
the original behavior(no calibration)
In the picture above, we see that "touch panel values frame" differs from "touch panel physical size frame". When we are pressing the touch we are moving in the "touch panel physical size frame" but when the touch screen is not calibrated the arrow from XBMC is in another place.
"touch panel physical size frame" is the screen starting from (0,0) on the left top corner and going to (width, height) in the right bottom corner.
"touch panel values frame" is the frame which contains all the number the touch controller is giving.
We see that these frames differs a lot. Our main scope is to overlap the "touch panel values frame" to the "touch panel physical size frame".
In order to do this we need to do three steps(the third one is done in software): a. Scale the value read from the touch driver x and y) in order to fit 0->width range and respectively 0->height range of the "touch panel physical size frame" the scale value for x axis is: "touch panel physical size frame" width calib_x_fact = ------------------------------------------------- "touch panel values frame" width
"touch panel values frame" width and height are coming from your XBMC resolution(I have width=1280 and height=720). "touch panel physical size frame" width and height are a little more trickier to find but nothing hard. In step 2 above, you have calibrated the touchscreen in XFCE. You got some values returned by xinput_calibrator, something like:
Section "InputClass" Identifier "calibration" MatchProduct "eGalax Inc. USB TouchController" Option "Calibration" "1977 32 1893 131" EndSection
In my case, "touch panel physical size frame" width is 1977 - 32 = 1945 "touch panel physical size frame" height is 1893 - 131 = 1762 Now, compute the values and put them in /home/pi/touchscreen_axes_calib file
b. Translate the "touch panel values frame" to the left and up, to match "touch panel physical size frame". I didn't find a logical method to do this, because we don't know exactly "where is" the "touch panel values frame", so, in order to find calib_x_d and calib_y_d you have to first set them both to zero and then start XBMC. Now, put some sharp pointer on the screen and observe the distances between the cursor on the screen and your pointer's position. Try to approximate these x and y deviations(measured in pixels) and put them in the /home/pi/touchscreen_axes_calib file.
c. Revert direction of axes. This is done in the software(from patches).
5. Math behind. To accomplish these transformations the following formula was implemented in the file xbmc/input/linux/LinuxInputDevices.cpp pointer.x = value_read.x * calib_x_fact + calib_x_d; pointer.y = value_read.y * calib_y_fact + calib_y_d;
After I have successfully calibrated the touchscreen I have discovered that single click was not possible from the touchscreen, just double click. After digging through the code, I have found that this was caused by drag action which was triggered because the previous values of the touch were far(more than 5 pixels) from a new press. For example, at the start of the program, cursor is set at 0,0 coordinates; if user is trying to press a button, let's say at 100, 300, the program(XBMC) will calculate the distance between these two points and will find out that this is greater than 5. Pythagorean theory: (100-0)x(100-0) + (300 - 0)x(300-0) is greater than 5x5 XBMC will treat this as a drag event. This drag issue is not caused when you double click, because the previous point in the second click action is very close to the second click point. This also works for mouses, because the previous value of the pointer is always very close to the new value of the pointer(because mouse's pointer drags on the screen and it doesn't jump - so each new value is very close to the previous one).
I have developed an algorithm to avoid this issue: When the user is pressing the screen(x,y), the touch values are being set to (screen_width+1, screen_height+1 -> outside of the visible screen) just at the first event read(which is BTN_TOUCH PRESS). After this event, the program will receive multiple X and Y absolute values events. The first two events, one for X and one for Y are used to set the previous X value, respectively previous Y value to the current X respective current Y values. And from now on distance is measured and this is preventing no unwanted drag action. The user's finger/pointer will not stay at a single point, because the touchscreen's lack of precision, so it will move around 5-6 pixels in x and y directions. I have also set the click distance to 7. You can change this by changing click_confines value in xbmc/input/MouseStat.h. Originally it was set to 5, but this is not very good for touch screens(I had to click with a sharp pointer and with my nail always, but with a value of 7 I can click with my finger with a slight touch -> really nice).
After struggling couple of days in finding the best way to build XBMC on Raspberry PI I have finally got a working solution(haven't discovered how I can cross-compile it, which would be the best choice). This takes about 15 hours, on my Raspberry PI model B, but the good news is that 'make' takes about 12 hours, so you don't need to watch it, just come from time to time to see if it is working. Besides the build messages displayed on screen you have the whole logs for rbp_depends, configure, make and make install steps. If anything goes wrong you can investigate these files(the last one reached) and search for the first error
This tutorial is for Linux Host Machine but it can be easily adapted to any other OS. Let's get this started!
1. Get the latest Raspbian Wheezy image from http://www.raspberrypi.org/downloads and put it on an SD card: You have couple of possibilities to do this. In Linux you can use:
2.Get XBMC 12 source code from http://xbmc.org/download/. On the Source Code section, download the zip file from where it says: "Stable release sources are available here". If you get the code from git it will probably get an unstable version, which is the latest code. When I have build from source I have got XBMC 13 alpha 1 which worked, but no addon was working. Transfer xbmc folder to your /home/pi/ directory or wherever you like. Now you can plug the card in Raspberry PI and follow the next steps.
Note. The easiest way to do this is via ssh(first, enable it using sudo raspi-config menu), from a computer. Just connect in Terminal using:
ssh pi@x.x.x.x
where x.x.x.x is the ip address of your device. You can get the ip address by typing ifconfig. Then you just copy/paste the commands into Terminal.
3. Set minimum amount of video memory and create a swap partition:
sudo raspi-config
Here you should expand_rootfs, disable overscan, configure_keyboard, change_pass, change_timezone and enable ssh. Select memory_split and enter 16 then restart.
Now, to create a swap partition, use the following:
There is a problem when compiling, with the file /usr/include/interface/vmcs_host/vcgencmd.h which includes the wrong vchost_config.h, so I have created a command to put the right inclusion:
sudo sed -i 's/#include "vchost_config.h"/#include "linux\/vchost_config.h"/' /usr/include/interface/vmcs_host/vcgencmd.h
6. Install taglib, libcec and libshairport.
cd <pah_to_xbmc_dir> make -C lib/taglib sudo make -C lib/taglib install cd <any_directory> git clone --depth 5 https://github.com/Pulse-Eight/libcec.git cd libcec ./bootstrap ./configure --prefix=/usr/local make sudo make install cd <path_to_xbmc_dir> make -C lib/libshairport sudo make -C lib/libshairport install
After configuration completes, please run he following command:
sed -i 's/ifeq (1,1)/ifeq (0,1)/' tools/TexturePacker/Makefile
Compile(this will take about 12 hours):
make 2>&1 | tee log_3_make.log
8. Install XBMC 12 in Raspbian.
sudo make install 2>&1 | tee log_4_make_install.log
After this step you have to run raspi-config again and to set video memory to 128 and then restart. Now you should be able to run XBMC using
/usr/local/lib/xbmc/xbmc.bin
Note: If you are running via xbmc command, or from XFCE menu->Multimedia->XBMC it will not start. The same command can be used to run XBMC from terminal or from XFCE interface. In addition you can also install PVR Addons and XVDR addon(but this is not necessary):
cd <any_directory> git clone --depth 5 git://github.com/opdenkamp/xbmc-pvr-addons.git cd xbmc-pvr-addons/ ./bootstrap ./configure --prefix=/usr/local --enable-addons-with-dependencies sudo make install cd <any_directory> git clone git://github.com/pipelka/xbmc-addon-xvdr.git cd xbmc-addon-xvdr sh autogen.sh ./configure --prefix=/usr/local sudo make install
Note If you want to modify sources after the compilation is completed, you just have to modify them and then run make again, which will build only the affected parts(couple of minutes), but remember to keep the video memory at maximum 32MB when you are building, and also keep the swap partition.