sábado, 31 de março de 2012

Arduino Stringless Guitar: Apresentação Inicial e Definição de Projeto com Cronograma.

Objetivo


Após varias discussões sobre o que viria ser uma ideia de projeto, decidimos, com base nos nossos gostos pessoais, que iríamos desenvolver um instrumento musical, no caso uma guitarra. O diferencial nesse projeto é a substituição das cordas físicas por feixes de luz. Daí, é instantâneo o título do projeto: Arduino Stringless Guitar.

Pretendemos, portanto, simular esses feixes com lasers pointers (ou leds) acoplados onde costuma-se ir as cordas de uma guitarra. Ao lado do Arduino, é claro, conectado com 6 LDRs. Para tocar as notas desejadas, utilizaremos chaves-botão do tipo arduino-shield. No código-fonte, haverá uma condição booleana que verificará o valor da resistência do LDR e a partir disso emitirá uma nota, se você apertar um dos botões, ou o som das cordas tocadas juntas, caso contrário.

Materiais necessários

  • shape de madeira;
  • arduino duemilanove;
  • chave-botão tipo arduino shield (qtd não definida);
  • lasers ou leds - 6;
  • ldr - 6



Cronograma do Projeto


Apresentação Inicial - 27/03

Nota do blog - 03/04

Montagem/Programação/Testes (código)

Abril - 14/04, 28/04

Maio - 05/05, 12/05, 19/05

Nota do blog - 07/05

Oficina Arduino - 08/05

Pesquisa sobre Materiais - 11/05

Apresentação Intermediária - 22/05

Ajustes finais (artigo, elaboração de cartaz, correção de código, relatórios)

26/05, 01/06, 02/06, 09/06

Nota do blog - 05/06

Apresentação Final - 12/06



segunda-feira, 19 de março de 2012

Medidas Elétricas com Arduino


Os valores das tensões medidos são fornecidos em Volts. No esquema adotado a tensão que estamos medindo é sobre o LDR ( um de seus terminais está no terra e o outro na porta analógica 0).

Os valores lidos variam de 0 a 1024. Para convertê-los em unidades de tensão, o Arduino possui um conversor analógico-digital de 10 bits e sua leitura corresponde ao decimal associado à tensão que se deseja medir.

O conversor AD do Arduino é um conversor que apresenta 10 bits. O que isso significa?
Um sistema digital apresenta apenas duas possibilidades de tensões, próximas de zero (décimos de mV) e que corresponde ao bit 0 e aquela em que a tensão assume o seu valor máximo (da ordem de 5 V) que corresponde ao bit 1. Assim um valor de tensão que varia continuamente entre 0 e 5 V deverá ser expressão em frases binárias para que possa ser processado pelo micro-controlador.
Para 10 bits teremos um conjunto de 210 frases binárias= 1024.
O Arduino opera com 5V de tensão, aproximadamente. Assim qualquer valor de tensão de teremos que:
Para 5 Volts teremos o decimal correspondente 1024
Valor de tensão de entrada teremos X para o decimal
5.....................1024
A0 (V).............Decimal lido
Portanto em Volts o valor de A0 será dado por: A0 lido em Volts = (decimal lido) *5/1024
Com estas considerações, desenvolvemos algumas linhas de programação que permitiram:
· Oferecer o valor de tensão em Volts sobre o LDR
· Oferecer o valor de tensão no resistor R
· Oferecer a tensão total ( Soma: VR + VLDR)
· Imprimir em colunas estes valores nesta sequencia,decimal no LDR, VLDR (V), VR(V) Vtotal (V) e tempo.

Código-Fonte

int LDR; //declara a variável
unsigned long tempo;
float TLDR;
float TR;
float TT;

void setup() {

pinMode(A0, INPUT);

Serial.begin(9600);


}

void loop() {

tempo= millis(); // base de tempo para a coleta

LDR = analogRead(A0);
TLDR = (5.101 * LDR) / 1024;
TR = 5.101 - TLDR;
TT = TR + TLDR;

{
Serial.print(LDR);

Serial.print(" | ");

Serial.print(TLDR,3);

Serial.print(" | ");

Serial.print(TR,3);

Serial.print(" | ");

Serial.print(TT,3);

Serial.print(" | ");

Serial.print(tempo);


}

Serial.println(); // imprime em linhas

delay(250);

}

Coletamos os dados impressos pelo monitor serial:


Tensão no LDR

Determinando a corrente elétrica do circuito: U(tensão no Resistor)=R(Resistência total).i(corrente elétrica total). Entre o LDR e o Resistor. A tensão total foi 5.08V.

Retomando o código fonte, inserimos linhas de código em que:
  • O valor de corrente pode ser obtido em mA;
  • Podemos imprimir em colunas os valores nesta sequência, decimal no LDR, VLDR (V), VR(V) Vtotal (V), corrente elétrica e tempo.

Nova coleta de dados:

Potencia dissipada no LDR (em Watts):
P(potencia Dissipada no LDR) =R(Resistência no LDR)*i²(Corrente Elétrica Total)
Potencia dissipada (ou consumida) pelo circuito (resistor e LDR):
P(Potencia Dissipada pelo Circuito) = i(Corrente Eletrica Total)*U(Tensão Total)






Blinking Led - Condicional (Complemento R1)

Com o circuito montado para leitura no LDR, montamos um programa e um sistema físico em que tenhamos uma sequencia de leds acendendo conforme a distancia de bloqueio de luz no LDR.
A sequencia deve ser a seguinte: Com a dimiuição da distância acenderemos os leds na seguinte sequência:
* Maior distancia: led azul
* Distancia intermediaria1 (mais próxima led verde)
* Menor distancia vermelho
Para acender os leds use as portas digitais e inserimos linhas de programação com condições de “if”, conforme o código-fonte abaixo:
Obs: O vídeo, esquema e código-fonte são os mesmos do R1

int LDR; //declara a variavel
unsigned long tempo; //declara tempo
int LedAzul = 7;
int LedVerde = 6;
int LedVermelho = 5;

void setup() {

pinMode(A0, INPUT);
pinMode(LedAzul, OUTPUT);
pinMode(LedVerde, OUTPUT);
pinMode(LedVermelho, OUTPUT);


Serial.begin(9600);

}

void loop() {

tempo= millis(); // base de tempo para a coleta

LDR = analogRead(A0);

{

Serial.print(tempo);

Serial.print(" "); // introduz um espaço entre as colunas
Serial.print(" ");
Serial.print(LDR);

if ( LDR > 100){
digitalWrite(LedAzul,HIGH);
}
else {
digitalWrite(LedAzul,LOW);
}

if ( LDR > 150){
digitalWrite(LedVerde,HIGH);
}
else {
digitalWrite(LedVerde,LOW);
}

if ( LDR > 200){
digitalWrite(LedVermelho,HIGH);
}
else {
digitalWrite(LedVermelho,LOW);
}
}

Serial.println(); // imprime em linhas

delay(100);

}

sábado, 17 de março de 2012

Leds e Notas Musicais

Tarefa: Construir um sistema que funcione da seguinte forma:
1. Acenda leds de cores diferentes a medida que se aproxima do LDR ( na seguinte sequencia, (mais distante - azul, verde e vermelho - mais próximo) – feito no R1 complementar;
2. Toque notas diferentes a medida que se aproxima:
Nota dó.............mais distante
Nota ré.............distância intermediaria
Nota fá.............maior distância


Esquema do Circuito


Foto do Circuito



Vídeo





Código - Fonte



int LDR; //declara a variavel
unsigned long tempo; //declara tempo
int LedAmarelo = 13;
int LedAzul = 12;
int LedVermelho = 11;

void setup() {

pinMode(A0, INPUT);
pinMode(LedAzul, OUTPUT);
pinMode(LedAmarelo, OUTPUT);
pinMode(LedVermelho, OUTPUT);
pinMode(9,OUTPUT);

Serial.begin(9600);

}

void loop() {

tempo= millis(); // base de tempo para a coleta

LDR = analogRead(A0);

{

Serial.print(tempo);

Serial.print(" "); // introduz um espaço entre as colunas
Serial.print(" ");
Serial.print(LDR);

if (( LDR > 95)&&(LDR <120)){
digitalWrite(LedAmarelo,HIGH);
tone(9,523,200);
}
else {
digitalWrite(LedAmarelo,LOW);
}
if ((LDR > 120)&&(LDR <190)){
digitalWrite(LedAmarelo,LOW);
digitalWrite(LedAzul,HIGH);
tone(9,587,200);
}
else {
digitalWrite(LedAzul,LOW);
}

if ( LDR > 190){
digitalWrite(LedAzul,LOW);
digitalWrite(LedVermelho,HIGH);
tone(9,659,200);
}
else {
digitalWrite(LedVermelho,LOW);
}
}

Serial.println(); // imprime em linhas

delay(100);

}








segunda-feira, 5 de março de 2012

Arduino Blinking Led


O experimento a seguir propõe um primeiro contato com o Arduino, aonde um LED será ligado a uma placa em uma porta digital, e através do código programado nele o LED piscará interruptamente,com um intervalo de alternação entre acender e apagar de 1 segundo.
Nesse experimento foram utilizados os seguintes componentes: 1 LED, 1 resistor de 330 Ohm, 2 fios.

Esquematização do Circuito



Código-Fonte

int LDR;
unsigned long tempo; //declara tempo
int LedAzul = 7;
int LedVerde = 6;
int LedVermelho = 5;

void setup() {

pinMode(A0, INPUT);
pinMode(LedAzul, OUTPUT);
pinMode(LedVerde, OUTPUT);
pinMode(LedVermelho, OUTPUT);


Serial.begin(9600);

}

void loop() {

tempo= millis(); // base de tempo para a coleta

LDR = analogRead(A0);

{

Serial.print(tempo);

Serial.print(" "); // introduz um espaço entre as colunas
Serial.print(" ");
Serial.print(LDR);

if ( LDR > 100){
digitalWrite(LedAzul,HIGH);
}
else {
digitalWrite(LedAzul,LOW);
}

if ( LDR > 150){
digitalWrite(LedVerde,HIGH);
}
else {
digitalWrite(LedVerde,LOW);
}

if ( LDR > 200){
digitalWrite(LedVermelho,HIGH);
}
else {
digitalWrite(LedVermelho,LOW);
}
}

Serial.println(); // imprime em linhas

delay(100);

}