quinta-feira, 12 de agosto de 2010

Arduino - Parte 4

Depois de um bom tempo, aqui estou... neste período que fiquei longe do blog estava estudando (muito) sobre o Arduino, já montei uma Ponte-H, para utilizar no meu e já fiz vários testes, aliás a postagem sobre a Ponte-H está como rascunho ainda no blog, falta eu inserir imagens e terminar algumas edições, e mais recentemente (essa semana) terminei a montagem da minha primeira placa Arduino para rodar em modo Standalone.
Eu estava precisando da placa arduino dessa forma tanto para uso pessoal como para um projeto que estou trabalhando em paralelo, assim que possuir disponibilidade de horário farei uma postagem em como montar uma placa Arduino para rodar em modo standalone, com componentes, preço e esquema.
A postagem de hoje é sobre a programação do Arduino, então chega de papo furado e vamos ao que interessa:
Um programa criado no Arduino pode ser dividido em três partes principais: Estrutura, Valores e Funções. Na parte da estrutura podemos dizer que todo código criado para o Arduino deve obrigatoriamente possuir duas funções: void Setup e void LooP.

- A palavra void é usada somente na declaração de funções. Ele indica que a função deve retornar qualquer informação para a função a partir da qual foi chamada. 

- A função void Setup é chamada quando o sketch inicia - sketch é o nome que o arduino usa para um programa. Ela é utilizada para iniciar variáveis, PinMode, e iniciar o uso de bibliotecas. Esta função é executada somente uma vez quando a placa é energizada ou cada vez que a placa é "resetada".
Exemplo: 
void setup()   {               
  // declara o pino digital como saída:
  pinMode(ledPin, OUTPUT);    
}

- A função void Loop faz o que seu prórpio nome sugere, loops consecutivos permitindo seu programa executar as operações que aqui estão.
Exemplo:
void loop()                    
{
  digitalWrite(ledPin, HIGH);   // Liga o LED
  delay(1000);                         // aguarda um segundo
  digitalWrite(ledPin, LOW);    // desliga o LED
  delay(1000);                         // aguarda um segundo
}
Ainda na parte de "Estruturas", temos: Estruturas de controle, operadores aritméticos, operadores de comparação, operadores booleanos, operadores bit a bit, operadores compostos, dentre outros...

Na parte de "Valores", temos as variáveis e constantes, mas de primeiro momento vamos ver apenas as constantes HIGH e LOW bem como INPUT e OUTPUT.

HIGH: O siginificado de High é um pouco diferente dependendo se o pino é configurado como "input" ou "output". Quando um pino é configurado como saída (output) com o pinMode e o valor de digitalWrite é setado como HIGH, o microcontrolador envia uma voltagem de 5V para este pino.
Quando um pino é configurado como entrada (input) com o pinMode e leitura com o digitalRead, o microcontrolador irá reportar High se uma tensão de 3V ou mais está presente no pino.

LOW: o significado de LOW também pode ser diferente, dependendo se um pino é definido como "input" ou "output". Quando um pino é configurado como uma entrada com pinMode, e leitura com digitalRead, o microcontrolador irá reportar LOW se uma tensão de 2 volts ou menos estiver presente neste pino.
Quando um pino é configurado como a saída (output) com pinMode, e definido como LOW com digitalWrite, a tensão neste pino é de 0 volts.

INPUT: Os pinos configurados como input com o pinMode, estão em um estado de alta impedância, isso faz com que eles sejam uteis para ler o valor de um sensor, mas não para acender um LED.

OUTPUT: Os pinos configurados como output com o pinMode, estão em um estado de baixa impedância, isso significa que eles podem fornecer uma quantidade significativa de corrente para outros circuitos. Os pinos configurados como Output podem fornecer uma corrente de até 40 mA (miliamperes) para outros dispositivos/circuitos. A quantodade de corrente fornecida pelos pinos do Atmega é muito pequena para acionar motores então algum circuito extra será necessário.

Ainda temos a parte das funções que envolvem as entradas e saídas analógicas e digitais, funções de tempo, cálculo, números randômicos (aleatórios), etc. Mas estes ficam para outra hora, quem sabe.
Para finalizar deixo o código fonte do exemplo blink que já vem no software Arduino, apenas com os comentários em português. Você pode analizá-lo e notar o uso das funções vistas neste artigo.

int ledPin =  13;    // LED conectado no pino digital 13
// A função setup() roda uma vez, quando o sketch inicia
void setup()  
{               
  // inicializa o pino digital como saída
  pinMode(ledPin, OUTPUT);    
}

// a função loop()  é executada repetidas vezes,
// enquanto o Arduino estiver com energia.
void loop()                    
{
  digitalWrite(ledPin, HIGH);    // Liga o LED
  delay(1000);                          // aguarda um segundo para próxima instrução
  digitalWrite(ledPin, LOW);     // Desliga o LED
  delay(1000);                          // aguarda um segundo para próxima instrução
 }

P.S.: Neste exemplo é utilizada uma função de tempo, a função delay(), que pausa o programa por um período de tempo especificado em milisegundos. Nota: Da mesma forma que existem 60 minutos em uma hora, existem 1.000 milissegundos em um segundo.
Então, até a próxima.

Fontes:
- Arduino reference (Referência da Linguagem do Arduino);
- Código de exemplo "Blink" disponível no software Arduino;