domingo, 15 de diciembre de 2013

Generador de frecuencia con Raspberry - PLL

Generador de frecuencia con Raspberry

PLL

xsetaseta@gmail.com

En este montaje aprovechamos el anterior montaje raspfm y modificamos el código fuente para generar una onda de una frecuencia entre 123KHZ y 125MHZ.
He quitado en el programa PIFM todo lo relativo a la modulación de FM y el código de DMA.
El programa pll3 está realizado en C de donde recibe un parámetro de frecuencia a generar. Si por el contrario queremos parar el generador deberemos figurar como parámetro 0.
SETA43 ->Frecuencia: 0.123000 Mhz  Divisor 16650406
SETA43 ->Frecuencia: 0.555000 Mhz  Divisor 3690090
SETA43 ->Frecuencia: 1.000000 Mhz  Divisor 2048000
SETA43 ->Frecuencia: 5.000000 Mhz  Divisor 409600
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 15.000000 Mhz  Divisor 136533
SETA43 ->Frecuencia: 12.000000 Mhz  Divisor 170667
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 20.000000 Mhz  Divisor 102400
SETA43 ->Frecuencia: 30.000000 Mhz  Divisor 68267
SETA43 ->Frecuencia: 40.000000 Mhz  Divisor 51200

Salida del programa pll3

Para crear un interface gráfico he utilizado el lenguaje python con la librería gráfica tkinter.
Tiene dos interfaces gráficos pll1.py  y pll2.py , se puede utilizar el que mas guste.


pll2.py

pll1.py









Como vemos en la imágenes, a frecuencia bajas la onda es cuadrada, y según aumentamos la frecuencia se va haciendo senoidal. Con un filtro paso altos  podríamos llegar a una forma de onda casi perfecta.
Con mi osciloscopio podemos ver la forma de la onda hasta un máximo de unos 20MHZ. Con el frecuencímetro  hecho por mi, podemos medir la frecuencia. Existe una desviación de frecuencia que puede ser debido al propio frecuencímetro  por no estar bien tarado.
En cualquier receptor de radio de AM, OC y FM  podemos sintonizar la frecuencia generada.
Deberemos tener cuidado de no pisar las emisoras comerciales, que aunque la potencia es baja podemos tapar la señal de algún vecino.

Archivos de programa

Ahora voy a intentar explicar en lo que pueda, un poco del programa pll3.c .
El BCM2835 es un integrado que además de contener un procesador ARM dispone de una serie de periféricos auxiliares como:
Timers, Interrupt controller, GPIO, USB, PCM / I2S, DMA controller, I2C master, I2C / SPI slave, SPI0, SPI1, SPI2, PWM, UART0, UART1.
Existe un manual BCM2835 ARM Peripherals que explica mas o menos todas las funciones del integrado. Es muy completo pero muy difícil de comprender.
Para utilizarlo como PLL debemos ir a la página 105 , punto 6.3 General Purpose GPIO Clocks.
Colocamos en la dirección CM_GP0CTL las distintas opciones
 struct GPCTL setupword = {6/*SRC*/, 1, 0, 0, 0, 1,0x5a};
Que significan:
Clock source =PLLD
ENAB=1
KILL=0
BUSY=0
FLIP=0
MASH=1
PASSWD=0x5a

Seleccionamos como fuente de reloj PLLD, y MASH control a 1 (equivalente a no MASH divisores).
Ahora establecemos el divisor para el PLL que se coloca en CM_GP0DIV. Variando el valor de este registro podemos variar la frecuencia generada en tiempo real, este es el metodo empleado para generar FM en el montaje de PIFM. Existe dos programas de PIFM, uno que maneja mediante el procesador la frecuencia y otro que utiliza DMA para no sobrecargar el procesador.
Para calcular el divisor que debemos poner en CM_GP0DIV, que genere una frecuencia concreta en el PLL utilizamos la formula:

centerFreqDivider = (int)((500.0 / centerFreq) * (float)(1<<12) + 0.5);


Como ejemplo para una frecuencia de 40.000000Mhz debemos colocar un divisor 51200.
Podéis ver que la formula se puede optimizar bastante, pero no he querido modificar la original para no despistar mucho. El numero 500 se debe a que el PLL se basa en un reloj de 500MHZ y (1<<12) significa 4096, por lo que una forma más rápida sería:

centerFreqDivider =2048000/centerFreq

Como podemos ver, es un tanto difícil de entender.
Después de ver los manuales del ATMEGA del arduino y ver los manuales del BCM2835, la comparación es abismal en favor de ATMEGA,  hecho de menos todas sus explicaciones y esquemas.

Saludos
Juan Galaz



Bibliografía:
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
https://github.com/Emerica/pifm/blob/master/pifm.c
https://github.com/Guzunty/Pi/blob/master/src/gzlib/src/gz_clk.c
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=72&t=17975

lunes, 25 de noviembre de 2013

Control de 17 salidas Raspberry - Domótica

Control de 17 salidas Raspberry

Domótica

xsetaseta@gmail.com

Esta es la continuación de mi artículo sobre el control de 17 salidas con la raspberry.
Aquí vamos a dar una utilidad práctica al montaje, para encender y apagar luces de un piso.
Mediante la pulsación sobre las diferentes partes del plano, se encienden o apagan las diferentes salidas de la raspberry. Aquí pondríamos los relés, que encenderían o apagarían las luces.
Para encender vía internet, solo lo podríamos realizar mediante un programa de acceso vía vnc, próximamente se hará mediante un navegador.
Programa funcionando




Vídeo de demostración

ARCHIVO PROGRAMA.
Crea un directorio y descomprime todos los ficheros en el directorio creado.
Se ejecuta con permisos de superusuario. sudo ./raspif

ARCHIVO LIBRERÍAS.
Si no tienes la librería instalada, deberás descomprimir el fichero librerias.tar.gz en /usr/local/lib .
Si quieres además compilar, he añadido el fichero include.tar.gz para que lo descomprimas en /usr/local/include los ficheros de cabeceras.
Recomiendo que visites https://projects.drogon.net/raspberry-pi/wiringpi/ y sigas la instrucciones para compilar e instalar las librerías.


Saludos
Juan Galaz



Bibliografía:

https://projects.drogon.net/raspberry-pi/wiringpi/

martes, 19 de noviembre de 2013

Control de 17 salidas Raspberry

Control de 17  salidas Raspberry

Librería WiringPi - SDL

 Raspberry Pi

xsetaseta@gmail.com

En el anterior montaje Control de 3 salidas Raspberry Pi había realizado la programación en lenguaje Python. En este montaje realizo el control de las 17 salidas de la raspberry en lenguaje C, utilizando la librería wiringPi, y el interface gráfico lo he realizado con la librería SDL.
A cada uno le gusta el lenguaje donde mas ha programado, y en mi caso es C. Este es el motivo de que haya buscado una librería en C para manejar las salidas de la raspberry, y encontré wiringPi. La librería wiringPi la ha realizado Gordons y se encuentra en su página https://projects.drogon.net/raspberry-pi/wiringpi/.
Para manejar las salidas de la raspberry ha simulado el manejo de entradas y salidas de arduino.

void pinMode (int pin, int mode);
para indicar si el pin es de entrada o salida (INPUT, OUTPUT)

void digitalWrite (int pin, int value); escribe un valor alto o bajo (HIGH or LOW)

En el programa lo primero que se hace es  inicializar la librería con  wiringPiSetup (); , y colocar todos los pin del GPIO como salida.

//___________Todos lo GPIO como salidas_____

    wiringPiSetup () ;
    for(z=0;z<17;z++)    pinMode (z, OUTPUT) ;

//________________




Correspondencia entre GPIO y pin.



Para que lea una especie de botones, utilizo una función que detecta zonas de imagen, que una vez activada mediante el ratón, se cambia la imagen del botón.


Imagen del programa funcionando.


Montaje eléctrico. Como prueba solo utilizo 3 pin.


FICHERO FUENTE


Saludos
Juan Galaz



Bibliografía:

https://projects.drogon.net/raspberry-pi/wiringpi/


lunes, 18 de noviembre de 2013

Control de salidas Arduino con Raspberry o PC

Control de salidas Arduino

con Raspberry o PC

 C - SDL

xsetaseta@gmail.com

En este montaje, realizó una comunicación entre la raspberry y el arduino mediante el cable USB.
Además de realizar la comunicación a través del cable usb, el arduino se alimenta de él.
Se basa en un anterior montaje aserie.html que activaba o desactivaba todas las salidas del arduino mediante un interface gráfica realizada en C y con la librería SDL.
Ahora he modificado un poco la programación de mi montaje para que funcione tanto en un PC con Linux como en la Raspberry. Este es mi primer programa para Raspberry que utiliza las librerías SDL.
Para que lea una especie de botones, utilizo una función que detecta zonas de imagen, que una vez activada mediante el ratón se cambia la imagen del botón. Es un sistema muy sencillo que como luego veremos en montajes posteriores, se puede utilizar para activar o desactivar partes de una imagen para encender un dispositivo.


Montaje eléctrico


Control desde el programa en la Raspberry

En el fichero adjunto veremos el programa para el PC y para la Raspberry. El programa en la Raspberry deberá funcionar sin problema en la distribución Raspbian, pero la versión para PC está compilada para Debian 7, para los que tengan otra versión de Linux, deberán compilar los códigos fuentes.

FICHERO FUENTE


Un Saludo
Juan Galaz

jueves, 17 de octubre de 2013

Control de salidas Raspberry - Arduino -Python

Control de salidas

Raspberry - Arduino -Python

 Raspberry Pi

xsetaseta@gmail.com

En este montaje realizó una comunicación entre la raspberry y el arduino mediante el cable USB.
Además de realizar la comunicación a través del cable usb, el arduino se alimenta de él.
Se basa en un anterior montaje aserie.html que activaba o desactivaba todas las salidas del arduino mediante un interface gráfica realizada en C y con la librería SDL.
En este caso hacemos lo mismo pero programando en python y con la librería tk.
Como realmente la raspberry es un ordenador con linux como sistema operativo, la realización se efectúa en el PC con debian por cuestión de velocidad, y luego se pasa a la raspberry donde funciona perfectamente.
El programa de arduino consiste en que se lee constantemente el puerto serie. Cuando se recibe una orden "1Dig13" el arduino interpreta que tiene que poner a 5V la salida de arduino Digital13. Si recibe la orden "0Dig13" el arduino pone la salida Digital13 a 0V.
Para mandar las ordenes al arduino se puede utilizar la consola del programador de arduino o cualquier otro programa de comunicaciones como por ejemplo CuteCom o minicom en  Linux.
void WriteComand()
{
  
   
    if(!strcmp(entrada,"0An0"))
      {
       digitalWrite(14, LOW);
       goto salir1;
      }
    if(!strcmp(entrada,"1An0"))
      {
      digitalWrite(14, HIGH);
       goto salir1;
      }
    
    if(!strcmp(entrada,"0An1"))
      {
      digitalWrite(15, LOW);
       goto salir1;
      }
    if(!strcmp(entrada,"1An1"))
      {
      digitalWrite(15, HIGH);
       goto salir1;
      }
................
Ejemplo de como interpreta el arduino las ordenes a través del interface serie.


def fAn0():
                global An0
                if An0  ==  0:
                        An0=1
                        ser.write('1An0\n')
                else:
                        An0=0
                        ser.write('0An0\n')
                print  "An0",An0                
                return

def fAn0():
                global An0
                if An0  ==  0:
                        An0=1
                        ser.write('1An0\n')
                else:
                        An0=0
                        ser.write('0An0\n')
                print  "An0",An0                
                return
Ejemplo de como manda la raspberry las ordenes a través de interface serie.


El programa funcionando en la rapberry.


Circuito montado y funcionando.

Nos puede surgir algun problema como este:

Traceback (most recent call last):

  File "./raArPy.py", line 5, in <module>
    import serial
ImportError: No module named serial

Significa que no tenemos instalado el modulo serie, se instala con la orden:

sudo apt-get install python-serial

Otro problema que puede surgir es que no tengamos permisos para escribir el los puertos serie, /dev/ttyACMx/dev/ttyUSBx , depende del modelo de arduino que tengamos . Para solucionarlo, debemos dar permisos al usuario que ejecuta el programa con la orden :

adduser usuario dialout

Arreglado estos problemas, ya solo nos queda ejecutar el programa ./raArPy.py .

Archivos del montaje

Un saludo
Juan Galaz

Bibliografía:

http://www.safecreative.org/work/1207302042960-curso-python-para-principiantes
http://docs.python.org/2/contents.html
http://gmendezm.blogspot.com.es/2012/12/tutorial-tkinter-python-gui.html

sábado, 12 de octubre de 2013

Receptor ADS-B con Raspberry - dump1090

Página principal

Receptor ADS-B con Raspberry - dump1090

 Raspberry Pi

xsetaseta@gmail.com

En un artículo anterior había realizado un receptor de ADS-B con linux. Como la raspberry pi es un mini ordenador, con linux de sistema operativo, me he dispuesto a realizar el montaje en la raspberry.
Lo primero es bajar y compilar los programas:

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

Con esto hemos compilado las librerías rtl-sdr necesarias.
Ahora debemos bajar y compilar el programa dump1090.

    git clone https://github.com/antirez/dump1090
    cd dump1090/
    make

Ya tenemos todo listo para que funcione.
Conectamos el receptor de TDT-USB  RTL2832U y ejecutamos la orden:

./dump1090 --interactive --net --metric

Para ver los aviones en un mapa, abrimos la dirección:
http://Dirección_IP_raspberry:8080/



Vista de los aviones en la raspberry.
El renderizado en la raspberry es bastante lenta.



Vista de los aviones desde el PC, es muy rápido la presentación de los aviones.



TDT-USB  RTL2832U utilizado. Debido al consumo del TDT he tenido que utilizar un alimentador de mas amperios para la raspberry.

Saludos.
Juan Galaz


Bibliografía:
http://www.stackspace.info/category/raspberry/#Accessing_Hardware
http://www.satsignal.eu/raspberry-pi/dump1090.html


lunes, 7 de octubre de 2013

Transmisor de FM con el Raspberry Pi

Página principal

Transmisor de FM con el Raspberry Pi

xsetaseta@gmail.com

Buscando en internet algún montaje fácil para hacer en Raspberry Pi,  encontré un transmisor de FM.
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
 Al principio me parecía un poco difícil que pudiera hacer esto por si solo, por lo que me puse a bajar el programa  y ponerlo a funcionar.
Se baja el programa de la misma ṕagina y se compila con la orden:

gcc -lm -std=c99 pifm.c


Ahora tecleamos:

 ./pifm sound.wav 103.0

Donde sound.wav es el archivo de sonido codificado en mono y con un muestreo de 22Khz.
Por defecto la frecuencia de transmisión es de 103.3Mhz, pero si se quiere cambiar la tenemos que especificar al final de la línea.


Debemos colocar un pequeño cable al pin GPIO 4, a modo de antena, para que la señal llegue mas lejos.


El resultado ha sido perfecto, en mi radio la música suena bastante bien, y la señal llega por toda la casa.



Según lo expuesto en el artículo se utiliza un sintetizador PLLD integrado el el própio chip, con un cristal a 500MHZ el cual se puede programar desde 1 Mhz hasta 250Mhz. Esto puede ser muy útil para otros montajes,


Saludos
Juan Galaz

Bibliografía:

http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter