Hace ya un ratote que usé PyGTK para comunicarme con un PIC por medio del puerto serie (ver manejo del puerto serie con Python), y desde aquel entonces me llamó la atención hacer algo parecido pero con el USB.
Pss bien, en ultimas fechas he estado hojeando un leve lo que es Pinguino (http://pinguino.cc/) y éste tiene implementado funciones para la comunicación USB desde el lado del PIC claro, y en la misma documentación de Pinguino se dan ejemplos de cómo realizar la interfaz de comunicación para la PC (con el PIC con Pinguino) por medio de python (usando pyUSB, en Debian y derivados instalar python-usb) (pinguino.cc - Interfacing with Python).
Realicé un pequeño ejemplo para que vean que fácil es hacer la comunicación USB PIC - PC con Pinguino y Python.
Del lado de Pinguino tenemos:
// File: pyGTK_toogle // // February 2012 // aztk <aztecaymaya@gmail.com> // // Recibe información del puerto USB y dependiendo del comando // enviado pone en alto o en bajo alguna salida. char received_char; char i; void setup() { for (i=0 ;i<8 ;i++){ pinMode(i,OUTPUT); digitalWrite(i,LOW); } } void loop() { if (USB.available()) { received_char = USB.read(); if (received_char == 'A') digitalWrite(0,HIGH); if (received_char == 'B') digitalWrite(1,HIGH); if (received_char == 'C') digitalWrite(2,HIGH); if (received_char == 'D') digitalWrite(3,HIGH); if (received_char == 'E') digitalWrite(4,HIGH); if (received_char == 'F') digitalWrite(5,HIGH); if (received_char == 'G') digitalWrite(6,HIGH); if (received_char == 'H') digitalWrite(7,HIGH);
if (received_char == 'a') digitalWrite(0,LOW); if (received_char == 'b') digitalWrite(1,LOW); if (received_char == 'c') digitalWrite(2,LOW); if (received_char == 'd') digitalWrite(3,LOW); if (received_char == 'e') digitalWrite(4,LOW); if (received_char == 'f') digitalWrite(5,LOW); if (received_char == 'g') digitalWrite(6,LOW); if (received_char == 'h') digitalWrite(7,LOW); } }
** Los pines 0 - 7 en Pinguino son los referentes al RB0 - RB7. Para ver disposición de pines de Pinguino revisar documentación.
Del lado de la PC tenemos:
#! /usr/bin/python # -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # File: pingu_usb_toogle.py # # Pone en alto o en bajo bits por medio de instrucciones al puerto USB # Envía los cómandos: # A -> Bit0 ON # B -> Bit1 ON # C -> Bit2 ON # D -> Bit3 ON # E -> Bit4 ON # F -> Bit5 ON # G -> Bit6 ON # H -> Bit7 ON # # a -> Bit0 OFF # b -> Bit1 OFF # c -> Bit2 OFF # d -> Bit3 OFF # e -> Bit4 OFF # f -> Bit5 OFF # g -> Bit6 OFF # h -> Bit7 OFF # # aztk, february 2012 # # aztecaymaya@gmail.com # # References: # http://wiki.pinguino.cc/index.php/Interfacing_with_Python #------------------------------------------------------------------------------- import usb # requires pyusb available at https://sourceforge.net/projects/pyusb/files/ import pygtk pygtk.require('2.0') import gtk #------------------------------------------------------------------------------- # Pinguino Class by Marin Purgar (marin.purgar@gmail.com) #------------------------------------------------------------------------------- class Pinguino(): VENDOR = 0x04D8 PRODUCT = 0xFEAA CONFIGURATION = 3 INTERFACE = 0 ENDPOINT_IN = 0x82 ENDPOINT_OUT = 0x01 device = None handle = None def __init__(self,): for bus in usb.busses(): for dev in bus.devices: if dev.idVendor == self.VENDOR and dev.idProduct == self.PRODUCT: self.device = dev return None def open(self): if not self.device: print "Unable to find device!" return None try: self.handle = self.device.open() self.handle.setConfiguration(self.CONFIGURATION) self.handle.claimInterface(self.INTERFACE) except usb.USBError, err: print >> sys.stderr, err self.handle = None return self.handle def close(self): try: self.handle.releaseInterface() except Exception, err: print >> sys.stderr, err self.handle, self.device = None, None def read(self, length, timeout = 0): return self.handle.bulkRead(self.ENDPOINT_IN, length, timeout) def write(self, buffer, timeout = 0): return self.handle.bulkWrite(self.ENDPOINT_OUT, buffer, timeout) class Ventana: # This callback write a data in USB port def writex(self, widget, data): INTERVAL = 100 # When a button is hold on if (widget.get_active()): print "Bit%s ON" %(data - ord('A')) pinguino.write(chr(data), INTERVAL) # When a button is hold off else: data = data + 32 print "Bit%s OFF" %(data - ord('a')) pinguino.write(chr(data), INTERVAL) # This callback quits the program def delete_event(self, widget, event): INTERVAL = 100 pinguino.write('abcdefgh', INTERVAL) pinguino.close() print "All bits OFF" print "Good Wave!!! :)" gtk.main_quit() def destroy(self, widget): INTERVAL = 100 pinguino.write('abcdefgh', INTERVAL) pinguino.close() print "All bits OFF" print "Good Wave!!! :)" gtk.main_quit() def main(self): gtk.main() return 0 def __init__(self): # Create a new window self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("PinguinoUSBX") self.window.connect("delete_event", self.delete_event) self.window.set_border_width(20) self.window.set_resizable(False) # Create a vertical box vbox = gtk.VBox(True, 2) self.window.add(vbox) for i in range(8): bx = "Bit%d" % i dx = gtk.ToggleButton(bx) dx.connect("toggled", self.writex, ord('A') + i) vbox.pack_start(dx, True, True, 2) # Add a separator for the quitbutton separator = gtk.HSeparator() separator.set_size_request(90, 1) vbox.pack_start(separator, False, True) # Create the "Quit" button buttonq = gtk.Button("Quit") buttonq.connect("clicked", self.destroy) vbox.pack_start(buttonq, True, True, 2) self.window.show_all() print "Hey Hoo, Let's go!" if __name__ == '__main__': pinguino = Pinguino() if pinguino.open() == None: print "Unable to open Pinguino device!" exit(1) ventana = Ventana() ventana.main()
** No se olviden de tener instalado pyUSB y pyGTK
Saludos!!!
Gracias por el eporte, pero necesito ayuda, he buscado en varios sitios pero no encuentro una explicacion.
ResponderEliminarDel lado del pingüino al ponerle compilar, pero me aparece un error:
--- error line 24 too few parameters
esto en la linea---> received_char = USB.read();
lo solucione reeplanzandolo por-->received_char = USB.read(received_char);
Pero al momento de Compilar el lado de la PC:
Primero sale error de indentacion
y al solucionarlo, no puede abrir el pinguino, si lo detecta pero no lo puede abrir, porfavor ayudame como puedo solucionar este inconveniente
Ya encontré una solución!!!
EliminarLo que sucede es que en la versión que estoy utilizando de pingüino IDE, la librería USB no se encuentra "actualizada" o "terminada" es por eso que no funcionaba, así que cambie por la librería BULK para el envío de mensajes por usb .
Gracias VLIMO por compartir la solución!
EliminarSuerte con tu proyecto!