quinta-feira, 22 de dezembro de 2011

Laços While & For do Arduino

comando for

Descrição

O comando “for” é utilizado para repetir blocos de comandos inseridos entre chaves. Um contador incremental é normalmente utilizado para incrementar e finalizar o laço. O comando “for” é útil em qualquer tarefa repetitiva, e largamente utilizado em combinação com arrays para processar coleções de dados/portas.
O laço “for” é constituído de 3 partes:
for (iniciação; condição; incremento) {
//comando(s);
}
A iniciação (declaração da variável contadora) acontece primeiro e exatamente uma única vez. Cada vez que o laço “roda”, a condição é testada; se é verdadeira, o bloco de comandos e seu incremento é executado, então a condição é verificada novamente. Quando a condição se torna falsa, o laço termina.

Exemplo

// Esvanece um LED usando uma porta PWM
int PWMpin = 10; // LED em série com resistor 470 ohm na porta 10

void setup()
{
  // nada a ser feito no setup
}

void loop()
{
   for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);
   } 
}



Dicas de Codificação

O laço “for” do C é muito mais flexível que outros laços encontrados em outras linguagens de programação, incluindo BASIC. Qualquer uma das 3 partes (ou todas elas) podem ser omitidas, embora os pontos e vírgulas são obrigatórios. Tanto que os comandos de iniciação, condição e incremento podem ser qualquer comando válido em C, mesmo que as variáveis não tenham relação entre si. E é permitido o uso de qualquer tipo de variável, mesmo float. Estes tipos não usuais para comandos “for” devem fornecer soluções para alguns problemas raros de programação.
Por exemplo, utilizando multiplicação na parte incremental gerará uma progressão logarítimica:

for(int x = 2; x < 100; x = x * 1.5){
println(x);
}
Resultado: 2,3,4,6,9,13,19,28,42,63,94
Outro exemplo, esvanece um LED ao ligar e desligar com esse laço “for”

void loop()
{
   int x = 1;
   for (int i = 0; i > -1; i = i + x){
      analogWrite(PWMpin, i);
      if (i == 255) x = -1;             // muda a direção no pico
      delay(10);
   } 
}

laço while

Descrição

Laços “while” vão executar sequencialmente e para sempre, até que a expressão dentro dos parênteses () se torne falsa. Algum evento deve mudar o estado da variável testada, ou então o laço “while” não terminará nunca. Este evento pode estar em seu código, como uma variável incremental, ou uma condição externa, como um sensor de teste, um botão etc.

Sintaxe

while(expressão){
  // comando(s)
}

Parametros

expressão - um (boolean) comando C que retorne verdadeiro ou falso (true ou false)

Exemplo

var = 0;
while(var < 200){
  // faça alguma coisa repetitiva por 200 vezes
  var++;
}

Traduzido do Original em Inglês por Renato Aloi

domingo, 11 de dezembro de 2011

Strings no Arduino


Descrição

Strings de texto podem ser representadas de duas formas. Você pode utilizar o tipo de variável “String”, que é parte do Arduino desde a versão 0019, ou você pode fazer uma string a partir de um array de variáveis do tipo “char” e adicionar a terminação nula.
Este artigo descreve o último método. Para maiores detalhes sobre o objeto String, que permite maiores funcionalidades (e também maior custo de memória), veja o artigo mais abaixo.

Exemplos

Todas as formas abaixo são declarações válidas de strings.
char Str1[15];
  char Str2[8]  = {'a','r','d','u','i','n','o'};
  char Str3[8]  = {'a','r','d','u','i','n','o','\0'};
  char Str4[ ]  = "arduino";
  char Str5[8]  = "arduino";
  char Str6[15] = "arduino";


Possibilidades para declaração de strings
  • Declare um array de caracteres (char) sem iniciá-lo, como feito em Str1
  • Declare um array de caracteres (char), com um caractere adicional, e o próprio compilador acrescentará o caractere de terminação nula, como feito em Str2
  • Adicionar explicitamente o caractere nulo, como em Str3
  • Inicie com uma constante de texto, contida entre aspas; o compilador vai definir o tamanho do array de caracteres automaticamente, calculando o tamanho da string mais o terminador nulo, conforme Str4
  • Inicie um array com o tamanho declarado explicitamente e uma constante de texto entre aspas, vide: Str5
  • Inicie um array, deixando espaço extra para strings com tamanhos maiores, conforme Str6


Terminação Nula
Geralmente, strings são terminadas com um caractere nulo, (código ASCII zero [0]). Isto permite que funções (como a Serial.print()) conhecerem onde termina o texto da string. Caso contrário, essas funções continuariam a ler bytes da memória que não fazem parte da string.
Isso significa que sua string precisa ter espaço suficiente para um ou mais caracteres além do texto que você deseja armazenar. É por isso que a variável Str2 e Str5 (acima) precisam de 8 caracteres, mesmo tendo a palavra “arduino” apenas 7 letras – a última posição é preenchida automaticamente com o caractere nulo. Str4 será automaticamente redimensionada para o tamanho de 8 caracteres, sendo uma posição para o nulo. Na variável Str3, nós declaramos explicitamente o tamanho e adicionamos o caractere nulo ('\0') por nossa conta.
Veja que é possível ter uma string sem o caractere final nulo (por exemplo, declarando a variável Str2 com 7 ao invés de 8 caracteres). Isso falhará na maioria das funções que esperam uma string para funcionar, portanto não faça isso intencionalmente! Se você perceber um comportamento diferente, como adição de caracteres estranhos na sua string, este pode ser o problema.


Aspas Simples ou Duplas?
Strings sempre são definidas escrevendo-se um texto contido entre aspas duplas (exemplo: "Abc"), e caracteres sempre são definidos escrevendo-se uma única letra (ou dígito, ou algum caractere da tabela ASCII), contido dentre aspas simples, ou apóstrofes (exemplo: 'A').
Quebrando strings longas
Você pode quebrar strings assim:
char myString[] = "Um texto que começa aqui"
" e termina logo"
" ali";
Array de Strings
Quando trabalhamos com uma grande quantidade de texto, em um projeto com display LCD, por exemplo, é muito comum fazer uso de um array de strings. Como as strings por si só são arrays de caracteres, um array de string nada mais é senão um array bi-dimensional de caracteres.
No código abaixo, o asterisco após o tipo de variável (“char*”), indica que esta variável é um array de ponteiros. Todos os arrays na realidade são ponteiros de memória, então este é o requisito para fazer arrays de arrays. O estudo de ponteiros é uma das partes mais difíceis para um iniciante, mas é necessário entender ponteiros em detalhes, para usá-los de forma efetiva aqui.

Exemplo

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};

void setup(){
Serial.begin(9600);
}

void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}

Objeto String

Descrição

A classe String, parte do Arduino desde a versão 0019, nos permite utilizar e manipular strings de texto de uma maneira mais completa aos arrays de caracteres. Você pode concatenar textos, adicionar trechos de texto, pesquisar expressões no texto e substituir trechos, e muito mais. Consome mais memória que um simples array de caracteres, mas é muito mais útil.
Para referência, arrays de caracteres são declarados como “string” com o “s” minúsculo, e instâncias da classe String são declaradas como “String”, com a letra “S” maiúscula. Repare também que strings constantes, especificadas por aspas duplas, são tratadas como arrays de caracteres, e não como instâncias da classe String.


Funções

Operadores

Exemplos

Tradução por Renato Aloi
Original em Inglês -- http://www.arduino.cc/en/Reference/String

sábado, 3 de dezembro de 2011

Material de Apoio do Curso Arduino (Aulas 7-8)


Pessoal,

Segue esquema elétrico da solução apresentada nas aulas 7 e 8 do Curso Arduino:



Abaixo temos o código da montagem feita na aula 8, para acionamento de um motor, a partir de um botão:

byte BOTAO = 0;
byte MOTOR = 0;

byte PORTA_B = 10;
byte PORTA_M = 8;

void setup()
{
pinMode(PORTA_B, INPUT);
digitalWrite(PORTA_B, 1); // Liga PullUp!

pinMode(PORTA_M, OUTPUT);
digitalWrite(PORTA_M, 0); // Motor Deslig.
}

void loop()
{
BOTAO = digitalRead(PORTA_B);
if (BOTAO == 0)
{
MOTOR = !MOTOR;
digitalWrite(PORTA_M, MOTOR);
delay(500);
}
delay(1000);
}

Abraços,
Renato Aloi

quarta-feira, 16 de novembro de 2011

Constantes do Arduino


Constantes

Constantes são variáveis pré-definidas da linguagem do Arduino. Elas são usadas para fazer com que programas fiquem mais fáceis de ler. Constantes são classificadas em grupos.

 

Definindo Níveis Lógicos e Constantes Booleanas (true e false)

Existem duas constantes utilizadas para representar verdade e falsidade na linguagem do Arduino: true (verdadeiro) e false (falso).

false

Falso é o mais fácil de se definir. Falso é definido como zero (0).

true

Verdadeiro é normalmente tido como um (1), que está correto, mas verdadeiro tem uma definição mais ampla. Qualquer inteiro que não seja zero (0) é considerado verdadeiro, num sentido booleano. Então -1, 2 e -200 são todos definidos como verdadeiro, também em um sentido booleano.
Note que as constantes verdadeiro (true) e falso (false) são digitadas em caixa-baixa (letras minúsculas), ao contrário de HIGH (ALTO), LOW (BAIXO), INPUT (ENTRADA) e OUTPUT (SAIDA).

 

Definindo os Níveis das Portas, HIGH e LOW

Quando lendo ou escrevendo em uma porta digital, existem apenas dois valores possíveis que a porta pode ser lida/configurada: HIGH (ALTO) e LOW (BAIXO).
HIGH
O entendimento de HIGH (em relação a porta) é um pouco diferente dependendo se a porta foi configurada como INPUT (ENTRADA) ou OUTPUT (SAIDA). Quando uma porta é configurada como INPUT, utilizando a função pinMode, e lida com a função digitalRead, o microcontrolador retornará HIGH se a voltagem de 3 volts ou mais estiver presente na porta.
Uma porta também pode ser configurada como INPUT com o pinMode e na sequência ser configurada como HIGH com a função digitalWrite. Isto ativará o resistor interno de elevação de 20K ohms, o qual derivará a porta para o valor HIGH a não ser que ela seja trazida para LOW, por um circuito externo.
Quando uma porta é configurada para OUTPUT com a função pinMode, e configurada para HIGH com a digitalWrite, a porta ficará em 5 volts. Neste estado, a porta pode fornecer corrente, por exemplo para acender um LED, conectado através de um resistor em série com o terra (ground ou GND), ou mesmo para outro pino configurado como saída e com valor LOW (tem o mesmo efeito do GND).
LOW (BAIXO)
O significado de LOW também tem diferentes entendimentos dependendo de como a porta é configurada para INPUT ou OUTPUT. Quando uma porta é configurada como INPUT pela função pinMode, e lida com a função digitalRead, o microcontrolador irá retornar LOW se a voltagem de 2 volts ou menos estiver presente na porta.
Quando uma porta é configurada para OUTPUT com pinMode, e configurada como LOW pelo digitalWrite, a porta terá o valor de 0 volts. Neste estado podemos ancorar corrente, como no exemplo do LED ligado através de um resistor em série com uma porta OUTPUT no estado HIGH.

 

Definindo Portas Digitais, INPUT (ENTRADA) e OUTPUT (SAIDA)

Portas digitais podem ser usadas tanto como INPUT ou OUTPUT. Mudar o estado de uma porta de INPUT para OUTPUT com a função pinMode() muda drasticamente as características elétricas da porta.

Porta Configurada como Entrada

Portas do Arduino (ATMega) configuradas como INPUT com pinMode estão em um estado conhecido por alta-impedância. Uma forma de explicar isso é que a porta configurada como INPUT demanda muito pouca corrente do circuito que está amostrando, como se tivesse um resistor de 100 Megaohms em série com a porta. Isto se faz útil para leitura de um sensor, mas não para acender um LED.

Porta Configurada como Saída

Portas configuradas como OUTPUT com pinMode estão em um estado conhecido por baixa-impedância. Isso significa que elas podem fornecer uma quantidade substancial de corrente para outros circuitos. As portas do ATMega podem fornecer (prover corrente positiva) ou ancorar (prover corrente negativa) até 40 mA (miliamperes) de corrente para outros dispositivos/circuitos. Configuradas dessa forma, as portas podem fornecer corrente para acender um LED, mas se tornam inúteis para leitura de um sensor. Portas configuradas como saída podem também ser danificadas ou destruídas se curto-circuitadas tanto ao terra quanto aos 5 volts. A corrente fornecida pelas portas do ATMega também não são suficientes para a maioria dos motores e relês, então algum circuito de casamento se faz necessário.

Tradução

Por Renato Aloi, do original em inglês, no site: http://arduino.cc/en/Reference/Constants


Curso Arduino - Aula 5 (Variáveis) por Renato Aloi

quarta-feira, 9 de novembro de 2011

Variáveis do Arduino


Variáveis

Uma variável é uma forma de nomear e guardar um valor para usar depois pelo programa, como dados de um sensor, ou ainda, um valor intermediário de um cálculo.

Declarando Variáveis

Antes de serem utilizadas, as variáveis devem ser declaradas. Declarar uma variável significa definir seu tipo, e opcionalmente, configurar um valor inicial (iniciar a variável). Variáveis não precisam ser iniciadas (conferidas um valor) quando estas são declaradas, mas muitas vezes se faz útil.
int inputVariable1;  // iniciando variável
int inputVariable2 = 0;     // iniciando e atribuindo valor
Programadores devem considerar o tamanho dos números que desejam guardar, escolhendo o tipo da variável. Variáveis sobrecarregam quando o valor excede o espaço designado para guardá-lo. Veja abaixo por exemplo.

Escopo da Variável

Outra escolha importante que os programadores enfrentam é onde declarar as variáveis? O lugar específico que as variáveis são declaradas influencia como várias funções do programa a enxergarão. Isto é chamado de escopo.

Iniciando Variáveis

Variáveis devem ser iniciadas (designadas um valor) no momento que elas são declaradas ou depois. É sempre uma boa prática de programação verificar que uma variável tenha dados válido dentro dela, antes de ser utilizada.
Exemplo:
int calibrationVal = 17;  // declara calibrationVal e configura seu valor
           // inicial

Sobrecarga da Variável

Quando variáveis têm seu valor excedido pela capacidade máxima do seu tipo, elas sobrecarregam e voltam para seu valor mínimo. Isto acontece em ambas  direções.
int x
   x = -32,768;
   x = x - 1;       // x contém 32,767 - sobrecarrega na direção negativa
   x = 32,767;
   x = x + 1;       // x contém -32,768 – sobrecarrega

Usando Variáveis

Uma vez que variáveis tenham sido declaradas, elas podem ser usadas configurando a variável para o valor que se deseja armazenar, através do operador de atribuição (um sinal de igual). O operador de atribuição diz ao programa para atribuir o que estiver do lado direito do sinal de igual, dentro da variável que deve ficar do lado esquerdo do sinal de igual.
inputVariable1 = 7;             // configura variável chamada inputVariable1 
        // atribuindo o valor 7
inputVariable2 = analogRead(2); // configura variável chamada inputVariable2 
        // atribuindo a voltagem lida de uma porta 
                                // analógica 2

Exemplos

int lightSensVal;
   char currentLetter;
   unsigned long speedOfLight = 186000UL;
   char errorMessage = {"escolha outra impressão"}; // vide: string 
 
Uma vez que a variável tenha sido configurada (conferida um valor), você pode testar seu valor para verificar se atende determinada condição, ou usar seu valor diretamente. Por exemplo, o código a seguir testa se o valor da variável inputVariable2 é menor que 100, então configurando um atraso (delay) baseado no valor de inputVariable2, que é no mínimo 100.
if (inputVariable2 < 100)
{
  inputVariable2 = 100;
}

delay(inputVariable2);
 
Este exemplo mostra todas as três operações úteis que se pode fazer com variáveis. Ele testa a variável (if (inputVariable2 < 100)), configura o valor 100 caso o teste tenha passado (inputVariable2 = 100), e utiliza o valor armazenado na variável como parâmetro de entrada na função delay (delay(inputVariable2)).
Nota de Estilo: Você deve nomear suas variáveis descrevendo as características do valor guardado, para fazer o código ficar mais agradável de ler. Nomes de variáveis como tiltSensor ou pushButton te ajudam (ou a qualquer um que esteja lendo seu código) a entender o que a variável representa.
Você pode nomear uma variável com qualquer palavra que você quiser, desde que não sejam as reservadas do Arduino (link para palavras reservadas). Evite nomes que comecem com números.

Alguns Tipos de Variáveis


Escopo das Variáveis

Variáveis na linguagem C, que o Arduino usa, tem uma característica conhecida por escopo. Isto é um contraste com linguagens como BASIC que qualquer variável é uma variável global.
Uma variável global é uma que pode ser vista por qualquer função dentro de um programa. Variáveis locais são apenas visíveis para a função na qual foram declaradas. No ambiente do Arduino, qualquer variável declarada fora de uma função (ex. setup, loop, etc.), é considerada uma variável global.
Quando programas começam a ficar grandes e mais complexos, variáveis locais são úteis para garantir que apenas uma função terá acesso apenas as suas próprias variáveis. Isso evita erros de programação quando uma função inadvertidamente, modifica o valor de variáveis utilizadas por outra função.
Algumas vezes é útil declarar e iniciar uma variável interna para um laço (loop). Assim criamos uma variável que possa apenas ser acessada na parte interna das chaves {} do laço-for.

Exemplo:

int gPWMval;  // qualquer função acessa essa variável

void setup()
{
  // ...
}

void loop()
{
  int i;    // "i" é apenas "visível" dentro da função "loop"
  float f;  // "f" é apenas "visível" dentro da função "loop"
  // ...

  for (int j = 0; j <100; j++){
   // variável “j” pode ser apenas 
   // acessada dentro das chaves do laço-for 
  }

}

Tradução: Renato Aloi


quinta-feira, 3 de novembro de 2011

Funções do Arduino


Segmentar o código em funções possibilita ao programador criar partes modulares, que desempenham tarefas bem definidas, e então retornam para a área do código a partir de onde foram chamadas. O caso típico de criação de uma função é quando existe a necessidade de executar a mesma tarefa diversas vezes durante um programa.
Para programadores acostumados ao BASIC, funções do Arduino fornecem (e estendem) a utilidade do uso das subrotinas (GOSUB em BASIC).
Padronizar fragmentos de código em funções tem várias vantagens:
  • Funções ajudam o programador permanecer organizado, muitas vezes, isso ajuda a montar o conceito do programa.
  • Funções codificam a tarefa em um único lugar, para que a funcionalidade seja pensada e depurada uma única vez.
  • As chances de erros em modificações reduzem drasticamente, no caso do código precisar ser alterado.
  • Funções reduzem o tamanho dos Sketches (projetos criados na IDE do Arduino, do inglês: rascunhos), pois seções de código podem ser reutilizadas diversas vezes.
  • Elas também tornam mais fácil reutilizar código, tornando-o mais modular, e com um efeito colateral benéfico: fica mais agradável de ler o código.
Existem duas funções mandatórias nos Sketches do Arduino: setup() e loop(). Outras funções podem ser criadas fora das chaves ({}) dessas duas funções. Como um exemplo, vamos criar uma função simples para multiplicar dois valores.

Exemplo



Para “chamar” nossa função simples de multiplicação, nós passamos os parâmetros do tipo de dados que a função está esperando:
void loop{
int i = 2;
int j = 3;
int k;

k = myMultiplyFunction(i, j); // k now contains 6
}
Nossa função precisa ser declarada fora de qualquer outra função, então “MinhaFuncaoMultiplicar()” pode ficar tanto acima quanto abaixo da função principal “loop()”.
O código completo deve ficar parecido com isto:
void setup(){
  Serial.begin(9600);
}

void loop() {
  int i = 2;
  int j = 3;
  int k;

  k = myMultiplyFunction(i, j); // k now contains 6
  Serial.println(k);
  delay(500);
}

int myMultiplyFunction(int x, int y){
  int result;
  result = x * y;
  return result;
}

Outro exemplo

Esta função abaixo fará a leitura de um sensor, cinco vezes, utilizando a função analogRead(); calculando a média das cinco leituras. Ela também converte os dados da leitura para 8 bits (0-255), e a inverte, invertendo assim a saída.
int ReadSens_and_Condition(){
  int i;
  int sval = 0;

  for (i = 0; i < 5; i++){
    sval = sval + analogRead(0);    // sensor na porta analógica 0
  }

  sval = sval / 5;    // média
  sval = sval / 4;    // converte para 8 bits (0 - 255)
  sval = 255 - sval;  // inverte a saída
  return sval;
}
Para chamar a função, nós apenas fazemos a atribuição para uma variável.
int sens;

sens = ReadSens_and_Condition();

Tradução

Por Renato Aloi, do original em inglês, no site: http://arduino.cc/en/Reference/HomePage
 

quinta-feira, 20 de outubro de 2011

Referência Arduino - pinMode(), digitalWrite() e delay()

Função: pinMode()

Descrição
Configura a porta especificada para se comportar tanto como entrada ou saída. Veja o post sobre portas digitais para maiores detalhes.

Sintaxe
pinMode(pin, mode)

Parâmetros
pin: o número da porta que você deseja configurar
mode: INPUT para entrada e OUTPUT para saída

Retorna
Nada

Nota
As portas analógicas podem ser usadas como portas digitais, referindo-as como A0, A1 etc.

Função: digitalWrite()
 
Descrição
Altera o estado da porta para alto (HIGH) ou baixo (LOW) de uma porta digital.

Se a porta foi configurada como saída (OUTPUT) pela função pinMode(), sua voltagem será correspondente aos valores de 5V (ou 3.3V nas placas de 3.3V) para alto (HIGH), e 0V (GND) para baixo (LOW).

Se a porta é configurada como entrada (INPUT), escrever um valor alto (HIGH) com o digitalWrite() habilitará o resistor de elevação (pullup) interno de 20K (veja a postagem sobre portas digitais). Escrever um valor baixo (LOW) desabilitará o resistor de elevação. Este resistor de elevação é suficiente para acionar muito fracamente um LED, portanto se o LED funcionar, mas dessa forma fraca, esta é a causa mais provável. A solução é configurar a porta para saída (OUTPUT) através da função pinMode().

NOTA: A porta digital 13 é mais difícil de se utilizar como uma porta de entrada dentre as outras portas digitais, pois existe um LED ligado a ela, com um resistor em série, soldado na placa, na maioria das placas. Se você habilitar seu resistor de elevação, ela travará em uma tensão aproximada de 1,7V, ao invés dos esperados 5V, por causa do LED embutido na placa, e o resistor em série sempre puxará o nível de tensão para baixo, resultando sempre em um estado baixo (LOW). Se você quiser usar a porta 13 como entrada digital, ligue um resistor de referência (pulldown) externo.

Sintaxe
digitalWrite(pin, value)

Parâmetros
pin: o número da porta
value: HIGH para o estado alto ou LOW para o estado baixo

Retorna
nada

Configura a porta 13 para o estado alto (HIGH), pausa por um segundo e depois configura a porta de volta para o estado baixo (LOW).

Nota
As portas analógicas podem ser usadas como portas digitais, referindo-as como A0, A1 etc.

Função: delay()

Descrição
Pausa o programa por um período de tempo (em milissegundos) especificado pelo parâmetro. (Existem 1000 milissegundos em um segundo.)

Sintaxe
delay(ms)

Parâmetros
ms: quantidade de milissegundos a parar o programa (unsigned long)

Retorna
nada

Advertência
Assim como é fácil criar o efeito de piscar um LED com a função delay(), e muitos programas (sketches) utilizam pausas curtas para tarefas como garantir o pressionamento de um botão, o uso da função delay() tem significativos obstáculos. Nenhuma outra ação, como leitura de sensores, cálculos matemáticos, ou manipulação de portas funciona durante a pausa pela função delay(). Dessa forma, esta pausa tem como efeito causar a inoperabilidade de todas as outras atividades. Para abordagens alternativas no controle de tempo, considere o uso da função millis(). Programadores mais experientes evitam utilizar a função delay() para cálculos de tempo maiores que 10 milissegundos, a não ser que o programa seja realmente muito simples. Certas coisas, entretanto, continuam funcionando enquanto a função delay() está controlando o chip do ATMega, porque essa função não desabilita as interrupções. Comunicação serial que chega no pino RX é gravada, valores PWM (analogwrite) e o estado das portas são mantidos, assim como as interrupções funcionam como esperado.

 
Exemplo
 
int ledPin = 13; // LED conectado na porta 13
void setup()
{
pinMode(ledPin, OUTPUT); // configura a porta como saida (OUTPUT)
}
void loop()
{
digitalWrite(ledPin, HIGH); // liga (HIGH) o LED
delay(1000); // espera um segundo
digitalWrite(ledPin, LOW); // desliga (LOW) o LED
delay(1000); // espera um segundo
}

quarta-feira, 19 de outubro de 2011

Referência Arduino - Portas Digitais

As portas digitais podem ser configuradas tanto como entrada e saída. Este artigo explica a funcionalidade das portas nesses modos. Enquanto o título deste artigo se refere a portas digitais, é importante lembrar que uma vasta maioria das portas analógicas do Arduino (ATMega) podem ser configuradas, e usadas, da mesma maneira que as portas digitais.

Propriedades das Portas Configuradas como Entrada (INPUT)
Portas do Arduino (ATMega) são por padrão consideradas como entradas, então estas não precisam explicitamente ser declaradas como entrada através da função pinMode(). Portas configuradas como entrada se encontram em um estado conhecido por alta impedância. Uma forma de explicar isso é que portas de entrada demandam muito pouco, ou quase nada, do circuito que estão amostrando, equivalente a um resistor de 100 mega ohms em série com a porta. Isto significa que não é necessária muita corrente para alternar as portas de entrada de um estado para outro, e que estas podem se tornar muito úteis para tarefas como: implementar um sensor capacitivo, sensível ao toque; efetuar a leitura de um LED como se fosse um foto-diodo; ou ainda fazer a leitura de um sensor analógico com um esquema RCTime.

Isto significa também, entretanto, que as portas de entrada apresentarão sensibilidade aleatória entre estados pelo simples fato de não ter nada conectado a elas, ou mesmo por estarem conectadas a um fio solto, detectando ruído elétrico a partir do ambiente, ou acoplamento capacitivo do estado das portas adjacentes.

Resistor de Elevação (Pullup)
Dessa forma se faz necessário, muitas vezes, nortear uma porta de entrada para um estado conhecido, quando nenhum sinal se faz presente. Isto pode ser feito adicionando na entrada, um resistor de elevação (ligando no 5V), ou um resistor de referência (pulldown - ligado no terra). 10k ohms é um valor comumente utilizado.

Existem também resistores de elevação convenientemente construídos internamente no chip do ATMega, que podem ser acessados via programação. Estes resistores de elevação embutidos podem ser acessados da seguinte maneira:

pinMode(pin, INPUT); // configura a porta como entrada
digitalWrite(pin, HIGH); // liga o resistor de elevação (pullup)

Note que estes resistores de elevação provêm corrente suficiente para acender de forma bem suave um LED conectado a porta configurada como entrada. Se os LED's de um projeto estiverem acendendo dessa forma bem suave, provavelmente é exatamente isso que está acontecendo e o programador esqueceu de usar a função pinMode() para configurar as portas como saída (OUTPUT).

Repare também que os resistores de elevação são controlados pelos mesmos registradores (endereços internos da memória do chip) que controlam se uma porta está em um estado alto (HIGH) ou baixo (LOW). Consequentemente um pino que é configurado para ter um resistor de elevação ligado quando a porta é uma entrada, manterá o estado alto mesmo quando a porta for alterada para saída, através da função pinMode(). Isso funciona de forma inversa também, e uma porta de saída deixada em estado alto, terá os resistores de elevação automaticamente ligados se for alterada para o modo de entrada pelo pinMode().

NOTA: A porta digital 13 é mais difícil de se utilizar como uma porta de entrada dentre as outras portas digitais, pois existe um LED ligado a ela, com um resistor em série, soldado na placa, na maioria das placas. Se você habilitar seu resistor de elevação, ela travará em uma tensão aproximada de 1,7V, ao invés dos esperados 5V, por causa do LED embutido na placa, e o resistor em série sempre puxará o nível de tensão para baixo, resultando sempre em um estado baixo (LOW). Se você quiser usar a porta 13 como entrada digital, ligue um resistor de referência (pulldown) externo.

Propriedades das Portas Configuradas como Saída (OUTPUT)
Portas configuradas como saída através do pinMode() encontram-se em um estado de baixa impedância. Isso significa que elas podem fornecer uma quantidade considerável de corrente para outros circuitos. As portas do ATMega podem alimentar (fornecer corrente positiva) ou ancorar (fornecer corrente negativa) até 40mA (miliampéres) de corrente para outros dispositivos/circuitos. Isso é corrente suficiente para acender bem forte um LED (não se esqueça do resistor em série), ou acomodar vários sensores, por exemplo; mas não fornece corrente suficiente para ativar diretamente a maioria dos relês, solenóides, ou motores.

Curto-circuitos nas portas do Arduino, ou tentativas de ativar dispositivos que consomem altas correntes, podem danificar ou até destruir o transistor de saída da porta; ou ainda danificar completamente o chip ATMega. Muitas vezes isso resulta em um pino "morto" no microcontrolador, mas o resto do chip ainda funciona adequadamente. Por essa razão, é uma boa ideia conectar portas de saída aos dispositivos, através de um resistor de 470 ou 1k ohms, a não ser que a máxima corrente consumida das portas seja necessária para alguma aplicação em particular.

Tradução literal do Inglês para Português do original, extraído do site arduino.cc, conforme link que segue:
http://arduino.cc/en/Tutorial/DigitalPins

by
Renato Aloi

Curso Arduino - Aula 2 (Eletrônica Básica)

Curso Arduino - Aula 1 (Iniciando)

sábado, 15 de outubro de 2011

Instalando Arduino - Guia Completo

Tenho ministrado cursos sobre Arduino e a principal dificuldade de quem começa a desenvolver com essa tecnologia é justamente a instalação do ambiente no computador. Resolvi então escrever esse artigo para ajudar quem está começando nessa nova e maravilhosa plataforma.

 
Vamos ao fatos: o grande problema da instalação do Arduino é a quantidade de Sistemas Operacionais existentes. Temos Windows XP, Vista e 7; Mac OS; e finalmente uma enorme quantidade de distribuições Linux. Além de tudo isso, temos versões 32 e 64 bits. Isso sem falar que existem várias distribuições do Arduino, como UNO, Duemilanove, Decimila, Mega etc. Não se preocupe, vou tentar cobrir todas as possibildades.

 
Para quem não conhece o Arduino, é uma plataforma de desenvolvimento baseada em microcontroladores da Atmel. Com o Arduino somos capazes de criar dispositivos que "sentem" e controlam dispositivos. Por exemplo, podemos utilizar um sensor de luminosidade para "sentir" o cair da noite e acionar o acendimento de uma lâmpada. Mas este é apenas um exemplo. Podemos também acionar motores, relês, além de detectar calor, movimento etc. Tudo depende dos dispositivos ligados ao Arduino.

 
Vamos então partir para a instalação do Arduino no computador. Precisamos de duas coisas:
  • Instalar o programa de desenvolvimento (conhecido por IDE)
  • Instalar o driver USB
O mais fácil é baixar e instalar a IDE (Ambiente Integrado de Desenvolvimento). Para isso, basta acessar o seguinte endereço e fazer o download específico para seu sistema operacional:

 
http://arduino.cc/en/Main/Software

 
Na página do link acima, escolha entre as versões Windows, Mac ou Linux, ou então clicque diretamente nos links da lista abaixo:
Vamos começar pelo Windows. Não importa se é XP, Vista ou 7. Basta baixar a versão denominada apenas "Windows". Não existe instalador, o que você vai baixar é um arquivo compactado, do tipo ZIP. Para abrir este arquivo e descompactar a IDE do Arduino, você precisará de um programa chamado WinRar. Algumas versões de Windows lidam com arquivos ZIP de forma transparente, mas para todos os efeitos, segue o link do programa gratuito WinRar:

 
http://www.baixaki.com.br/download/winrar.htm

 
Descompacte esse arquivo chamado "arduino-0022.zip" (é a versão atual enquanto eu escrevo esse artigo) em uma pasta com o mesmo nome, de preferência no drive "C:", para que o caminho fique assim: "C:\arduino-0022". Vou considerar que você seguiu essas orientações para facilitar o entendimento desse artigo. Dentro dessa pasta, você verá que existe um arquivo executável chamado "arduino.exe". Este é o ponto de entrada do programa principal do Arduino, ou seja, a IDE ("C:\arduino-0022\arduino.exe").

 
Outra coisa importante dentro do diretório "arduino-0022" é a pasta "drivers" ("C:\arduino-0022\drivers"). Nesta pasta é onde gastaremos a maior parte do nosso esforço. Isso porque já terminamos a instalação da IDE e vamos partir para a instalação do Driver USB.

 
Agora precisamos verificar algumas coisas, entre elas qual a versão do seu Arduino. Vamos começar conectando o Arduino no computador através do cabo USB. Faça isso agora, mas se você já tentou e não conseguiu, não se preocupe. Vamos aos passos:

 
Para o Arduino UNO ou Mega 2560 no Windows XP, Vista ou 7
  1.  Conecte a placa via cabo USB no computador. O assistente de instalação deve aparecer. Clique em "Avançar" até que o Windows diga que não conseguiu instalar o driver (não se preocupe, é assim mesmo). Clique em "Concluir" para dispensar o assistente.
  2. Clique então no menu "Iniciar" e selecione a opção "Painel de Controle".
  3. No painel de controle, clique no ícone "Sistema" (dependendo do Windows, pode estar dentro da categoria "Sistema e Segurança"). Na tela que aparecer, selecione "Hardware" e depois "Gerenciador de Dispositivos" (mais uma vez essa opção pode variar um pouco dependendo da versão do Windows).
  4. Procure pela opção "Portas (COM & LPT)". Clique no sinal de adição (+) correspondente a essa opção e uma entrada chamada "Arduino UNO (COMxx)" deve aparecer. Pode ser que você não encontre essa entrada na opção "Portas", se for esse o caso, procure por um "Dispositivo Desconhecido" na opção "Outros Dispositivos". Se você tiver mais de um dispositivo desconhecido, ou tiver dúvidas nesse ponto, desligue e religue o cabo do Arduino e preste atenção qual a entrada que some quando você desliga o Arduino e que reaparece quando você o reconecta.
  5. Clique então na entrada descrita no passo 4 com o botão direito do mouse para aparecer o menu de contexto. Selecione a opção "Atualizar driver...". 
  6. Na tela que aparecer, selecione a opção "Instalar de uma lista ou local específico (Avançado)" e clique em "Avançar".
  7. Na próxima tela, verifique que a opção selecionada é a "Procurar melhor driver nestes locais". E nas caixas de seleção logo abaixo essa opção, desmarque a primeira, denominada "Pesquisar mídia removível (disquete, CD-ROM...)" e marque a segunda "Incluir este local na pesquisa:". Quando você fizer isso, o campo de pesquisa e o botão "Pesquisar" ficarão disponíveis.
  8. Clique então no botão "Pesquisar" e localize a pasta "Drivers" que se encontra no local "C:\arduino-0022\drivers\" (se você seguiu os passos de instalação desse tutorial). AtençãoNÃO escolha a sub-pasta "FTDI USB Drivers". Clique em "OK" para concluir a escolha da pasta.
  9. Agora clique em "Avançar" até concluir a instalação do driver. Pode ser que o Windows apresente uma tela dizendo que o driver pode não ser confiável. Clique na opção que diz para instalar assim mesmo!
  10. Clique em "Concluir" para finalizar a instalação.
Em caso de dúvidas, veja um passo-a-passo ilustrado de como fazer as ações acima, clicando no link abaixo:
http://arduino.cc/en/Guide/UnoDriversWindowsXP

 
Para Arduino Duemilanove, Mega, Nano ou Diecimila no Windows XP, Vista ou 7


Quando você conectar o Arduino via cabo USB, o instalador do Windows deve aparecer automaticamente.
 
No Windows Vista, selecione a opção "Instalar automaticamente" (Realmente funciona!)
 
No Windows 7 64 bits, baixe e utilize o driver do seguinte link:
http://www.ftdichip.com/Drivers/CDM/CDM20814_WHQL_Certified.zip
 
No Windows XP, o assistente de instalação de novo hardware aparecerá, siga os passos abaixo:
  1. Quando aparecer a tela perguntando "Deseja que o Windows procure automaticamente o driver na internet?", selecione a opção "Não dessa vez" e clique em "Avançar". 
  2. Na tela que aparecer, selecione a opção "Instalar de uma lista ou local específico (Avançado)" e clique em "Avançar".
  3. Na próxima tela, verifique que a opção selecionada é a "Procurar melhor driver nestes locais". E nas caixas de seleção logo abaixo essa opção, desmarque a primeira, denominada "Pesquisar mídia removível (disquete, CD-ROM...)" e marque a segunda "Incluir este local na pesquisa:". Quando você fizer isso, o campo de pesquisa e o botão "Pesquisar" ficarão disponíveis.
  4. Clique então no botão "Pesquisar" e localize a pasta "FTDI USB Drivers" que se encontra no local "C:\arduino-0022\drivers\FTDI USB Drivers\" (se você seguiu os passos de instalação desse tutorial). Clique em "OK" para concluir a escolha da pasta.
  5. Agora clique em "Avançar" até concluir a instalação do driver. Pode ser que o Windows apresente uma tela dizendo que o driver pode não ser confiável. Clique na opção que diz para instalar assim mesmo!
  6. Quando a instalação terminar, o Windows dirá que o "USB Serial Converter" foi instalado. Clique em "Concluir" para finalizar a instalação.
  7. Nesse momento, outro assistente de instalação de hardware deve aparecer. Siga novamente os passos acima, mas desta vez, ao terminar o Windows dirá que o "USB Serial Port" foi instalado. Clique em "Concluir" para finalizar essa segunda instalação.
Você pode verificar se a instalação ocorreu com sucesso, acessando o Gerenciador de Dispositivos (na aba Hardware do item Sistema, no Painel de Controle). Procure na seção "Portas (COM & LPT)" pela entrada "USB Serial Port".

Instalando Arduino no Mac OS X

Após fazer o download, conforme indicado no início deste tutorial, a imagem de disco (.dmg) deve abrir automaticamente. Caso isso não aconteça, clique duas vezes sobre o arquivo "arduino-0022.dmg".

Para o Arduino UNO e Mega 2560, apenas copie a pasta do Arduino para sua pasta de Aplicações. Não é necessário instalar nenhum driver.

Se você estiver usando uma versão anterior (Duemilanove, Mega, Nano ou Diecimila) não esqueça de instalar o driver do FTDI, clicando duas vezes no arquivo "FTDIUSBSerialDriver_10_4_10_5_10_6.mpkg" e siga as instruções do instalador. Você precisará reiniciar o computador após a instalação do driver.

Instalando Arduino no Linux

Acredito que a instalação mais complicada de ser explicada é a do Linux, pois existem muitas distribuições diferentes e muitos detalhes a serem verificados. Vou fazer uma explicação geral aqui, pois entendo que o usuário do Linux é experiente. O próprio site do Arduino tem uma seção exclusivamente para detalhes sobre a instalação nas mais diversas distribuições do Linux, que podem ser encontradas no link abaixo:

http://www.arduino.cc/playground/Learning/Linux

De uma forma geral, a instalação no Linux depende da instalação dos seguintes programas (o jeito de instalar as opções abaixo depende da sua distribuição):
  • openjdk-6-jre (emmbora o java runtime da Sun deve funcionar também: sun-java6-jre)
  • avr-gcc (conhecido por "gcc-avr"), versão 4.3.2 ou versões 4.3.x (Versões 4.4.x e 4.5.x apresentam vários problemas)
    • Versão 4.3.0 tem um problema que afeta multiplicação de inteiros longos. Esta é a versão padrão do Ubuntu Intrepid (8.10). Verifique usando o comando "avr-gcc --version" e atualize-a se necessário.
    • Versões ateriores a 4.3.0  não suportam o ATmega328 (que vem com o Arduino Duemilanove).
    • Quem roda versões das distribuições como Hardy Heron (Ubuntu) ou Etch (Debian) e anteriores precisarão atualizar suas versões do avr-gcc.
  • avr-gcc-c++ (Senão você experimentará o erro: Cannot run program "avr-g++": java.io.IOException:Error=2: No such file or directory)
  • avr-libc
Efetue o download da última versão do Arduino para Linux, conforme indicado no início deste tutorial. Copie/extraia os arquivos baixados para um diretório (ou seu desktop) e rode o script do "arduino". Certifique-se que o diretório extraído não tenha espaços no nome.

Abrindo a IDE do Arduino

Lembra do "arduino.exe" que está na pasta "C:\arduino-0022", mostrado no começo do tutorial? Pois é hora de clicar duas vezes nesse arquivo. Isso fará com que o ambiente de desenvolvimento do Arduino inicie.

Configurando a IDE do Arduino

Com o ambiente iniciado, selecione o menu Tools > Boards e escolha a sua versão do Arduino. Se você está usando um Arduino UNO, a IDE já deve estar configurada por padrão. Mas não deixe de verificar essa opção.

No Windows, uma última coisa a ser verificada é no menu Tools > Serial Port. Selecione a porta COM do seu Arduino. Se você não sabe qual é a porta certa (caso tenha mais de uma), verifique no Gerenciador de Dispositivos (na aba Hardware do item Sistema, no Painel de Controle).

Caso seu Arduino seja o UNO, procure na seção "Portas (COM & LPT)" pela entrada "Arduino UNO (COMxx)", onde "xx" será o número da porta do Arduino.


Caso seu Arduino seja o Duemilanove, Nano ou Diecimila, procure na seção "Portas (COM & LPT)" pela entrada "USB Serial Port (COMxx)", onde "xx" será o número da porta do Arduino.
No Mac OS X, caso seu Arduino seja o UNO ou Mega 2560, a porta serial a ser escolhida deve ser a que começa com "/dev/tty.usbmodem", caso seja uma versão anterior do Arduino (Duemilanove, Mega, Nano ou Diecimila), a porta serial deve ter um nome que começa com "/dev/tty.usbserial".

Conclusão

Bom, espero ter conseguido cobrir as principais maneiras de se instalar o Arduino nos principais sistemas operacionais. Lógico que sempre existe uma situação em particular que não deve estar nesse artigo, mas para quem ainda está experimentando problemas ou tem dúvidas, utilize o campo de comentários para se expressar. Críticas, sugestões e informações adicionais são bem-vindas.

Obrigado!
Renato Aloi