Comunicação entre o Arduino e o Processing

Comunicação entre o Arduino e o Processing

Para fazer o Arduino se comunicar com o Processing precisamos pegar a biblioteca que é responsável por criar o caminho de comunicação entre os dois. Para que a biblioteca funcione corretamente é necessário ter rodando no Arduino o firmware Firmata. É possível realizar a comunicação entre os dois fazendo uso da biblioteca Serial do Processing e do Arduino, mas isso da mais trabalho e não me parece elegante.

Faça o download da biblioteca e descompacte-a dentro da pasta libraries que se encontra na pasta Scketchbook do seu Processing. Agora abra a IDE do Arduino e faça o upload do exemplo que se encontra em: LIbrary-Firmata>StandardFirmata para a placa.

No Processing digite o seguinte exemplo para o teste inicial:

import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
int ledPin = 13;
 
void setup()
{
    arduino = new Arduino(this, Arduino.list()[0]):
    arduino.pinMode(ledPin, Arduino.OUTPUT);
}
 
void draw()
{
    arduino.digitalWrite(ledPin, Arduino.HIGH);
    delay(1000);
    arduino.digitalWrite(ledPin, Arduino.LOW);
    delay(1000);
}

Rode este programa e se tudo ocorreu como planejado o led que está conectado no pino 13 do Arduino deve começar a piscar. Maiores detalhes sobre as funções da biblioteca do Processing podem ser encontradas na sua página no Arduino Playground.

Vamos começar a brincadeira!

Vou usar um circuito simples com LDR (Resistor Variável Conforme Incidência De Luz) que é mostrado na página 31 do Arduino Booklet para interagir com os programas escritos no Processing.

000012

Lendo os valores do sensor

import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
int pino_sensor_ldr = 0;
int valor_capturado_ldr = 0;
 
void setup()
{
    println(Arduino.list());
    // cria um novo objeto arduino
    arduino = new Arduino(this, Arduino.list()[0]);
    // seta os pinos do arduino
    arduino.pinMode(pino_sensor_ldr, Arduino.INPUT);
}
 
void draw()
{
    // captura o valor do sensor
    valor_capturado_ldr = arduino.analogRead(pino_sensor_ldr);
    // imprime esse valor no terminal do processing
    println(valor_capturado_ldr);
}

Alterando diâmetro de um circulo

circulo

import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
int pino_sensor_ldr = 0;
int valor_capturado_ldr = 0;
 
void setup()
{
    size(400,400);
    background(255, 204, 0);
    ellipseMode(CENTER);
    println(Arduino.list());
    arduino = new Arduino(this, Arduino.list()[0]);
    arduino.pinMode(pino_sensor_ldr, Arduino.INPUT);
}
 
void draw()
{
   // captura o valor do sensor
    valor_capturado_ldr = arduino.analogRead(pino_sensor_ldr);
    background(255, 204, 0);
    // usa o valor capturado para alterar o diâmetro do círculo
    ellipse(200, 200,  valor_capturado_ldr*2,  valor_capturado_ldr*2);
}

Gerando sons e alterando a forma de onda do sinal

Alterei o exemplo SineWaveSignal do Processing que originalmente muda as formas de onda com base nos valores capturados da posição onde o cursor do mouse se encontra. Agora ele funciona com um LDR :)



import ddf.minim.*;
import ddf.minim.signals.*;
import processing.serial.*;
import cc.arduino.*;
 
Minim minim;
AudioOutput out;
 
// SineWave é uma subclasse de Oscilador, que é uma
//classe abstracta que implementa a interface AudioSignal
SineWave sine;
 
Arduino arduino;
int pino_sensor_ldr = 0;
int valor_capturado_ldr = 0;
 
void setup()
{
    size(512, 200, P2D);
 
    println(Arduino.list());
    arduino = new Arduino(this, Arduino.list()[0]);
    arduino.pinMode(pino_sensor_ldr, Arduino.INPUT);
 
    minim = new Minim(this);
    // cria um line out para o Minin
    out = minim.getLineOut(Minim.STEREO);
    // cria um sinal oscilante de 440Hz e 0.5 de amplitude
    sine = new SineWave(440, 0.5, out.sampleRate());
    // seta a velocidade do portamento para 200millisegundos
    sine.portamento(200);
    // adiciona o sinal ao line out
    out.addSignal(sine);
}
 
void draw()
{
    background(0);
    stroke(255);
 
    valor_capturado_ldr = arduino.analogRead(pino_sensor_ldr);
 
    // muda a frequencia do sinal
    float freq = map(valor_capturado_ldr, 0, height, 1500, 60);
    sine.setFreq(freq);
    float pan = map(valor_capturado_ldr, 0, width, -1, 1);
    sine.setPan(pan);
 
    // desenha a forma de onda
    for(int i = 0; i < out.bufferSize() - 1; i++)
    {
        float x1 = map(i, 0, out.bufferSize(), 0, width);
        float x2 = map(i+1, 0, out.bufferSize(), 0, width);
        line(x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
        line(x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
    }
}
 
void stop()
{
    out.close();
    minim.stop();
    super.stop();
}

Alguém já fez algum projeto usando essa interação entre o Arduino e o Processing?

5 comentários »

  1. [...] Arduino Brasil » Comunicação entre o Arduino e o Processing (tags: http://www.arduino.com.br 2009 mes1 dia8 arduino processing blog_post) [...]

  2. Régis
    6:10
    9 Fevereiro, 2009
  3. Tá demais isso aqui!
    Boa, Alan

  4. 6:30
    17 Fevereiro, 2009
  5. Rodei o blog procurando um e-mail de contato e não achei.
    Me manda uma mensagem, quero te passar uma informação comercial (SPAM nos comentários não vale, né?)

    vlw

  6. Samuel Teodoro Ferreira
    16:28
    18 Maio, 2009
  7. Me ajude pelo amor de Deuss !!!!! rsrsrsr

    Já usou o sensor ping da tatuíno ? Comprei um mas até agora nada de conseguir fazer funcionar.

    Se tiver usado me passa uma dica de como receber informações dele.

    Tá showw aquii !!

  8. Régis
    17:46
    18 Maio, 2009
  9. Olá, Samuel,
    eu nunca usei o Tatuino. Alguém aqui usou? Algum comentário?

RSS de comentários a este artigo.

Deixe um comentário

Assinar (RSS)

Powered by WordPress

Theme by Índice.

Arduino.com.br by +zero and Índice is licensed under a Creative Commons Attribution-Share Alike 2.5 Brazil License.