1. El Octavo Bit
  2. / Arduino
  3. / Proyectos para Arduino
  4. / Arduino y Processing Comunicación básica por puerto serie

Arduino y Processing Comunicación básica por puerto serie

| Actualizado:
Comentarios: 0

Arduino y Processing Comunicación básica por puerto serie
Arduino y Processing Comunicación básica por puerto serie

En este tutorial veremos como comunicar Arduino con processing utilizando dos ejemplos muy sencillos. En el primero de ellos, mandaremos una variable para que processing nos la muestre en la consola. En el segundo, cambiaremos el color de fondo de una ventana al modificar la intensidad de un LED, y apagaremos o encenderemos el LED según presionemos el botón derecho o izquierdo del ratón.

Comunicación de Arduino a processing

Primero escribimos el código para Arduino:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hola!");
  delay(100);
}

Simplemente estamos haciendo que nos escriba «hola» por el monitor serial cada 100 milisegundos, este será el dato que pasemos a processing.

Vamos ahora con processing: lo primero es saber a través de qué puerto se esta comunicando Arduino, podemos saberlo de dos formas. Directamente mediante el menu de Herramientas en Arduino:

Menu de herramientas del IDE de Arduino

O a través de programación con processing. El primer paso es añadir la biblioteca que permite la comunicación. Se puede añadir desde el menu "Sketch/importar biblioteca/Serial":

Importar biblioteca serial en processing

Ya tenemos la librería, comprobamos entonces cuál es nuestro puerto de comunicación añadiendo la función setup() como en el parrafo inferior:

import processing.serial.*; // librería necesaria para la comunicación en serie

void setup(){
  println(Serial.list());  // Mostrar por la consola
}

Si presionamos el botón de ejecutar nos mostrará el puerto en la consola, vereis algo como en la imagen inferior:

Mostrando el puerto en processing

A continuación, mostraremos el dato que le enviamos desde Arduino por la consola de processing. Para ello necesitamos crear dos variables globales, por lo que añadimos dos nuevas líneas debajo de la declaración de importación:

Serial puerto; // creamos un objeto de la clase Serial
String dato;   // Variable para los datos

El siguiente paso sería encontrar el puerto serial al que estamos conectados:

void setup(){
  String nombrePuerto = Serial.list()[0];
  puerto = new Serial(this, nombrePuerto, 9600); // Recordar que en Arduino tenemos Serial.begin(9600)
}

En la siguiente función, draw(), haremos que nos muestre por la consola el dato recogido. Veréis que lo primero es comprobar si tenemos algún puerto disponible

void draw(){
  if(puerto.available() > 0){
    dato = puerto.readStringUntil('\n'); // lee y almacena el valor
  }
  println("Dato recibido: " + dato);
}

El codígo completo sería:

import processing.serial.*;

Serial puerto;
String dato;

void setup(){
  String nombrePuerto = Serial.list()[0];
  puerto = new Serial(this, nombrePuerto, 9600);
}

void draw(){
  if(puerto.available() > 0){
    dato = puerto.readStringUntil('\n');
  }
  println("Dato recibido: " + dato);
}

Comunicación entre Arduino y processing y de processing a Arduino

Falta cómo comunicar processing con Arduino. Para terminar de comprender su funcionamiento cambiaremos el color de una ventana utilizando un potenciómetro desde Arduino y encenderemos o apagaremos un LED según presionemos sobre la ventana del programa con el botón derecho o izquierdo del ratón.

Esquema que montaremos:

Las conexiones del potenciómetro de 10K van al 5V y al GND de Arduino, el pin central al pin A0 de Arduino. El pin positivo del LED lo conectamos al pin 7 de Arduino y el pin negativo al GND a través de una resistencia de 220 ohmios.

Esquema de conexión para Arduino

El código para Arduino

#define PIN_POT A0       // pin de potenciómetro (analógico) 
#define PIN_LED 9        // pin de la LED (analógico)

int valor_POT = 0;       // para guardar el valor del potenciómetro
int brillo = 0;          // brillo de la LED

void setup() {
  pinMode(PIN_POT, INPUT);  // configuro pin del potenciómetro como Entrada
  pinMode(PIN_LED, OUTPUT); // configuro pin de la LED como Salida
  Serial.begin(9600);       // inicializo puerto serie
}

void loop() {
  valor_POT = analogRead(PIN_POT);             // obtengo el valor del potenciómetro (0 a 1023)
  brillo = map(valor_POT, 0, 1023, 0, 255);    // calculo el valor del brillo de la LED
  analogWrite(PIN_LED, brillo);                // cambio el brillo de la LED
  Serial.println(valor_POT);                   // envío el valor por el puerto serie

  if (Serial.available ( ) > 0) {   // Comprobamos si processing envía un valor
    char estado = Serial.read ( );    // leemos el valor y lo guardamos en la variable estado
    if(estado == '1'){             // Si el valor es 1 encendemos el LED
      digitalWrite (PIN_LED, HIGH); 
    }
    if (estado == '0') {     // Si el valor es 0 apagamos el LED
      digitalWrite (PIN_LED, LOW);
    }
  }
  delay(100);  //  pausa para no saturar el puerto
}

Este código es muy parecido al realizado en cambiar la intensidad de un LED con un potenciómetro, al que le hemos añadido una parte nueva de la línea 19 a la 27, tenemos un if que comprueba si recibimos algún dato desde processing, si estamos presionando el botón izquierdo del ratón nos manda 1, encendemos el LED. Si presionamos el botón derecho, nos envía un 0, apagamos el LED.

En la línea 10, estamos enviando el valor de la intensidad al girar el potenciómetro, dato que vamos a utilizar para cambiar el color de la ventana.

Código para processing:

import processing.serial.*;    // Importamos la libreria para comunicarnos con Arduino

Serial mi_puerto;      // Inicializamos la variable mi_puerto
float background_color ;   // Variable para cambiar el color

void setup ( ) {
  size (500,  500);     // Tamaño de la ventana
  String puerto = Serial.list()[0];
  mi_puerto = new Serial(this, puerto, 9600);
  mi_puerto.bufferUntil ( '\n' );   // Reciviendo los datos de Arduino
} 

void serialEvent  (Serial mi_puerto) {
  background_color  =  float (mi_puerto.readStringUntil ( '\n' ) ) ;  // Cambiamos el color segun recibimos los datos
} 

void draw ( ) {
  background ( 150, 50, background_color );   // Color inicial, cambiara segun giremos el potenciometro
  if ( mousePressed  &&  ( mouseButton  ==  LEFT ) ) { // Si presionamos el botón izquierdo del ratón
    mi_puerto.write ( '1' ) ;       // enviamos 1 al Arduino
  }
  if  ( mousePressed  &&  ( mouseButton == RIGHT ) ) {  // Si presionamos el botón derecho del ratón
    mi_puerto.write ( '0' ) ;     // Enviamos 0 al Arduino
  }
}

El código para pocessing: primero, importamos la librería necesaria para comunicación, seguidamente creamos dos variables globales.

En la función setup() creamos la ventana sobre la que presionaremos y cambiaremos el color según giremos el potenciómetro. Buscamos el puerto disponible para la comunicación. Y en la línea 10, recibiremos los datos a través de un evento.

Luego, tenemos la función serialEvent(), encargada de guardar en la variable background_color el cambio de intensidad al girar el potenciómetro.

Por último, en la función draw, cambiamos el color de fondo y comprobamos si presionamos el botón derecho o izquierdo del ratón, si es el izquierdo, mandaremos un 1, y si es el derecho un 0.

Artículos que te pueden interesar

Medir la inclinación con Arduino
Medir la inclinación con Arduino y el sensor SW-520D

Medir la inclinación con Arduino y el sensor SW-520D

| Actualizado:
Comentarios: 0

Realizamos un ejemplo básico, donde se puede apreciar que la lectura hecha por el sensor se recibe en un pin de entrada digital de la placa (hemos usado el nº 7). Material necesario: Arduino Uno o similar. Protoboard. Cables Sensor…

Iluminación de un led según la cantidad de luz
Sistema de regulación de la iluminación de un led a partir de la cantidad de luz

Sistema de regulación de la iluminación de un led a partir de la cantidad de luz

| Actualizado:
Comentarios: 0

El objetivo es encender un LED y variar su intensidad dependiendo de la luz ambiental, para esto vamos a utilizar un sensor de luz LDR. Antes de cambiar la intensidad del LED según la cantidad de luz, haremos que se…

Robot Arduino controlado por un mando a distancia de infrarrojos
Robot Arduino dirigido con un mando infrarrojo

Robot Arduino controlado por un mando a distancia de infrarrojos

| Actualizado:
Comentarios: 0

El objetivo de este proyecto es controlar el movimiento de un robot Arduino con un mando a distancia, a través de una señal de infrarrojo.

Control Remoto en Arduino
Control Remoto en Arduino con la librería IRremote

Control Remoto en Arduino con la librería IRremote

| Actualizado:
Comentarios: 0

¿Qué te parece utilizar un mando para apagar o encender la luz? En este post vamos a utilizar un mando a distancia y un sensor infrarrojo con el que encender o apagar un led. Son elementos que podrás aplicar en…

Comentarios - 0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *