segunda-feira, 20 de janeiro de 2014

Arduino - Porta Analógica - Controle de Brilho do LED

Objetivo: Controlar a intensidade do brilho do LED externo, usando porta em modo analógico.

Como base, vamos usar o capítulo 5 do SainSmart Uno Starter Kits Manual:
Download do site SainSmart.com

Em caso de problemas para acessar o documento, tente:
download Tutorial

Além do exemplo do manual, vamos:
- Simular uma porta analógica, ligando e desligando rapidamente uma porta digital
- Fazer uma nova versão do painel da Supermáquina

Vídeo com a montagem do projeto e as alterações:


Código da Simulação de Porta Analógica:
https://docs.google.com/file/d/0B2SYabtePBegQzV2M3g2bjJaNmc/edit

/*
Simulando PWM
simulando PWM com digitalWrite
autor: @vintesegundos
*/

int led1=9;   // LED 1 = pino 9

int intensidadeMinima=20;   // Faixa da Intensidade de 20 a 200
int intensidadeMaxima=200;   
int passo = 1;// Qtde. de Brilho que muda a cada passo
int ciclo = 20;   // fator de ajuste para que a piscar do LED nao seja percebido

int intensidade = intensidadeMinima;   // Intensidade inicial LEDs = Intensidade Minima

// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
   pinMode(led1, OUTPUT);   // Pino 9 = Saida
}

// a rotina loop roda repetida e eternamente
void loop() {

   // Liga o led por uma parte do periodo
   digitalWrite(led1, HIGH);
   delay (intensidade/ciclo);

   // Desliga o led pelo resto do periodo
   digitalWrite(led1, LOW);
   delay ((intensidadeMaxima-intensidade)/ciclo);

   // aumenta (ou diminui) a intensidade para o proximo ciclo
   intensidade = intensidade + passo;

   // se chegou no limite inferior ou superior, altera a direcao
   if (intensidade == intensidadeMaxima || intensidade == intensidadeMinima) {
      passo = -passo;
   }
}

/* fim do codigo */


Código da Comparação do PWM em portas em modo digital e modo analógico:
https://docs.google.com/file/d/0B2SYabtePBegT1RnQXd2QmlIWGc/edit

/*
Simulando PWM
simulando PWM com digitalWrite e comparando com analogWrite
autor: @vintesegundos
*/

int led1=9;   // LED 1 = pino 9

int intensidadeMinima=20;   // Faixa da Intensidade de 20 a 200
int intensidadeMaxima=200;   // Fim da faixa
int passo = 1;   // Qtde. de Brilho que muda a cada passo
int ciclo = 20;   // fator de ajuste para que a piscar do LED nao seja percebido

int intensidade = intensidadeMinima;   // Intensidade inicial LEDs = Intensidade Minima

// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
   pinMode(led1, OUTPUT);   // Pino 9 = Saida
}

// a rotina loop roda repetida e eternamente
void loop() {

   // Liga o led por uma parte do periodo
   digitalWrite(led1, HIGH);
   delay (intensidade/ciclo);

   // Desliga o led pelo resto do periodo
   digitalWrite(led1, LOW);
   delay ((intensidadeMaxima-intensidade)/ciclo);

   // aumenta (ou diminui) a intensidade para o proximo ciclo
   intensidade = intensidade + passo;

   // se chegou no limite inferior ou superior, altera a direcao
   if (intensidade == intensidadeMaxima || intensidade == intensidadeMinima) {
      passo = -passo;
   }
}

/* fim do codigo */


Código da Supermáquina (Versão 3):
https://docs.google.com/file/d/0B2SYabtePBegZjItNEdyQm5NX0U/edit

/*
Supermáquina 3
Versão 3 do painel imitando a supermáquina
autor: @vintesegundos
*/

int led1=9;   // 4 portas analógicas 9,10,11 e 3
int led2=10;
int led3=11;
int led4=3;

int intensidadeMinima=0;   // Faixa de Brilho: de 0 a 200
int intensidadeMaxima=200;
int intensidadeMaximaPonta=250;
int passo = 10;   // Qtde. de Brilho que muda a cada passo

int ledApagando = led1;   // Estado inicial
int ledAcendendo = led2;
int intensidadeApagando = intensidadeMaxima;
int intensidadeAcendendo = intensidadeMinima;
int sentido = 0;

// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
   pinMode(led1, OUTPUT); // Pino 9 = Saida
   pinMode(led2, OUTPUT); // Pino 10 = Saida
   pinMode(led3, OUTPUT); // Pino 11 = Saida
   pinMode(led4, OUTPUT); // Pino 3 = Saida

}

// a rotina loop roda repetida e eternamente
void loop() {

   // assinala o valor da intensidade ao LED
   analogWrite(ledApagando, intensidadeApagando);
   analogWrite(ledAcendendo, intensidadeAcendendo);

   // atualiza os valores para o próximo passo
   intensidadeApagando = intensidadeApagando - passo;
   intensidadeAcendendo = intensidadeAcendendo + passo;
   
   // Verifica se eh hora de mudar de par de LEDs acendendo e apagando
   if (intensidadeApagando == intensidadeMinima) {

      intensidadeApagando=intensidadeMaxima;
      intensidadeAcendendo=intensidadeMinima;

      switch (ledApagando){
         case 9:
            ledApagando=led2;
            ledAcendendo=led3;
            sentido=0;
            break;
         case 10:
            if (sentido==0){
               ledApagando=led3;
               ledAcendendo=led4;
            }
            else {
               ledApagando=led1;
               ledAcendendo=led2;
               delay(150);
            }
            break;
         case 11:
            if (sentido==0){
               ledApagando=led4;
               ledAcendendo=led3;
               delay(150);
            }
            else {
               ledApagando=led2;
               ledAcendendo=led1;
            }
            break;
         case 3:
            ledApagando=led3;
            ledAcendendo=led2;
            sentido=1;
            break;
      }
   }

   // espera 12 ms
   delay(12);
}

/* fim do codigo */


Nenhum comentário:

Postar um comentário