controlador digital - Arduino e processing

Com base no que foi estudado em sala de aula na disciplina de instalações multimídia nos foi solicitado a criação de uma interface de controle e supervisão que pudesse se relacionar com o ambiente de uma possível instalação.

Esse tipo de tecnologia é bastante vista em instalações visuais por exemplo, onde controladores são usados para mostrar imagens, videos e gerar resultados diferentes.

Exemplo:
Temporary-Babel2D de André Sier
Hyperborea de André Sier
NON HUMAN DEVICE #01 de Miguel Neto, Rodrigo Carvalho
Retrovision de Nuno Lemos

Vídeo instalação interativa - Arduino

As vezes são usados controladores fisicos, mas sistemas de controle virtuais também podem ser usados pensando nesse contexto.


Para realizar a tarefa foi proposto o uso do Arduino com o Processing que um programa de programação visual e para isso era obrigatório o uso dos seguintes dispositivos:
 1. Leds (simulando o acionamento das luzes de ambiente/palco);
2. Buzzers (Simulando controle de som);
3. LDRs (Reportando os índices de luminescência do ambiente);
4. ServoMotor (Para o controle de mecanismos de ajuste/abertura ou posicionamento de câmeras e iluminação);

No caso do meu sistema considerei que o servomotor poderia ser usado para um sistema de  abertura cortinas por exemplo.

o esquema visual das conexões foi o seguinte:
Abaixo encontra-se o código usado no Processing

import processing.serial.*;
Serial port;




//anexar imagens: botoes, background e display
PImage bt1;
PImage bt2;
PImage bt3;
PImage bt4;
PImage bt5;
PImage bg;
PImage display;

void setup() {
  size(600, 400);
     // definição do tamanho da tela
  port = new Serial(this, "COM8", 9600);
     // precisa verificar em qual porta o arduino está conectar

/*imagens iniciais são chamadas no setup pois são estaticas e não precisam ficar sendo redesenhadas sempre*/

// essa função lê o local das imagens, no caso estavam na mesma pasta do projeto.   bt1= loadImage("bt1.png");
  bt2= loadImage("bt2.png");
  bt3= loadImage("bt3.png");
  bt4= loadImage("bt4.png");
  bt5= loadImage("bt5.png");
  bg= loadImage("bg.png");
  display= loadImage("display.png");

// as imagens são posicionadas nos respectivos locais   image(bg, 0, 0);
  image(bt2, 43, 43);// ligar o sistema
  image(bt1, 43+150, 150+93); // bt 1
  image(bt1, 43+250, 150+93); // bt2
  image(bt1, 43+450, 150+93); // bt3
  image(bt1, 43+350, 43+200);// bt4
  image(display, 150, 50);

// textos de apoio para entendimento da função de cada botão   text("ON/OFF", 50, 120);
  text("LUZ", 210, 330);
  text("SOM", 310, 330);
  text("CORTINA I", 395, 330);
  text("CORTINA II", 495, 330);
}

void draw() {

 /* a condição verifica se a interface está ligada, se sim escreve o valor do sinal enviado pelo sensor */
  if(sistema==true){
    if (port.available()>0) {
      fundoverde(300, 85);
      text("Luz no palco: "+port.readStringUntil('\n'), 300, 100);
    }
  }

}

/* para mostrar os botões mudando de cor criei funções para chamar as imagens desejadas e que pudessem ter sua posição fixada de forma fácil, o motivo disso é que as imagens possuem pouco mais de 65x65px, mas as áreas de contato são apenas de 50x50px, assim essas funções já calculam a diferença para que a imagem do botão e da área de contato designada sejam compatíveis*/

void criabt1(int x, int y) {
  image(bt1, 43+x, 43+y);
}
void criabt4(int x, int y) {
  image(bt4, 43+x, 43+y);
}
void criabt2(int x, int y) {
  image(bt2, 43+x, 43+y);
}
void criabt3(int x, int y) {
  image(bt3, 43+x, 43+y);
}
void criabt5(int x, int y) {
  image(bt5, 43+x, 43+y);
}

//booleanos para a verificação de sistemas e o botão foi ativado ou desativado boolean btliga=false;
boolean sistema= false;
boolean btservo=false;
boolean btmelodia = false;
boolean btluz=false;


void mousePressed() {
  println(" ");
  println("Coordenada x: " + mouseX + " e y: " + mouseY);


  //botão de liga e desliga
  if (mouseX > 50 && mouseX < 50+50
    && mouseY > 50 && mouseY < 50+50) {
    // if (botao1()) {
    if (btliga==false) {
      println("Ligou a maquina");
      criabt4(0, 0);
      btliga=true;
      sistema=true;
      println("true");
    } else if (btliga==true) {

      println("desligar");
      criabt2(0, 0);
      btliga=false;
      println("false");
      sistema=false;
    }
  }


  if (sistema==true) {
    text("SISTEMA LIGADO", 180, 100);


    /*esses textos servem apenas para o momento em que o sistema é inciado e não é atualizado*/
    text("LUZ:DESATIVADO", 180, 120);
    text("SOM: DESATIVADO", 180, 140);
    text("CORTINA: FECHADA", 180, 160);

      controlLuz();
      controlSom();
      servomotor();
  }

// quando o sistema é desligado as imagens voltam a ser as originais
  if (sistema==false) {
    image(bt2, 43, 43);// ligar o sistema

    image(bt1, 43+150, 150+93); // bt 1
    image(bt1, 43+250, 150+93); // bt2
    image(bt1, 43+450, 150+93); // bt4
    image(bt1, 43+350, 43+200);// bt5
    image(display, 150, 50);
  }
}

void controlLuz() {
  //controla LUZ
  if (mouseX > 150+50 && mouseX < 250
    && mouseY > 50+200 && mouseY < 300) {

    if (btluz==false) {
      port.write(1);
      println("Luz: ativado");
      criabt4(150, 200);
      btluz=true;
      println(true);
      fundoverde(180, 100);
      text("LUZ:ATIVADO", 180, 120);
    } else if (btluz==true) {
      port.write(2);
      btluz=false;
      println("false");
      criabt1(150, 200);
      fundoverde(180, 100);
      text("LUZ:DESATIVADO", 180, 120);
    }
  }
}



void controlSom() {
  // controla som
  if (mouseX > 50+250 && mouseX < 300+50
    && mouseY > 50+200 && mouseY < 300) {

    if (btmelodia==false) {
      port.write(5);
      println("ativa som");
      criabt4(250, 200);
      btmelodia=true;
      println(true);
      fundoverde(180, 120);
      text("SOM: ATIVADO", 180, 140);
    } else if (btmelodia==true) {
      println("desativa som");
      port.write(6);
      btmelodia=false;
      println("false");
      criabt1(250, 200);
      println(false);
      fundoverde(180, 120);
      text("SOM: DESATIVADO", 180, 140);
    }
  }
}

//NAO FUNCIONOU COM A MESMA LÓGICA
/*void controlServo() {
 //liga servo motor
 if (mouseX > 50+350 && mouseX < 50+400
 && mouseY > 50+200 && mouseY < 300) {

 if (btservo==false) {
 port.write(3);
 println("ativa servo");
 criabt4(350, 200);
 btservo=true;
 println(true);
 text("Som:ativado", 400, 160);
 } else if (btservo==true) {
 println("desativa servo");
 port.write(4);
 btservo=false;
 println("false");
 criabt1(350, 200);
 println(false);
 text("Som: Desativado", 400, 160);
 }
 }
 }*/


//codigo para botões diferentes
// controlador do servo
boolean botao3() {
  if (mouseX > 50+350 && mouseX < 50+400
    && mouseY > 50+200 && mouseY < 300) {
    return true;
  } else {
    return false;
  }
}
boolean botao4() {
  if (mouseX > 50 +450 && mouseX < 50+500
    && mouseY > 50+200 && mouseY < 300) {
    return true;
  } else {
    return false;
  }
}

void servomotor() {
  if (botao3()) {

    println("clicou botao 3");
    // Envia código 1 para Arduino
    port.write(3);
    println("abrir cortina");
    criabt4(350, 200);
    criabt5(450, 200);
    fundoverde(180, 140);
    text("CORTINA: ABERTA", 180, 160);
  }

  if (botao4()) {
    println("clicou botao 4");
    // Envia código 1 para Arduino
    port.write(4);
    println("fechar cortina");
    criabt4(450, 200);
    criabt5(350, 200);
    fundoverde(180, 140);
    text("CORTINA: FECHADA", 180, 160);
  }
}

/*função para criar um fundo com a mesma cor da caixa de texto criada, é importante para que os textos não fiquem se sobreponto a medida que são atualizados*/ void fundoverde(int x, int y) {
  fill(135, 173, 52);
  noStroke();
  rect(x, y, 200, 20);
  fill(255);
}

void sensordeluz(){
if (port.available()>0) {
      fundoverde(300, 85);
      text("Luz no palco: "+port.readStringUntil('\n'), 300, 100);

    }

}



Segue abaixo o código do Arduino

#include <Servo.h>

Servo myservo;

int led = 13;
int buzzer = 8;
int sensorPin = A0;
int sensorVar=0;
void setup() {
  pinMode(led, OUTPUT);
  pinMode(12,OUTPUT);// transforma em GND ( so funciona com pouca corrente)
  digitalWrite(12,LOW);
  pinMode(buzzer,OUTPUT);
  Serial.begin(9600);

  myservo.attach(11);
  // myservo.write(200);

}

void loop() {
sensorVar = analogRead(sensorPin);
Serial.println(sensorVar);
//1023 valor maximo
  if (Serial.available() > 0) {
    char valorLido = Serial.read();
    Serial.print("Arduino diz: ");

    if (valorLido == 1) {
      digitalWrite(13, HIGH);
      Serial.println("ativar luz");
    }
    if (valorLido == 2) {
      digitalWrite(13, LOW);
      Serial.println("desativar luz");
    }

    if (valorLido == 3) {
      myservo.write(0);  
      Serial.println("Abrir cortina com servo");
      Serial.println("som de alerta");
   
    }

    if (valorLido == 4) {
      myservo.write(200);  
      Serial.println("fechar cortina com o servo");    
    }
    if (valorLido == 5) {
      Serial.println("som de alerta");
      tone(buzzer, 1500);
            delay(1000);
            tone(buzzer, 1000);
         
     
    }
    if (valorLido == 6) {
      Serial.println("fim do som");    
      noTone (buzzer);
    }
 
    }

}


A imagem ta dela de controle ficou assim:



Segue abaixo o vídeo mostrando o projeto em funcionamento:

 o modelo do circuito pode ser encontrado no autodesk circuits:
https://circuits.io/circuits/5076455-sistema-de-controle-via-processing

Comentários