- Semana 8
Semana 8
Ejemplos de código
Para comunicarnos entre diferentes software en el computador, podemos usar la comunicación Serial. Veamos por ejemplo como Arduino y Processing tienen acceso al puerto Serial, pueden enviar y recibir mensajes, y por ende podemos aprovechar aplicaciones que facilitan la creación de contenido digital en combinación con los componentes físicos que usamos en Arduino.
Escribir al puerto Serial con Arduino y leer esta señal en Processing
En processing vamos a File -> Examples -> Libraries -> Serial -> SimpleRead
/**
* Simple Read
*/
// Importamos la librería de comunicación serial
import processing.serial.*;
// Creamos una clase que nos da acceso a la funciones de la libreria
Serial myPort;
// Una variable donde guardamos el valor que entra por el puerto serial.
int val;
void setup() {
size(200, 200);
// Para configurar el puerto, podemos imprimir los puertos en la consola
printArray(Serial.list());
// En mi computador, el puerto donde está conectado el Arduino es el segundo.
// Entonces le digo que el puerto es el segundo en la lista de puertos
// La lista comienza en 0, asi que el segundo es 1, el tercero 2, etc...
String portName = Serial.list()[1];
// La librería serial me deja abrir el puerto de la siguiente manera
// para que processing pueda recibir la información
myPort = new Serial(this, portName, 9600);
}
void draw() {
// Si el puerto está disponible...
if ( myPort.available() > 0) {
// guardamos el valor que está entrando en la variable que definimos al principio.
val = myPort.read();
}
// Pintar el fondo blanco.
background(255);
// Aquí definimos la lógica de lo que sucede con los datos que llegan.
// Si el valor es 0, pintar el cuadro de negro.
if (val == 0) {
fill(0);
} else {
// De lo contrario, lo pintamos de gris claro.
fill(204);
}
// Finalmente, pintamos el cuadro con los parámetros que definimos anteriormente.
rect(50, 50, 100, 100);
}
En el Arduino, podemos conectar un switch de la siguiente manera:
En el Arduino IDE usamos el siguiente codigo para escribir al puerto serial un valor dependiendo de si el switch esta prendido o apagado:
// El switch esta conectado al pin 4
int switchPin = 4;
void setup() {
// Vamos a escribir al puerto serial por el baudrate 9600
Serial.begin(9600);
// Definimos que el pin debe actuar como entrada.
pinMode(switchPin, INPUT);
}
void loop() {
// Si esta presionado, le mandamos a processing el valor 1
if (digitalRead(switchPin) == HIGH) {
Serial.write(1);
} else {
// De lo contrario, le mandamos a Processing el valor 0
Serial.write(0);
}
// Esperamos 100 milisegundos antes de reiniciar el proceso.
// Recuerden que estos delays al final son importantes
// para obtener lecturas limpias de nuestros sensores.
delay(100);
}
Potenciómetro color modular
Código Arduino
int pinPot = A0;
void setup() {
Serial.begin(9600);
pinMode(pinPot, INPUT);
hacerContacto();
}
void loop() {
if (Serial.available() > 0) {
int valPot = analogRead(pinPot);
int gris = map(valPot, 0, 1023, 0, 255);
Serial.write(gris);
}
}
void hacerContacto() {
while (Serial.available() <= 0) {
Serial.write('A');
delay(300);
}
}
Código Processing
import processing.serial.*;
Serial myPort;
int val = 0;
boolean primerContacto = false;
void setup() {
size(200, 200);
printArray(Serial.list());
String portName = Serial.list()[1];
myPort = new Serial(this, portName, 9600);
}
void draw() {
background(val);
}
void serialEvent(Serial myPort) {
int mensajeDeArduino = myPort.read();
if (primerContacto == false) {
println("¿Aló?");
if (mensajeDeArduino == 'A') {
myPort.clear();
primerContacto = true;
myPort.write('A');
println(".....::::: Contacto exitoso :::::.....");
}
} else {
val = mensajeDeArduino;
myPort.write('A');
}
}
Ejercicio
Usando 3 sensores, enviar 3 señales desde Arduino a Processing para definir el color RGB del rectangulo.
Ejemplo con 3 potenciómetros
Código Arduino
int pin1 = A0;
int pin2 = A1;
int pin3 = A2;
void setup() {
Serial.begin(9600);
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
pinMode(pin3, INPUT);
hacerContacto();
}
void loop() {
if (Serial.available() > 0) {
int val1 = analogRead(pin1);
delay(10);
int val2 = analogRead(pin2);
delay(10);
int val3 = analogRead(pin3);
int r = map(val1, 0, 1023, 0, 255);
int g = map(val2, 0, 1023, 0, 255);
int b = map(val3, 0, 1023, 0, 255);
Serial.write(r);
Serial.write(g);
Serial.write(b);
}
}
void hacerContacto() {
while (Serial.available() <= 0) {
Serial.write('A');
delay(300);
}
}
Código Processing
import processing.serial.*;
Serial puerto;
int[] colores = new int[3];
int contador = 0;
int r, g, b;
boolean primerContacto = false;
void setup() {
size(200, 200);
printArray(Serial.list());
String nombrePuerto = Serial.list()[1];
puerto = new Serial(this, nombrePuerto, 9600);
}
void draw() {
background(r, g, b);
}
void serialEvent(Serial puerto) {
int mensajeDeArduino = puerto.read();
if (primerContacto == false) {
println("¿Aló?");
if (mensajeDeArduino == 'A') {
puerto.clear();
primerContacto = true;
puerto.write('A');
println(".....::::: Contacto exitoso :::::.....");
}
} else {
colores[contador] = mensajeDeArduino;
contador++;
if (contador > 2) {
r = colores[0];
g = colores[1];
b = colores[2];
puerto.write('A');
contador = 0;
}
}
}
Usando libreria VSync
La libreria VSync facilita la comunicación entre Processing y Arduino. http://erniejunior.github.io/VSync/
La libreria tiene que estar instalada tanto en Processing como en Arduino IDE.
Ejemplo LED controlado desde Processing con VSync
Código Arduino
#include <VSync.h>
ValueReceiver<1> receiver;
int x;
int pinLed = 10;
void setup() {
Serial.begin(19200);
pinMode(pinLed, OUTPUT);
receiver.observe(x);
}
void loop() {
receiver.sync();
analogWrite(pinLed, x);
}
Código Processing
import vsync.*;
import processing.serial.*;
ValueSender sender;
Serial puerto;
public int x;
void setup() {
size(800, 800);
printArray(Serial.list());
String nombrePuerto = Serial.list()[1];
puerto = new Serial(this, nombrePuerto, 19200);
sender = new ValueSender(this, puerto);
sender.observe("x");
}
void draw() {
x = (int)map(mouseX, 0, width, 0, 255);
}