quinta-feira, 19 de maio de 2016

Linkar o arduino com o processing

Saudações povo amante do meu blog de terras tupiniquins, como vocês estão?

Na aula de hoje, auashuashuasa, vamos aprender como linkar o onitor serial do arduino com o programa baseado em java processing.

Bom antes que me perguntem, pra que linkar o arduino a um programa se ele ja vem com o monitor serial embutido? A resposta é simples: INTERFACE GRÁFICA

grande sacada do processing e que voce pode editar a interface deixando ela a seu gostos e modos, e assim, exibir graficos e estatísticas com base no que os sensores linkados ao arduino andam captando. Bem como também enviar comandos com o simples clique em imagens específicas e o arduino interpretar como ações, que é o caso ao qual irei demonstrar no tutorial de hoje.

Antes de mais nada, o que é processing?Bem processing é este bixao aqui:
Ele é um programa desenvolvido especialmente para ser linkado ao arduino e demais softwares voltados para eletronica e pode ser facilmente baixado de graça nesse link aqui

Escolha a sua versão, se é 32 ou 64 e seu sistema operacional, windows,linux, etc,etc.

E a partir dahe é so fazer o download e a descompactação, ele é programa portátil, logo não precisa instalar.

Como nem tudo é flores você precisara baixar plugins para que ele possa ser linkado ao arduino.
e é esse bixao aqui
Depois de descompactado ira aparecer na sua área de trabalho assim:


clicando na pasta, ira achar o seu executável:



Ao baixar essa pasta zipada(não tenha medo que não é virus)descompacte-a e coloque na pasta libraries do processing, que, automaticamente ao voce clicar em executar o processing pela primeira vez, irá criar uma pasta processing em documentos. veja

Depois so clicar em libraries e cole a pasta arduino lah, pronto. Ele ja esta pronto para se comunicar com o processing.

Feito isso estamos apenas em meio caminho andado, agora falta a outra metade ahuahsuahsua.

Vamos agora se familiarizar com o processing, como verão nas imagens a seguir, ele é bem parecido com o arduino. POssui 2 interfaces de comando, o void setup() e, em vez do arduino que é o void loop(), ele possui o void draw(). Trabalha bastante com eixo de coordenadas x,y. Não possui coordenadas negativas, a origem (0,0) fica no canto superior esquerdo  e vai alternando as coordenadas para baixo e para a direita..
Agora vou colocar o código que voce ira usar tanto na IDE do arduino quanto na IDE do processing.

1° compile esse codigo na ide do arduino

----------------------------
_________________________
char valor;
int ledroxo = 12;
int ledlaranja = 13;
int ledcinza = 7;
int ledVerde = 8;
int ledAmarelo = 9;
int ledVermelho = 10;

void setup() {
  // Definir LEDs como OUTPUTs
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAmarelo, OUTPUT);
  pinMode(ledVermelho, OUTPUT);
  pinMode(ledcinza,OUTPUT);
  pinMode(ledlaranja,OUTPUT);
  pinMode(ledroxo,OUTPUT);
  // Iniciar comunicacao serie
  Serial.begin(9600);
}

void loop() {
  if (Serial.available())
  {
    // Guardar valor lido e recebido do Processing
    valor = Serial.read();
  }

  // Se o valor recebido for igual a 1, acender o LED verde
  if (valor == '1')
  {
    digitalWrite(ledVerde, HIGH);
  }

  // Se o valor recebido for igual a 2, desligar o LED verde
  else if (valor == '2')
  {
    digitalWrite(ledVerde, LOW);
  }

  // Se o valor recebido for igual a 3, acender o LED amarelo
  else if (valor == '3')
  {
    digitalWrite(ledAmarelo, HIGH);
  }

  // Se o valor recebido for igual a 4, desligar o LED amarelo
  else if (valor == '4')
  {
    digitalWrite(ledAmarelo, LOW);
  }

  // Se o valor recebido for igual a 5, ligar o LED vermelho
  else if (valor == '5')
  {
    digitalWrite(ledVermelho, HIGH);
  }

  // Se o valor recebido for igual a 6, desligar o LED vermelho
  else if (valor == '6')
  {
    digitalWrite(ledVermelho, LOW);
  }
  else if(valor=='7')
  {
digitalWrite(ledcinza,HIGH);
  }
  else if (valor== '8')
  {
  digitalWrite(ledcinza,LOW);
  }
  else if (valor == '9')
  {
  digitalWrite(ledlaranja,HIGH);
}
else if (valor =='a')
{
  digitalWrite(ledlaranja,LOW);
}
else if (valor=='b'){
digitalWrite(ledroxo,HIGH);}
else if(valor=='c'){
digitalWrite(ledroxo,LOW);}
}
-----------------------------------------------------
Depois salve esse código no processing:
(salve ele não o compile ainda)
----------------------------------
// Importar biblioteca comunicacao serie
import processing.serial.*;

// Criar objeto do tipo Serial chamado myPort
Serial myPort;

// Definir variaveis que mudam as cores dos botoes
int vermelho = 150;
int verde = 150;
int amarelo1 = 150;
int amarelo2 = 150;
int roxo=150;
int laranja=150;
int cinza=150;
PImage led;
void setup() {
  led = loadImage("led.jpg");
  // Abrir o porto de comunicação
  myPort = new Serial(this,"com7", 9600);

  // Criar uma janela com as dimensões 460x230 e preencher a preto
  size(600, 600);
  background(0);

  // Nome da interface a letras brancas no fundo da janela
  fill(100,90,140);
  rect(70,510,300,30);
  textSize(24);
  textAlign(CENTER);
  fill(255, 255, 255);
  text("Eletronica e utilidades", 230, 530);
}

void draw() {
  image(led,150,340);
  // Criar um retângulo verde com texto a branco
  fill(0, verde, 0);
  rect(20, 20, 140, 140);
  fill(255, 255, 255);
  textSize(24);
  textAlign(CENTER);
  text("led1", 90, 95);

  // Criar um retângulo amarelo com texto a preto
  fill(amarelo1, amarelo2, 0);
  rect(160, 20, 140, 140);
  fill(0);
  text("led2", 230, 95);

  // Criar um retângulo vermelho com texto a branco
  fill(vermelho, 0, 0);
  rect(300, 20, 140, 140);
  fill(255, 255, 255);
  text("led3", 370, 95);
  
  fill(180,roxo,160);
  rect(20,180,140,140);
  fill(255);
  text("led4",90,260);
  
  fill(130,10,laranja);
  rect(160,180,140,140);
  fill(255);
  text("led5",230,260);
  
  fill(cinza,90,30);
  rect(300,180,140,140);
  fill(255);
  text("led6",360,260);

  // Enviar informacao para o Arduino
  // Premir botao verde
  if (mousePressed && mouseX > 20 && mouseX < 180 && mouseY >200 && mouseY < 320)
  {
    // Desligar LED roxo
    if (roxo == 255)
    {
      myPort.write("2");
    }
    // Ligar cinza verde
    else
    {
      myPort.write("1");
    }
  }
  if (mousePressed && mouseX > 170 && mouseX < 290 && mouseY > 190 && mouseY < 310)
  {
    // Desligar LED laranja
    if (laranja == 255)
    {
      myPort.write("4");
    }
    
    else
    {
      myPort.write("3");
    }
  }
  if (mousePressed && mouseX > 300 && mouseX < 440 && mouseY > 180 && mouseY < 320)
  {
    // Desligar LED cinza
    if (cinza == 255)
    {
      myPort.write("6");
    }
    // Ligar cinza verde
    else
    {
      myPort.write("5");
    }
  }
  if (mousePressed && mouseX > 20 && mouseX < 160 && mouseY > 20 && mouseY < 160)
  {
    // Desligar LED verde
    if (verde == 255)
    {
      myPort.write("8");
    }
    // Ligar LED verde
    else
    {
      myPort.write("7");
    }
  }

  // Premir botao amarelo
  else if (mousePressed && mouseX > 160 && mouseX < 300 && mouseY > 20 && mouseY < 160)
  {
    // Desligar LED amarelo
    if (amarelo1 == 255 && amarelo2 == 255)
    {
      myPort.write("a");
    }
    // Ligar LED amarelo
    else
    {
      myPort.write("9");
    }
  }

  // Premir botao vermelho
  else if (mousePressed && mouseX > 300 && mouseX < 440 && mouseY > 20 && mouseY < 160)
  {
    // Desligar LED vermelho
    if (vermelho == 255)
    {
      myPort.write("b");
    }
    // Ligar LED vermelho
    else
    {
      myPort.write("c");
    }
  }
}

void mouseClicked() {
   if (mouseX > 300 && mouseX < 440 && mouseY > 180 && mouseY < 320)
  {
    if (cinza == 150)
    {
      cinza= 255;
    }

    else
    {
      cinza = 150;
    }
  }
  if (mouseX > 170 && mouseX < 290 && mouseY > 180 && mouseY < 320)
  {
    if (laranja == 150)
    {
      laranja= 255;
    }

    else
    {
      laranja = 150;
    }
  }
if (mouseX > 20 && mouseX < 160 && mouseY > 180 && mouseY < 320)
  {
    if (roxo == 150)
    {
      roxo= 255;
    }

    else
    {
      roxo = 150;
    }
  }
  // Botao verde
  if (mouseX > 20 && mouseX < 160 && mouseY > 20 && mouseY < 160)
  {
    if (verde == 150)
    {
      verde = 255;
    }

    else
    {
      verde = 150;
    }
  }

  // Botao amarelo
  if (mouseX > 160 && mouseX < 300 && mouseY > 20 && mouseY < 160)
  {
    if (amarelo1 == 150 && amarelo2 == 150)
    {
      amarelo1 = 255;
      amarelo2 = 255;
    }

    else
    {
      amarelo1 = 150;
      amarelo2 = 150;
    }
  }

  // Botao vermelho
  if (mouseX > 300 && mouseX < 440 && mouseY > 20 && mouseY < 160)
  {
    if (vermelho == 150)
    {
      vermelho = 255;
    }

    else
    {
      vermelho = 150;
    }
  }
}
---------------------------------------
 É nessa hora que o bixo pega, provavelmente se voce fez tudo arrisca o que eu falei até agora seu código não funcionara, ahusahsuahusa. Mas não se preocupe, ele precisa ser *modelado* para funcionar.
Infelizmente esse tutorial ele não é do tipo control+c + control+v, precisa de um pouco de originalidade que vai de  pc para pc. Primeiro voce tem que achar qual porta serial o seu arduino ttá conectado, no meu caso ele ta na com7, mas isso varia de pc para pc. O propio ide do arduino ira falar em qual porta ele tá.

Uma vez ciente disto, voce tera que alterar uma linha no código do processing que eu coloquei: Procure esta linha aqui:
myPort = new Serial(this,"com7", 9600); e altere a "com7" para a porta que voce esta usando,"com1","com2", sei lah
essa linha vai estar um pouco depois do void setup.
Depois voce tera que salvar uma imagem na pasta onde voce salvou o codigo do processing.
Salve essa imagem com o nome de led, led em minusculo, não salve em maiusculo por que senão não ira funcionar. Também não precisa salvar dentro de uma pasta, salve do lado onde esta o arquivo que você salvou aquele código:
Ficando assim oh:

Agora se voce fez tudo certim aparecerá assim na sua tela do processing:
E se voce clicar dentro de cada quadradinho ira mudar de cor bem como ira ativar um pulso no seu arduino, seja para acionar um led ou controlar um rele.
E em breve o video, ate a próxima pessoal.
E como prometido, eis o vídeo

Nenhum comentário: