2. GNU Radio

Anuncio
UDLA
Desarrollo de Software Radio
TX/RX de FM
CAPÍTULO 2
El objetivo de este capítulo es describir el funcionamiento del programa GNU Radio el
cual es necesario para la transmisión y recepción con el USRP, trataremos
primeramente con la instalación del programa y su relación con el USRP, luego
analizaremos al USRP que incluye convertidores, un procesador y la interfase así como
las tarjetas secundarias. Por ultimo se dará una introducción a la programación en GNU
Radio.
2. GNU Radio
GNU Radio es un conjunto de archivos y aplicaciones que proveen las librerías
necesarias de procesado digital de señales para poder manipular señales de radio. GNU
Radio corre sobre sistemas GNU\Linux como Ubuntu, el cual debe estar previamente
instalado
El programador de GNU Radio necesita, para construir un sistema de radio,
crear un grafo, donde los vértices son bloques de procesado de señales, y los bordes
representan el flujo de datos entre ellos. Los bloques de procesado de señal son
implementados en C++. Conceptualmente un bloque procesa señales continuamente
desde puertos de entrada hasta puertos de salida. Las partes de un bloque son el número
de puerto de entrada, el número del puerto de salida, y el tipo de dato que fluirá de uno
al otro. Los tipos de datos más comúnmente utilizados son: “short”, “float” y
“complex”.
17
UDLA
Desarrollo de Software Radio
TX/RX de FM
Algunos bloques tienen únicamente puertos de salida o puertos de entrada. Éstos
sirven como fuente de datos y señales en una gráfica. Existen fuentes que leen datos de
un archivo o del ADC, y señales que escriben datos a un archivo, al DAC o a un display
gráfico. GNU Radio cuenta con aproximadamente 100 de estos bloques.
Las gráficas para GNU Radio corren y son construídas en Python[25].
Python es un lenguaje de programación interpretado, interactivo y orientado a
objetos, es habitualmente comparado a TCL, Perl, Scheme, Java y Ruby.
Actualmente, Python se desarrolla como un proyecto de código abierto,
administrado por la Python Software Foundation. Contiene módulos, clases, tipos de
datos de alto nivel y escritura dinámica. Tiene interfaces para diversos sistemas y
librerías. También puede utilizarse como un lenguaje de extensión para aplicaciones que
necesitan una interfaz programable. Otra ventaja es su portabilidad, funcionando en
sistemas Unix y derivados, Windows, Dos, Mac y otros.
Hay factores que distinguen a Python de otros lenguajes de programación
orientados a objetos:
1) No hay necesidad de compilar código en Python antes de ejecutarlo, por lo
que se convierte en un lenguaje de script.
2) El lenguaje busca tener un código más fácil de utilizar (y con reutilizable para
otras aplicaciones).
18
UDLA
Desarrollo de Software Radio
TX/RX de FM
2.1.
Instalación
La instalación de GNU Radio fue quizás el proceso más exhaustivo de ésta Tesis, pero
la siguiente guía contiene toda la información necesaria para obtener una instalación
satisfactoria en Ubuntu.
Lo primero que hay que hacer es ubicar los paquetes (2.x tarball o CVS) de
GNU Radio los cuales los podemos encontrar en www.gnu.org/software/gnuradio (2.x
tarball) o utilizando CVS (Concurrent Versions System), lo cual se realizará más
adelante, estos paquetes son los siguientes:
•
gnuradio-core: el núcleo de las librerías.
•
gnuradio-examples: ejemplos de GNU Radio, donde encontraremos los
programas para TX y RX de FM.
•
gr-audio-oss: soporte para tarjetas de sonido que utilizan OSS (Open Sound
System).
•
gr-audio-alsa: soporte para tarjetas de sonido que utilizan ALSA (Advanced
Linux Sound Architecture).
•
gr-usrp: librerías que unen a GNU Radio con el Universal Software Radio
Peripheral.
•
gr-wxgui: wxPython basado en herramientas GNU, incluye un oscilocopio y
FFT´s.
•
gr-howto-write-a-block: incluye ejemplos de como escribir un bloque.
•
usrp: soporte para la tarjeta USRP.
Ahora antes de instalar gnuradio-core es necesario tener algunos paquetes preinstalados, estos paquetes son los siguientes:
19
UDLA
Desarrollo de Software Radio
TX/RX de FM
FFTW (Fastest Fourier Transform in the West): Ésta es una subrutina en C
que es capaz de computar transformadas discretas de Fourier en una o más dimensiones,
el tamaño de la entrada es arbitrario y maneja datos complejos y reales. FFTW es
software libre por lo que se convierte en una librería de FFT para cualquier aplicación.
Lo podemos obtener de: http://www.fftw.org/download.html
Cppunit: Es una unidad de prueba para checar bloques en C++.
Lo podemos obtener de:
https://sourceforge.net/project/showfiles.php?group_id=11795
SWIG (Simplified Wrapper and Interface Generator): Son herramientas para
el desarrollo de software que conectan programas escritos en C o C++ con una gran
variedad de lenguajes de programación de alto nivel. SWIG es utilizado con diferentes
tipo se lenguaje como Python.
Lo podemos obtener de: http://sourceforge.net/projects/swig/
Numarray y Numpy: Son dos módulos de Python necesarios para el
funcionamiento de GNU Radio. Éstos son utilizados para computo numérico y los
podemos encontrar disponibles en: http://sourceforge.net/projects/numpy
wxPython: Son herramientas para el lenguaje de programación Python, y
permite crear programas con funciones e interfaces gráficas de forma simple. Ésta
implementado como un módulo de Python. Lo podemos obtener de:
https://sourceforge.net/project/showfiles.php?group_id=10718
20
UDLA
Desarrollo de Software Radio
TX/RX de FM
La instalación de los programa antes mencionados es ciertamente complicada ya
que éstos también requieren algunos programas preinstalados, lo que vuelve al proceso
bastante confuso. Para aportar claridad al proceso contamos con la ayuda del Synaptic
Package Manager de Ubuntu (otra razón más del porqué Ubuntu), el cual lo
encontramos en:
SystemÆAdministrationÆSynaptic Package Manager
Al haber dado de alta, en un principio, los repositorios donde se encuentran las
librerías necesarias, ahora simplemente hay que instalarlas; para esto es necesario
buscar la librería requerida con el botón de “search”, seleccionarla para instalación y
aplicar la instalación con el botón “apply”.
Las librerías que debemos buscar e instalar son las siguientes:
•
automake1.8
•
gcc-3.4
•
g++-3.4
Después de instalar gcc y g++ debemos crear una liga simbólica con los
siguientes comandos ejecutados en una Terminal:
# cd /usr/bin
# sudo ln -s gcc-3.4 gcc
# sudo ln -s g++-3.4 g++
•
python2.4
•
python2.4-dev
•
libtool (1.5)
•
wxpython2.5.3
21
UDLA
Desarrollo de Software Radio
TX/RX de FM
En caso de no ser encontrado wxpython por el Synaptic Package Manager es
necesario ejecutar en una Terminal los siguientes comandos:
# apt-get update
# apt-get install wxpython2.5.3
•
python2.3-numeric
•
libasound2 para ALSA
•
libasound2-dev para ALSA
•
libusb-dev
•
sdcc
•
bjam
•
libboost-dev
•
libboost-python1.31.0
•
libboost-python-dev
•
fftw3
•
fftw3-dev
•
cppunit
•
libcppunit-dev
•
libcppunit-1.10-2
Las únicas librerías que no se encuentran en los repositorios son las de SWIG
por lo que es necesario instalarlo manualmente, para esto hay que descargarlo de
“http://sourceforge.net/projects/swig/” donde podemos obtener la versión SWIG 1.3.24
la cual ya fue probada en este trabajo.
22
UDLA
Desarrollo de Software Radio
TX/RX de FM
El archivo descargado se encuentra en formato comprimido swig-*.tar.gz por lo
que es necesario descomprimirlo, para esto es necesario utilizar una Terminal y
movernos al directorio donde se encuentra el archivo comprimido.
En la Terminal y ya en ese directorio debemos escribir el siguiente comando:
# tar zxvf swig-1.3.24.tar.gz
Con esto obtendremos una carpeta con los archivos necesarios de SWIG; en la
misma terminal nos movemos a esta nueva carpeta y para realizar la instalación es
necesario ahora ejecutar los siguientes comandos esperando a que cada uno termine de
ejecutarse antes de correr el siguiente:
# ./configure
# make
# make check
# make install
Ahora para obtener los paquetes de GNU Radio utilizaremos CVS que es una
forma de descargar los paquetes en su ultima versión sin necesidad de hacerlo desde una
página de Internet. Para esto debemos ejecutar los siguientes comandos en una
Terminal:
# export CVS_RSH="ssh"
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-build
23
UDLA
Desarrollo de Software Radio
TX/RX de FM
Con estos comandos creamos una carpeta llamada gr-build con los archivos
necesarios para instalar los paquetes de GNU Radio como se muestra en la Figura 2.1:
Figura 2.1. Carpeta gr-build con los archivos necesarios para instalar GNU
Radio
Ahora debemos descargar los paquetes en esta carpeta que se creó, para esto nos
movemos a esa carpeta y tecleamos lo siguiente en la línea de comandos de la Terminal:
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gnuradio-core
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P
gnuradio-
examples
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-audio-alsa
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-audio-oss
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-usrp
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-wxgui
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-howtowrite-a-block
# cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-gsm-frvocoder
24
UDLA
Desarrollo de Software Radio
TX/RX de FM
# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/opensdr login
# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/opensdr co -P usrp
Ahora nuestra carpeta de gr-build se debe ver como en la Figura 2.2.
Figura 2.2. Carpeta gr-build luego de descargar los archivos de CVS
Para realizar la instalación final hacemos lo siguiente en la Terminal en el
directorio de gr-build:
# ./checkout
# ./for-all-dirs ../buildit 2>&1 | tee make.log
El proceso debe durar algunos minutos y de acuerdo a lo hecho anteriormente no
debe haber ningún error, en caso de existir alguno el sistema nos avisara si hace falta
algún archivo o librería, de no ser así es necesario revisar el proceso nuevamente.
25
UDLA
Desarrollo de Software Radio
TX/RX de FM
Ahora debemos obtener las actualizaciones para el USRP, lo único que debemos
hacer es descarga este archivo de www.gnu.org/software/gnuradio, descomprimirlo
como lo hicimos con SWIG:
# tar zxvf usrp*.tar.gz
Y copiar los archivos que no se encuentren en nuestra carpeta de usrp en grbuild. Ahora para comprobar que todo el proceso se realizó correctamente correremos
un programa de ejemplo que simula el tono que da una línea telefónica, para esto, desde
una Terminal nos ubicamos en la carpeta gr-build y hacemos lo siguiente:
# killall esd (es necesario cada vez que iniciamos el sistema operativo, elimina el
proceso de audio con el que cuenta la computadora.)
# cd gnuradio-examples/pitón/audio/
#./dial_tone.py
Si escuchamos un tono como el mencionado anteriormente significa que el
ejemplo funciona, y que nuestro GNU Radio está instalado correctamente. En caso de
no encontrar el archivo dial_tone.py lo podemos crear a través de los siguientes pasos:
Abrimos un Editor de Texto y copiamos el siguiente programa:
#!/usr/bin/env python
from gnuradio import gr
from gnuradio import audio
def build_graph ():
sampling_freq = 48000
ampl = 0.1
fg = gr.flow_graph ()
src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl)
src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl)
dst = audio.sink (sampling_freq)
fg.connect ((src0, 0), (dst, 0))
fg.connect ((src1, 0), (dst, 1))
26
UDLA
Desarrollo de Software Radio
TX/RX de FM
return fg
if __name__ == '__main__':
fg = build_graph ()
fg.start ()
raw_input ('Press Enter to quit: ')
fg.stop ()
Ahora guardamos este archivo en /gr-buid/gnuradio-examples/python/audio/ con
el nombre de dial_tone.py
Para poder ejecutarlo desde una Terminal es necesario pulsar el botón derecho
del mouse sobre el ícono del archivo creado y en la pestaña de “Permissions” debemos
dejar las opciones como se muestra en la Figura 2.3.
Figura 2.3 Propiedades del programa hello_world.py
Con esto ya podemos volver a correr el ejemplo como se mostró anteriormente.
27
UDLA
Desarrollo de Software Radio
TX/RX de FM
2.2.
Pre-requisitos
La sección de prerrequisitos tiene la función de informar al lector sobre algunos tópicos
que deben ser conocidos para poder continuar con el proceso de esta Tesis.
ADCs: Un convertidor analógico a digital tiene tres características primarias:
•
Sample Rate (Tasa de Muestreo)
•
Dynamic Range (Rango Dinámico)
•
Tiempo de conversión
Sample Rate o Tasa de Muestreo es el número de veces por segundo que el ADC
mide una señal analógica.
Dynamic Range o Rango Dinámico se refiere a la diferencia entre la señal más
pequeña y la más grande que puede ser distinguida por el ADC, esta en función del
número de bits de salida del ADC.
Tiempo de conversión: Existe un tiempo de conversión Tc que necesita el ADC
para sacar un número digital a partir de recibir un dato analógico con el fin de que al
existir una variación en la entrada no surja una confusión en la conversión.
Teoría de Nyquist: La teoría de Nyquist determina que para evitar el efecto de
aliasing cuando convertimos de analógico a digital, la frecuencia de muestreo del
ADC debe ser de al menos dos veces el ancho de banda de la banda de interés.
Frecuencia de interés Æ 0 a fmax
Frecuencia de muestreo Æ 2 fmax
28
UDLA
Desarrollo de Software Radio
TX/RX de FM
RF front end: Un RF front end se encarga de trasladar el centro de un rango de
frecuencias a otro rango de frecuencias, por ejemplo: un módem sintonizador de señales
de cable (RF front end) tiene las siguientes características, traslada una parte de 6MHz
del espectro centrada entre 50 y 800MHz hacia un rango de salida centrado en
5.75MHz. La frecuencia central del rango de salida se llama Frecuencia Intermedia o IF.
[14]
2.3.
Tarjeta USRP
2.3.1. ¿Qué es el USRP?
El Universal Software Radio Peripheral es un periférico diseñado para trabajar en
conjunto con una computadora a través de un FPGA y permite la realización de
Software Radios. Este periférico realiza las funciones de llevar la señal a banda base de
RF a través de la sección de IF, y viceversa, para un sistema común de radio
comunicaciones, como se muestra en la Figura 2.4.
Antena
RF
FrontEnd
Analog
IF
A/D
Conversión.
Procesamiento
(Software)
D/A
Conversión.
Figura 2.4 Bloques principales en este sistema de comunicaciones de
Software Radio
En el Apéndice H se muestra una hoja técnica del USRP con algunas
características.
29
UDLA
Desarrollo de Software Radio
TX/RX de FM
2.3.2. Características
El USRP cuenta con 2 niveles de tarjetas como se muestra en la Figura 2.5. El primero
es la tarjeta base en donde se encuentra el FPGA, los convertidores ADC´s y DAC´s, la
alimentación y la conexión vía USB. El segundo nivel se compone de Daughterboards
llamadas tarjetas secundarias. Éstas existen para transmisión y recepción. Estas tarjetas
son las que trabajan como RF front-end las cuales llevan nuestra señal hasta la banda de
RF deseada.
Nivel 1
USRP
Motherboard o
Tarjeta Primaria
Nivel 2
USRP
Daughterboards
o Tarjetas
Secundarias
Figura 2.5 Universal Software Radio Peripheral [5]
La Figura 2.6 muestra un diagrama a bloques del Universal Software Radio
Peripheral, donde podemos ver la disposición de los convertidores, el procesador y la
interfase USB.
30
UDLA
Desarrollo de Software Radio
TX/RX de FM
Figura 2.6 Diagrama a bloques del Universal Software Radio Peripheral [5]
2.3.2.1
Primer nivel: convertidores, procesador e interfase.
Convertidores AD
El USRP tiene 4 convertidores ADC de alta velocidad, cada uno a 12 bits por muestreo,
y 64 millones de muestras por segundo con lo que podemos digitalizar una banda de
32MHz. Si muestreamos una señal a una IF (Intermediate Frecuency) de 32MHz
introducimos el efecto de imagen al sistema con lo que la banda de interés se mapea a
algún lugar entre -32 y 32MHz.
El rango completo del ADC es de 2V pico a pico y tiene una entrada diferencial
de 50Ω, lo que significa 16dBm o 40mW. Existe un amplificador de potencia
programable (PGA) antes del ADC para amplificar la señal de entrada y utilizar el
rango completo en el caso que la señal sea débil.
31
UDLA
Desarrollo de Software Radio
TX/RX de FM
Convertidores DA
El USRP tiene 4 convertidores DAC de alta velocidad para transmisión, cada uno a 14
bits por muestreo y 128 millones de muestras por segundo, por lo que la frecuencia de
Nyquist es de 64MHz.
Los DAC´s pueden suministrar 1V pico a pico a una carga diferencial de 50Ω
esto es 10dBm o 10mW. Contamos también con un PGA conectado después del DAC
para aumentar la ganancia a 20dB o más.
Los PGA utilizados para transmisión y recepción son programables.
Procesador e Interfases
El procesador utilizado por el USRP es un FPGA Altera Cyclone EP1C12 (Apéndice
D). Comprender el funcionamiento del FPGA es parte importante para utilizar GNU
Radio. Los ADC y DAC´s están conectados al FPGA, la tarea de éste es realizar
procesos matemáticos de las señales en la banda que necesitamos, y reducir las tasas de
muestreo de datos para enviar datos a través de una interfase USB 2.0. EL FPGA se
conecta a un chip de interfase USB 2.0, este chip es el Ciprés FX2. La configuración
estándar del FPGA incluye 4 convertidores digitales de bajada (DDC), esto permite 1, 2
o 4 canales independientes de recepción, cada DDC tiene dos entradas I (en fase) y Q
(en cuadratura). Cada ADC puede ser ruteado a cualquiera de las entradas I y Q de los 4
DDC.
Para la transmisión tenemos convertidores digitales de subida (DUC) contenidos
fuera del FPGA en el chip AD9862 CODEC (Apéndice I).
32
UDLA
Desarrollo de Software Radio
TX/RX de FM
Los canales múltiples para la recepción deben todos tener la misma tasa de
transmisión de datos (data rate), lo mismo para los canales de transmisión que deben
tener el mismo “data rate” el cual debe ser distinto del de la recepción.
La figuras 2.7 muestra un diagrama a bloques de la trayectoria de recepción
desde la antena hasta el DDC.
Figura 2.7 Multiplexor en el USRP, donde I es la señal en fase y Q la señal en
cuadratura. [17]
El multiplexor (MUX) en la Figura 2.7 es un circuito seleccionador, que determina cual
ADC es conectado a cada DDC. Podemos controlar este MUX utilizando el método en
Python llamado usrp.set_mux().
Por ejemplo, si suponemos el diseño de un receptor de FM, el ancho de banda de
una estación de FM es de 22kHz, podemos seleccionar un factor de decimación de 250
con lo que la tasa de transmisión a través del USB será de 64MHz / 250 = 256kHz el
cual satisface los 200kHz de ancho de banda sin perder información.
33
UDLA
Desarrollo de Software Radio
TX/RX de FM
Es posible seleccionar la frecuencia IF del DDC utilizando el método en Python
de usrp.set_rx_frec(), y para seleccionar el factor de decimación utilizamos
usrp.set_decim_rate() el cual puede ir de 1 a 256.
Cuando tenemos múltiples canales (más de cuatro), los canales son entrelazados.
Por ejemplo, con cuatro canales, la secuencia enviada a través del USB será I0 Q0 I1 Q1
I2 Q2 I3 Q3 I0 Q0 I1 Q1, etc.
Finalmente las señales de I y Q entran a la computadora vía USB y ahora todo es
cuestión de Software.
Para la transmisión todo sucede de forma similar, con la diferencia que el
proceso es contrario. Enviamos una señal I y Q en banda base de la computadora al
USRP. El convertidor digital de subida (DUC) interpola la señal convirtiéndola a una
frecuencia superior para la banda de IF y por último la envía a través del DAC.[5]
2.3.2.2
de RF e IF).
Segundo nivel: tarjetas secundarias (antena, sección
Tarjetas Secundarias: estas tarjetas se muestran en la Figura 9 y realizan la
tarea de la antena, la sección de RF y la sección de IF en nuestro sistema de
comunicación.
Se conectan al primer nivel que cuenta con 4 entradas, 2 para recepción y 2 para
transmisión. Para recepción se utiliza la Tarjeta Secundaria llamada Basic RX y para
transmisión la Basic TX.
34
UDLA
Desarrollo de Software Radio
TX/RX de FM
Existen 2 ranuras para tarjetas de transmisión etiquetadas como TXA y TXB y
sus dos correspondientes para recepción etiquetadas también RXA y RXB. Cada ranura
para tarjeta tiene acceso a 2 de los 4 convertidores de datos de alta velocidad (Salidas de
DACs para TX y entras de ADC para RX).
Esto permite a cada tarjeta tener dos secciones independientes de RF y dos
antenas (4 para todo el sistema). Si utilizamos un muestreo en cuadratura (IQ) de la
señal analógica, cada tarjeta puede soportar una sola sección de RF, para un total de dos
para el sistema completo.
La entrada analógica del ADC tiene un ancho de banda por arriba de los
200MHz por lo que para frecuencias intermedias por arriba de este valor, la frecuencia
debe ser seleccionada [5].
Figura 2.9 Imagen de las tarjetas secundarias Basic RX y Basic TX [5]
Podemos ver en la Figura 2.9 que cada tarjeta secundaria cuenta con dos
conectores de tipo SMA, los cuales se utilizan para conectar señales de entrada o salida,
así como para acoplar una antena.
35
UDLA
Desarrollo de Software Radio
TX/RX de FM
Existen actualmente 3 tipos de tarjetas secundarias:
•
Basic daughterboards: son las más sencillas, existen para transmisión y
recepción, son utilizadas para conectar sintonizadores o generadores de señales.
El rango de frecuencia para estas tarjetas es de hasta 64MHz [5]. Se pueden
utilizar para transmisiones del tipo de AM en incluso FM con algunas limitantes.
•
TVRX daughterboards: son tarjetas únicamente para recepción, el rango de
frecuencias va desde 50 a 800MHz, con un ancho de banda para IF de 6MHz,
son utilizadas para detección de señales de FM y TV.
•
DBSRX daughterboards: éstas son también solo para recepción, y su rango de
frecuencia de RF va desde 800MHz hasta 2.4GHz.
Otras daughterboards están siendo desarrolladas por Ettus Research LLC [5],
especialmente para transmisión. Y estarán a la venta próximamente.
Para la realización de esta Tesis se cuenta con las “Basic Daughterboards”
únicamente.
2.3.2.3
Conexión mecánica y eléctrica.
Conexión Mecánica
El USRP incluye un equipo completo de pilares, pernos y tuercas para realizar
una conexión mecánica adecuada. Tenemos 20 pilares (standoffs) M3x10mm M-F, de
los cuales 4 son utilizados como “patas” para el USRP, ubicados en las cuatro esquinas
de la tarjeta, los 16 pernos restantes, los pernos y las tuercas son utilizados para sostener
36
UDLA
Desarrollo de Software Radio
TX/RX de FM
las cuatro tarjetas secundarias. En las Figuras 2.10 y 2.11 se muestra la conexión
mecánica de los pilares, pernos y tuercas en el USRP:
Pilares
Figura 2.10 Pilares, Conexión Mecánica del USRP.
Pernos
Tuercas
Figura 2.11 Pernos y Tuercas, Conexión Mecánica del USRP.
La posición en el USRP de los pilares está diseñada para prevenir accidentes o
conexiones incorrectas de las tarjetas secundarias. El USRP no debe ser operado sin los
pilares y las tarjetas secundarias no deben ser conectadas o desconectadas mientras el
USRP está encendido.
37
UDLA
Desarrollo de Software Radio
TX/RX de FM
Conexión Eléctrica
El USRP necesita un convertidor de 6V 4A el cual viene incluído en el paquete al
momento de la compra. El convertidor funciona con voltajes de corriente alterna de 90 a
260V, y opera a 50/60Hz, por lo que funciona en cualquier país. El conector que va al
USRP es de 2.1mm/5.5mm DC power conector. El USRP por sí solo necesita de 5V y
2A, pero se seleccionó una alimentación de 6V para utilizar a futuro otras tarjetas
secundarias.
El paquete también incluye el cable USB el cual debe ser conectado a una ranura
de computadora capaz de soportar USB 2.0, por lo que en ranuras USB 1.1 el USRP no
funciona.
Al conectar el USRP, debemos ver un LED destellando de 3 a 4 veces por
segundo, esto indica que el procesador está corriendo, y el dispositivo se encuentra en
modo de ahorro de energía. Una vez que el soporte lógico es cargado al FPGA, el LED
destellará a una velocidad menor. En caso de que el LED no muestre ninguna señal, es
necesario revisar las conexiones eléctricas, y revisar si hay continuidad en el fusible
principal F501, el cual se encuentra cercano al conector de energía como se muestra en
la Figura 2.12. Si este fusible requiere ser reemplazado las especificaciones son:
Tamaño 0603
Corriente 3A
38
UDLA
Desarrollo de Software Radio
TX/RX de FM
Figura 2.12 Fusible, Conexión eléctrica del USRP.
2.3.3. Instalación del USRP
La instalación del USRP es bastante sencilla, es necesario haber instalado GNU Radio,
y hacer la conexión correcta de la tarjeta, por lo que solo necesitamos conectar el USRP
a la corriente y con el cable USB a la computadora. Ahora abrimos una Terminal y
corremos el siguiente comando:
# tail -f /var/log/messages
Con este comando podemos ver en la Terminal el estado de las conexiones USB
por lo que al conectar el USRP debemos observar un mensaje como el siguiente:
new high speed USB device using address 1
Ahora al desconectar el cable debemos obtener un mensaje correspondiente a
haber retirado el conector de la ranura. En caso de que al conectarlo obtengamos un
mensaje como el siguiente:
new full speed USB device using address 1
39
UDLA
Desarrollo de Software Radio
TX/RX de FM
Significa que nuestra ranura de USB no soporta la versión 2.0 de éste.
Como la instalación de GNU Radio fue hecha directamente desde CVS, hay un
archivo (usrp.fpga.rbf) que debemos extraer del paquete usrp-*.*.tar.gz por lo que
podemos seguir el siguiente procedimiento de comandos:
# mkdir tmp
# cd tmp (descargar el archive comprimido a esta carpeta)
# tar xvvfz usrp-*.*.tar.gz
# cp usrp-*.*/fpga/rbf/usrp_fpga_rev2.rbf /usr/local/share/usrp/rev2/usrp_fpga.rbf
# cd ..
# rm -rf tmp
Con esto ya tenemos todos los archivos necesarios en el lugar adecuado y
podemos comenzar a correr programas utilizando el USRP y GNU Radio.
En
una
Terminal
nos
movemos
al
directorio
de
gr-build/gnuradio-
examples/python/usrp/ y ejecutamos el siguiente comando:
# ./usrp_oscope.py
(Recordemos que si es el primer programa que ejecutamos desde que iniciamos
la computadora, es necesari hacer # killall esd). Si todo ha sido instalado correctamente
debemos ver una ventana similar a un Osciloscopio, ahora cambiamos el botón de POS
a AUTO y debemos ver una figura como la 2.13:
40
UDLA
Desarrollo de Software Radio
TX/RX de FM
Figura 2.13 Osciloscopio de recepción en GNU Radio.
Este programa que acabamos de ejecutar funciona como un osciloscopio y
podemos conectarle señales para analizarlas, como se hace con los equipos que tenemos
en el Laboratorio de Electrónica. Con esto dejamos las instalaciones atrás y tenemos al
sistema completo funcionando. Ahora lo que sigue es solo cuestión de Software.
2.4.
Grafos, Bloques y Conexiones
Para iniciarnos en la programación de Software Radio con GNU Radio es necesario
conocer y saber como funcionan las estructuras de grafos, bloques y conexiones. Para
realizar esta tarea comenzaremos con un programa básico en Python, éste programa es
dial_tone.py el cual se encuentra en la siguiente dirección “gr-buidl\gnuradioexamples\python\audio”.
Éste programa generan dos señales senoidales de diferente frecuencia que
simulan el de tono de llamada en un teléfono local y los envía a la tarjeta de sonido de
nuestra computadora por lo que el USRP no es necesario aquí.
41
UDLA
Desarrollo de Software Radio
TX/RX de FM
El código de dial_tone.py es el siguiente y será analizado línea por línea para
conocer su funcionamiento:
#!/usr/bin/env python
#
# Copyright 2004 Free Software Foundation, Inc.
# This file is part of GNU Radio
#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
from gnuradio import gr
from gnuradio import audio
def build_graph ():
sampling_freq = 32000
ampl = 0.1
fg = gr.flow_graph ()
src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl)
src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl)
dst = audio.sink (sampling_freq)
fg.connect (src0, (dst, 0))
fg.connect (src1, (dst, 1))
return fg
if __name__ == '__main__':
fg = build_graph ()
fg.start ()
raw_input ('Press Enter to quit: ')
fg.stop ()
Las primeras líneas, que inician con #, son únicamente comentarios y no afectan
la lógica del programa. Es necesario, para comprender las siguientes líneas, hablar sobre
los Módulos y Paquetes.
42
UDLA
Desarrollo de Software Radio
TX/RX de FM
Un Módulo es un programa realizado en Python con un sufijo “.py” y contiene
un programa con alguna función específica la cual está disponible como una variable
global “__name__”, esta función puede ser importada dentro de otro modulo en
cualquier nivel. Un Paquete es un conjunto de módulos que realizan funciones
similares. Para que Python maneje estas carpetas como paquetes es necesaria la función
“__init__.py”, un paquete puede contener módulos y sub-paquetes. La estructura dentro
del programa para módulos y paquetes es del tipo x.y donde y es un módulo contenido
en el paquete x, por lo que si en el programa tenemos “gr.sig_source_f” significa que el
módulo sig_source_f.py se encuentra en el paquete gr. Estos paquetes y módulos se
encuentran en: “/usr/local/lib/python2.4/site-packages”. Al inicio del programa, luego
de los comentarios, importamos los siguientes módulos:
from gnuradio import gr
from gnuradio import audio
Con lo que importamos el paquete gr y el módulo audio.py de la carpeta de
gnuradio, como se muestra en la Figura 2.14.
Figura 2.14 Paquete gr y módulo audio.py en la carpeta gnuradio
43
UDLA
Desarrollo de Software Radio
TX/RX de FM
Ahora definimos una función sin argumentos para construir una gráfica, de la
siguiente forma:
def build_graph ():
La función que acabamos de definir funcionará como una variable global dentro
del módulo dial_tone.py, ahora dentro de esta definimos dos constantes:
def build_graph ():
sampling_freq = 32000
ampl = 0.1
Como ya mencionamos sampling_freq es la frecuencia a la que se muestréa la
señal que entrará a la tarjeta de sonido, el valor de 32kHz es estándar para la mayoría de
estas tarjetas. La frecuencia de muestreo es un parámetro para la fuente de la señal
gr.sig_source_f que veremos más adelante. El otro parámetro es la amplitud de la señal
senoidal el cual se define de 0.1 Volts para este ejemplo.
La siguiente parte del programa consiste en crear el grafo para generar las
señales:
fg = gr.flow_graph ()
El módulo flow_graph es una clase definida en gr.flow_graph.py, la cual llama a
la función basic_flow_graph.py.1
Ahora creamos dos fuentes de datos:
src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl)
src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl)
1
Como recordamos, un grafo esta compuesto por vértices y bordes que conectan a éstos, éstos dos
elementos están definidos como clase “endpoint” y clase “edge” en el módulo basic_flow_graph.py
importado en un inicio del paquete gr.
44
UDLA
Desarrollo de Software Radio
TX/RX de FM
La fuente de la señal pertenece a la categoría de Bloques, los bloques están
implementados en C++, por lo que aquí es donde interviene SWIG quien provee la
interfase entre Python y C++, el bloque utilizado en ésta parte es gr.sig_source_f el cual
se encuentra en “gr-buld\gnuradio-core\src\lib\general”.
Con estas dos líneas generamos dos señales senoidales, una a 350Hz y otra a
440Hz con lo que creamos un tono compuesto por ambas senoidales.
El siguiente paso es generar la señal para el dispositivo de audio, es decir, la
tarjeta de sonido de nuestra computadora, esto se logra con la siguiente línea:
dst = audio.sink (sampling_freq)
El módulo audio.py se encuentra en “/usr/local/lib/python2.4/site-packages/
gnuradio/audio.py” el cual es importado desde el inicio. Este módulo transforma las
fuentes en señales para poder reproducirlas. Las funciones “sink()” y “source()”son
definidas en éste módulo y regresan una señal o una fuente de audio a partir de una
clase.
Ahora debemos realizar la Conexión entre los bloques que hemos definido
anteriormente para completar el grafo:
fg.connect (src0, (dst, 0))
fg.connect (src1, (dst, 1))
Con esto creamos la conexión lógica del grafo uniendo los puertos de entrada
y salida (src-fuente y dst-destino). Ahora la función global build_graph() regresa el
flujo a través del grafo creado en fg.
45
UDLA
Desarrollo de Software Radio
TX/RX de FM
La última parte del programa consiste en hacer correr el flujo de datos a través
del grafo con las siguientes líneas:
if __name__ == '__main__':
fg = build_graph ()
fg.start ()
raw_input ('Press Enter to quit: ')
fg.stop ()
La primera línea sirve para correr el programa directamente, es decir, a través de
una Terminal con el comando ./dial_tone.py, en caso de que el módulo que estamos
creando sea llamado, la parte que se encuentra debajo de esta línea será ignorada y
solamente se importará el contenido anterior a ésta. Es decir, esta línea sirve para hacer
del código un módulo ejecutable o un sub-módulo. La siguiente línea es la que llama a
la función que hemos definido y le asigna el flujo del grafo fg. Para correr el grafo
utilizamos la línea fg.start(),y para terminarlo fg.stop(), los métodos “start()” y
“stop()” se encuentran definidos en la clase flow_graph. La función raw_input es
similar a “print” en otros lenguajes de programación y sirve para añadir texto a la
pantalla.
Este archivo fue corrido para verificar la correcta instalación de GNU Radio
pero en ese momento no conocíamos el código, por lo que es importante correrlo de
nueva cuenta y variar algunos parámetros, para observar el poder que tenemos sobre
éste gracias a que esta implementado por Software.
En caso de correr el programa y obtener un mensaje como el siguiente: “unable
to support sampling rate 32000, card request 48000 instead” como se muestra en la
Figura 2.15.
46
UDLA
Desarrollo de Software Radio
TX/RX de FM
Figura 2.15 Mensaje de respuesta al soportar 48k muestras por segundo y no 32k
Es necesario cambiar en el programa:
from gnuradio import audio Æ from gnuradio import audio_oss as audio
ó
from gnuradio import audio Æ from gnuradio import audio_alsa as audio
El cambio se debe realizar cuando la frecuencia de muestreo de 32kHz no es
aceptada por la tarjeta de sonido que utilizamos, ALSA y OSS son los dos tipos de datos
que manejan las tarjetas de sonido. Al realizar el cambio debemos obtener algo como en
la Figura 2.16, al correr el programa.
47
UDLA
Desarrollo de Software Radio
TX/RX de FM
Figura 2.16 Ventana que muestra una corrida correcta del programa dial_tone.py
El archivo dial_tone.py es un módulo básico para trabajar con GNU Radio, de
ahí que es importante comenzar a programar con éste, ya que además de darnos una
clara introducción de cómo se realizan los grafos, bloques y conexiones, nos introduce a
la programación de señales de audio.
48
Descargar