Buscar en este blog

viernes, 14 de enero de 2011

Onda cuadrada mediante puerto serie y Pyserial

La comunicación mediante el protocolo RS232, usualmente por el puerto serie, entre una PC y otro dispositivo, se realiza enviando (o recibiendo) un bit tras otro por los pines TX (transmisión) y RX (recepción) de dicho puerto.

A su vez, el puerto posee otros bits de control por los cuales no se envían ni reciben datos, sino que son utilizados para indicarle al dispositivo externo cuando está disponible la PC para recibir datos y demás.

Estos bits de control se pueden utilizar para generar por ejemplo una señal de onda cuadrada como en este post.

Para controlar el puerto utilizo las librerias PySerial escritas en el lenguje Python y como línea de control tomo el pin 7 RTS (Request To Send) del puerto serie.

Hardware

El circuito utilizado es el siguiente:

Circuito utilizado - Creado con gschem
Contrario a lo que sucede con los pines de transmisión RX y TX, la señal en el pin RTS del puerto serie es de unos 12V para un 1 lógico y de -12V para un 0 lógico. El transistor PNP se encarga de convertirla a niveles de 9V (1 lógico) y 0V (0 lógico) respectivamente a la salida Vout.

Notar que por como es la conexión del LED, este endencerá con un 0 lógico y estará apagado con un 1 lógico.

Si en lugar de utilizar una bateria de 9V, se utiliza una fuente de 5V, se pueden obtener a la salida niveles de voltaje TTL que son los que manejan la mayoría de los circuitos integrados.

Software

El programa de control está escrito en Python y hace uso de las librerías "PySerial" para controlar el puerto serie y de "Time" que permite generar delays para dejar pasar el tiempo.

Previo a esto deben instalar Python y Pyserial. En Ubuntu lo pueden hacer en una consola mediante:

$ sudo aptitude install python2.5 python-serial

Luego de tener Python y PySerial instalados, deben crear un archivo de texto con el siguiente código:

import serial   # importo modulo pyserial
from time import *  # importo modulo time

puerto_serie = '/dev/ttyS0' # direccion del puerto serie
# creo conexion a 2400 baudios con una espera maxima de 5 segundos
s = serial.Serial(puerto_serie, baudrate = 2400, timeout=5)

while True:
    s.setRTS(0) # pongo RTS=0 logico
    print 'Salida = 0 (0V), LED encendido...'
    sleep(1.5)  # espero (sin ocupar el puerto)

    s.setRTS(1) # pongo RTS=1 logico
    print 'Salida = 1 (Vcc), LED apagado...'
    sleep(1.5)  # espero


Guardan este archivo con el nombre "onda_serie.py" y para ejecutarlo abren una consola en la carpeta donde tengan guardado el archivo y ejecutan:

$ python onda_serie.py

Vsita de la salida en el analizador lógico TFLA (usando sleep(1))

Cambiando el valor de sleep(x segundos) pueden variar la frecuencia de la señal. A su vez, usando valores distintos entre sí para estos tiempos de sleep, se puede generar una señal con cíclo de trabajo variable donde el tiempo en que la onda está arriba (9V) es distinto al tiempo en que está abajo (0V).

Fuentes

No hay comentarios:

Publicar un comentario