Manifiesto

Nosotros exploramos... y ustedes nos llaman criminales. Nosotros buscamos ampliar nuestro conocimiento... y ustedes nos llaman criminales. Nosotros existimos sin color de piel, sin nacionalidad, sin prejuicios religiosos... y ustedes nos llaman criminales. Ustedes construyen bombas atómicas, hacen la guerra, asesinan, engañan, y nos mienten y tratan de hacernos creer que es por nuestro bien, ahora nosotros somos los criminales.

Fragmento de "La Conciencia de un Hacker"

25 feb 2012

Comunicación USB Pinguino + PyGTK


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!!!

3 comentarios:

  1. Gracias por el eporte, pero necesito ayuda, he buscado en varios sitios pero no encuentro una explicacion.
    Del 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

    ResponderEliminar
    Respuestas
    1. Ya encontré una solución!!!
      Lo 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 .

      Eliminar
    2. Gracias VLIMO por compartir la solución!

      Suerte con tu proyecto!

      Eliminar

Hey you!
Deja un comentario! va?!