MCO018703 2023 1 AULA06

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Mapa das Entradas e Saídas do Arduino

OBJETIVOS

O aluno será capaz de:

  • Apresentar o mapa das entradas e saídas do Arduino;
  • Saber utilizar as funções na linguagem do Arduino.


METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos executados programas para programação de microcontroladores. Na prática utilizaremos os pinos digitais como entrada digital fazendo uso de pushbotton.


Fig041 MCO018703.jpg

Figura 1 - Mapa das Entradas e Saídas do Arduino.

Pinos Digitais
São usados para detecção ou transmissão de controles digitais.
Funções em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )


Pinos analógicos
São usados para leitura de sinais de sensores análogicos.
Funções em C:
analogRead( )


Porta USB
É usada para comunicação serial com um computador.
Funções em C:
begin( )
end( )
available( )
read( )
print( )
println( )
Pinos de Alimentação
São usados para alimentação de circuitos externos e reset do Arduino.

Portas de E/S do Arduino e suas Funções

Pinos Digitais

São 14 pinos marcados com o nome DIGITAL logo abaixo de duas barras de 8 pinos. São numerados de 0 a 13 da direita para a esquerda e podem ser configurados pela função pinMode( ) para detetarem ou transmitirem níveis lógicos digitais (verdadeiro/falso, 1/0 ou HIGH/LOW). A Figura 2 mostra o mapa de pinos Digitais do Arduino.

Fig042 MCO018703.jpg

Figura 2 - Mapa dos Pinos Digitais do Arduino.


Função Exemplo Notas
pinMode(pino,modo)

Serve para estabelecer a direção do fluxo de informações em qualquer dos 14 pinos digitais. Dois parâmetros devem ser passados à função: o primeiro indica qual pino vai ser usado; o segundo, se esse pino vai ser entrada ou se vai ser saída dessas informações.

pinMode(2,OUTPUT);

Aqui o pino 2 é selecionado para transmitir informações do Arduino para um circuito externo qualquer. Para configurar esse pino como entrada, o segundo parâmetro dessa função deve ser INPUT.

Essa função é sempre

escrita dentro da função setup( ).

digitalRead(pino)

Uma vez configurado um certo pino como entrada com a função pinMode( ), a informação presente nesse pino pode ser lida com a função digitalRead( ) e armazenada numa variável qualquer.

int chave = digitalRead(3);

Nesse exemplo a variável inteira ‘chave’ vai guardar o estado lógico (verdadeiro/falso) presente no pino digital 3.

digitalWrite(pino,valor)

Para enviar um nível lógico para qualquer pino digital do Arduino utiliza-se essa função. Dois parâmetros são requeri dos: o número do pino e o estado lógico (HIGH/LOW ) em que esse pino deve permanecer.

digitalWrite(2,HIGH);

Aqui uma tensão de 5 volts é colo cada no pino 2. Para enviar terra para esse pino o segundo parâmetro deverá ser LOW.

É necessário configurar previamente o

pino como saída com a função pinMode( ).

analogWrite(pino,valor)

O Arduino pode gerar tensões analógicas em 6 de seus 14 pinos digitais com a função analogWrite( ). Dois parâmetros devem ser passados à função: o primeiro indica em qual pino será gerada a tensão; o segundo determina a amplitude dessa tensão, e deve ter valores entre 0 (para 0 volt) e 255 (para 5 volts).

analogWrite(10,128);

Com esses parâmetros uma tensão analógica de 2,5 volts vai aparecer no pino 10. Não é necessário configurar um pino PWM como saída com a função pinMode( ) quando se chama função analogWrite( ).

Modulação por Largura de Pulsos, ou

PWM (Pulse Width Modulation) na língua inglesa, é uma técnica usada para gerar tensões analógicas a partir de uma sequência de pulsos digitais.

attachInterrupt(pino,função,modo)

Essa função é uma rotina de serviço de interrupção, ou ISR (Interrupt Service Routine) em inglês. Toda vez que ocorrer uma interrupção por hardware no pino digi tal 2 ou no 3 do Arduino uma outra função, criada pelo programador, vai ser chamada. O terceiro parâmetro, modo, informa como a interrupção vai ser disparada, se na borda de subida do pulso detetado no pino do Arduino, se na borda de descida, se quando o pulso for baixo ou se na mudança de nível desse pulso.

attachInterrupt(0,contador,RISING);

Nesse exemplo a função ‘contador’ vai ser chamada quando o Arduino detetar uma mudança do nível LOW para o nível HIGH em seu pino 2. Nessa ISR o parâmetro 0 monitora o pino 2, o parâmetro 1 monitora o pino 3.

LOW - dispara a interrupção quando

o pino está em 0; CHANGE - dispara sempre que o pino muda de estado (de 0 para 1, ou vice-versa); RISING - somente quando o pino muda de 0 para 1; FALLING - somente quando o pino muda de 1 para 0.

pulseIn(pino,valor,espera)

Essa função mede a largura em microssegundos de um pulso em qualquer pino digital. O parâmetro ‘valor’ diz à função que tipo de pulso deve ser medido, se HIGH ou LOW. O parâmetro ‘espera’ (time out) é opcional e se passado à função faz com que a medida do pulso só comece após o tempo em microssegundos ali especificado.

pulseIn(4,HIGH);

Aqui essa função vai monitorar o pino 4, e quando o nível nesse pino mudar de LOW para HIGH a sua largura vai ser medida até que seu nível volte para LOW. Se, por exemplo, for passado o valor 100 como terceiro parâmetro, a medida da largura do pulso só será disparada após 100 uS.

Uma aplicação interessante para

essas duas últimas funções seria o de montar um contador de dois dígitos com mostradores de 7-segmentos.

Exemplo


No programa abaixo essas três funções: pinMode(), digitalRead() e digitalWrite() são utilizadas para acender um LED no pino 2 toda vez que uma chave normalmente aberta no pino 3 for pressionada.

void setup() 
{
    pinMode(11,OUTPUT);
    // led no pino 11 como saída
    pinMode(5,INPUT);   // Pode-se definir um resistor interno de pull-up com INPUT_PULLUP  
    // chave no pino 5 como entrada
}
void loop() 
{
    int chave = digitalRead(5); 
    // variável ‘chave’ guarda estado do pino 5
    if (chave==HIGH)
       digitalWrite(11,LOW);   
    else
       digitalWrite(11,HIGH);   
    // estado de ‘chave’ é passado para pino 11 
}

A Figura 3 mostra como ficaria as ligações para acender o LED toda vez que a chave for pressionada.

Fig043 MCO018703.jpg

Figura 3 - Fios vermelhos são 5V, fios pretos GND e fios verdes conexões com os Pinos de E/S.

O botão push-button também é chamado micro switch. A Figura 4 ilustra o seu funcionamento.

Fig013 MCO18703.png

Figura 4 - Push-button de pólo simples com 2 ou 4 pinos de contato.

LED, ou Light Emitter Diode é um diodo emissor de luz que, quando alimentado corretamente, permite o fluxo de energia apenas em um sentido. É um componente polarizado (com pólos positivo e negativo) e deve ser corretamente conectado para funcionar. Note que o polo positivo possui uma perna maior (terminal maior) que a outra (veja a figura abaixo). Já o polo negativo possui a menor perna (terminal menor).

Fig004 MCO18703.jpg

Figura 5 - Diodo emissor de luz.

Nota
Alguns LED's apresentam o polo negativo chanfrado (plano) no seu exterior.

Enviando estado de chave para Monitor Serial

EXEMPLO 3

Neste teste, o estado de uma chave externa será lido e enviado pro Monitor Serial.

Esquemático


Fig022 MCO18703.png
Código fonte
int pushButton=2;

void setup()
{
   Serial.begin(9600);
   pinMode(pushButton, INPUT);
}

void loop() 
{
   int buttonState=digitalRead(pushButton);

   Serial.println(buttonState);
   delay(1);
}
No protoshield do laboratório
Fig023 MCO18703.jpg
Quando pressiona a chave, efeito no Monitor Serial
Fig024 MCO18703.png


Pushbutton como interruptor liga/desliga

Criar um circuito para atribuir duas funções em um único botão (pushbutton). O botão servirá como um interruptor para ligar e desligar um componente eletrônico. Neste exemplo vamos ligar e desligar um led utilizando o pushbutton como interruptor.

const int buttonPin = 6; 
const int ledPin = 13; 

int estado = 0; // variável para leitura do pushbutton
int guarda_estado = LOW; // variável para armazenar valores do pushbutton
  
void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT); // resistor de pullup -> pinMode(buttonPin, INPUT_PULLUP);
}
  
void loop(){
    estado = digitalRead(buttonPin);
 
    if (estado == HIGH) {    // para pullup (estado==LOW)
        guarda_estado = !guarda_estado;  // inverte valor da variável variable_buttonEstado
        delay(500); //esperera o tempo de 500ms para evitar que haja várias vezes alterações
    }
    if (guarda_estado == HIGH) {
        digitalWrite(ledPin, HIGH);
    }
    else {
        digitalWrite(ledPin, LOW);
    }
}

Exercícios

1. Altere o programa Button para trocar o estado do LED quando o botão é pressionado.
2. Explique e implemente o código abaixo:
#define BOTAO 6
#define LED 13
void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BOTAO, INPUT);
}

void loop() {
   digitalWrite(LED, !digitalRead(BOTAO));
}
Nota
O operador !, em linguagem C, significa negação (not) e tem como finalidade complementar a expressão que segue à sua direita.

Referências

[1] http://ordemnatural.com.br/pdf-files/CartilhadoArduino_ed1.pdf

[2] https://www.tinkercad.com/circuits



Icone voltar.png Icone menu.png Icone prox.png