12
Hello World : LED que pisca Material: LED (de qualquer cor: verde, vermelho azul) Resistencia de 220 ohm Fios #define LED 2 void setup(){ pinMode(LED,OUTPUT); //estabelece o PIN 2 como um pino de output } void loop(){ digitalWrite(LED,HIGH); //acende o LED delay(300); //espera 300 milisegundos com o LED acesso digitalWrite(LED,LOW); //apaga o LED delay(200); //espera 200 milisegundos com o LED apagado

arduino e processing

Embed Size (px)

Citation preview

Page 1: arduino e processing

Hello World : LED que pisca

Material:

LED (de qualquer cor: verde, vermelho azul) Resistencia de 220 ohm Fios

#define LED 2

void setup(){ pinMode(LED,OUTPUT); //estabelece o PIN 2 como um pino de output}

void loop(){ digitalWrite(LED,HIGH); //acende o LED delay(300); //espera 300 milisegundos com o LED acesso digitalWrite(LED,LOW); //apaga o LED delay(200); //espera 200 milisegundos com o LED apagado}

Page 2: arduino e processing

Captura de Som com Arduino e Animação em Processing

Em poucas palavras, o que esta montagem faz é captar o som com um microfone e apresentar uma animação no Processing.

Page 3: arduino e processing

Para trabalhar com o Arduino no Processing deve-se carregar o Firmata, que é um programa que “passa” o controlo dos inputs e outputs do Arduino para o Processing. Encontram-no em:

Arduino File Examples Firmata StandardFirmata

O Arduino precisa de receber o sinal do microfone amplificado e nivelado, o microfone debita sinais demasiado fracos para o Arduino que recebe, nas entradas analógicas, entre 0 e 5 V. Para além disso o sinal precisa de ser centrado a 2.5V para que se possa utilizar a parte inferior das ondas sonoras.

O pré amplificador comprei-o no eBay, foi praticamente o preço dos componentes (5.20 € com portes) e já vem montado, de qualquer forma segue tambem o esquema todo caso o queiram montar. É divertido e mais fácil do que parece, acreditem ;-)

Page 4: arduino e processing

Esquema

Page 5: arduino e processing

Códigoimport processing.serial.*;import cc.arduino.*;

Arduino arduino;int chart[];

void setup(){ println(Arduino.list()); arduino=new Arduino(this,Arduino.list()[Arduino.list().length-1],57600); size(400, 400); chart=new int[400]; for(int i=0;i<400;i++)chart[i]=399; fill(0,0,0,0); smooth(); }

void draw(){ background(0); int amostraActual=(int)map(arduino.analogRead(0),0,1024,0,400); int divisor=(int)map(arduino.analogRead(1),0,1024,1,20); int numAmostras=400/divisor; int i; for(i=0;i<numAmostras-1;i++){ chart[i]=chart[i+1]; } chart[i]=amostraActual; //raios for(i=0;i<(5*abs(amostraActual-200));i++){ int x,y; if(decisaoAleatoria()){ if(decisaoAleatoria())x=0; else x=399; y=(int)random(400); } else{ if(decisaoAleatoria())y=0; else y=399; x=(int)random(400); } stroke(255,255,255,amostraActual%50); line(200,200,x,y); } //linha vermelha stroke(255,0,0); beginShape(); for(i=0;i<numAmostras;i++)vertex(i*divisor,chart[i]); endShape(); //circulos for(i=0;i<amostraActual/10;i++){ stroke(corAleatoria(),corAleatoria(),corAleatoria(),corAleatoria()); float raio=(7.0*((float)(200-amostraActual)))-((float)i); ellipse(200.0+random(-20,20),200.0+random(-20,20),raio,raio); } }

boolean decisaoAleatoria(){ return (random(1.0)>0.5);}

int corAleatoria(){ return (int)random(255);}

Page 6: arduino e processing

Motor de Disco Rigido como Dispositivo de Input

Esta ideia foi inspirada e adaptada para arduino/processing de um tutorial online:

http://www.instructables.com/id/HDDJ_Turning_an_old_hard_disk_drive_into_a_rotary/

Utilizando um disco rigido inutilizado pode-se construir um dispositivo de input. Quando rodamos manualmente um motor, as bobines que o constituem produzem cargas eléctricas e com elas podemos detectar a direcção e velocidade da movimento aplicado.

Para isso é necessário retirar todas as peças do disco à excepcção do(s) prato(s) e do motor.

O passo seguinte é identificar que contactos ligam onde. Tipicamente as bobines dos motores dos disco rigidos encontram-se ligadas em Y:

Page 7: arduino e processing

Para tal, basta medir a resistência entre cada par de contactos do motor com um multímetro:

a b c da --- 14 ohm 7 ohm 14 ohmb 14 ohm --- 7 ohm 14 ohmc 7 ohm 7 ohm --- 14 ohmd 14 ohm 14 ohm ---

Cada bobine tem uma determinada resistência, a partir dos valores encontrados deduz-se se entre cada par de contactos existe 1 ou 2 bobines. Aquele contacto que encontra sempre metade do valor - neste exemplo é o c com 7ohm - é o ponto central do Y e todos os outros os extremos.

As cargas electricas produzidas são comparadas com um valor de referencial que activa um sinal para o arduino.

Se quiserem digerir bem o funcionamento deste circuito a fundo investiguem:

amplificadores operacionais – operational amplifiers / opamps circuitos comparadores com opamps – opamp as comparator circuit

O opamp utilizado nesta montagem foi o LM324N tem um preço acessível (comprei 2 packs de 10 no eBay por 5.0 €).

De referir que muitos outros opamps servem para fazer este circuito, provavelmente sem alterações ao circuito, e encontram-se com facilidade em equipamentos electrónicos avariados: colunas amplificadas, rádios, brinquedos, leitores de CD-ROM...

a

c

b

d

Page 8: arduino e processing

Esquema

Page 9: arduino e processing

Código

import processing.serial.*;import cc.arduino.*;

Arduino arduino;final int UP=-3;final int DOWN=3;final int NIL=0;int x=200,y[];char seq[]={' ',' ',' '};int dir=NIL;boolean state=false;

void setup(){ println(Arduino.list()); arduino=new Arduino(this,Arduino.list()[Arduino.list().length-1],57600); size(400, 400); y=new int[50]; for(int n=0;n<50;n++)y[n]=200; fill(0,0,0,0); smooth(); }

void draw(){ background(0); state=false; if(arduino.analogRead(0)>500)addSeq('a'); if(arduino.analogRead(1)>500)addSeq('b'); if(arduino.analogRead(2)>500)addSeq('c');

if(!state)seq[0]=seq[1]=seq[2]=' '; setDir(); for(int n=0;n<49;n++)y[n]=y[n+1]; y[49]+=dir; if(y[49]<0)y[49]=0; if(y[49]>400)y[49]=399; for(int n=0;n<50;n++){ stroke(255,0,0,5+n*5); ellipse(x,y[n],10,10); } }

void addSeq(char c){ state=true; for(int i=0;i<3;i++) if(seq[i]==' '){ seq[i]=c; return; } if(seq[2]!=c){ seq[0]=seq[1]; seq[1]=seq[2]; seq[2]=c; }}

void setDir(){ if((seq[0]=='a' && seq[1]=='b' && seq[2]=='c')|| (seq[0]=='b' && seq[1]=='c' && seq[2]=='a')|| (seq[0]=='c' && seq[1]=='a' && seq[2]=='b'))dir=UP; if((seq[0]=='c' && seq[1]=='b' && seq[2]=='a')|| (seq[0]=='b' && seq[1]=='a' && seq[2]=='c')|| (seq[0]=='a' && seq[1]=='c' && seq[2]=='b'))dir=DOWN; if(seq[0]==' ' || seq[1]==' ' || seq[2]==' ')dir=NIL;}