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);
}

results matching ""

    No results matching ""