sábado, 17 de março de 2012

Desenhar Sketch's - Arduino e outros.

É muito legal sair colocando a mão na massa e fazer os protótipos direto no Arduino + Protoboard, mas ai você quer testar outra coisa e precisa desmontar seu lindo circuito e perde tudo o que fez.

Um bom jeito de guardar tudo na "memória" é desenhar os sketch's e armazená-los para consultar depois.

É um bom jeito de pensar no que está fazendo também. E muito útil para expor seus esquemas para as outras pessoas. Bom, já dei vários bons motivos.

Segue um editor de sketch's open source bem legal e simples de operar.

Fritzing
Página: http://fritzing.org/
Direto ao ponto: http://fritzing.org/download/

Olha que bonito:

Botões e Resistores Pull-down e Pull-up

Como um bom programador, e não profundo conhecedor de eletrônica, tive um pouco de dificuldade até entender como o Arduino verifica se um botão foi ou não pressionado, para isso tive que entender um pouco sobre a montagem dos circuitos e seus respectivos resistores pull-down e pull-up.

Como cheguei nessa dúvida?

Bom, vi que algumas aplicações que utilizavam um botão, faziam as verificações se os botões estavam pressionados de formas diferentes, as vezes verificavam se estavam em HIGH e as vezes em LOW quando pressionados. Mas por que?

O Arduino na verdade não vê se o botão está pressionado ou não, ele verifica se a porta onde está o botão está energizada (HIGH) ou não (LOW), e dependendo de como o circuito está montado, é possível que sejam feitas as seguintes leituras na porta:

Exemplo 1:
- HIGH - com o botão não pressionado
- LOW - com o botão pressionado

Exemplo 2:
- HIGH - com o botão pressionado
- LOW - com o botão não pressionado

No exemplo 1, significa que a porta está energizada (HIGH) com o botão não pressionado, isso quer dizer que estamos utilizando resistores pull-up para manter a porta em HIGH. A porta terá leitura LOW quando o botão for pressionado.

E no exemplo 2 é o contrário, significa que a porta está em LOW quando o botão não está pressionado e será HIGH quando o botão for pressionado, levando-nos a entender que estamos utilizando resistores pull-down para manter a porta em LOW enquando o botão não estiver pressionado.

Ou seja, HIGH e LOW não tem nada a ver com a situação do botão (pressionado ou não), e sim com a montagem do circuito.

Mas por que utilizar os resistores de pull-up e pull-down?

Pode haver variação na leitura da tensão das portas do Arduino (ou de qualquer circuito eletrônico), logo, utilizando essa técnica, sempre forçamos a leitura em 5V ou 0V, isolando essas variações que podem fazer com que ocorra erros na leiruta de pressionamento de um botão.
E como deixo a porta em HIGH (pull-up) ou LOW(pull-down)?

Para isso utilizamos os resistores, fazendo que com o circuito aberto (botão não pressionado) a porta esteja energizada com os 5V no Arduino, como no exemplo abaixo:

PULL-UP
Repare que com o botão não pressionado
a porta está ligada aos 5V (HIGH), e com o botão
pressionado, o caminho com menor resistência será
o GND (LOW).

Ou, forçamos que com o circuito aberto (botão não pressionado) a porta esteja com leitura LOW, como no exemplo abaixo:

PULL-DOWN
Repare que com o botão não pressionado
a porta está ligada ao GND (LOW), e com o botão
pressionado, o caminho com menor resistência será
os 5V (HIGH).

No código, as verificações ficam da seguinte forma:

  // Verifica se o botão foi pressionado - PULL-UP.
  if (digitalRead(buttonPin) == LOW) {
    // rotina...
  }

  // Verifica se o botão foi pressionado - PULL-DOWN
  if (digitalRead(buttonPin) == HIGH) {
    // rotina...
  }

Agora a boa notícia, o Arduino possui internamente os resistores de PULL-UP, basta ativar esse recurso através do código:

    pinMode (buttonPin,INPUT);
    digitalWrite (buttonPin,HIGH); // ativa os resistores pull-up


O digitalWrite de HIGH na porta onde está o botão faz com que o resistor PULL-UP interno do Arduino seja ativado. Bem mais simples hein?

Agora basta fazer a verificação de pressionamento do botão utilizando o código do PULL-UP que já havia mostrado acima:

  // Verifica se o botão foi pressionado - PULL-UP.
  if (digitalRead(buttonPin) == LOW) {
    // rotina...
  }

Esse esquema dispensa o resistor externo para fazer o Pull-Up e utiliza o resistor interno do Arduino (na verdade do ATMega), facilitando em muito a montagem do circuito.
PULL-UP interno do Arduino


Espero ter ajudado no entendimento e montagem de botões no ATMega, e como utilizar os resistores Pull-Up e Pull-Down para manter um circuito energizado ou não, evitando a leitura de variações de tensão na porta do Arduino e gerando possíveis erros para saber se um simples botão está ou não pressionado.

Abraços!
Diego Feliciano

quinta-feira, 8 de março de 2012

Semáforo de Pedestres

Olá!

Como primeiro teste, criei um semáforo de pedestres, que ao clicar no botão de travessia ele fecha o farol de veículos e abre o de pedestre. Simples assim!

Fiz um tratamento para impedir que o pedestre fica apertando o botão e fechando o farol a todo momento, então sempre é necessário esperar 50 segundos (definido pelo código) para que o farol de pedestres abra novamente.

Tirei a idéia desse exemplo do livro "Arduino Básico - Novatec", porém pelo código do livro é sempre necessário que o pedestre aguarde os 50 segundos (sempre ignora o pressionamento do botão) para que o semáforo registre uma nova solicitação de travessia, eu refiz o código, e dessa forma o usuário pode registrar a solicitação de travessia a qualquer momento, sendo que o semáforo apenas irá respeitar os 50 segundos mínimos para a passagem dos carros.

Segue uma foto do Arduino + Protoboard:


Segue vídeo do brinquedo funcionando:

Itens utilizados:
- 5 leds - 3 para o semáforo de carros e 2 para o semáforo de pedestres.
- 5 resistores - um para cada led.
- 1 botão - para acionamento da  requisição de travessia.

Código do Semáforo:

byte red = 13;
byte yellow = 12;
byte green = 11;
byte button = 10;
byte redPedestre = 9;
byte greenPedestre = 8;
unsigned long tempo=50000;
boolean entrar = false;

void setup() {               
  // inicializa os pinos como OUTPUTT
  pinMode(red, OUTPUT); 
  pinMode(yellow, OUTPUT); 
  pinMode(green, OUTPUT);
  pinMode(redPedestre, OUTPUT);
  pinMode(greenPedestre, OUTPUT);
  // inicializa o pino do botao como INPUT
  pinMode(button, INPUT);
  digitalWrite(button, HIGH); 
}

void loop() {
 
  upGreen();
 
  int val = digitalRead(button);
 
  if (val == LOW || entrar) {
    if ((millis() - tempo) > 50000){
      entrar = false;
      upYellow(5000);
      upRed(20000);
      tempo = millis();
    }
    else {
      entrar = true;
      delay(50000 - (millis() - tempo));
    }
  }
}
void upRed(int timeDelay) {
  offAll();
  digitalWrite(red, HIGH);   // set the LED on
  digitalWrite(greenPedestre, HIGH); // set the LED on
 
  delay(timeDelay);              // wait for a second
 
  digitalWrite(greenPedestre, LOW);
 
  int x;
  for(x=0; x<=9; x++) {
    digitalWrite(redPedestre, LOW);
    delay(250);
    digitalWrite(redPedestre, HIGH);
    delay(250);
  }
}
void upYellow(int timeDelay) {
  offAll();
  digitalWrite(yellow, HIGH);   // set the LED on
  digitalWrite(redPedestre, HIGH); // set the LED on
  delay(timeDelay);              // wait for a second
}
void upGreen() {
  offAll();
  digitalWrite(redPedestre, HIGH); // set the LED on
  digitalWrite(green, HIGH);   // set the LED on 
}
void offAll() {
  digitalWrite(red, LOW);    // set the LED off
  digitalWrite(yellow, LOW);    // set the LED off 
  digitalWrite(green, LOW);    // set the LED off
  digitalWrite(redPedestre, LOW); // set the LED off
  digitalWrite(greenPedestre, LOW); // set the LED off
}

Se alguém tiver dúvidas ou quiser dar sugestões, sempre serão bem-vindas!

Diego Feliciano

Vamos começar...

Boa noite!

Criei esse blog para compartilhar minha humilde experiência na tentantiva de criar um robô utilizando um Arduino.

Como estou no começo do projeto, irei postar coisas simples e testes que estou fazendo para conhecer a interface do Arduino.

Abraços!
Diego Feliciano