lunes, 22 de abril de 2013

Comunicación de pinguino con processing

Utilización De La Librería Piguino Processing

Esta es una librería para Processing que permite comunicar la tarjeta Pinguino con Processing en modo Bulk USB.
Esta aplicación fue pensada para que se pueda desarrollar programas desde el computador, en este caso con Processing para poder tener acceso a un dispositivos electrónicos conectados a un microcontrolador como leds, interruptores, potenciómetros, etc.
También trata de poder tener acceso al microcontrolador sin necesidad de programar este directamente.
Para poder utilizar esta librería hay que instalarla en Processing y descargar un programa en el microcontrolador Pinguino.
Disposición para el 18f4550
La imagen muestra como esta configurado para la tarjeta montada con el PIC18F4550, se indica cuales terminales se emplean como entradas y salidas digitales así como entradas análogas.
El terminal 11 puede ser empleado como salida análoga por modulación de ancho de pulso.

Enlaces de interés

Instalación De La Librería En Processing.

Antes de instalar la librería se debe tener lo siguiente:
  1. Descargar en la tarjeta Pinguino el programa de comunicación USB con Processing, puede ser los archivos con extensión hex empleando el PICKIT o compilando el código que esta al final de este documento con Pinguino 9.05 donde dice descarga del programa de comunicación en Pinguino.
  2. En el caso de windows instalar el driver o controlador, el enlace para descargar el controlador esta en los enlaces de interés.
Ya teniendo lo anterior se puede instalar y probar la librería

 Video explicativo de la instalación de la libreria

Resumen Funciones Disponibles En La Librería

Esta tabla es un resumen de las funciones que pueden ser empleadas en Processing y la tarjeta Pinguino.

Ejemplos Básicos 

Una vez instalada la librería en Processing y el driver de Pinguino. Se pueden probar los siguientes programas en Processing para ser probados.

Encendido y Apagado De Un Led

Montaje de prueba básico

Ejemplo 01 Encendido Y Apagado De Un Led

import hypermedia.pinguino.*; 
Pinguino pinguino; 
void setup(){ 
   Pinguino.log( true );
   pinguino = new Pinguino( this );
void draw(){ 
   pinguino.digitalWrite(0,Pinguino.LOW); 
   delay(1000); 
   pinguino.digitalWrite(0,Pinguino.HIGH); 
   delay(1000); 
}

Ejemplos Varios

Montaje multiproposito

Ejemplo 02 Entradas Digitales Empleando Pulsadores

import hypermedia.pinguino.*;
Pinguino pinguino;
int nPulsador1;
nt nPulsador2;
int nPulsador3;
int nPulsador4;
void setup(){
Pinguino.log( true );
   pinguino = new Pinguino( this );
}
void draw(){
   nPulsador1=pinguino.digitalRead(10);
   nPulsador2=pinguino.digitalRead(12);
   nPulsador3=pinguino.digitalRead(21);
   nPulsador3=pinguino.digitalRead(22);
   pinguino.digitalWrite(0,Pinguino.LOW);
   pinguino.digitalWrite(1,Pinguino.LOW);
   pinguino.digitalWrite(2,Pinguino.LOW);
   pinguino.digitalWrite(3,Pinguino.LOW);
   if(nPulsador1==0){
      println("Pulsador izquierdo esta presionado ");
     pinguino.digitalWrite(0,Pinguino.HIGH);
   }
   if(nPulsador2==0){
     println("Pulsador arriba esta presionado ");
    pinguino.digitalWrite(1,Pinguino.HIGH );
   } 
   if(nPulsador3==0){
     println("Pulsador derecho esta presionado ");
     pinguino.digitalWrite(2,Pinguino.HIGH );
   }
   if(nPulsador4==0){
      println("Pulsador abajo esta presionado ");
     pinguino.digitalWrite(3,Pinguino.HIGH );
   } 
}

Ejemplo 03 Entrada Análoga Empleando Un Potenciómetro

import hypermedia.pinguino.*;
Pinguino pinguino;
int nAdc;
void setup(){
   Pinguino.log( true );
   pinguino = new Pinguino( this );
}
void draw(){
   nAdc=pinguino.analogRead(13);
   println("El Valor es: " + nAdc);
}

Descarga Del Programa De Comunicación En Pinguino

Dejo los dos programas tanto para el microcontrolador 18F2550 y 18F4550 empleando pinguino 9.05 si se utiliza PinguinoX2 o PinguinoX3 comentar la instrucción #define pic18f4550.
Los siguientes son los programas que se compilan y se descargan en el microcontrolador

Para el 18F4550 en Pinguino 9.05

// test Pinguino with Processing
// Jean-Pierre MANDON 2009
#define PIC18F4550
int i;
uchar todo,mode,pin,value;
unsigned char buffer[2];
int temp;
int endstring;
void clear();
void setup() {
for( i=0; i<8; i++ ) pinMode( i, OUTPUT );
for( i=25; i<29; i++ ) pinMode( i, OUTPUT );
clear();
}
void loop() {
// select action to perform...
if ( USB.available() ) {
if (USB.read()=='+')
{
todo =USB.read();
if ( todo=='C' ) clear(); // clear all
if ( todo=='W' ) { // switch on/off the specified pin
mode = USB.read();
pin = USB.read();
value  = USB.read();
if ( mode=='D' ) digitalWrite( pin, value );
if ( mode=='A' ) {
temp=value+(USB.read()*256);
analogWrite( pin, temp );
}
}
if ( todo=='R' ) {
mode = USB.read();
pin = USB.read();
if ( mode=='D' ) {
buffer[0] = digitalRead( pin );
USB.send(  buffer, 1 );
}
if ( mode=='A' ) {
temp = analogRead( pin  );
buffer[0]=temp;
buffer[1]=temp/256;
USB.send(  buffer, 2 );
}
}
endstring=USB.read(); // read end string byte ( 0 )
}
}
}
void clear() {
for( i=0; i<8; i++ ) {
digitalWrite( i, LOW );
}
for( i=21; i<29; i++ ) {
digitalWrite( i, LOW );
}
}

Para el 18F2550 en Pinguino 9.05

// test Pinguino with Processing
// Jean-Pierre MANDON 2009
int i;
uchar todo,mode,pin,value;
unsigned char buffer[2];
int temp;
int endstring;
void clear();
void setup() {
for( i=0; i<8; i++ ) pinMode( i, OUTPUT );
clear();
}
void loop() {
// select action to perform...
if ( USB.available() ) {
if (USB.read()=='+')
{
todo =USB.read();
if ( todo=='C' ) clear(); // clear all
if ( todo=='W' ) { // switch on/off the specified pin
mode = USB.read();
pin = USB.read();
value  = USB.read();
if ( mode=='D' ) digitalWrite( pin, value );
if ( mode=='A' ) {
temp=value+(USB.read()*256);
analogWrite( pin, temp );
}
}
if ( todo=='R' ) {
mode = USB.read();
pin = USB.read();
if ( mode=='D' ) {
buffer[0] = digitalRead( pin );
USB.send(  buffer, 1 );
}
if ( mode=='A' ) {
temp = analogRead( pin  );
buffer[0]=temp;
buffer[1]=temp/256;
USB.send(  buffer, 2 );
}
}
endstring=USB.read(); // read end string byte ( 0 )
}
}
}
void clear() {
for( i=0; i<8; i++ ) {
digitalWrite( i, LOW );
}
for( i=21; i<29; i++ ) {
digitalWrite( i, LOW );
}
}

Problemas Comunes

  • En la versión PinguinoX4 da un error al tratar de compilar el programa que se descarga en Pinguino, en la versión PinguinoX3 también da el mismo error compilando el programa en windows más no en Linux. No da problemas empleando Pinguino 9.05 tanto en windows como en Linux. Deje en los enlaces de descarga el archivo ya compilado hex para descargarlo empleando el PICKIT.
  • En algunas ocasiones se rompe la comunicación y aparece un error de comunicación en Processing. Es importante tener un buen cableado en la tarjeta para no generar ruido o interferencias que pueda romper la comunicación con el puerto USB en modo BULK

Preguntas Frecuentes

  • ¿ Por medio de esta librería es la única forma de comunicar Pinguino con Processing ? R/ No hay otras formas como la que puede realizarse con los puertos seriales del computador, ya sea por medio de un adaptador usb serial o configurando la tarjeta Pinguino en modo CDC.
  • ¿ Solo necesito conectar la tarjeta pinguino para realizar la comunicación ? R/ No también es necesario que el microcontrolador Pinguino tenga descargado el programa correspondiente para realizar la comunicación.
  • ¿ Puedo controlar servos con la tarjeta desde Processing ? R/ No el programa que se descarga a Pinguino no tiene soporte para servos, así como la librería. Para manjar servos aconsejo programar directamente la tarjeta Pinguino y comunicarse con Processing por el puerto serie.

10 comentarios:

  1. de cuanto es el potenciometro que se debe utilizar en el montaje??

    ResponderEliminar
    Respuestas
    1. El potenciometro puede ser de 10k. El potenciometro esta como un divisor de tensión variable, el valor del potenciometro determina la corriente que pasa por este circuito divisor, por esto el potenciomentro no pude ser de un valor muy pequeño, ni tampoco muy grande

      Eliminar
  2. Hola Julio muy buen aporte, quisiera saber si has podido establecer correctamente la comunicacion cdc con processing en windows 7, o como podria controlar un servomotor de la forma que presentas aqui muchas gracias.

    ResponderEliminar
  3. Hola julio, estoy trabajdno en crear un firmata para pinguino y pues quisiera saber si esta interesado en participar.

    ResponderEliminar
    Respuestas
    1. Por supuesto que me gustaría trabajar en tu propuesta. Tu me dirás de que manera puedo colaborarte.

      Eliminar
    2. yudyestri@gmail.com, escribeme y emepzamos.

      Eliminar
    3. Hola, una preguntica sobre la libreria hypermedia, mire que tiene dos funciones llamadas read() y write(), quisiera saber si puedes darme un ejemplo sencillo de como tulizarla, es decir tengo entendido que es leer datos de pinguino y asi mismo escribirle datos?, entonces no se como utilizarla, muchas gracias.

      Eliminar
  4. Amigo buenas noches, excelente trabajo que haces, me gustaria saber acerca de un problema que tengo con processing no me reconoce la libraria y siempre me arroja el error en la linea "board = new Pinguino( this ); // connect to Pinguino board"
    "A library relies on native code that's not available.
    Or only works properly when the sketch is run as a 32-bit application."
    Me gustaria que me ayudaras. Muhcas gracias de antemano

    ResponderEliminar
  5. El programa para la placa pinguino me da un mensaje de error en la linea:
    uchar todo,mode,pin,value;

    No logro saber que es uchar

    ResponderEliminar
  6. hola, al realizar la practica de lectura análoga con la pinguino, en processing aparece el siguiente mensaje:

    Pinguino found
    !!! Pinguino error : LibusbJava.usb_bulk_read: libusb0-dll:err [_usb_reap_async] timeout error

    cual podría ser el error si he instalado los drivers.

    ResponderEliminar