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
-
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:
//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:
//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 ;)
-
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.
-
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?
-
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?
-
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.
-
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.
-
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.
-
Podes por um video, deste teu trabalho para perceber melhor a ideia?
Obrigado
-
Quando estiver por Aveiro vou tentar tratar disso.