Hace unos días descubrí, gracias a un amigo, el lenguaje de programación Processing, muy sencillo de utilizar y con el que podemos programar sencillas aplicaciones gráficas. Tiene además una librería para trabajar conjuntamente con Arduino. Como veremos, el estilo de programación de Processing sigue el mismo estilo que el de Arduino.

Para familiarizarme con este lenguaje, he creado una pequeña aplicación que recoge la posición de un joystick de doble eje, y la aplica sobre un punto dibujado en la pantalla. El resultado es similar a una "pizarra de arena" de juguete.

 

El esquema de conexiones es el siguiente:

Joystick - Esquema

 

A continuación muestro el código usado en Arduino:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// pines de conexión del joystick
int ejeX = A0;
int ejeY = A1;
// valores leidos
int valorX = 0;
int valorY = 0;
 
void setup() {
 Serial.begin(9600);
}
 
void loop() {
  // lee el valor de los sensores
  valorX = analogRead(ejeX);    
  valorY = analogRead(ejeY);
  // envía por el puerto serie los valores
  Serial.println(valorX);
  Serial.println(valorY);
 
  delay(50);
}

 

Y el código usado en Processing:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import processing.serial.*;
 
Serial myPort; // puerto serie
int inByte = -1;
// valores leidos
float valueX;
float valueY;
// posición del puntero
int posX, posY;
// posición del puntero actualizada
int posX2, posY2;
 
void setup() {
  // inicializamos la pantalla
  size(800, 600);
  fill(0);
  background(255);
  // incializamos el puerto serie
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
  // inicializamos la posición del puntero;
  posX = width/2;
  posY = height/2;  
}
 
void draw() {
  // si hacemos click, limpia la pantalla
  if(mousePressed) background(255);
  // leemos el valor del joystick en un eje  
  String message = myPort.readStringUntil(13);
  if(message != null) valueX = float(message);
  // leemos el valor del joystick en el otro eje
  message = myPort.readStringUntil(13);
  if(message != null) valueY = float(message);
 
  // transformamos los valores medidos
  float velx = (valueX - 522);
  float vely = (valueY - 515);  
  posX2 = posX + (int)(0.01*vely);
  posY2 = posY + (int)(0.01*velx);
  // si nos vamos a salir de la pantalla, bloqueamos la posición
  if(posX2 < 0) posX2 = 0;   if(posX2 > width) posX2 = width;
  if(posY2 < 0) posY2 = 0;   if(posY2 > height) posY2 = height;
 
  // dibujamos la nueva posición del puntero
  //ellipse(posX2, posY2, 3,3); 
  line(posX, posY, posX2, posY2);
  // actualizamos la nueva posición
  posX = posX2;
  posY = posY2;
}

 

El resultado de este programa se puede ver en el siguiente video: