Mudanças entre as edições de "MCO018703 2018 1 AULA09"
(Criou página com '=A plataforma Arduíno= (Extraído da apostila Curso de Arduíno, de Álvaro Justen e do curso [http://www.oficinaderobotica.ufsc.br Programaç...') |
|||
(17 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
− | = | + | =Introdução= |
− | + | Assim como a IDE, que já vem com diversas funções pré-definidas, o Arduino possui outras '''bibliotecas''' para controle | |
+ | de servomotores, displays LCD, geração de áudio, recepção de sinais de sensores e outros dispositivos (como teclado PS/2), dentre muitas outras funções. | ||
− | Arduino | + | E quem pensa que essa estensibilidade toda se restringe ao software está muito enganado: o Arduino possui o que chamamos de ''shields'', que são placas que se acoplam à placa original, agregando funcionalidades à mesma. |
− | |||
− | + | Existem ''shields'' dos mais variados tipos, para as mais diversas funções: [http://playground.arduino.cc/Main/SimilarBoards Lista oficial]. | |
− | + | Alguns servem como entrada, outros como saída, e ainda outros como entrada e saída. | |
− | + | Com os shields conseguimos, por exemplo, fazer o Arduino se comunicar numa rede Ethernet, ou ainda transmitir dados para qualquer dispositivo via Bluetooth, Wi-Fi ou Zigbee. | |
+ | Existem [http://blog.fazedores.com/conheca-os-shields-e-incremente-seu-arduino-com-eles/ ''shields''] com circuitos integrados prontos para controlarmos motores, sem que precisemos nos preocupar com complicações eletrônicas envolvidas, outros possuem leitor de cartão SD, acelerômetro, GPS e diversos outros sensores que podem gerar dados importantes para o software que está rodando no microcontrolador. | ||
− | |||
− | + | [[imagem:Fig007_MCO18703.jpg|445px|center]] | |
− | + | <center> | |
− | + | Figura 1 - Arduíno com Shield acoplada. | |
+ | </center> | ||
− | Existem | + | Existem também outros ''shields'' mais elaborados, que são sistemas completos. |
+ | [[imagem:Fig008_MCO18703.png|500px|center]] | ||
+ | <center> | ||
+ | Figura 2 - Shields são placas para acoplar ao Arduíno visando expandir suas funcionalidades. | ||
+ | </center> | ||
− | [[imagem: | + | [[imagem:Fig010_MCO18703.png|500px|center]] |
+ | <center> | ||
+ | Figura 3 - Várias Shields permitem a sobreposição de outros Shiels. | ||
+ | </center> | ||
− | + | Um deles, por exemplo, cria uma plataforma para desenvolvimento de jogos no Arduino: o '''Video Game Shield10''', que possui uma saída RCA | |
− | no | + | e duas entradas para controles Numchuck do Nintendo Wii. |
− | |||
− | + | Além do hardware, existe uma biblioteca para ser utilizada em conjunto, que já possui várias funções pré-programadas para fazermos desenhos na televisão e capturar os dados dos movimentos nos controles. | |
− | |||
− | |||
+ | =Leitura de portas digitais= | ||
− | + | Utilizamos as portas digitais quando precisamos trabalhar com valores bem definidos de tensão. | |
− | + | Apesar de nem sempre ser verdade, geralmente trabalhamos com valores digitais binários, ou seja, projetamos sistemas que | |
− | + | utilizam apenas dois valores bem definidos de tensão. | |
− | + | Existem sistemas ternários, quaternários, mas focaremos no binário, já que é esse o utilizado pelo Arduino. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | Como o sistema é binário, temos que ter apenas duas tensões. São elas: | ||
+ | * 0V e | ||
+ | * 5V | ||
− | + | Dessa forma, as portas digitais do Arduino podem trabalhar apenas com essas duas tensões, e o software que desenvolveremos poderá | |
+ | requisitar ao microcontrolador do Arduino que leia o valor de uma determinada porta (e obterá 0V ou 5V, como resposta). | ||
− | + | O Arduino Uno possui 14 portas digitais que estão destacadas na figura a seguir: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[imagem: | + | [[imagem:Fig011_MCO18703.png|500px|center]] |
+ | <center> | ||
+ | Figura 4 - Em destaque a localização das portas digitais no Arduíno Duemilanove. | ||
+ | </center> | ||
− | |||
− | |||
− | + | Apesar de ser possível, não é recomendável utilizar as portas 0 e 1 pois elas estão diretamente ligadas ao | |
+ | sistema de comunicação do Arduino (pinos RX e TX - recepção e transmissão, respectivamente) e, por isso, | ||
+ | seu uso pode conflitar com o ''upload'' do software. | ||
− | + | Caso queira utilizá-las, certifique-se de desconectar quaisquer circuitos conectados a ela no momento do ''upload''. | |
− | + | Utilizaremos as funções ''digitalRead'' e ''digitalWrite'' para ler e escrever, respectivamente, nas portas digitais. | |
− | |||
− | + | A função ''digitalWrite'' já foi exemplificada em nosso exemplo '''Blink'''. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Para exemplificar a função ''digitalRead'' utilizaremos um botão, tipo ''push-button'', como no diagrama a seguir: | |
− | |||
− | |||
− | + | [[imagem:Fig012_MCO18703.png|500px|center]] | |
+ | <center> | ||
+ | Figura 5 - Circuito de entrada digital com ''push-button''. | ||
+ | </center> | ||
− | + | O botão ''push-button'' também é chamado ''micro switch'' e tem o seguinte funcionamento: | |
− | + | [[imagem:Fig013_MCO18703.png|500px|center]] | |
+ | <center> | ||
+ | Figura 6 - ''Push-button'' de pólo simples com 2 ou 4 pinos de contato. | ||
+ | </center> | ||
− | + | Assista o vídeo sobre o uso do botão '''push-button''' para acionar led: | |
− | + | <center>{{#ev:youtube|Xf2L7VfNa9Y#!}} </center> | |
− | |||
− | |||
− | + | ==Circuito do ''push-button''== | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Montado o circuito acima, vamos programar o Arduino com o seguinte código: | |
− | |||
− | + | <syntaxhighlight lang=c> | |
+ | #define BOTAO 6 | ||
+ | #define LED 13 | ||
+ | void setup() { | ||
+ | pinMode(LED, OUTPUT); | ||
+ | pinMode(BOTAO, INPUT); // pode fazer uso do resistor interno de PULLUP* | ||
+ | } | ||
+ | void loop() { | ||
+ | if (digitalRead(BOTAO) == HIGH) | ||
+ | digitalWrite(LED, LOW); | ||
+ | |||
+ | else | ||
+ | digitalWrite(LED, HIGH); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
− | [ | + | [* pinMode(BOTAO, INPUT_PULLUP);] |
− | + | A função ''digitalRead'' nos retorna o valor correspondente à tensão que está na porta que passamos entre | |
+ | parenteses. | ||
− | + | Em nosso exemplo, utilizamos a porta BOTAO (que na verdade é uma constante, definida através da diretiva #define), cujo valor é 6. | |
− | + | O valor retornado é uma constante, mapeado da seguinte forma: | |
+ | * HIGH, caso a tensão na porta seja 5V | ||
+ | * LOW, caso a tensão na porta seja 0V | ||
− | |||
+ | O que o programa faz, então, é apagar o LED caso o botão esteja pressionado e acendê-lo, caso não esteja. | ||
− | + | Um circuito alternativo, mais indicado, por não deixar a entrada digital "flutuando", quando a chave está aberta, é o abaixo: | |
− | |||
+ | [[imagem:Fig014_MCO18703.png|500px|center]] | ||
+ | <center> | ||
+ | Figura 6 - Realização do circuito ''push-button'' com entrada digital fixa em GND ou 5V. | ||
+ | </center> | ||
− | + | Neste caso, o pino 7 está ligado a um resistor de ''pull-up'', se a chave estiver aberta (neste caso, fica com nível lógico alto), ou aterrado (nível lógico baixo), quando a chave fecha: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[imagem:Fig015_MCO18703.png|400px|center]] | |
+ | <center> | ||
+ | Figura 7 - Diagrama do circuito ''push-button'' no pino digital fixa em GND ou 5V. | ||
+ | </center> | ||
− | + | O programa ficaria: | |
− | + | <syntaxhighlight lang=c> | |
− | + | #define BOTAO 7 | |
+ | #define LED 13 | ||
+ | void setup() { | ||
+ | pinMode(LED, OUTPUT); | ||
+ | pinMode(BOTAO, INPUT); | ||
+ | } | ||
+ | void loop() { | ||
+ | if (digitalRead(BOTAO) == HIGH) | ||
+ | digitalWrite(LED, LOW); | ||
+ | |||
+ | else | ||
+ | digitalWrite(LED, HIGH); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | E, neste caso, o LED permanece apagado, se a chave estiver aberta; | |
− | [[imagem: | + | [[imagem:Fig016_MCO18703.png|400px|center]] |
+ | <center> | ||
+ | Figura 8 - Chave S<sub>1</sub> desligada. | ||
+ | </center> | ||
+ | e acende, quando o botão for pressionado. | ||
− | + | [[imagem:Fig017_MCO18703.png|400px|center]] | |
+ | <center> | ||
+ | Figura 9 - Chave S<sub>1</sub> pressionada. | ||
+ | </center> | ||
− | + | ===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. | |
− | + | <syntaxhighlight lang=c> | |
− | + | 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); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | ==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: | ||
− | + | <syntaxhighlight lang=c> | |
+ | #define BOTAO 6 | ||
+ | #define LED 13 | ||
+ | void setup() { | ||
+ | pinMode(LED, OUTPUT); | ||
+ | pinMode(BOTAO, INPUT); | ||
+ | } | ||
+ | void loop() { | ||
+ | digitalWrite(LED, !digitalRead(BOTAO)); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | Dica: o operador !, em linguagem C, significa negação ('''not''') e tem como finalidade complementar a expressão que segue à sua direita. | |
− | + | =Referências= | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [1] https://www.sparkfun.com/categories/240?page=all | |
− | + | [2] https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_3_-_Microcontroladores_-_T%C3%A9cnico | |
− | + | [3] http://squids.com.br/arduino/index.php/projetos-arduino/projetos-basicos/123-projeto-04-pushbutton | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ----- | |
− | + | [[Imagem:icone_voltar.png|link=MCO018703_2018_1_AULA08]] | |
− | + | [[Imagem:icone_menu.png|link=MCO018703_2018_1#Aulas]] | |
+ | [[Imagem:icone_prox.png|link=MCO018703_2018_1_AULA10]] |
Edição atual tal como às 19h15min de 26 de junho de 2018
Introdução
Assim como a IDE, que já vem com diversas funções pré-definidas, o Arduino possui outras bibliotecas para controle de servomotores, displays LCD, geração de áudio, recepção de sinais de sensores e outros dispositivos (como teclado PS/2), dentre muitas outras funções.
E quem pensa que essa estensibilidade toda se restringe ao software está muito enganado: o Arduino possui o que chamamos de shields, que são placas que se acoplam à placa original, agregando funcionalidades à mesma.
Existem shields dos mais variados tipos, para as mais diversas funções: Lista oficial.
Alguns servem como entrada, outros como saída, e ainda outros como entrada e saída.
Com os shields conseguimos, por exemplo, fazer o Arduino se comunicar numa rede Ethernet, ou ainda transmitir dados para qualquer dispositivo via Bluetooth, Wi-Fi ou Zigbee.
Existem shields com circuitos integrados prontos para controlarmos motores, sem que precisemos nos preocupar com complicações eletrônicas envolvidas, outros possuem leitor de cartão SD, acelerômetro, GPS e diversos outros sensores que podem gerar dados importantes para o software que está rodando no microcontrolador.
Figura 1 - Arduíno com Shield acoplada.
Existem também outros shields mais elaborados, que são sistemas completos.
Figura 2 - Shields são placas para acoplar ao Arduíno visando expandir suas funcionalidades.
Figura 3 - Várias Shields permitem a sobreposição de outros Shiels.
Um deles, por exemplo, cria uma plataforma para desenvolvimento de jogos no Arduino: o Video Game Shield10, que possui uma saída RCA
e duas entradas para controles Numchuck do Nintendo Wii.
Além do hardware, existe uma biblioteca para ser utilizada em conjunto, que já possui várias funções pré-programadas para fazermos desenhos na televisão e capturar os dados dos movimentos nos controles.
Leitura de portas digitais
Utilizamos as portas digitais quando precisamos trabalhar com valores bem definidos de tensão. Apesar de nem sempre ser verdade, geralmente trabalhamos com valores digitais binários, ou seja, projetamos sistemas que utilizam apenas dois valores bem definidos de tensão.
Existem sistemas ternários, quaternários, mas focaremos no binário, já que é esse o utilizado pelo Arduino.
Como o sistema é binário, temos que ter apenas duas tensões. São elas:
- 0V e
- 5V
Dessa forma, as portas digitais do Arduino podem trabalhar apenas com essas duas tensões, e o software que desenvolveremos poderá requisitar ao microcontrolador do Arduino que leia o valor de uma determinada porta (e obterá 0V ou 5V, como resposta).
O Arduino Uno possui 14 portas digitais que estão destacadas na figura a seguir:
Figura 4 - Em destaque a localização das portas digitais no Arduíno Duemilanove.
Apesar de ser possível, não é recomendável utilizar as portas 0 e 1 pois elas estão diretamente ligadas ao
sistema de comunicação do Arduino (pinos RX e TX - recepção e transmissão, respectivamente) e, por isso,
seu uso pode conflitar com o upload do software.
Caso queira utilizá-las, certifique-se de desconectar quaisquer circuitos conectados a ela no momento do upload.
Utilizaremos as funções digitalRead e digitalWrite para ler e escrever, respectivamente, nas portas digitais.
A função digitalWrite já foi exemplificada em nosso exemplo Blink.
Para exemplificar a função digitalRead utilizaremos um botão, tipo push-button, como no diagrama a seguir:
Figura 5 - Circuito de entrada digital com push-button.
O botão push-button também é chamado micro switch e tem o seguinte funcionamento:
Figura 6 - Push-button de pólo simples com 2 ou 4 pinos de contato.
Assista o vídeo sobre o uso do botão push-button para acionar led:
Circuito do push-button
Montado o circuito acima, vamos programar o Arduino com o seguinte código:
#define BOTAO 6
#define LED 13
void setup() {
pinMode(LED, OUTPUT);
pinMode(BOTAO, INPUT); // pode fazer uso do resistor interno de PULLUP*
}
void loop() {
if (digitalRead(BOTAO) == HIGH)
digitalWrite(LED, LOW);
else
digitalWrite(LED, HIGH);
}
[* pinMode(BOTAO, INPUT_PULLUP);]
A função digitalRead nos retorna o valor correspondente à tensão que está na porta que passamos entre parenteses.
Em nosso exemplo, utilizamos a porta BOTAO (que na verdade é uma constante, definida através da diretiva #define), cujo valor é 6.
O valor retornado é uma constante, mapeado da seguinte forma:
- HIGH, caso a tensão na porta seja 5V
- LOW, caso a tensão na porta seja 0V
O que o programa faz, então, é apagar o LED caso o botão esteja pressionado e acendê-lo, caso não esteja.
Um circuito alternativo, mais indicado, por não deixar a entrada digital "flutuando", quando a chave está aberta, é o abaixo:
Figura 6 - Realização do circuito push-button com entrada digital fixa em GND ou 5V.
Neste caso, o pino 7 está ligado a um resistor de pull-up, se a chave estiver aberta (neste caso, fica com nível lógico alto), ou aterrado (nível lógico baixo), quando a chave fecha:
Figura 7 - Diagrama do circuito push-button no pino digital fixa em GND ou 5V.
O programa ficaria:
#define BOTAO 7
#define LED 13
void setup() {
pinMode(LED, OUTPUT);
pinMode(BOTAO, INPUT);
}
void loop() {
if (digitalRead(BOTAO) == HIGH)
digitalWrite(LED, LOW);
else
digitalWrite(LED, HIGH);
}
E, neste caso, o LED permanece apagado, se a chave estiver aberta;
Figura 8 - Chave S1 desligada.
e acende, quando o botão for pressionado.
Figura 9 - Chave S1 pressionada.
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));
}
Dica: o operador !, em linguagem C, significa negação (not) e tem como finalidade complementar a expressão que segue à sua direita.
Referências
[1] https://www.sparkfun.com/categories/240?page=all
[2] https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_3_-_Microcontroladores_-_T%C3%A9cnico
[3] http://squids.com.br/arduino/index.php/projetos-arduino/projetos-basicos/123-projeto-04-pushbutton