Processing - Primeiros passos para interação com Arduino
Autor: EGDA | Publicado: 2011-03-19T18:03:00-07:00

Olá, gostaria de pedir desculpas pelo tempo sem atualização, estive meio desmotivado para postar aqui, mas em fim, vamos lá.

Tanto o Processing como o Arduino já possuem bibliotecas prontas para uma comunicação eficaz entre eles, e neste post veremos como começar a utilizar tais recursos.

Para começar faça o download da biblioteca Arduino para o processing, já que ela não é nativa do programa.
processing-arduino-0017.zip
Extraia o arquivo zip dentro da pasta "libraries" no Processing, para que você possa utilizá-la.



A seguir, no Arduino, abra o exemplo "Standard Firmata" e faça o upload na sua placa, este exemplo contem o Firmware necessário para interagir diretamente PC-Arduino, este programa é uma ligação entre todos os recursos do arduino e a sua comunicação serial, assim você poderá acessar "diretamente" os valores nas suas entradas digitais e até mesmo escrever valores nas saidas do Arduino interagindo apenas com o seu PC, em outras palavras, você transforma o arduino em um "periférico" do seu pc e pode controlar ele diretamente.

Voltando.

Se você já fez o upload do Firmata para a sua placa, ela não precisa de mais nada para funcionar! Agora vamos a um exemplo básico.

Leitura digital utilizando o Firmata e o Processing

Neste exemplo vamos ver como acessar as portas do Arduino para utilizá-las como saídas para nosso programa Processing. Ligue alguns Leds nos pinos digitais do Arduino, nunca use os pinos 0 e 1 pois eles são ligações diretas com a comunicação serial, que neste caso será obrigatoriamente usada pela placa para conexão com o PC, independente do meio usado (usb, Bluetooth, XBee, rádio, etc). Continuando...

Exemplo de ligações. 
Como já disse, você poderá ligar em qualquer pino exceto os pinos 0 e 1.

A seguir abra o Processing e abra o exemplo arduino_output que acompanha os arquivos da biblioteca, deverá ser como este:



import processing.serial.*; // Biblioteca serial nativa do processing

import cc.arduino.*; // Biblioteca de interação com o arduino

Arduino&nbsp;arduino;&nbsp;// Cria um novo objeto arduino para interação com a placa

color off = color(4, 79, 111); //Declara as cores usadas no exemplo
color on = color(84, 145, 158);

int[] values = { Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,
&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW,&nbsp;Arduino.LOW&nbsp;};
//Cria&nbsp;um&nbsp;array&nbsp;para&nbsp;armazenar&nbsp;os&nbsp;valores&nbsp;a&nbsp;serem&nbsp;passados&nbsp;para&nbsp;a&nbsp;placa
//Arduino.LOW&nbsp;representa&nbsp;os&nbsp;valor&nbsp;LOW&nbsp;na&nbsp;placa&nbsp;arduino&nbsp;sendo&nbsp;acessada&nbsp;pela&nbsp;biblioteca
//Arduino

void setup() {
&nbsp;&nbsp;size(470, 200);//Tamanho da tela
&nbsp;&nbsp;
&nbsp;&nbsp;println(Arduino.list());//Esse é um comando usado apenas para saber
&nbsp;&nbsp;// qual a porta utilizada pela placa.
&nbsp;&nbsp;
&nbsp;&nbsp;arduino&nbsp;=&nbsp;new Arduino(this, Arduino.list()[0], 57600); //Construtor
&nbsp;&nbsp;//do objeto arduino, onde Arduino.list()[0] é a porta usada e 57600 é a Baud
&nbsp;&nbsp;//da porta serial
&nbsp;&nbsp;
&nbsp;&nbsp;//Este For é uma parte do código que devemos prestar atenção
&nbsp;&nbsp;//pois nele estamos utilizando código do arduino.
&nbsp;&nbsp;//tente substituir este bloco por:
&nbsp;&nbsp;/*
&nbsp;&nbsp;arduino.pinMode(2,Arduino.OUTPUT);
&nbsp;&nbsp;arduino.pinMode(3,Arduino.OUTPUT);
&nbsp;&nbsp;arduino.pinMode(4,Arduino.OUTPUT);
&nbsp;&nbsp;etc
&nbsp;&nbsp;*/
&nbsp;&nbsp;for (int i = 0; i &lt;= 13; i++)
&nbsp;&nbsp;&nbsp;&nbsp;arduino.pinMode(i,&nbsp;Arduino.OUTPUT);
}
//Percebeu&nbsp;a&nbsp;semelhança?&nbsp;com&nbsp;o&nbsp;código&nbsp;do&nbsp;arduino?
//Pois&nbsp;é...


//Este&nbsp;bloco&nbsp;desenha&nbsp;a&nbsp;interface,&nbsp;não&nbsp;vem&nbsp;ao&nbsp;caso&nbsp;agora
void draw() {
&nbsp;&nbsp;background(off);
&nbsp;&nbsp;stroke(on);
&nbsp;&nbsp;
&nbsp;&nbsp;for (int i = 0; i &lt;= 13; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;if (values[i] == Arduino.HIGH)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill(on);
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill(off);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;rect(420 - i * 30, 30, 20, 20);
&nbsp;&nbsp;}
}

//Esta&nbsp;função&nbsp;é&nbsp;um&nbsp;presset&nbsp;do&nbsp;Processing,&nbsp;pode&nbsp;ser&nbsp;chamada&nbsp;de&nbsp;Evento
//&nbsp;Ela&nbsp;é&nbsp;chamada&nbsp;SEMPRE&nbsp;que&nbsp;um&nbsp;botão&nbsp;do&nbsp;mouse&nbsp;é&nbsp;pressionado.
void mousePressed()
{
&nbsp;&nbsp;int pin = (450 - mouseX) / 30;//Utiliza a posição X do mouse para
&nbsp;&nbsp;//saber que botão foi clicado
&nbsp;&nbsp;//Perceba que aqui ele não utiliza a posição Y 
&nbsp;&nbsp;//mas vamos deixar assim pra simplificar.
&nbsp;&nbsp;
&nbsp;&nbsp;//Este bloco if simplesmente comuta os valores
&nbsp;&nbsp;if (values[pin] == Arduino.LOW) {
&nbsp;&nbsp;&nbsp;&nbsp;// A parte legal esta aqui!!
&nbsp;&nbsp;&nbsp;&nbsp;// pra quem já conhece o arduino e POO não tem o que explicar
&nbsp;&nbsp;&nbsp;&nbsp;// se não vamos lá:
&nbsp;&nbsp;&nbsp;&nbsp;// aqui você manda a sua placa, representada aqui pelo objeto "arduino"
&nbsp;&nbsp;&nbsp;&nbsp;// e manda ele escrever numa saída digital
&nbsp;&nbsp;&nbsp;&nbsp;// perceba que a variável pin é uma variável do programa, e não da placa
&nbsp;&nbsp;&nbsp;&nbsp;arduino.digitalWrite(pin,&nbsp;Arduino.HIGH);
&nbsp;&nbsp;&nbsp;&nbsp;values[pin]&nbsp;=&nbsp;Arduino.HIGH;
&nbsp;&nbsp;}&nbsp;else {
&nbsp;&nbsp;&nbsp;&nbsp;arduino.digitalWrite(pin,&nbsp;Arduino.LOW);//idem
&nbsp;&nbsp;&nbsp;&nbsp;values[pin]&nbsp;=&nbsp;Arduino.LOW;
&nbsp;&nbsp;}
}&nbsp;
Bem, por enquanto é isso. Dúvidas??