LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: senso em 08 de Abril de 2010, 02:04

Título: Mini rgb mixer usando arduino e processing
Enviado por: senso em 08 de Abril de 2010, 02:04
Aqui está um exemplo bastante simples do que se pode fazer usando o processing para conversar com o arduino, atenção que eu ainda não perdi muito tempo a aprender a sintaxe do processing, mas aqui vai disto.
Uso o processing para gerar 3 barras de gradiente, cada uma delas corresponde ao canal vermelho, verde e azul de um led rgb ligado nos pinos 9,10 e 11 do arduino, ao colocar o ponteiro do rato sobre cada uma dessas barras, o processing lê a posição do ponteiro e envia por serial um valor entre 0 e 255 que corresponde ao gradiente da barra, assim podemos variar a intensidade do led, uso 3 barras que é para poder controlar separadamente cada canal do led, se não não estava a usar um led rgb lol, sem mais demoras aqui vai o meu mini código:

Arduino:
Código: [Seleccione]
//Tiago Angelo 08/04/2010

#define RedPin 9        //define os pinos usados para cada cor do led rgb
#define GreenPin 10     //neste caso 3 dos pinos pwm do arduino
#define BluePin 11      //uso define's em vez de ints para o caso do compilador
//não reparar que é uma constante e assim gastar preciosa ram
byte redColor=0;
byte greenColor=0;
byte blueColor=0;

void setup()
{
  Serial.begin(9600);
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
}

void loop() {

  if (Serial.available()) {            // Se tiver dados para ler
    byte val = Serial.read();          // lê os dados

    if (val == 'S') {                 //Se receber o 'S' que é o caracter para iniciar/sincronizar a trasmissão
      while (!Serial.available()) {}   //começa a ler os dados á medida que eles estão disponiveis na conexão serial
      redColor = Serial.read();       //recebe o valor para o vermelho através da conexão serial

      while (!Serial.available()) {}
      greenColor = Serial.read();    //recebe o valor para o verde através da conexão serial

      while (!Serial.available()) {}
      blueColor = Serial.read();    //recebe o valor para o azul através da conexão serial

    }
  }


  setColor(redColor,greenColor,blueColor);

}

inline void setColor(byte red, byte green, byte blue){    //Simples função que "escreve" o valor do pwm para cada pino
  analogWrite(RedPin,red);                               
  analogWrite(GreenPin,green);
  analogWrite(BluePin,blue);

}

Processing:
Código: [Seleccione]
//Tiago Angelo 08/04/2010
import processing.serial.*;

Serial port;

int redColor=0;
int greenColor=0;
int blueColor=0;

void setup() {
  size(256, 190);

  println("Available serial ports:");
  println(Serial.list());

  port = new Serial(this, Serial.list()[0], 9600);  //cria a conexao serial com o arduino

}

void draw() {
 
  background(redColor,greenColor,blueColor);  //cria um background com as componentes que sao
                                              //enviadas para o led, assim vemos a cor desejada no ecra
                                              //e podemos assim determinar se existem erros de ligaçao
  for (int i = 0; i < 256; i++) {
    stroke(i);
    line(i, 0, i, 50);
    line(i,70,i,120);
    line(i,140,i,190);
  }

  int y = mouseY;        //coloca numa variavel o valor de mouseY para que este nao mude enquanto
                         //enquanto se esta a comparar esse mesmo valor dentro de cada if para que
                         //nao haja erros a decidir que barra/cor e
  if(y>0 && y<50){
    redColor=mouseX;      //le a primeira barra que corresponde a componente vermelha
  }
  if(y>70 && y<120){      //le a segunda barra, que corresponde a componente verde
    greenColor=mouseX;
  }
  if(y>140 && y<190){    //le a terceira barra, ou seja a componente azul
    blueColor=mouseX;
  }

  sendRGB(redColor,greenColor,blueColor);//escreve na "consola" do processing
  print("red: ");                        //os valores lidos da janela
  println(redColor);                     //e uma simples questao de debuging
  print("green: ");                      //mas sempre e giro ver os numeros a mudar
  println(greenColor);
  print("blue: ");
  println(blueColor);

}

void sendRGB (int r, int g, int b) {    //funçao usada para escrever
  port.write('S');                      //via serial o caracter de sincronizaçao
  port.write(r);                        //e os valores para o led rgb
  port.write(g);
  port.write(b);
}


Digam o que acham  ;)
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: microbyte em 08 de Abril de 2010, 02:18
Está fixe a ideia...
Pelo que vi, tens um código bastante simples e limpo. (Está na hora de complicar)  ;D

Para te ambientares com os eventos do rato, sugiro que experimentes a mexer apenas nos valores de cada componente quando se clica no botão rato.
Para criar uma espécie de "slider".

Outra ideia (mais maluca):
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.sapdesignguild.org%2Fresources%2Fglossary_color%2Fimages%2Fcolor_wheel2.jpg&hash=c2953d5286d7c80136753a78db3a3533b3d95193)
Vais buscar uma palete de cores (estilo a de cima) e usas o get() (http://processing.org/reference/get_.html) para ir buscar a cor que está no sítio onde tens o rato. (muito confuso?)

Depois, mandas os valores RGB tal e qual como estás a fazer.

PS: Só uma observação - "int y = mouseY;" eu percebi porque é que fizeste isto. Mas é para te dizer que o Processing trabalha ciclicamente. Por exemplo, hás-de reparar que não consegues fazer animações com FOR ou WHILE. E porquê? É que as alterações não são instantâneas, são feitas no fim do draw().
Se fizeres um FOR e meteres um rectângulo a ir do ponto A para o B, só o vais ver já no ponto B, porque é essa a posição onde ele está quando o draw() chega ao fim.

Ou seja, o mouseY, mouseX, etc... estão disponíveis num ciclo e penso que não mudam num ciclo.
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: senso em 08 de Abril de 2010, 02:28
Complicar é sempre bom, pois é assim que se aprende!
Aceito de muito bom grado as sugestões, a minha ideia era mesmo fazer o desenho de uma roda de cores HSL, e usa-la para obter os valores RGB para o led.
Andei as ler os tutoriais do Processing, e tentei meter uma label de texto em cada barra, mas quando meto o texto, não sei se é problema de incompatibilidade do java no ubuntu, se é problema do processing, pois ainda não existe suporte oficial para o ubuntu 9.10 e para o meter a funcionar foi preciso dar umas quantas voltas, mas se uso comando text("Vermelho",20,3) por exemplo o programa fica lento, no sentido em que podemos mexer o rato por cima de um slider que ele deixa de responder.
É normal?
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: microbyte em 08 de Abril de 2010, 02:31
Complicar é sempre bom, pois é assim que se aprende!
Aceito de muito bom grado as sugestões, a minha ideia era mesmo fazer o desenho de uma roda de cores HSL, e usa-la para obter os valores RGB para o led.
Andei as ler os tutoriais do Processing, e tentei meter uma label de texto em cada barra, mas quando meto o texto, não sei se é problema de incompatibilidade do java no ubuntu, se é problema do processing, pois ainda não existe suporte oficial para o ubuntu 9.10 e para o meter a funcionar foi preciso dar umas quantas voltas, mas se uso comando text("Vermelho",20,3) por exemplo o programa fica lento, no sentido em que podemos mexer o rato por cima de um slider que ele deixa de responder.
É normal?
Não é nada normal... :-s Fizeste o createFont(), procedimento normal, correcto?
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: senso em 08 de Abril de 2010, 02:38
Sim, fiz isso tudo, seguindo o tutorial que está no site do Processing, penso que é problema do Java em linux, tenho de ir ao Windows experimentar, mas não tenho os drivers ftdi instalados nem nada disso, fica para amanha essa experiencia, o java no linux tem estado com alguns problemas, não sou o unico a queixar-me tanto que em muitos sketchs dos exemplos o processing crasha de uma maneira maravilhosa que tenho de desligar o pc no botão lol.
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: Rebel em 08 de Abril de 2010, 12:22
Acho que o Ubuntu vem com uma JDK que não é da Sun. Pode ser isso.
O melhor é desinstalar a que vem e instalar a da Sun.
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: senso em 08 de Abril de 2010, 12:25
Foi logo a primeira coisa que fiz quando vi o java a falhar por todos os lados, infelizmente não corrige os problemas, mas deve ser uma questão de tempo até aparecer alguma actualização.
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: kerwac em 19 de Junho de 2010, 12:12
Podes por um video, deste teu trabalho para perceber melhor a ideia?
Obrigado
Título: Re: Mini rgb mixer usando arduino e processing
Enviado por: senso em 19 de Junho de 2010, 14:44
Quando estiver por Aveiro vou tentar tratar disso.