Você está na página 1de 14

Arduino na prática Data-20/04/2018

FL. 1 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

- Tópicos abordados:
 Hardware Arduino UNO
 Interface de desenvolvimento integrado do arduino (IDE)
 Tipos de variáveis
 Funções
 Exemplos de codificação

- Legenda:
 Negrito – Observações importantes
 Fonte de coloração azulada – Indica linhas de programação em geral
 // - Comentários das linhas de código

1. Hardware Arduino UNO


Para se ter mais segurança nos projetos a serem desenvolvidos, assim
como entender todo funcionamento por trás do nosso código, faz-se necessário
um conhecimento prévio da configuração de hardware em que estaremos
trabalhando. Abaixo, é possível observar os principais componentes, assim
como suas características comentadas.

Figura 1 - Visão Geral Arduino Uno.

ELABORADO POR: Felipe Crispim APROVADO POR: Prof. Dr. Anderson


Arduino na prática Data-20/04/2018
FL. 2 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

 USB: Por meio dessa conexão é possível alimentar a placa, também realizar
o envio e recebimento de dados, por meio da comunicação serial. Para
realizar o envio e recebimento de dados, utilizam-se funções disponibilizadas
pela biblioteca Serial, que já vem inicializada pela IDE.

Serial.print(“Hello World”); //Imprime no monitor serial a string Hello World

Serial.println(“Hello World”); //Imprime no monitor serial a string Hello World


e pula uma linha

Serial.print(Altura); //Imprime no monitor serial o conteúdo da variável Altura


em números decimais (0 até 9)

Serial.print(Altura, DEC); //Imprime no monitor serial o conteúdo da variável


Altura em números decimais (0 até 9)

Serial.print(Altura, HEX); //Imprime no monitor serial o conteúdo da variável


Altura em números hexadecimais (0 até F)

Serial.print(Altura, OCT); //Imprime no monitor serial o conteúdo da variável


Altura em números octais (0 até 7)

Serial.print(Altura, BIN); //Imprime no monitor serial o conteúdo da variável


Altura em números binários (0 e 1)

Também é possível receber valores do usuário por meio de comunicação


serial, utilizando-se do comando Serial.read(). Importante notar que essa
função não recebe parâmetro algum, por isso o “()”.

int nome_variavel = Serial.read(); //Cria-se uma variável do tipo inteiro, por


meio do comando Serial.read() e aguarda o usuário enviar um valor via monitor
serial, esse valor digitado é atribuído à variável criada.

Importante notar que para trabalhar com a comunicação serial,


primeiramente é necessário habilita-la e configura-la com a função
Serial.begin (Valor_em_bps); O parâmetro dentro dos parênteses é a
velocidade em bits por segundo do envio de dados pela comunicação serial. Para
essa comunicação ser efetiva, se configura o monitor serial com a mesma
velocidade atribuída a função Serial.begin.
Arduino na prática Data-20/04/2018
FL. 3 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

 Fonte externa: Por meio de um conector Jack com positivo no centro, se


realiza a alimentação da placa por meio de uma fonte externa.
Recomendável trabalhar com alimentação de 7 até 12V para um
desempenho ideal.
 Alimentação: Conexões destinadas para a alimentação de Shields, módulos
e sensores. Também é possível alimentar o Arduino por essas entradas,
como se observa a seguir:

IOREF: Tensão de referência utilizada para os Shields identificarem a tensão de


trabalho da placa. No caso do UNO, essa tensão de referência é 5V.

RESET: Esta entrada pode ser utilizada para efetuar um reset externo no
Arduino.

3.3V: Pino com tensão de saída de 3.3V, sendo utilizado para alimentar Shields,
módulos, sensores e qualquer outro componente que necessite de alimentação
externa para funcionar. Fornece uma corrente máxima de 50mA.

5V: Pino com tensão de saída de 5V, sendo utilizado para alimentar Shields,
módulos, sensores e qualquer outro componente que necessite de alimentação
externa para funcionar. Fornece uma corrente máxima de 50mA.

GND (2x): Pinos de referência. Terra (Ground).

VIN: Pino utilizado para alimentar o Arduino. Ao utilizar a fonte externa com o
conector jack, a tensão introduzida estará nesse pino, porém também há a
possibilidade de alimentar a placa diretamente na entrada VIN

 Entradas analógicas: Objetivando uma interface com o mundo real, na qual,


em sua maioria, têm-se grandezas analógicas (Ex.: Pressão, temperatura,
velocidade), há 6 entradas analógicas com resolução de 10 bits. Para se
compreender o funcionamento dessas entradas, se observa como exemplo
um sensor de temperatura de 0 a 100°C, que, de acordo com temperatura de
leitura, retornará para o Arduino uma tensão variando de 0 a 5V. Esse valor,
introduzido na placa, por meio de um conversor analógico para digital (ADC),
irá resultar em um número binário de 10 dígitos, por isso a resolução de 10
Arduino na prática Data-20/04/2018
FL. 4 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

bits. Assim, para uma tensão de 0 V, há 0000000000, enquanto para uma


tensão de 5 V, há 1111111111. Abaixo se exemplifica um cálculo para
compreensão da precisão deste sensor na medição de uma variação de
temperatura.

2bits_do_conversor = 210 = 1024  A saída tem 1024 possibilidades


diferentes, porém uma dessas é de valor nulo, isto é, 0. Logo, para o cálculo
da resolução devo considerar 1023 possibilidades de leitura.

5V / 1023 = 4,89mV e 100°C / 1023 = 97,75m°C  Finalmente, pode se


dizer que o Arduino, na configuração ADC 10 bits, é capaz de detectar uma
variação de tensão de 4,89mV ou de temperatura de 97,75m°C.

Para efetuar a leitura de uma entrada analógica, se utiliza a função


analogRead, passando como parâmetro para esta, o número do pino que a
leitura será realizada. Observe o exemplo abaixo, onde se objetiva verificar a
leitura do pino analógico 3.

int temperatura = analogRead (3); // Cria-se a variável temperatura, do tipo


inteiro, e se atribui a ela o valor lido do pino analógico A3.

 Entradas/Saídas digitais: Conjunto de 14 pinos que podem ser utilizados


como entradas ou saídas. Para utilização desses pinos, deve-se configura-
los inicialmente como entrada ou saída. Observe os dois exemplos abaixo.

pinMode (5, INPUT); // Configura-se o pino 5 como entrada.

PinMode (6, OUTPUT); // Configura-se o pino 6 como saída.

Após a configuração inicial, ao longo de todo o restante da programação,


dentro do void loop no caso, se manipula esse pino, tanto escrevendo quanto
lendo valores digitais no pino. Veja o exemplo abaixo, para maior compreensão,
onde se gera um pulso de duração de 0,5 segundos com o pino 6, realizando a
leitura do pino 5 ao término do pulso.

digitalWrite (6, HIGH); // Escreve-se o valor 1 (HIGH) no pino digital 6.


Arduino na prática Data-20/04/2018
FL. 5 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

delay(500); // Configura-se um tempo de espera de 0,5 segundos. A base do


timer do delay é em ms, logo 500 ms = 0,5 s. Assim, mantém-se o pino 6 em
estado alto pelo tempo do delay.

digitalWrite (6, LOW); // Escreve-se o valor 0 (LOW) no pino digital 6

boolean d5 = digitalRead (5); // Cria-se a variável d5, do tipo booleana, isto é,


esta pode assumir dois valores, true (1) ou false (0). Do outro lado da igualdade,
leio o pino 5, se este está em nível alto ou baixo, armazenando este estado na
variável d5.

Importante notar, que em alguns pinos digitais, temos o símbolo “~”.


Os pinos que vêm acompanhados por esse símbolo são os pinos habilitados
para PWM, isto é, modulação por Largura de Pulso. Esse conceito, por meio da
alteração da largura dos pulsos de um pino digital, permite para as aplicações,
simular um controle de característica analógica.

Figura 2 - Exemplo de ondas com PWM.

Na imagem acima, se visualiza uma saída PWM em ação, onde variando


o valor passado para a função analogWrite, altera-se a largura do pulso,
variando assim o valor de tensão média fornecida para a carga. É possível enviar
para a função, números inteiros variando de 0 até 255, que irão representar uma
Arduino na prática Data-20/04/2018
FL. 6 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

entrega de 0 a 100% de tensão para a carga (Ex.: Lâmpada, motor, LED).


Observe os exemplos abaixo, para maior compreensão.

analogWrite (3, 0); // Simula uma saída analógica no pino 3, como há apenas
nível lógico LOW, mantenho a carga desligada (0%).

analogWrite (5, 63); // Simula uma saída analógica no pino 5, entregando 25%
de energia para a carga.

analogWrite (6, 127); // Simula uma saída analógica no pino 6, entregando 50%
de energia para a carga.

analogWrite (9, 191); // Simula uma saída analógica no pino 9, entregando 75%
de energia para a carga.

analogWrite (10, 255); // Simula uma saída analógica no pino 10, ligando a
carga com potência máxima (100%).

2. Interface de desenvolvimento integrado do arduino


(IDE)
Este será o ambiente em que se implementará o código para manipulação
das estradas e saídas (I/O) do nosso micro controlador. Veja, nas imagens
abaixo, os atalhos que serão utilizados com frequência.

Figura 3 - Atalhos principais da IDE do Arduino

1 - Compila a programação, caso o código possua erros de gramática, isto é, de


escrita, irá acusar o erro, assim como retornar qual o erro e a posição deste, no
código.

2 – Compila a programação e grava o código na memória do Arduino, sendo este


o atalho que se utilizará para habilitar a placa para desempenhar o objetivo da
programação.

3 – Cria um arquivo de programação, isto é, um arquivo de extensão .ino.


Arduino na prática Data-20/04/2018
FL. 7 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

4 – Carrega um arquivo de programação, isto é, um arquivo de extensão .ino.

6 – Salva um arquivo de programação, isto é, um arquivo de extensão .ino.

Um atalho que merece atenção especial é o monitor serial . Este atalho


possibilita monitorar serialmente o Arduino, recebendo e enviando dados. Como
se viu anteriormente, por meio da função Serial.read, enviam-se dados para a
placa, enquanto com a função Serial.print, enviam-se dados da placa para o
computador.

Figura 4 - Monitor Serial do Arduino.

Observe acima um monitor serial aberto. No topo (1), há o campo para


input dos dados a serem enviados para o Arduino, enquanto na caixa maior (2),
se exibe as mensagens (Strings e variáveis) enviadas pelo Arduino. O campo 3
indicado acima, serve para impedir ou permitir, que o box de exibição (2) role
Arduino na prática Data-20/04/2018
FL. 8 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

automaticamente, de acordo com a velocidade que ele receber os dados do


Arduino. Por último, o campo 4 representa a velocidade em bits por segundo da
comunicação serial. Para a comunicação ser efetiva, o valor configurado no
campo 4 deve ser igual ao valor passado para a função Serial.begin
(Valor_em_bps), conforme foi salientado anteriormente.

Neste momento, acessa-se um novo arquivo e se observa a estrutura da


codificação padrão do Arduino. Ela é iniciada com duas funções, void setup e
void loop. Em void setup, o código roda apenas uma vez, sendo indicada a
realização da configuração dos periféricos dentro dessa função. Já no void loop,
o código é executado indefinidamente, sendo aqui onde se programa o Arduino
para executar a tarefa desejada.

Finalmente, com o objetivo de carregar a programação no Arduino, vale


prestar atenção ao menu, ferramentas, onde por meio das configurações de
placa e port, indica-se para a IDE, a versão do hardware Arduino (Ex.: Uno,
Mega) em que se está trabalhando, assim como a porta serial na qual a placa
está conectada. Para uma melhor compreensão, observe a imagem abaixo.

Figura 5 – Configuração da comunicação com a placa Arduino conectada


serialmente.
Arduino na prática Data-20/04/2018
FL. 9 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

3. Tipos de variáveis
Para manusear os dados enviados e recebidos do Arduino, faz-se
necessária a compreensão do que são variáveis e quais seus possíveis tipos. As
variáveis possibilitam o armazenamento das informações ao longo do código e
a identificação, por meio da atribuição de nomes para essas variáveis. Há
diversos tipos de variáveis e a escolha de qual será utilizada deve ser em função
da necessidade de mundo real que se deseja sanar com o código, uma vez que
cada tipo de variável consome um espaço de memória específico do Arduino
(Ex.: Sensores analógicos, sensores digitais, necessidade de medidas
decimais).

Abaixo, há os principais tipos de variáveis, assim como o espaço de


memória que consomem.

 boolean (8 bits): Variável de caráter digital, armazena os valores lógicos true


(1) e false (0).
 byte (8 bits): Variável para armazenar números inteiros, abrange valores de
0 a 255.
 char (8 bits): Variável de armazenamento de carácteres (Ex.: a, +, c);
 int (16 bits): Variável para armazenar números inteiros com sinais, abrange
valores de – 32 768 a 32 767.
 unsigned int (16 bits): Variável para armazenar números inteiros sem sinais,
abrange valores de 0 a 65 535.
 long (32 bits): Similar ao tipo int, porém com o dobro de espaço em memória,
possibilita trabalhar com valores de – 2 147 483 648 a 2 147 483 647.
 float (32 bits): Variáveis para armazenar números de caráter racional, isto é,
números com algarismos decimais (Ex.: 1,15; 10,37; 101,79). Possibilita
trabalhar com números entre -3,4028235E+38 e +3,4028235E+38

Como se comentou inicialmente, a escolha dos tipos de variáveis deve se


adequar à necessidade. Um bom código não possui todas as suas variáveis do
tipo float para garantir alta precisão, mas, sim, se utiliza do tipo de variável
específico para cada informação a ser armazenada. Um código que respeite
Arduino na prática Data-20/04/2018
FL. 10 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

esse princípio é um código que possui um bom gerenciamento da memória


utilizada.

4. Funções
Objetivando trabalhar com uma codificação sempre a mais organizada
possível, torna-se necessário conhecer as funções. Inicialmente, o Arduino já
vem com algumas funções configuradas, como por exemplo, o void setup e void
loop, porém a IDE também nos permite a criação de funções. A utilização de
funções permite segmentar o código, em módulos que executem uma tarefa
especifica e depois retorne para a linha onde a chamada da função foi realizada.
A chamada da função pode ser realizada dentro de outras funções. Observe
abaixo a anatomia da chamada de uma função. Importante notar que as
variáveis referentes aos argumentos enviados para a função, devem ser
declaradas e terem seus valores atribuídos anteriormente.

Figura 6 – Anatomia generalizada da chamada de uma função.

Importante se observar que caso se trate de uma função void, não há


a variável para atribuição do valor de retorno. Portanto, só se realiza a
chamada da função, assim como o envio de argumentos, no caso da função
void possuir parâmetros.

As funções podem ser classificadas em dois tipos. O primeiro tipo quando,


após a execução da tarefa especificada, há o retorno de um valor. Neste caso,
antes do nome da função, devo declarar o tipo de dado da função (int, float, char),
isto é, o tipo de dado que ela irá retornar. O segundo, onde só ocorre a execução
da tarefa especificada, sem retorno de valor, devo declarar que a função é do
tipo void. Veja, na imagem abaixo, a anatomia de uma função para melhor
entendimento. É importante observar que essa parte da função, que pode
ser chamada de declaração da função, deve ser executada fora de qualquer
outra função, inclusive das funções de setup e loop.
Arduino na prática Data-20/04/2018
FL. 11 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

Figura 7 – Anatomia generalizada da declaração de uma função.

5. Exemplos de codificação

Exemplo de utilização do sensor ultrassônico:

// Constantes para deixar mais visível a que cada pino se refere

// No caso em questão o pino 4 é o Trig, e o 5 é o Echo do sensor ultrassônico

#define Trig 4

#define Echo 5

// Dentro da função setup, realizo a configuração dos periféricos

// Esta parte do código é executada apenas uma vez

void setup() {

// Configuro o pino digital 5(Echo) como entrada, sendo este o pino que irá perceber o retorno
das ondas refletidas

pinMode(Echo, INPUT);

// Configuro o pino digital 4(Trig) como saída, sendo este o pino que emitirá os pulsos para
disparo das ondas ultrassônicas

pinMode(Trig, OUTPUT);
Arduino na prática Data-20/04/2018
FL. 12 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

// Garanto que o pino de Trig inicie em 0

digitalWrite(Trig, LOW);

// Inicio a comunicação Serial com 9600bps

Serial.begin(9600);

// Dentro da função setup há a programação principal, que irá se repetir indefinidamente

void loop() {

// Inicialização da variável distancia como float, que irá receber o retorno da função
sensor_ult.

float distancia = sensor_ult();

// Realizo a impressão do valor lido em cm

Serial.print("A distancia lida em cm eh: ");

Serial.println(distancia);

// Delay de 1 segundo para visualizar o valor lido

delay(1000);

float sensor_ult() {

// Geração de um pulso no pino Trig, com duração de 10 micro segundos. Disparo das ondas
ultrassônicas

digitalWrite(Trig, HIGH); // Pino Trig = 1

delayMicroseconds(10); // Delay de 10us

digitalWrite(Trig, LOW); // Pino Trig = 0

// Após o pino do Echo passar para 1, realizo a contagem de tempo que ele para retornar
para 0 (O tempo retornado pela função está em us)

int tempo = pulseIn(Echo, HIGH);

// Fórmula para cálculo da distância => distância = velocidade x tempo (Velocidade do som
= 340m/s = 34000cm/s)

// 34000 * tempo * 10^-6 = 0,034 * tempo


Arduino na prática Data-20/04/2018
FL. 13 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

// Divido por 2, porque a distância retornada = distância entre o emissor e a superfície de


reflexão + distância entre a superfície de reflexão e o receptor

return (tempo * 0.034 / 2);

Exemplo de utilização do sensor de linha:

// Constantes para deixar mais visível a que cada pino se refere

// No caso em questão, o pino 4 é o DO do sensor de linha. (DO é a saída digital do sensor,


sendo A0 a analógica)

#define D0 4

// Dentro da função setup realizo a configuração dos periféricos

// Esta parte do código é executada apenas uma vez

void setup() {

// Configuro o pino digital 4(D0) como entrada, sendo o pino que irá perceber ou não a presença
de uma superfície reflexiva

pinMode(D0, INPUT);

// Inicio a comunicação Serial com 9600bps

Serial.begin(9600);

// Dentro da função setup há a programação principal, que irá se repetir indefinidamente

void loop() {

// Inicialização da variável s_linha como variável booleana

// A variável s_linha irá receber 0 (false) ou 1 (true), de acordo com a recepção ou não da luz
infravermelha emitida

boolean s_linha = digitalRead(D0);

// Realizo a impressão do valor lido

Serial.print("O retorno do sensor óptico é: ");

Serial.println(s_linha);

// Há um potenciômetro na parte superior da placa, que é utilizado para calibrar o sensor para
detectar a superfície desejada
Arduino na prática Data-20/04/2018
FL. 14 de 14
Guia introdutório da placa Arduino Uno
REVISÃO:00

// Na aplicação em questão, o sensor foi configurado para detectar um caminho de cor preta em
uma superfície branca, cuja presença da cor preta gera um leitura pelo sensor de 1 e fora dela 0

if(s_linha == true)

// Caso s_linha = 1, exibo para o usuário que o caminho foi encontrado

Serial.println("Caminho encontrado");

else

// Caso s_linha = 0 (false), exibo para o usuário que o caminho não foi encontrado

Serial.println("Caminho não encontrado");

// Delay de 0,5 segundo para visualizar o valor lido e se o caminho foi encontrado ou não

delay(500);

Observe na imagem abaixo o potenciômetro que se utiliza para calibrar o


sensor.

Figura 8 – Potenciômetro para calibração do sensor de linha.

Você também pode gostar