quarta-feira, 22 de julho de 2009

Hello Arduino World: Parte 2

Na primeira parte deste simples tutorial mostrei uma unidade de uso do Arduino ao ilustrar o uso de um LED e um resistor conectados a uma porta digital. Depois um simples programa implementado na IDE Processing, compilado e instalado no Arduino fez este LED acender e apagar. Agora Vamos à segunda parte do exemplo "Hello Arduino World".

Nesta segunda parte vou evoluir o programa usado para controlar vários LEDs usando um loop baseado na instrução "for" suportada pelo microcontrolador do Arduino.

Clique para ampliarOs LEDs estão ligados da porta 2 até a porta 7, num total de 6 LEDs. Como ilustra a figura ao lado, foram usados LEDs vermelhos e verdes dispostos de maneira intercalada. Cada um ligado a um resistor de 10k e 1k ohms, respectivamente.

O código a seguir contem as instruções necessárias para configurar as portas digitais como saída e acender/apagar os LEDs ligados a estas portas em sequência.

#define QTD_LEDS 6

int porta[QTD_LEDS] = {2,3,4,5,6,7};
int pausa = 500;

void setup() {
for(int i = 0;i < QTD_LEDS; i++) {
pinMode(porta[i], OUTPUT);
}
}

void loop() {
for(int i = 0;i < QTD_LEDS; i++) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
for(int i = QTD_LEDS - 1;i == 0; i--) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
}

Na linha 3 do código acima é definido um array contendo em cada posição o número de cada porta ocupada por um LED. O uso da estrutura array facilita e simplifica o acesso em sequência ao número de cada porta usada para fazer a respectiva configuração na função "setup()" e o controle de cada LED em loop na função "loop()".

Na função "setup()", implementada a partir da linha 7, cada porta é configurada dentro da instrução "for" que permite a execução da linha 8 num número conhecido de vezes. A cada execução uma das portas indicadas pelo array "porta" é configurada como saída (OUTPUT) através da execução da função "pinMode()".

A função "loop()", que será executada infinitas vezes pelo microcontrolador do Arduino, usa duas vezes a instrução "for" para acender e apagar o LED conectado em cada porta. No primeiro uso, os LEDs acendem e apagam na sequência crescente e no segundo uso, os LEDs acendem e apagam na sequência decrescente.

O video a seguir mostra a execução do programa implementado acima já instalado e rodando dentro do Arduino.



Agora vamos fazer uma pequena evolução neste exemplo para incorporar uma chave que permite mandar um bit para o programa através de porta digital 8. Usando este bit podemos controlar a direção que os LEDs acendem/apagam ao aplicar a instrução "if" sobre as linhas de código que realizam o loop dentro da função "loop()".

O programa ilustrado a seguir configura na linha 11 a porta digital 8 do Arduino como entrada digital. Na linha 15 deste programa o valor fornecido pela chave digital é lido através da chamada à função "digitalRead()". Se o valor retornado por esta função for igual a HIGH, os LEDs acendem/apagam na ordem da porta 2 até 7. Se o valor for LOW, os LEDs acendem/apagam na ordem da porta 7 até 2.
#define QTD_LEDS 6
#define portaChave 8

int porta[QTD_LEDS] = {2,3,4,5,6,7};
int pausa = 500;

void setup() {
for(int i = 0;i < QTD_LEDS; i++) {
pinMode(porta[i],OUTPUT);
}
pinMode(portaChave,INPUT);
}

void loop() {
if (digitalRead(portaChave) == HIGH) {
for(int i = 0;i < QTD_LEDS; i++) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
} else {
for(int i = QTD_LEDS - 1;i >= 0; i--) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
}
}

Na figura ao lado, a chave de duas posições e três pares de pinos é ligada ao aterramento (GND), à porta 8 (pino central) e à porta de 5v (fio laranja). Assim, quando mudamos a chave para uma posição, a porta 8 é ligada ao aterramento e estaremos enviando o bit 0 (LOW). Quando mudamos a chave para a outra posição, a porta 8 passa a ser ligada à tensão de 5v (bit igual a 1 ou HIGH).

O video abaixo apresenta a execução do programa dentro do Arduino após compilar através da IDE na máquina desktop. Este video mostra os LEDs acendendo/apagando num sentido e após a mudança da posição da chave o sentido é invertido.



O próximo exemplo, que será apresentando num novo post, ilustrará uma evolução do código acima para receber um sinal analógico vindo de um potenciômetro para controlar o tempo que cada LED permanece aceso.

2 comentários:

Jeronimo disse...

Muito legal e instrutivo o seu blog Spock, quanto mais pessoas conhecerem o Arduino, mais se ampliam as possibilidades de que cada um possa customizar o seu ambiente e criar controladores para aumentar a sua qualidade de vida . Vida Longa e Prosperidade para voce.
Jeronimo
www.blogdoje.com.br
AVR, Arduino & ARM

Rudy disse...

Spock parabens pela iniciativa, o Arduino é realmente apaixonante.
Só um comentário, o ATMEGA suporta 40mA por pino, o LED ligado com um resistor de 10K vai receber menos de 5mA.

Abraços,

Rudy