Powered By Blogger

domingo, 18 de março de 2012

Simon diz!

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Simon diz!? Sigam o mestre!

Excelente jogo da década de 80
Seguir uma sequência de luzes coloridas sinalizadas por sons foi uma fébre, este jogo rendeu milhares de dólares à Hasbro.

Ele procurava estimular a memorização através de cores e sons. De formato circular e com botões coloridos, o objetivo éra repetir as sequências sem errar e buscar a sequência mais longa.....

Verdadeiro Campeão.

No brasil, lançado pela Estrela, "Genius" foi o primeiro jogo eletrônico, uma versão da Americana Hasbro do jogo "Simon".

Hoje, imitado por muitos, em muitas tecnologias, tanto de hardware quanto de software.



Mais uma vez o Arduino, devido a sua versatilidade, pode trazer de volta a vida, com facilidade, este grande jogo.


O HARDWARE:

1 x Arduino Uno ou duemilanove
1 x Bread Board
1x Speaker 8O
1 x LED vermelho 3mm
1 x LED amarelo 3mm
1 x LED verde 3mm
1 x LED azul 3mm
4 x resistores de 220O
4 x botões dactilares
Fios e cabos

O CIRCUITO:

Ligar a cada LED com um resistor de 220O; ligar o terminal do resistor no anodo do LED e o catodo ligar diretamente ao terra.
Cada resistor deve ser ligado ao Arduino, a sequencia é:
LED vermelho - pino 8
LED amarelo - pino 9
LED verde - pino 10
LED azul - pino 11

As chaves devem ser ter um terminal ligado ao terra e o outro terminal diretamente ligado ao Arduino.
A sequência é:
chave correspondente ao vermelho - pino 2
chave correspondente ao vermelho - pino 3
chave correspondente ao vermelho - pino 4
chave correspondente ao vermelho - pino 5

O alto-falante deve ter o terminal negativo ligado ao terra e o positivo ligado diretamente ao Arduino no pino 12.





O SOFTWARE:

/*

Simon Says game. Now with sound effects. 
Originaly made by Robert Spann
Code trimmed and sound effects added by digimike


Os botões devem ser configurados para pinos designados sem resistores de pull down
 e conectados ao terra ao invés do +5. 
*/

#include <Tone.h>
Tone speakerpin; // gerador de tom para pino do speaker
// música de início
int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};
int duration2[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};
// música de acerto 
int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};
int duration[] = {100, 100, 100, 300, 100, 300};

boolean button[] = {2, 3, 4, 5}; // pinos dos botões
boolean ledpin[] = {8, 9, 10, 11};  // pinos dos LEDs
int turn = 0;  // contador de vez
int buttonstate = 0;  // checagem do estado do botão
int randomArray[100]; //matriz para armazenar sequencia de acertos (longa..., ninguém chegou tão longe)
int inputArray[100];  


// na inicialização do Arduino
void setup() 
{
  Serial.begin(9600);
  speakerpin.begin(12); // speaker no pino 12

  for(int x=0; x<4; x++)  // pinos dos LEDs como saída
  {
    pinMode(ledpin[x], OUTPUT);
  }
  
  for(int x=0; x<4; x++) 
  {
    pinMode(button[x], INPUT);  // pinos dos botões como entradas
    digitalWrite(button[x], HIGH);  // habilita pull up interno; botões iniciam em estado alto; lógica reversa
  }

  randomSeed(analogRead(0)); // adicionado para gerar "mais aleatoreidade" 
                                                // com a matriz randomicapara a  função de saída
  for (int thisNote = 0; thisNote < 13; thisNote ++) { // toca música de início
     // toca a próxima nota
     speakerpin.play(starttune[thisNote]);
     // mantém a nota:
     if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6) // se estas notas?
     {
       digitalWrite(ledpin[0], HIGH);  // acende o LED vermelho (índice 0 da matriz, primeiro LED)
     }
     if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11) 
     // se estas notas?
     {
       digitalWrite(ledpin[1], HIGH); // acende o LED amarelo (índice 1 da matriz, segundo LED)
     }
     if (thisNote==8 || thisNote==12)
     // se estas notas?
     {
       digitalWrite(ledpin[2], HIGH); // acende o LED verde (índice 2 da matriz, segundo LED)
     }  
     if (thisNote==10) // se esta nota
     {   
       digitalWrite(ledpin[3], HIGH); // acende o LED azul (índice 3 da matriz, segundo LED)
     }
     delay(duration2[thisNote]); // pausa de cada nota
     // finaliza para iniciar a próxima nota
     speakerpin.stop();
     digitalWrite(ledpin[0], LOW); // apaga todos os LEDs
     digitalWrite(ledpin[1], LOW);
     digitalWrite(ledpin[2], LOW);
     digitalWrite(ledpin[3], LOW);
     delay(25); // pausa
    }
  delay(1000); // pausa
}


// loop principal do programa
void loop() 
{   
  for (int y=0; y<=99; y++)
  {
    // função para gerar a matriz a ser seguida pelo jogador
    digitalWrite(ledpin[0], HIGH); // acende todos os LEDs na inicialização
    digitalWrite(ledpin[1], HIGH);
    digitalWrite(ledpin[2], HIGH);
    digitalWrite(ledpin[3], HIGH);
  
    for (int thisNote = 0; thisNote < 6; thisNote ++) {
     // toca a próxima nota
     speakerpin.play(note[thisNote]);
     // mantém a nota; duração
     delay(duration[thisNote]);
     // finaliza para a próxima nota
     speakerpin.stop();
     delay(25); // pausa
    }
    
    digitalWrite(ledpin[0], LOW); // apaga todos os LEDs
    digitalWrite(ledpin[1], LOW);
    digitalWrite(ledpin[2], LOW);
    digitalWrite(ledpin[3], LOW);
    delay(1000); // pausa
  
// imprime o turno a sequência gerada, e a sequência do jogador
    for (int y=turn; y <= turn; y++)
    { // limitado pela variável de turno
      Serial.println(""); //saída serial com a sequência a ser seguida durante o jogo
      Serial.print("Turn: ");
      Serial.print(y);
      Serial.println("");
      randomArray[y] = random(1, 5); // designa um número randômico serial de (1-4) para um
                                                        //  randomArray[y], y inicia a contagem de turno
      for (int x=0; x <= turn; x++)
      {
        Serial.print(randomArray[x]);
      
        for(int y=0; y<4; y++)
        {
      
          if (randomArray[x] == 1 && ledpin[y] == 8) 
          {  // se está na matriz o que foi mostrado na posição 1?
            digitalWrite(ledpin[y], HIGH); // acende o LED
            speakerpin.play(NOTE_G3, 100); // toca nota
            delay(400); // pausa
            digitalWrite(ledpin[y], LOW); // apaga o LED
            delay(100); // pausa
          }

          if (randomArray[x] == 2 && ledpin[y] == 9) 
          { // se está na matriz o que foi mostrado na posição 2?
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_A3, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }
  
          if (randomArray[x] == 3 && ledpin[y] == 10) 
          { // se está na matriz o que foi mostrado na posição 3?
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_B3, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }

          if (randomArray[x] == 4 && ledpin[y] == 11) 
          { // se está na matriz o que foi mostrado na posição 4?
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_C4, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }
        }
      }
    }
    input(); // chama função
  }
}



void input() { // funão para verificar as entradas do jogador contra a matriz gerada

  for (int x=0; x <= turn;)
  { // isto é controlado pelo contador de turno

    for(int y=0; y<4; y++)
    {
      
      buttonstate = digitalRead(button[y]);
    
      if (buttonstate == LOW && button[y] == 2)
      { // verifica se botão pressionado
        digitalWrite(ledpin[0], HIGH); // liga LED
        speakerpin.play(NOTE_G3, 100); // toca nota
        delay(200); // pausa
        digitalWrite(ledpin[0], LOW); // apaga LED
        inputArray[x] = 1; // 1 na variável do lugar da matriz (foi botão 1)
        delay(250); // pausa
        Serial.print(" "); 
        Serial.print(1);
        if (inputArray[x] != randomArray[x]) { // verifica valor de entrada do jogador e bate contra
          fail();                              // o valor no mesmo indice da matriz gerada
        }                                      // chama a função de falhou se não bater
        x++; // próximo
      }
       if (buttonstate == LOW && button[y] == 3) // se botão não pressionado e chegou a 3
      {
        digitalWrite(ledpin[1], HIGH); 
        speakerpin.play(NOTE_A3, 100); 
        delay(200); // pausa
        digitalWrite(ledpin[1], LOW); 
        inputArray[x] = 2;
        delay(250);
        Serial.print(" ");
        Serial.print(2);
        if (inputArray[x] != randomArray[x]) {
          fail();
        }
        x++;
      }

      if (buttonstate == LOW && button[y] == 4)
      {
        digitalWrite(ledpin[2], HIGH);
        speakerpin.play(NOTE_B3, 100);
        delay(200);
        digitalWrite(ledpin[2], LOW);
        inputArray[x] = 3;
        delay(250);
        Serial.print(" ");
        Serial.print(3);
        if (inputArray[x] != randomArray[x]) {
          fail();
        }
        x++;
      }

      if (buttonstate == LOW && button[y] == 5)
      {
        digitalWrite(ledpin[3], HIGH);
        speakerpin.play(NOTE_C4, 100);
        delay(200);
        digitalWrite(ledpin[3], LOW);
        inputArray[x] = 4;
        delay(250);
        Serial.print(" ");
        Serial.print(4);
        if (inputArray[x] != randomArray[x]) 
        {
          fail();
        }
        x++;
      }
    }
  }
  delay(500);
  turn++; // incrementa o contador de turno, 
          // como ultima ação antes chamar novamente a função de saída
}

void fail() { // função usada quando o jogador falha na sequência

  for (int y=0; y<=2; y++)
  { // pisca os LEDs para indicação de falha
    
    digitalWrite(ledpin[0], HIGH); // acende o LED
    digitalWrite(ledpin[1], HIGH);
    digitalWrite(ledpin[2], HIGH);
    digitalWrite(ledpin[3], HIGH);
    speakerpin.play(NOTE_G3, 300); // toca nota
    delay(200); // pausa
    digitalWrite(ledpin[0], LOW); // apaga LED
    digitalWrite(ledpin[1], LOW);
    digitalWrite(ledpin[2], LOW);
    digitalWrite(ledpin[3], LOW);
    speakerpin.play(NOTE_C3, 300); // toca nota
    delay(200); // pausa
  }
  delay(500); // pausa
  turn = -1; // reinicia o valor do turno então o jogo começa 
             // novamente sem necessidade de reset pelo botão
}

// Fim da Compilação



O VÍDEO:

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com


Até o próximo!






segunda-feira, 12 de março de 2012

Dado Eletrônico - LED Dice

Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);
Arduino by my Self



O dado eletrônico, é um simples brinquedo, onde você ao apertar um botão, gera números aleatório de 0 a 6, que serão mostrados em um conjunto de LEDs com o formato dos lados de um dado.

Mais uma demonstração de que com Arduino, qualquer tarefa se torna possível e pode ser executada com simplicidade e facilidade.

Exemplos de Dados com LED
O HARDWARE:
1 x Arduino UNO ou Duemilanove
1 x Push-botton/Switch Datilar
1 x Resistor de 10 KO
7 x Resistores de 220 O
7 x LEDs vermelhos
1 x BreadBoard
Fios

O CIRCUITO: 

Dado Eletrônico

Disposição dos LEDs
da direita para a esquerda
em cima:
LED1, LED2, LED3
em baixo:
LED4, LED5, LED6
no centro:
LED7



Disposição dos resistores

Disposição dos Fios

# 1
# 2


# 3
# 4

# 5
# 6


O PROGRAMA:

/*

  Este exemplo é um código de domínio público.
 */

// define os pinos onde conectados os LEDs
int ledPins[7] = {2, 3, 4, 5, 6, 7, 8}; 

// define o padão do LED, qual LED será aceso para cada número
int dicePatterns[7][7] = {
{0, 0, 0, 0, 0, 0, 1}, // 1
{0, 0, 1, 1, 0, 0, 0}, // 2
{0, 0, 1, 1, 0, 0, 1}, // 3
{1, 0, 1, 1, 0, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 1, 1, 1, 1, 1, 0}, // 6
{0, 0, 0, 0, 0, 0, 0} // BLANK
};

int switchPin = 9; // define o pino do botão de 
int blank = 6; // quando cair Blank define como 6

// inicialização do Arduino
void setup()
{
  for (int i = 0; i < 7; i++) // gera loop para definição de pinos
    {
      pinMode(ledPins[i], OUTPUT); // define o pino (i) como saída
      digitalWrite(ledPins[i], LOW); // apaga o LED do pino (i)
    }
  randomSeed(analogRead(0)); // lê porta analógica 0 e gera um
                             // número aleatório
}

// loop principal do programa
void loop()
{
  if (digitalRead(switchPin)) // lê o estado do botão, se pressionado (1)(5V)
    {
      rollTheDice(); // roda o Dado
    }
  delay(100); // espera 100ms e executa novamente
}

// roda o Dado
void rollTheDice()
{
  int result = 0; // inicializa a variável "result" com 0
  int lengthOfRoll = random(15, 25); // gera comprimento da rodada, quantos números passarão
  for (int i = 0; i < lengthOfRoll; i++) // loop de 0 até comprimento da rodada
    {
      result = random(0, 6); // gera número de 0 a 6, devido ao indexda matriz começar em 0
                             // e ser preciso 7 números
      show(result); // mostra resultado
      delay(50 + i * 10); // atraso
    }
  for (int j = 0; j < 3; j++) // gera loop para piscar 3 vezes o resultado final
    {
      show(blank);  // mostra branco
      delay(500);   // espera 500ms
      show(result); // mostra resultado
      delay(500);   // espera 500ms
    }
}

// mostra o resultado nos LEDs
void show(int result)
{
  for (int i = 0; i < 7; i++) // gera loop para 7 resultados
    {
      digitalWrite(ledPins[i], dicePatterns[result][i]); // escreve no pino do LED (i) o resuldado de cada LED
    }
}

// Fim da Compilação


O VÍDEO:

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com



Até o próximo Post!








domingo, 11 de março de 2012

Tradutor Morse

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Esta experiência é um complemento ao SOS, LED Código Morse.

Agora iremos ver como fazer um tradutor de palavras e textos para código morse e efetuar a sinalização em um LED.
Para usar, basta:
Abrir um terminal de comunicação serial da IDE do Arduino, e escrever os caracteres, palavra ou texto, e enviar. O Arduino irá traduzir e sinalizar no LED ou Lâmpada de Sinalização.


Tabela do Código Morse



O HARDWARE:
É o mesmo utilizado na experiência anterior. 

O CIRCUITO:

É o mesmo utilizado na experiência anterior.  Um LED ligado ao pino 10 com seu respectivo resistor de limitação e queda de tensão.



O SOFTWARE:

/*
  Este exemplo é um código de domínio público.
*/

int ledPin = 10; // pino onde seráconectado o LED

// matriz contendo o código Morse de cada letra do alfabeto
char* letters[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", // A-I
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", // J-R
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." // S-Z
};

// matriz contendo o código Morse de cada número
char* numbers[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....",
"--...", "---..", "----."};

int dotDelay = 200; // delay para os "dits"

// inicialização do Arduino
void setup()
{
  pinMode(ledPin, OUTPUT); // define pino do LED como saída
  Serial.begin(9600); // inicializa a comunicação serial
}

// loop principal do programa
void loop()
{
  char ch; // define variável
  if (Serial.available()) // existe alguma informação a ser lida da serial?
    {
    ch = Serial.read(); // lê uma letra única
    if (ch >= 'a' && ch <= 'z') // se a letra estiver entre a e z
      {
      flashSequence(letters[ch - 'a']); // chama a função "flashSequence"
                                                     // tendo como parâmetro o número da
                                                     // letra na matriz
                                                    // subtrair 'a' da letra é um ponto
                                                    // de refrência 'a' - 'a' = 0...
                                                    // primeiro menbro da matriz;
                                                   // 'b' - 'a' = 1...
                                                   // segundo membro da matriz
                                                  // e assim por diante
      }
    else if (ch >= 'A' && ch <= 'Z') // se a letra está entre A e Z
      {
      flashSequence(letters[ch - 'A']); // como dito acima, agora para as maísculas
      }
  else if (ch >= '0' && ch <= '9') // se está entre 0 e 9
    {
      flashSequence(numbers[ch - '0']); // como dito acima, agora para os números
    }
  else if (ch == ' ') // se vazio, espaço
    {
    delay(dotDelay * 4); // gap entre as palavras
    }
  }
}

// pisca a sequência letras
void flashSequence(char* sequence)
{
  int i = 0;
  while (sequence[i] != NULL) // enquanto não acabar a sequencia de letras
    {
      flashDotOrDash(sequence[i]); // envia para ser piscado o dit ou dah 
      i++; // mais um da sequência
    }
  delay(dotDelay * 3); // gap entre letras
}


// pisca a sequência de dits e dahs
void flashDotOrDash(char dotOrDash)
{
  digitalWrite(ledPin, HIGH); // acende LED
  if (dotOrDash == '.') // se dit?
    {
      delay(dotDelay); // tempo de um dit
    }
  else // então é  um dah 
    {
      delay(dotDelay * 3); // tempo de um dah
    }
  digitalWrite(ledPin, LOW); // apaga o LED
  delay(dotDelay); // gap entre piscadas
}
// Fim da Compilação



O VÍDEO:
Vejamos o teste!

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com









SOS, LED Código Morse

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Este projeto é mais um simples uso do Arduino, neste caso vamos gerar um Código Morse "SOS", que será mostrado em um LED ou, facilmente adaptável para uma Lâmpada de Sinalização.

SOS é um sinal usado em situaçãoes de emergência.  Quando enviado em CódigoMorse, consiste em três pontos (correspondente à letra S_, três traços (correspondentes à letra O) e novamente três pontos (. . . - - - . . .) - oralmente diz-se "dit dit dit   dah dah dah   dit dit dit" .
SOS pode significar:
"Save Our Souls" - Salve Nossas Almas;
"Save Our Seamens" - Salve Nossos Marinheiros;
"Save Our Ship" - Salve Nosso Navio;
"Survivor On Shore" - Sobreviventes na Costa;


O HARDWARE:
1 x Arduino UNO
1 x BreadBoard
1 x resistor de 220O 1/8W
1 x LED vermelho
Fios

O CIRCUITO:
Ligar o catodo do LED no negativo da alimentação;
Ligar um terminal do resistor ao anodo do LED;
O outro terminal do resistor ligar diretamente ao pino 10 do Arduino.





O SOFTWARE:

Abaixo o Software comentado das duas versões executadas

Primeira versão:


  Este exemplo é um código de domínio público.
 */

int ledPin = 10;  // pino onde será ligado o LED ou Lâmpada Sinalizadora

// matriz com a duração de piscadas para a palvra em Código Morse "SOS"
int durations[] = {200, 200, 200, 500, 500, 500, 200, 200, 200};


void setup() // inicialização do Arduino
  {
    pinMode(ledPin, OUTPUT); // configura o pino digital como saída
  }
  
void loop()  // loop principal do programa
  {
    for (int i = 0; i < 9; i++) // Loop iterativo das 9 piscadas do SOS
    {
      flash(durations[i]); // executa a função de piscar com a duração
                           // correspondente da matriz
    }
    delay(2000);   // espera 2 segundo e começa novamente
  }
  
// função para piscar o LED com uma certa duração  
void flash(int duration)
  {
    digitalWrite(ledPin, HIGH); // acende o LED
    delay(duration);            // espera a duração necessária
    digitalWrite(ledPin, LOW);  // apaga o LED
    delay(duration);            // espera a duração necessária
  }


Esta segunda versão têm a temporização de dits, dahs e separação entre caracteres de acordo com as normas internacionais:


  Este exemplo é um código de domínio público.
 */


int ledPin = 10;  // LED conectado ao pino 10


void setup() // inicialização do Arduino
{
pinMode(ledPin, OUTPUT); // configura pino do LED como saída
}

void loop() // loop principal do programa
{
// 3 dits
for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // acende o LED
delay(150); // espera 150ms
digitalWrite(ledPin, LOW); // apaga o LED
delay(100); // espera 100ms
}

// delay de 100ms para ter um gap entre as letras
delay(100);

// 3 dahs
for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // acende o LED
delay(400); // espera 400ms
digitalWrite(ledPin, LOW); // apaga oLED
delay(100); // espera 100ms
}

// delay de 100ms para ter um gap entre as letras
delay(100);

// 3 dits novamente
for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // acende o LED
delay(150); // espera 150ms
digitalWrite(ledPin, LOW); // apaga o LED
delay(100); // espera 100ms
}

// espera 5 segundos antes de repetir o código de SOS
delay(5000);
}



O VÍDEO:

Vejamos os resultados!

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com





sábado, 10 de março de 2012

LED Dimmer, via Processing

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Esta experiência tem como objetivo mostrar o uso do "Processing" para controlar a intensidade do brilho de um LED.

O Funcionamento é o seguinte:

Via Processing Criamos um Applet com um gradiente variando de preto até branco e seus respectivos tons de cinza.
Ess applet é uma pequena caixa de 256 x 150 pixels, ao passar o mouse sobre a caixa, será enviado um byte (pela porta de comunicação serial) contendo a posição (eixo X) correspondente e assim um valor mapeado de 0 a 255, que será exatamente o valor de intensidade do brilho do LED.
O valor será recebido pelo Arduino (porta serial), processado, e enviado uma porta PWM, essa porta têm um LED conectado e o mesmo responderá ao comando de brilho, sendo:-
No processing, parte escura (preto), valor 0, LED apagado;
No processing, parte clara (branco), valor 255, LED acesso em pleno brilho;
No processing, partes variáveis (tons de cinza), valores diversos, brilho do LED com de acordo com o gradiente.

Página do Processing: http://processing.org/
Página do LED Dimmer: http://arduino.cc/en/Tutorial/Dimmer

O HARDWARE:

1 x Arduino UNO
1 x LED
1 x Resistor 220O 1/8W
1 x BreadBroard
Fios


O CIRCUITO:
Conectar um terminal do resistor ao Anodo do LED, o catodo do LED deve ser conectado diretamente ao negativo da alimentação.
O outro terminal do resistor deve ser ligado ao Arduino.


LED Dimmer - Fritzing
















O SOFTWARE:
Abaixo o Software comentado para o Arduino e Processing.




Sketch Arduino LED Dimmer

Sketch do Processing





































































O VÍDEO:
Vejamos o resultado final.

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com



CONCLUSÃO:

O Processing é uma grande ferramenta para interação entre Software e Hardware
Permite criar projetos fáceis e rápidos e de grande funcionalidade.

sexta-feira, 9 de março de 2012

Arduino - Sistema de Segurança, Controle de Acesso

Arduino by my Self



Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);




Este projeto têm como objetivo, mostrar um uso prático do Arduino.

Um sistema de segurança para fazer o controle de acesso, por exemplo, da entrada de pessoas a um determinado ambiente seguro.

O sistema consta de um teclado para a entrada de uma senha, e um display LCD para visualizar mensagens.

A simulação é feita com LEDs, porém facilmente implementado para relés ou solenóides.

Como funciona:

Ao iniciar o sistema, um LED vermelho indica que o sistema está pronto, e neste caso não adianta digitar números no teclado, pois os mesmos não será processados; a não ser a tecla "#", que indicará ao sistema que alguém irá digitar uma senha.
Ao digitar "#"o sistema libera o teclado para a entrada da senha, e um LED amarelo sinaliza esta funcionalidade, bem como, será mostrado uma mensagem no display informar ao usuário que é necessário digitar a senha.
Digitando números no teclado (para cada um será emitido uma sinalização acústica), o sistema processará os dados.  
Se a quantidade de números digitar for igual a 4 e corresponder exatamente a senha do sistema, então será habilitato o relé ou o solenóide de acionamento (indicado por um LED verde, que irá piscar por cerca de 5 segundos, e o sistema estará liberado; durante esse período um som será emitido para sinalização; uma mensagem será mostrada no display, para informar ao usuário que o acesso foi liberado).
Se a quantidade de números digitados for 4 e não corresponder a senha esperado para o sistema, então o sistema não será liberado e voltará ao estado inicial.  O mesmo acontece se for pressionado a tecla "#" novamente.

O HARDWARE:
1 x Arduino UNO
1 x Teclado numérico 3x4
1 x Display LCD 2x16 I2C
1 x Buzzer
1 x Breadboard
4 x Resistores de 220O 1/8W
1 x LED verde 3mm
1 x LED Amarelo 3mm
1 x LED Vermelho 3mm
Fios e cabos para conexões

O CIRCUITO:
Utilize a breadboard para fazer as ligações:

Mini BreadBoard
BreadBoard


Para cada LED associar um resistor de 220O em série conectado ao terminal Anodo e o terminal catodo ligado diretamente ao negativo da alimentação. O outro terminal do resistor vai ligado ao Arduino, conforme abaixo:
Para o LED verde, terminal do resistor ligado ao pino 10  
Para o LED amarelo, terminal do resistor ligado ao pino 11
Para o LED vermelho, terminal do resistor ligado ao pino 12

Para o Buzzer, associar um resistor de 220O ao teminal positivo, sendo o terminal negativo do mesmo, ligado ao negativo da alimentação.  O outro terminal do resistor deve ser ligado ao pino 9 do Arduino.
Tipos variados de Buzzers
Buzzer soldável em placa


O teclado deve ser ligado da seguinte maneira:
Linha 1, ligada ao pino 5 do Arduino
Linha 2, ligada ao pino 4 do Arduino
Linha 3, ligada ao pino 3 do Arduino
Linha 4, ligada ao pino 2 do Arduino
Coluna 1, ligada ao pino 6 do Arduino
Coluna 2, ligada ao pino 7 do Arduino
Coluna 3, ligada ao pino 8 do Arduino

Detalhe da conexão flexível linhas x colunas
Teclado 4x3 flexível


Display I2C
Ligar o Vcc do dispositivo ao positivo da alimentação
Ligar o GND do dispositivo ao negativo da alimentação
Ligar o SDA do dispositivo ao pino A4 (analógico 4) do Arduino
Ligar o SCL do dispositivo ao pino A5 (analógico 5) do Arduino

Detalhe do adaptador I2C





Display I2C com BackLight azul e caracteres brancos




Diagrama:
Diagrama em fritzing
O Display LCD utilizado é um display I2C.


O SOFTWARE:
Abaixo o Software utilizado, com todos os comentários necessários (veja também o vídeo).

Este projeto foi baseado no projeto do Marcelo Rocha

Algumas modificações foram feitas para adequação somente.
Procurei deixar bem explicado, para que outras pessoas possam reproduzir com sucesso o experimento.

A versão 2 é ainda básica, somente para os primeiros passos, mais adiante versões mais completas.
/*
#################################################################################
#   Arquivo:            Tranca_Eletronica_v2.pde                                             
#       Micro-processador:  Arduino UNO         
#   Linguagem:    Wiring / C /Processing /Fritzing / Arduino IDE          
#
# Objetivo:           Tranca Eletrônica para controlede acesso
#  
# Funcionamento:    Ao pressionar #, libera para ser digitado a senha;
#                           se a senha estiver errada, volta ao estado inicial;
#                           Se a senha estiver correta, libera a porta;
#                           Simulação através de LEDs, porém adaptável a relés e travas
#                           Tons audíveis para orientação
#                           Display com as mensagens
#
#   Autor:              Marcelo Moraes 
#   Data:               20/02/12
#   Local:              Sorocaba - SP
#
#################################################################################
  Este exemplo é um código de domínio público.
 */
//Bibliotecas 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>        //Esta biblioteca tem 2 versões uma está apropriada para o IDEv1.0
#include <Keypad.h>

//Inicialização do Display I2C
LiquidCrystal_I2C lcd(0x27,16,2);


int count = 0;                                              //Contador de uso geral
char pass [4] = {'1', '9', '7', '1'};                 //Senha
const int yellowPin = 11;                             //Definição do pino do LED Amarelo
const int redPin = 12;                                 //Definição do pino do LED Vermelho
const int greenPin = 10;                              //Definição do pino do LED Verde
const int audioPin = 9;                                //Definição do pino do Buzzer
const int duration = 200;                             //Duração das sons tocados
const byte ROWS = 4;                              //Quatro linhas
const byte COLS = 3;                               //Três colunas

//Mapeamento de teclas
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2};                    //Definição de pinos das linhas
byte colPins[COLS] = {6, 7, 8};                          //Definição de pinos das colunas

//Cria o teclado
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//Programa inicial 
void setup(){
  lcd.init();                                              //Inicializa o LCD
  lcd.backlight();                                     //Com Backlight
  Serial.begin(9600);                              //Inicializa a comunicação serial a 9600 bps
  
  //Deifinição de modo dos pinos
  pinMode(audioPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  lcd.clear();                                        //Limpa LCD
  key_init();                                         //Inicializa o sistema
}



//Loop Principal do Programa 
void loop(){
  char key = keypad.getKey();                         //Obtém tecla pressionada
  if (key != NO_KEY){                                  //Se foi pressionada uma tecla:
    if (key == '#') {                                          //Se a tecla é '#'
      code_entry_init();                                    //Então espera que seja inserida uma senha
      int entrada = 0;
      while (count < 4 ){                                  //Conta 4 entradas/teclas
        char key = keypad.getKey();                //Obtém tecla pressionada
        if (key != NO_KEY){                          //Se foi pressionada uma tecla:
          entrada += 1;                                     //Faz entrada = entrada + 1
          tone(audioPin, 1080, 100);                 //Para cada dígito emite um som de indicação
          delay(duration);                                 //Duração do som
          noTone(audioPin);                            //Para de emitir som
          if (key == pass[count])count += 1;       //Se a tecla pressionada corresponde ao dígito 
                                                                      //da senha correspondente, soma 1 no contador
          if ( count == 4 ) unlocked();                 //Se contador chegou a 4 e com dígitos corretos, 
                                                                     //desbloqueia siatema
          if ((key == '#') || (entrada == 4)){        //Se foi pressionada a tecla "#' ou foram feitas
                                                                     //4 entradas,
             key_init();                                         //Inicializa o sistema
            break;                                               //Para o sistema e espera por uma tecla
          }
        }
      }
    }
  }
}


//Inicializar o Sistema 
void key_init (){
  lcd.clear();                                                //Limpa o LCD
  lcd.print("Aguardando...");                        //Emite mensagem
  lcd.setCursor(0,1);                                   //Muda de linha
  lcd.print("Tecle #");                                  //Emite mensagem
  
  count = 0;                                                //Variável count é zero na inicialização
  
  //Emite som e acende LED Vermelho, indicando Sistema Iniciado
  digitalWrite(redPin, HIGH);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  tone(audioPin, 1080, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 980, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 770, 100);
  delay(duration);
  noTone(audioPin);
}

//Subrotina de Entrada da Senha 
void code_entry_init(){
  lcd.clear();                                                //Limpa LCD
  lcd.print("Entre a Senha:");                        //Emite mensagem
  
  count = 0;                                                //Variável count é zero na entrada de senha
  
  //Emite som e acende LEDs
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  digitalWrite(redPin, LOW);                            //Apaga LED Vermelho
  digitalWrite(yellowPin, HIGH);                      //Acende LED Amarelo
  digitalWrite(greenPin, LOW);                        //Apaga LED Verde
}


//Subrotina para Acesso Liberado 
void unlocked(){
  lcd.clear();                                                    //Limpa LCD
  lcd.print("Acesso Liberado!");                       //Emite mensagem
  
  digitalWrite(redPin, LOW);                           //Apaga LED Vermelho
  digitalWrite(yellowPin, LOW);                      //Apaga LED Amarelo
  
  //Executa 20 vezes +- 5 segundos, emite som e pisca LED verde
  for (int x = 0; x < 20; x++){ 
  digitalWrite(greenPin, HIGH);
  tone(audioPin, 2000, 100);
  delay(duration);
  noTone(audioPin);
  digitalWrite(greenPin, LOW);
  tone(audioPin, 2000, 100);
  delay(duration);
  noTone(audioPin);
  delay(250);
  }
}

As bibliotecas deste projeto bem como as versões mais elaboradas estão disponibilizadas em:
https://github.com/Arduinobymyself/ElectronicDoorLock



VÍDEO:
Agora podemos ver o projeto completo

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com



Bom!, espero ter mostrado, o quanto o Arduino é flexível, fácil e dinâmico na realização de projetos.
Até o próximo post.



Como muitos visitantes pediram:

Agora temos uma Atualização do Sistema de Segurança com Arduino.
Sendo possível entar como uma nova senha via teclado.
Lembrando que ela permanece enquanto o sistema estiver ligado (em caso de perda de energia, a senha volta para a senha padrão).

;-)

Abaixo o código completo e uma nova versão da biblioteca LCD via I2C para a IDE 1.0 e da biblioteca keypad

https://github.com/Arduinobymyself/ElectronicDoorLock







25/01/2019 - ATUALIZAÇÃO

NOVA VERSÃO DA TRANCA ELETRÔNICA:


Agora com LCD normal 16x2 e LCD I2C, no mesmo SW você pode escolher entre um e outro somente tirando o comentário de algumas linhas;
Lendo e gravando as passwords diretamente na EEPROM do arduino;
Agora o sistema não perde mais a password  em caso de ser desernergizado;
Conhecendo o password antigo, é possível configurar um novo password que será gravado na EEPROM;
Para efeitos mais práticos de simulção, foi adicionado um servo-motor para fazer o acionamento da tranca;
Os comentários e as Telas do SW agora estão no idioma Inglês (devido a esse projeto estar também hospedado em sites estrangeiros;
quando digitado o password, um máscara com * irá aparecer para não divulgar os números (somente para efeitos especiais, pois os numeros do password não são mostrados enquanto digitados);
Nessa nova edição o teclado foi alterado para o tamanho 4x4, ou seja as senhas agora podem ter letras e números, o comprimento da senha também pode ser alterado na programação inicial do sistema.
Foi acrescentado um RTC Real Time Clock, para mostrar a hora no display na tela principal.
Conta com um temporizador; caso a pessoa não entre a senha correta em 5 segundos, volta para a tela inicial.

Dessa forma algumas mudanças na pinagem e interconexão foram necessárias; siga no próprio software a pinagem para as conexões do sistema.

Todos os arquivos podem ser obtidos diretamente no GitHub da ArduinoByMySelf; incluindo as versões anteriores:
https://github.com/Arduinobymyself/ElectronicDoorLock

BREVE POSTAREI UM VÍDEO RELACIONADO COM ESSA NOVA VERSÃO, AGUARDE!

Qualquer dúvida e ou sugestão entre em contato:
arduinobymyself@gmail.com