Friday, February 1, 2013

Setting up my Raspberry Pi as a SDR Server with RTL-2832U USB dongle

Setting up my Raspberry Pi as a SDR Server with RTL-2832U USB dongle. (Android details also)

Raspberry Pi

RTL-2832U


Here is my hardware configuration.

1)Raspberry PI + PSU.
2) External power USB hub. ( Preferably don't connect RTL Dongle directly into Raspberry Pi)
3) RTL-2832U USB Dongle.

Software configeration

First update you Raspberry Pi wheezy Linux to the latest version.

sudo apt-get update

Now install the required utils to compile the RTL-2832U USB dongle driver

sudo apt-get install git 
sudo apt-get install cmake
sudo apt-get install libusb-1.0-0.dev
sudo apt-get install build-essential

Now install the RTL-2832U USB dongle driver src and compile

git clone git://git.osmocom.org/rtl-sdr.git
cd rtl-sdr/
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig

if it was successful you should see no return on the previous command.

I have been told that the Raspberry crash if you don't reboot before inserting the dongle.

With the new Dongles and updated raspberry OS you mite get an error like this.
Found 1 device(s):
  0:  Generic RTL2832U OEM
Using device 0: Generic RTL2832U OEM
Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.
usb_claim_interface error -6
Failed to open rtlsdr device #0.


If you did get this error then edit add the following blacklist text to solve the problem.

Edit the following file /etc/modprobe.d/raspi-blacklist.conf

use your favourite editor like nano or vi 

sudo vi /etc/modprobe.d/raspi-blacklist.conf

add the following lines in the file.

blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830


Save and exist.

You need to reboot. so just run sudo shutdown -r 0

Install the RTL-2832U USB dongle on external powered USB HUB

sudo ldconfig

Run this command sudo rtl_test -t to test the compiled driver
I had to reboot and run the command sudo ldconfig again before the test worked.
If U are using a RTL2832+R820T dongle U will get this error below when running the rtl_test -t command
**************************************
Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle

Found Rafael Micro R820T tuner

Supported gain values (there was a string of values)

No E4000 tuner found, aborting

Just ignore it the normal rtl_tcp command will work.

**************************************
pi@raspberrypi ~ $ sudo rtl_test -t

Found 1 device(s):

  0:  ezcap USB 2.0 DVB-T/DAB/FM dongle



Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle

Found Elonics E4000 tuner

Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0

Benchmarking E4000 PLL...

[E4K] PLL not locked for 51000000 Hz!

[E4K] PLL not locked for 2201000000 Hz!

[E4K] PLL not locked for 1101000000 Hz!

[E4K] PLL not locked for 1242000000 Hz!

E4K range: 52 to 2200 MHz

E4K L-band gap: 1101 to 1242 MHz



To run the rtl server type rtl_tcp -a and you ip address of your Pi.



 sudo rtl_tcp -a 192.168.10.135Found 1 device(s).
Found Elonics E4000 tuner
Using ezcap USB 2.0 DVB-T/DAB/FM dongle
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=192.168.10.135:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).


Wala the Raspberry SDR Server is running. 
listening to Audio on the local speaker jack

sudo rtl_fm -f 144800000 -s 44100 -g 9 -l 10 - | aplay -t raw -r 44100 -c 1 -f S16_LE

I had to set the volume in the mixer to hear something.

to get your soundcard playback details run the command  
sudo aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7

You will have to configer your .asoundrc file (you can read about it in my websdr sound card section)
just use default as alsa device it should work

here is a example of .asoundrc config file content

pcm.!default {

        type hw

        card 0

}

ctl.!default {

        type hw

        card 0

}

pcm.usb {

        type plug

        slave {

                pcm "hw:1,0"

        }

}

ctl.usb {

        type plug

        slave {

                ctl "hw;1,0"

        }

}

Here is how you set your audio level


sudo alsamixer

alsamixer





Some Debugging

if you get this error below you tried to start the server when its already running.



sudo rtl_tcp -a 192.168.10.135

Found 1 device(s).

usb_claim_interface error -6

Failed to open rtlsdr device #0.

There is already running rtl server just kill the server and will now start.

Now to set-up a client to connect to server. 

Setting up SDR client on Linux / Raspberry. (multimode.py) or on Windows.


Linux client

1) install subversion
2) install python
3) install gnuradio and compile
3) compile mutimode.py
4) test and run

Run the following commands to install and configure multimode.py

apt-get install subversion

Install python
sudo apt-get install python


Check out the python multimode.py scipt

Setup the python path


 export PYTHONPATH=/usr/local/lib/python2.7/dist-packages:~/bin


cd /home/pi/Download/multimode/trunk (where ever you have checkout your mutimode code with subversion


run sudo make install


mkdir -p /root/bin
cp multimode.py multimode_helper.py /root/bin
Please make sure your PYTHONPATH includes /root/bin
And also that PATH includes /root/bin
this will allow multimode to work correctly

Check your python path with the following command.

echo $PYTHONPATH
/usr/local/lib/python2.7/dist-packages:/home/anton/bin

it seems to not include the /root/bin


So add it 


export PYTHONPATH=/usr/local/lib/python2.7/dist-packages:/home/anton/bin:/root/bin


Run mutimode.py

sudo ./multimode.py

Traceback (most recent call last):

  File "./multimode.py", line 9, in <module>
    from gnuradio import audio
ImportError: No module named gnuradio

need to install gnuradio

install gnuradio 

This process will take several ours  12 + on slow CPU(Raspberry or inter < 1.2Ghz ) so go and get some coffee or a bear and switch the TV on ......


Make shore you have sudo privileged be fore you go ahead.
You will be ask if you have sudo privileged in the script say Y.

wget http://www.sbrac.org/files/build-gnuradio && chmod a+x ./build-gnuradio && ./build-gnuradio

Proceed?Y Starting all functions at: Sun Feb 3 11:37:06 SAST 2013 SUDO privileges are required Do you have SUDO privileges?Y

.....................



......................


[sudo] password for anton: 
Done building and installing Gnu Radio
GRC freedesktop icons install ...Done
Done function gnuradio_build at: Sun Feb 3 19:26:13 SAST 2013
Starting function rtl_build at: Sun Feb 3 19:26:13 SAST 2013
Building rtl-sdr...Done building/installing rtl-sdr/gr-osmosdr
Done function rtl_build at: Sun Feb 3 19:29:47 SAST 2013
Starting function extras at: Sun Feb 3 19:29:47 SAST 2013
Doing GIT checkout for extra module gr-baz
Building extra module gr-baz
Doing GIT checkout for extra module grextras
Couldnt build module grextras directory not there
Done function extras at: Sun Feb 3 19:36:47 SAST 2013
Starting function mod_groups at: Sun Feb 3 19:36:47 SAST 2013
********************************************************************************
This script has just modified /etc/group to place your userid '('$USER')' into group 'usrp'
In order for this change to take effect, you will need to log-out and log back
in again.  You will not be able to access your USRP1 device until you do this.

If you wish to allow others on your system to use the USRP1 device, you will need to use:


  sudo usermod -a -G usrp userid

  
For each userid you wish to allow access to the usrp

********************************************************************************


Further 

Done function mod_groups at: Sun Feb 3 19:36:49 SAST 2013
Starting function mod_udev at: Sun Feb 3 19:36:49 SAST 2013
Done function mod_udev at: Sun Feb 3 19:36:53 SAST 2013
Starting function mod_sysctl at: Sun Feb 3 19:36:53 SAST 2013
Applying updates to /etc/sysctl.conf
Group 'usrp' now has real-time scheduling privileges
You will need to log-out and back in again for this to
take effect
Done function mod_sysctl at: Sun Feb 3 19:36:53 SAST 2013
Starting function pythonpath at: Sun Feb 3 19:36:53 SAST 2013


************************************************************

You should probably set your PYTHONPATH to:

     /usr/local/lib/python2.7/dist-packages


Using:


export PYTHONPATH=/usr/local/lib/python2.7/dist-packages


in your .bashrc or equivalent file prior to attempting to run

any Gnu Radio applications or Gnu Radio Companion.
*************************************************************
Done function pythonpath at: Sun Feb 3 19:36:53 SAST 2013
Done all functions at: Sun Feb 3 19:36:53 SAST 2013
All Done

sudo gnuradio-companion

















My Raspberry ran out of space need bigger SD card (but the process is the same on Ubuntu)

I will update this aria when I get my new SD card.

Now we are reddy to run the mutimode.py


cd to your directory where multimode.py 

something lie this cd /home/anton/Downloads/multimode/multimode/trunk
run sudo ./multimode.py

Woila ...

















It seems that the Raspberry CPU is to slow to run the mutimode.py

Setting up a Windows Client to connect  to rtl server.

Download SDR# from http://sdrsharp.com/  http://sdrsharp.com/downloads/sdr-stable.zip

Unzip sdr-stable.zip


run SDR#



Run SDRSharp

Configure the SDR# to connect to rtl_tcp

Select RTL-SDR/TCP
Select IP , Port, And I had to decrees sample rate to 1000000 (I think my WIFI is to slow)
This is the IP and Port of your Raspberry Pi (default port is 1234)


Add IP, Port and possibly change your Sample rate to 1000000


















Here is a video of the SDR# connected to Raspberry Pi





Android client connecting to rdl_tcp server (Worked on my Galaxy S2 and Galaxy tab 7')

Screenshots is from Galaxy S2
What you need to install from Google Play
1) SDR Touch from Google play
2) [RTL2832U driver] from Google play
3) And you need to pay for the License app +_ R90 [SDR Touch Key]. (
If you see Demo on left bottom corner the key did not work run it first.
( I had to sometimes stop and start the app to get it working)

I also have plug in the RTL-2832U dongle directly to the phone with a adapter cable and it also works vine via a external powered USB HUB ( I got the adapter cable from local China mole for about R70-00)


Galaxy S2 USB Host Adapter












Samsung Galaxy S2


















Run the [Touce Key] app and close it.


Then run [SDR Touch] and you should see the screen below.




Select the menu button = on bottom of phone and you should see a menu like this.
Enter your RTL_TCP server details as configure above.

















Then click on [Spectrum] button and you can then scroll the freq by dragging the spectrum left or write.
You could also pres the[ set Mhz] button and enter the frequency in the menu see screenshot below.
Just one problem (selecting the modulator option is a trick)
[AM LSB USB NBFM .....]
There is a small gap between the [set Mhz] button and the [help] button and you should carefully click the gap to change the mode. I am shore the developer will fix this soon


























Debug info:
If you get popups saying you need root just ignore them.
I had to sometimes restart the app.