Você está na página 1de 9

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
}
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.
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 ;-)
Esquema

Microfone e Nivelação de Sinal


Circuito Pre-amplificador para o Arduino

R4 +Vcc (12V)
+ C1
R3 R5
C3 C4

+
R2 Arduino
R1 Output Analog Pin 0
R6
T1
C2

Microfone

Selector de
R1 – 4.7 KΩ ¼ w Número de Amostras
R2 – 1 MΩ ¼ w
R3 – 4.7 Ω ¼ w
R4 – 1 KΩ ¼ w +Vcc (5V)
R5 – 39 KΩ ¼ w
R6 – 10 KΩ ¼ w

C1 – 220 µF/35V - electrolítico P1


C2 – 47 nF - cerâmico Arduino
Analog Pin 1
C3 – 47 µF/25V - electrolítico
C4 - 220 µF/35V - electrolítico

T1 – BC546 ou BC548

P1 – potenciometro de 100 a 500 KΩ linear


Código
import 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);
}
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:

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

a b c d acdb
a --- 14 ohm 7 ohm 14 ohm
b 14 ohm --- 7 ohm 14 ohm
c 7 ohm 7 ohm --- 14 ohm
d 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...
Esquema

HDD Motor

LM324N

10K

1
2 Out 1

Vcc (5v)

10K

1M
5

7 Out 2
6
10K

10k

10

8 Out 3
9

4 11

Vcc (5V)
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;
}

Você também pode gostar