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
}

12 comentários:

  1. Renato fantastico seu blog.

    Excelente iniciativa, aprendendo MUITO.

    ResponderExcluir
  2. começando aqui no blog hj
    vamos em frente
    parabens Renato

    ResponderExcluir
  3. Cara, uma dúvida... Meu arduino Mega está mandando sinal alto por uma porta INPUT só de colocar uma bananinha nele (mesmo ligada a nada), fica oscilando entre estado alto e baixo, será que queimou alguma coisa?

    ResponderExcluir
    Respostas
    1. Obrigado pelo comentario!!!
      Participe do nosso forum: http://www.seriallink.com.br/forum
      Poste suas duvidas tecnicas lá!!!
      Abraços
      Renato

      Excluir
  4. Aliás, uma matéria sobre as falhas de hardware seria uma ótima. Uma outra Mega minha ficou "louca", o estado baixo das saídas, quando configuradas como OUTPUT, sofriam interferência só de um humano chegar perto, ainda tenho ela guardada mas por enquanto dou por perdida... Em ambos os casos se está estragada pode ser por excesso de carga, na primeira por inexperiência liguei um motor de passo e na segunda, 16 leds... Queria saber o que é e se dá pra restaurar, dá dó perder as duas placas...

    ResponderExcluir
  5. Ola Renato Aloi estou começando agora, tenho um pequeno conhecimento em eletrônica estou fazendo algumas pesquisas sobre arduino achei seu blog e você e um cara muito aplicado veleu pela força no incentivo de um area tão pouco valorizada abraços.
    Thiago.

    ResponderExcluir
  6. vou assistir tods as aulas, cara vc eh nota 1000

    ResponderExcluir
  7. Muitos parabéns renato. Estou iniciando minha "aventura" no arduino, e as suas vídeo-aulas são os meus primeiros passos. tou gostando muito pois está tudo muito claro e suas explicações muito elucidativas. Obrigado por nos ajudar a abrir esta "porta" para o mundo do arduino!

    ResponderExcluir
  8. Começando hoje 31/05/2014, nas primeiras vídeo aula de 2011...Já já alcanço vocês!! Obrigado Renato.

    ResponderExcluir
  9. Totalmente excelente! Parabéns pela iniciativa e dedicação ao tema. Forte abraço Renato. Estou assistindo todos os vídeos.

    ResponderExcluir
  10. Rapaz, eu não sabia nada de Arduíno depois de Renato Aloi as coisas melhoraram e muito, valeu Renato!!!

    ResponderExcluir