Go Down

Topic: Poner caracter en el puerto USB (Read 2339 times) previous topic - next topic

impedancias

Hola a tod@s. Soy nuevo en el foro y encuentro muy interesantes los temas que aquí se tratan.

Quiero comentaros que estoy desarrollando un proyecto personal y me he quedado parado porque necesito conseguir que cuando se pulse una letra del teclado de mi pc, dicho caracter aparezca en el puerto USB para que el Duemilanove pueda leerlo.

El mayor problema es que el sistema operativo del pc es Windows XP (y no puedo cambiarlo  ;)). ¿Tenéis alguna idea de cómo podría conseguirlo? Supongo que tendría que programar algo en C, que es lo que más conozco, pero no tengo mucha idea de trabajo con puertos en Windows.

Saludos

juliandasilva

Hola, cuando tenés una placa Arduino correctamente instalada y conectada a un puerto USB, ésta es vista por la PC (en XP también es así) como un puerto serie. Dicho puerto es virtual, y se monta sobre el USB físico utilizando CDC (dispostivio USB que emula puerto serie), de modo que para cualquier programa que hagas para Windows, tu Arduino puede ser visto como un puerto serie.
La primera forma sencilla de enviar algo a dicho puerto es con el propio terminal de tu Arduino IDE. Si luego necesitas programar una aplicación, puedes hacerla en cualquier lenguaje que abra un puerto serie (C/C++, Python, etc.).

Saludos,
Julián
http://robotgroup.com.ar

kokuma

Lo más sencillo (creo) es que te hagas un programita en processing (processing.org) que es un entorno de desarrollo muy similar al de arduino, pero basado en java en vez de en c. Con processing es trivial escribir en el puerto serie. En este momento no tengo acceso a un entorno, pero más o menos.

Para capturar las pulsaciones usa el evento keyPressed (http://www.processing.org/reference/keyPressed_.html)

Para escribir en el puert serie usa Serail.write (http://processing.org/reference/libraries/serial/Serial_write_.html)

Básicamente, con eso te valdría y no te deberían salir más de 20 ó 30 líneas de código. Si te lías, escribe al foro y te echo una mano.

impedancias

Gracias kokuma, me pondré a ello en cuanto me sea posible.
Saludos.

impedancias

[size=12]Hola a todos,

ya he podido dedicarme a este proyecto y he conseguido un código, pero no me funciona.

En principio listo todos mis puertos disponibles y veo que solo tengo el COM 3:[/size]





[size=12]Al comentar la línea que me genera la lista y descomentar las líneas que me escriben en el puerto según la tecla pulsada, antes de pulsar ninguna tecla, me aparece este error:[/size]



[size=12]Seguro que es un error muy simple, pero conozco muy poco de Java.

¿Sabéis qué está ocurriendo?

Gracias y saludos.[/size]

kokuma

Tienes que dejar sin comentar la línea myPort = new Serial... Si la comentas (como en el segundo pantallazo) no estás definiendo la variable myPort y por eso te da error más adelante.

impedancias

Sí, perdonad.

El caso es que he descomentado esa línea, le he dado a Run y !me sigue dando el mismo error!.

¿Qué puede estar pasando?

kokuma

Hmm... es raro. Yo uso el siguiente código. Ojo, que lo que hago es escribir 8 bytes de golpe. Como he hecho limpia, si lo intentas ejecutar te dirá que no encuentra ni r, ni g, ni b.

Code: [Select]
import processing.serial.*;

byte[] bValues = new byte[8];
Serial sPort;

void setup(){

 String portName = Serial.list()[1];
 sPort = new Serial(this, portName, 57600);  

}


void draw() {
 bValues[0] = 127;
 bValues[1] = l;
 bValues[2] = (byte)((r & 0x3E0) >> 5);
 bValues[3] = (byte)((r & 0x1F));  
 bValues[4] = (byte)((g & 0x3E0) >> 5);
 bValues[5] = (byte)((g & 0x1F));    
 bValues[6] = (byte)((b & 0x3E0) >> 5);
 bValues[7] = (byte)((b & 0x1F));  
 sPort.write(bValues);  
}



impedancias

Hola kokuma. Feliz año, por cierto.

Yo he encontrado algo de tiempo para seguir con este proyecto y he querido hacer una prueba. He declarado un byte en setup() y lo he inicializado en draw(). El caso es que al correr el código que te copio debajo me da el error:"Cannot find anything named "bValue"".

Mi única conclusión es que draw() no está viendo lo que se declara en setup(), lo que me parece muy extraño.

¿Alguna idea?

Code: [Select]

/**
* CharUSB.
*
* Detecta un caracter pulsado,
* verifica si se trata de una 'a','A','z' o 'Z'
* y en ese caso lo escribe en el puerto USB conectado a la placa del Arduino
*/

import processing.serial.*;

void setup()
{
byte bValue;
Serial sPort;             // The serial port

//println(Serial.list());  // List all the available serial ports:

String portName = Serial.list()[1];
sPort = new Serial(this, portName, 9600);
}

void draw()
{
 bValue = 90;
 sPort.write(bValue);
 
 if(keyPressed)
 {
   if(key == 'a' || key == 'A' || key == 'z' || key == 'Z')
   {
     switch(key)
     {
      case 'a':    sPort.write('a');     break;  
      case 'A':    sPort.write('A');     break;
      case 'z':    sPort.write('z');     break;                                    
      case 'Z':    sPort.write('Z');     break;                        
     }
   }
 }
}

impedancias

Hola kokuma. Feliz año, por cierto.

Yo he encontrado algo de tiempo para seguir con este proyecto y he querido hacer una prueba. He declarado un byte en setup() y lo he inicializado en draw(). El caso es que al correr el código que te copio debajo me da el error:"Cannot find anything named "bValue"".

Mi única conclusión es que draw() no está viendo lo que se declara en setup(), lo que me parece muy extraño.

¿Alguna idea?

Code: [Select]

/**
* CharUSB.
*
* Detecta un caracter pulsado,
* verifica si se trata de una 'a','A','z' o 'Z'
* y en ese caso lo escribe en el puerto USB conectado a la placa del Arduino
*/

import processing.serial.*;

void setup()
{
byte bValue;
Serial sPort;             // The serial port

//println(Serial.list());  // List all the available serial ports:

String portName = Serial.list()[1];
sPort = new Serial(this, portName, 9600);
}

void draw()
{
 bValue = 90;
 sPort.write(bValue);
 
 if(keyPressed)
 {
   if(key == 'a' || key == 'A' || key == 'z' || key == 'Z')
   {
     switch(key)
     {
      case 'a':    sPort.write('a');     break;  
      case 'A':    sPort.write('A');     break;
      case 'z':    sPort.write('z');     break;                                    
      case 'Z':    sPort.write('Z');     break;                        
     }
   }
 }
}

Javier

Es curioso, es la segunda vez que sale este error en el foro en menos de 24 horas.

El error es debido a que estas intentando acceder a una variable fuera de su ambito.

impedancias

Ok, Javier, tiene sentido en base al error y en base a que se supone que está basado en Java, según tengo entendido.

¿Quieres decir que no puedo acceder directamente a una variable por su nombre fuera del ámbito local donde ha sido definida?.

Pero tras leer el manual, yo pensaba que en Processing setup() servía para declarar variables y draw() para realizar instrucciones sobre dichas variables. Y supuse que Processing ya se encargaba de solucionar esas cosas.

Entonces, ¿para qué sirve setup() realmente?

Estoy hecho un lío  :o  :D

kokuma

Saca  byte bValue; y Serial sPort;  fuera de setup() , ponlo debajo del import. Con eso consigues que bValue y sPort sean accesibles en todo el código. Si las declaras dentro del setup (lo que estás haciendo ahora), esas variables sólo estarán accesibles dentro de setup y te saldrá ese mensaje de error.

Una vez que has declarado esas dos variables, las tienes que inicializar y para eso va estupendo el setup() Todo lo que pongas en el setup() se ejecuta una única vez, cuando arranca el programa.

impedancias

Ok. Se ve que todo ha venido porque inconscientemente tiendo a utilizar el mínimo número posible de variables globales.

Ya funciona perfectamente.

Muchas gracias a todos. ;)

pcer


Hola,

Aunque parece que ya has encontrado una solucion te comento otra posibilidad. Yo tenia el mismo problema y al final, aunque yo soy mas de C, opte por Perl. Las razones son varias:

- Facilidad. A parte de la facilidad global del lenguaje en si, cosas como escribir/leer de puertos serie son triviales.
- El proyecto funcionara en cualquier maquina que tenga perl instalado (muchas). O instalarlo es trivial.
- Perl tiene cantidad de facilidades para acceso web, graficos, etc. Con lo cual conectar tu proyecto con otros procesos del PC es trivial.

Por ejemplo en mi caso lo use para controlar una camara web movil (cuyo motor controlaba arduino) a traves de internet. Con un servidor Apache corriendo en el PC, los CGIs en Perl hablaban directamente con el arduino.

Saludos,

Go Up