Trabalhei como comunicador visual na comissão de comunicação do programa de aprendizagem cooperativa em células estudantis PACCE na propria UFC. Hoje sou editor de vídeos do Laboratório de Mídias Eletrônicas (LME), também vinculado a UFC.
Tecnologia do Blogger.

Quem sou eu

Quem sou eu

Pesquise por marcações

terça-feira, 11 de junho de 2013

Arduíno + processing: veja o resultado que dá

     Bem dessa vez vamos brincar um pouco com arduíno, e juntamente nessa experiência vamos precisar dos seguintes componentes:

  • Um Arduíno;
  • Uma protoboard;
  • Um resistor (90 ohm);
  • Um led;
  • Um controle remoto de infra-vermelho (IR);
  • Um receptor de IR;
  • Alguns fios.

arduino

controle remoto
sensor IR


protoboard
led



   Com esses componentes precisaremos montar todo o equipamento, para isso segue essa pequena ilustração logo abaixo como dica de montagem. 
esquema de conexão
    Nessa experiência faremos um jogo bem simples, onde você apertará um botão do controle, e na tela mostrará 4 quadrados, e a cada clique um dos quadrados acenderá como um toque de magica, porem quando apertado o mesmo botão novamente outro quadrado poderá acender no lugar do primeiro. Algo relativamente simples, porem foi muito trabalhosa.
        Agora vamos aos códigos tanto do processing quanto do arduíno.



Código do Processing
import cc.arduino.*;

import processing.serial.*;



//#define R1 FF28CF
//#define G2 FF10E7
//#define B3 FF7285
//#define Y4 FF08EF

Serial myPort;
int val;

//variáveis das cores
float r = 0;
float g = 0;
float b = 0;
boolean button = false;
boolean flashred = false;
boolean flashgreen = false;
boolean flashblue = false;
boolean flashyellow = false;
boolean redpress = false;
boolean greenpress = false;
boolean bluepress = false;
boolean yellowpress = false;

//variáveis do sorteio;


int R1 = 54;
int G2 = 50;
int B3 = 57;
int Y4 = 53;

//int R1 = 16724175;
//int G2 = 16718055;
//int B3 = 16743045;
//int Y4 = 16716015;
//int [] cor = { R1, G2, B3, Y4 };


//int [4] cor = { R1, G2, B3, Y4};

//int [] sequencia = new int [100];

//int rodada_atual = 0;

//int passo_atual = 0;

//int perdeu = false;

void setup(){

  size (700, 700);
  frameRate (120);
 //background
   
  //select port
  println(Serial.list());
 
  myPort = new Serial(this, Serial.list()[1], 9600);
  myPort.bufferUntil('\n');
  
  
  }


void draw(){
    
 println(val);
  
 
  //fundo
  background (r, g, b);
  fill(255,150,150);
  rect(0, 0, width/2, height/2);
  fill(150,255,150);
  rect(width/2, 0, width/2, height/2);
  fill(150,150,255);
  rect(0, height/2, width/2, height/2);
  fill(255,255,150);
  rect(width/2, height/2, width/2, height/2);
     
     
     //recebe os valores da serial e armazena na variável. Se ficar posicionado nessa parte do código, as cores apenas piscam.
   //if( myPort.available() > 0) {
  //val = myPort.read();
  //}
   //Compara o valor das variáveis

  if ( val == R1 ){
  flashred = true;
  redpress = true;
  }
  
  else if ( val == G2 ){
  flashgreen = true;
  greenpress = true;
  }
  
  else if ( val == B3 ){
  flashblue = true;
  bluepress = true;
  }
  
  else if ( val == Y4 ){
  flashyellow = true;
  yellowpress = true;
  }

  //muda a cor dos quadrados
if (flashgreen) {
    fill(0,255,0);
  rect(width/2, 0, width/2, height/2);
 
  flashgreen = false;
      }

else if (flashred) {
   fill(255,0,0);
  rect(0, 0, width/2, height/2);
   
  flashred = false;
   }

else if (flashblue) {
   fill(0,0,255);
  rect(0, height/2, width/2, height/2);
 
  flashblue = false;
     
}

else if (flashyellow) {
  
  fill(255,255,0);
  rect(width/2, height/2, width/2, height/2);
  
  flashyellow = false;
 }
}

void serialEvent (Serial myPort){
  
  //recebe os valores e armazena na variável. Se ficar nessa parte do código, pode ocorrer da cor só mudar quando um botão for pressionado, como também pode piscar uma cor e outra ficar fixa.
  
 if( myPort.available() > 0) {
  val = myPort.read();
  }
  
} 

Alguns detalhes do código do processing:

  1. Linha 61. Ele começa a ler a porta serial do arduíno. Resumindo, ele se prepara para receber os dados que o arduíno vai mandar para ele;
  2. Linha 93. Começa a fazer comparativos, para iniciar a piscar ou não se apertar o botão;
  3. Linha 114. Muda a cor dos quadrados;
  4. Linha 145. Recebendo os valores e armazenando para deixar aceso o quadrado ou não do joguinho.



Código do Arduíno


int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    irrecv.resume(); // Receive the next value
  }
}



Detalhes do código arduíno


  1.  Linha 5. Recebe os dados do botão apertado de decodifica para computar os valores referente ao botão do controle; 
  2.  Linha 12. Inicia o recebimento de dados do receptor IR;
  3.  Linha 17. Decodifica para decimal o código hexadecimal formado;
  4.  Linha 18. Deixa pronto para receber os próximos valores.


Uma breve conclusão do que esta acontecendo: 


    O processing ficou responsável por rodar o jogo em si, desde de criar os quadrado e acendê-los, agora o arduíno fica responsável por decodificar os códigos e mandar para o processing decodificado. 


 Um pequeno vídeo demonstração:



author
Sou - Samuel Lincoln -
Sou um aluno do Curso de Sistemas e Mídias Digitais da Universidade Federal do Ceará (UFC). Já estudei Matemática (bacharelado) e Matemática industrial, na mesma universidade. Trabalho como editor de vídeos do Laboratório de Mídias Eletrônicas, vinculada a Universidade Virtual (vinculada a UFC).