Como una continuación del https://www.forosdeelectronica.com/f26/control-puerto-paralelo-python-gnu-linux-17617/ que realice como una contribución a un programa de munguis, ahora presento el manejo del puerto Serie con Python. Para este además del código de Python vamos a necesitar un hardware, que sera a partir de un microcontrolador, el PIC16F876, los parámetros importantes son que el PORTB será de salida y el cristal a usar será de 4MHz para una comunicación a 9600 Bauds, no se olviden de usar un max232 para la comunicación. El código asm para ensamblar y programar al PIc es el siguiente:
Ahora para el programa en Python, es prácticamente el mismo que utilice con el Control del Puerto Paralelo con Python, a excepción de que no utilizo el modulo parport sino es el PySerial, ventajas de usar este puerto es que para mi se me hace más fácil que el puerto paralelo, se pueden usar todos los pines del micro y definir cuantos serán de entrada y cuantos de salida (aunque en este ejemplo solo hemos definido 8 bits de salida) además de que NO! son necesarios permisos del superUser.
Los requisitos para este programa es que se tengan instalado Python, las librerías del escritorio GTK+, las librerías PyGTK y el modulo Pyserial (pueden buscarlas en Synaptic). Les recuerdo que Python también puede funcionar en 'Ventanas' (Windows) para eso dirijanse a la pagina del proyecto para descargar Python y las librerías, aunque como no lo he probado en dicha plataforma la neta que no sé si funcione correctamente, este programa fue probado en Ubuntu 8.04.
Buena Vibra!
Código:
; readf.asm
;
; CopyLeft 2008 Aztk
;
; This program 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 of the License, or
; (at your option) any later version.
;
; This program 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 this program; if not, write to the Free Software
; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
; -----------------------------------------------------------------------
; Este programa configura al PIC para leer 1 byte enviado del PC a
; una velocidad de 9600 bauds con un cristal de 4MHz.
; El dato se imprimirá en el PORTB.
processor 16f877
; -----------------------------------------------------------------------
; Template source file generated by piklab
#include
; -----------------------------------------------------------------------
; Bits de configuración:
__CONFIG 0x3F71
; -----------------------------------------------------------------------
; inicio
org 0x00 ; Respetamos vector de
goto start ; interrupción
org 0x05
start: bsf STATUS,RP0 ; Bank01
clrf TRISB ; PORTB = 'ssss ssss
movlw .25 ; Fosc = 4MHz
movwf SPBRG ; BaudRate = 9600
bsf TXSTA,BRGH ; High-Speed
bcf TXSTA,SYNC ; Modo asíncrono
bcf STATUS,RP0 ; Bank00
bsf RCSTA,SPEN
bsf RCSTA,CREN ; Habilitar recepción
clrf PORTB ; Limpiar primero el PORTB
readf:
wait: btfss PIR1,RCIF ; ¿Dato recibido?
goto wait ; No, esperar
movf RCREG,W ; Si, cargar dato a W
movwf PORTB ; imprimir dato de W al PORTB
goto readf ; Regresar para esperar
; otro dato
end
Ahora para el programa en Python, es prácticamente el mismo que utilice con el Control del Puerto Paralelo con Python, a excepción de que no utilizo el modulo parport sino es el PySerial, ventajas de usar este puerto es que para mi se me hace más fácil que el puerto paralelo, se pueden usar todos los pines del micro y definir cuantos serán de entrada y cuantos de salida (aunque en este ejemplo solo hemos definido 8 bits de salida) además de que NO! son necesarios permisos del superUser.
Los requisitos para este programa es que se tengan instalado Python, las librerías del escritorio GTK+, las librerías PyGTK y el modulo Pyserial (pueden buscarlas en Synaptic). Les recuerdo que Python también puede funcionar en 'Ventanas' (Windows) para eso dirijanse a la pagina del proyecto para descargar Python y las librerías, aunque como no lo he probado en dicha plataforma la neta que no sé si funcione correctamente, este programa fue probado en Ubuntu 8.04.
Código:
#!/usr/bin/env python
#
# serieAztk.py
#
# CopyLeft 2008 aztk
#
# This program 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 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
# 'pySerial'('serial') is a module that encapsulates the access
# for the serial port, to know how install it visit:
# [url]http://pyserial.wiki.sourceforge.net/pySerial[/url]
import serial
import pygtk
pygtk.require('2.0')
import gtk
s = serial.Serial(0) # Open port '/dev/tty0', BaudRate 9600
pdatax = 0
class SerialX:
# This callback write a data in serial port
def writex(self, widget, data=None):
global pdatax
# When a button is hold on
if (widget.get_active()):
pdatax = pdatax + data
print "data = %s" %(pdatax)
s.write(chr(pdatax))
# When a button is hold off
else:
pdatax = pdatax - data
print "data = %s" %(pdatax)
s.write(chr(pdatax))
# This callback quits the program
def delete_event(self, widget, event, data=None):
s.write('\x00') # Clear the seril port
s.close() # Close the seril port
return gtk.FALSE
def destroy(self, widget, data=None):
s.write('\x00')
s.close()
print "data = 0"
print "Good Wave! :)"
gtk.main_quit()
def __init__(self):
# Create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("SerialX")
self.window.connect("delete_event", self.delete_event)
self.window.set_border_width(20)
self.window.set_resizable(gtk.FALSE)
# Create a vertical box
vbox = gtk.VBox(gtk.TRUE, 2)
self.window.add(vbox)
# Create the data buttons (D0:D7)
# D0
d0 = gtk.ToggleButton("D0")
d0.connect("toggled", self.writex, 0x01)
vbox.pack_start(d0, gtk.TRUE, gtk.TRUE, 2)
# D1
d1 = gtk.ToggleButton("D1")
d1.connect("toggled", self.writex, 0x02)
vbox.pack_start(d1, gtk.TRUE, gtk.TRUE, 2)
# D2
d2 = gtk.ToggleButton("D2")
d2.connect("toggled", self.writex, 0x04)
vbox.pack_start(d2, gtk.TRUE, gtk.TRUE, 2)
# D3
d3 = gtk.ToggleButton("D3")
d3.connect("toggled", self.writex, 0x08)
vbox.pack_start(d3, gtk.TRUE, gtk.TRUE, 2)
# D4
d4 = gtk.ToggleButton("D4")
d4.connect("toggled", self.writex, 0x10)
vbox.pack_start(d4, gtk.TRUE, gtk.TRUE, 2)
# D5
d5 = gtk.ToggleButton("D5")
d5.connect("toggled", self.writex, 0x20)
vbox.pack_start(d5, gtk.TRUE, gtk.TRUE, 2)
# D6
d6 = gtk.ToggleButton("D6")
d6.connect("toggled", self.writex, 0x40)
vbox.pack_start(d6, gtk.TRUE, gtk.TRUE, 2)
# D7
d7 = gtk.ToggleButton("D7")
d7.connect("toggled", self.writex, 0x80)
vbox.pack_start(d7, gtk.TRUE, gtk.TRUE, 2)
# Add a separator for the quitbutton
separator = gtk.HSeparator()
separator.set_size_request(120, 5)
vbox.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
# Create the "Quit" button
buttonq = gtk.Button("Quit")
buttonq.connect("clicked", self.destroy, None)
vbox.pack_start(buttonq, gtk.TRUE, gtk.TRUE, 2)
self.window.show_all()
def main():
gtk.main()
return 0
if __name__ == '__main__':
SerialX()
main()
# This code is inspirated in a munguis' code
# Thanks munguis
# ython/...
# [url]http://www.pygtk.org/pygtk2tutorial-es/[/url]
# A great tuto about pygtk
Buena Vibra!