O documento apresenta uma introdução ao sistema Arduino para sistemas embarcados. Em 3 frases:
O documento discute o que são sistemas embarcados e a plataforma Arduino, apresentando suas características de hardware e software, conceitos básicos de eletrônica e microcontroladores, e exemplos de programação e aplicações práticas com sensores e atuadores. O autor é Felipe Nascimento Martins e o documento é licenciado com Creative Commons.
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Introdução a Sistemas Embarcados com Arduino - mini-curso
1. v. 2 - 2014
Introdução a
Sistemas Embarcados
com Arduino
Felipe Nascimento Martins
2. O trabalho Introdução ao Arduino de Felipe Nascimento Martins foi
licenciado com uma Licença
Creative Commons - Atribuição-CompartilhaIgual 3.0 Não Adaptada.
Introdução a
Sistemas Embarcados
com Arduino
Felipe Nascimento Martins
4. Conteúdo
• Sistemas embarcados;
• Arduino: características de hardware;
• Arduino: características de software;
• Microcontrolador;
• Eletrônica: conceitos básicos;
• Planejamento de programas;
• Sensores e atuadores;
• Práticas (montagem e programação);
• Avançando com o Arduino: shields, comunicação
sem fio, aplicações em robótica...
Felipe Nascimento Martins
6. Sistema Embarcado
• Sistema baseado em microcontroladores em
que o computador é encapsulado e dedicado
ao dispositivo ou sistema que ele controla;
• Realiza um conjunto de tarefas pré-definidas,
com requisitos específicos;
• Além do computador dedicado, em geral
possui sensores, atuadores e uma interface
com o usuário.
Felipe Nascimento Martins
8. Exemplos de Sistemas Embarcados
• MP3 player, relógio digital, calculadora,
controlador de veículo elétrico, navegador
com GPS, leitora para pagamento com
cartões de crédito, robô, semáforo, roteador,
console de vídeo game, lavadora de roupas,
marca-passo, quadricóptero, forno de micro-
ondas, tablet, medidor de pressão arterial,
televisão etc.
Felipe Nascimento Martins
11. O que é Arduino?
• Arduino é uma plataforma de prototipagem
eletrônica open-source, baseada nos princípios
de flexibilidade e facilidade de uso para hardware
e software.
• Consiste de uma placa com microcontrolador
programável preparada para receber sinais de
sensores e acionar atuadores.
• Sua linguagem de programação é baseada em
Wiring (baseado em C/C++).
• A placa pode funcionar em conjunto ou de forma
independente do computador.
Felipe Nascimento Martins
16. Arduino é Open Source
• Desenvolvido por: Massimo Banzi, David
Cuartielles, Tom Igoe, Gianluca Martino e David
Mellis, na Itália, em 2005;
• Todo o projeto é aberto: open source hardware
and software;
• 200 placas vendidas em 2005, 5.000 em 2006,
30.000 em 2007 e mais de 300.000 em 2011 e
cerca de 1 milhão até setembro de 2013!
• Site oficial: www.arduino.cc
Felipe Nascimento Martins
20. Arduino é Open Source!
• Todo o hardware é aberto e os projetos estão
disponíveis.
• Quem quiser, pode comprar os componentes e montar a
sua placa!
• O software de programação também é livre e está
disponível para download gratuitamente.
Felipe Nascimento Martins
21. Arduino é Open Source!
• Todo o hardware é aberto e os projetos estão
disponíveis.
• Quem quiser, pode comprar os componentes e montar a
sua placa!
• O software de programação também é livre e está
disponível para download gratuitamente.
• Mas...
Felipe Nascimento Martins
22. Arduino é Open Source!
• Todo o hardware é aberto e os projetos estão
disponíveis.
• Quem quiser, pode comprar os componentes e montar a
sua placa!
• O software de programação também é livre e está
disponível para download gratuitamente.
• Mas...
• O nome Arduino é marca registrada!
Felipe Nascimento Martins
34. Arduino Uno
• Microcontrolador: ATmega328;
• Tensão de operação: 5V;
• Tensão de entrada (recomendada): 7-12V;
• Pinos digitais de E/S:14 (6 podem ter sinal PWM);
• Pinos com entrada analógica: 6;
• Corrente máxima por pino de E/S: 40 mA;
• Hardware para comunicação: 1 porta serial (UART TTL),
I2C (TWI), SPI;
• Memória Flash (de programa): 32 kB, dos quais 0,5 kB
são usados pelo bootloader;
• Memória SRAM: 2 kB; EEPROM: 1 kB;
• Frequência de clock: 16 MHz.
Felipe Nascimento Martins
36. Arduino Leonardo
• Microcontrolador: ATmega32u4;
• Tensão de operação: 5V;
• Tensão de entrada (recomendada): 7-12V;
• Pinos digitais de E/S: 20 (7 podem ter sinal PWM);
• Pinos com entrada analógica: 12;
• Corrente máxima por pino de E/S: 40 mA;
• Hardware para comunicação: 1 porta serial (UART TTL),
I2C (TWI), SPI, USB 2.0 (emula teclado ou mouse);
• Memória Flash (de programa): 32 kB, dos quais 4 kB são
usados pelo bootloader;
• Memória SRAM: 2,5 kB; EEPROM: 1 kB;
• Frequência de clock: 16 MHz.
Felipe Nascimento Martins
38. Arduino Mega 2560
• Microcontrolador: ATmega2560;
• Tensão de operação: 5V;
• Tensão de entrada (recomendada): 7-12V;
• Pinos digitais de E/S: 54 (15 podem ter sinal PWM);
• Pinos com entrada analógica: 16;
• Corrente máxima por pino de E/S: 40 mA;
• Hardware para comunicação: 4 portas seriais (UART
TTL), I2C (TWI), SPI, USB 2.0 (emula teclado ou mouse);
• Memória Flash (de programa): 256 kB, dos quais 8 kB
são usados pelo bootloader;
• Memória SRAM: 8 kB; EEPROM: 4 kB;
• Frequência de clock: 16 MHz.
Felipe Nascimento Martins
41. O que é um Microcontrolador?
– Chip;
– CPU de pequeno porte, capaz de executar
um conjunto de instruções;
– Ou seja, possui um microprocessador!
– Instruções simples e rápidas;
– Possui memória(s);
– Possui periféricos;
– Pode se comunicar com outros periféricos;
etc.
Felipe Nascimento Martins
42. Componentes de um Microcontrolador
Conversor
D/A
Conversor
A/D
PWM
CPU
EEPROM
RAM
Porta
Serial
Porta
Paralela
Temporizadores
Microcontrolador
Felipe Nascimento Martins
65. Um pouco de eletrônica
• Ok. Entendi o programa.
• Mas o que acontece nos
pinos do Arduino?
Felipe Nascimento Martins
66. Um pouco de eletrônica
• Ok. Entendi o programa.
• Mas o que acontece nos
pinos do Arduino?
• A função
digitalWrite(12,HIGH);
faz com que o pino 12 vá
para “nível alto”, ou seja,
ele fica com 5V.
Felipe Nascimento Martins
67. Um pouco de eletrônica
• Ok. Entendi o programa.
• Mas o que acontece nos
pinos do Arduino?
• A função
digitalWrite(12,HIGH);
faz com que o pino 12 vá
para “nível alto”, ou seja,
ele fica com 5V.
• Este pino está ligado ao
RESISTOR+LED, e ao pino
GND (0V).
Felipe Nascimento Martins
68. Um pouco de eletrônica
• Ok. Entendi o programa.
• Mas o que acontece nos
pinos do Arduino?
• A função
digitalWrite(12,HIGH);
faz com que o pino 12 vá
para “nível alto”, ou seja,
ele fica com 5V.
• Este pino está ligado ao
RESISTOR+LED, e ao pino
GND (0V).
• É um circuito série, por
onde circula corrente!
Felipe Nascimento Martins
+5V
0V
69. Um pouco de eletrônica
• Em resumo:
• É a circulação de corrente
elétrica (elétrons) que faz
acender o LED;
• Experimente retirar o fio
que liga o LED ao GND,
mantendo o pino 12 em 5V.
• O LED apaga pois a
corrente precisa circular
num circuito fechado!
Felipe Nascimento Martins
+5V
0V
70. Um pouco de eletrônica
• Em resumo:
• É a circulação de corrente
elétrica (elétrons) que faz
acender o LED;
• A corrente só existirá se
houver diferença de
potencial elétrico
(diferença de tensão) entre
pontos do circuito: 5V – 0 =
5V;
• Tensão: volt [V];
• Corrente: ampère [A].
Felipe Nascimento Martins
+5V
0V
71. Um pouco de eletrônica
• A função
digitalWrite(12,LOW);
faz com que o pino 12 vá
para “nível baixo”, ou seja,
ele fica com 0V.
• Logo, como não há
diferença de tensão entre
os pinos 12 e GND, a
corrente é zero => LED
apaga.
Felipe Nascimento Martins
0V
0V
72. Um pouco de eletrônica
• Beleza. Mas, e o resistor?
Serve para quê?
Felipe Nascimento Martins
73. Um pouco de eletrônica
• Beleza. Mas, e o resistor?
Serve para quê?
• O elemento resistor serve
para dificultar a circulação
de corrente elétrica;
• Ele é colocado no circuito
para evitar que a corrente
cresça muito, o que pode
provocar problemas;
• No nosso circuito, o
resistor serve para evitar
que o LED queime devido
a uma corrente muito alta.
Felipe Nascimento Martins
74. Um pouco de eletrônica
• Quanto maior for o valor
da resistência do resistor,
menor será a corrente
(para uma mesma
diferença de tensão).
• O brilho do LED varia com
a corrente.
Felipe Nascimento Martins
75. Um pouco de eletrônica
• Cálculo da corrente:
• Lei de Ohm: V = R * I
• V = 5V, R = 220Ω.
• I = 5 / 220
• I = 0,0227 A = 22,7 mA
Felipe Nascimento Martins
76. Um pouco de eletrônica
• Cálculo da corrente:
• Lei de Ohm: V = R * I
• V = 5V, R = 220Ω + 220Ω.
• I = 5 / 440
• I = 0,0114 A = 11,4 mA
• Podemos calcular a queda de
tensão em cada resistor:
• VR = R * I, R = 220Ω, I = 11,4 mA.
• VR = 220 * 0,0114 = 2,5 V.
Felipe Nascimento Martins
77. Um pouco de eletrônica
• Cálculo da corrente:
• O LED tem queda de
tensão fixa = ~1,73V. Logo:
• V = 5 – 1,73 = 3,27V.
• V = R * I => I = V / R.
• I = 3,27 / 220 = 0,0149 A
• I = 14,9mA.
Felipe Nascimento Martins
+5V
0V
78. Um pouco de eletrônica
• Note que se a tensão do
pino 12 pudesse ser
alterada, a corrente no
circuito seria diferente.
• Ou seja, poderíamos
controlar o brilho do LED!
Felipe Nascimento Martins
+5V
0V
79. Prática 2: Código Morse
• Modifique o programa
Pisca-LED de forma que o
LED sinalize
indefinidamente o código
Morse que representa
S.O.S.:
...---...
OBS.: “ponto” é uma piscada
rápida do LED (pouco
tempo aceso), enquanto o
“traço” é uma piscada mais
lenta (mais tempo aceso).
Felipe Nascimento Martins
80. Diodo
• Dispositivo semicondutor que permite a circulação de
corrente apenas em um sentido;
• A tensão em seus terminais deve ter polaridade correta:
mais positiva no terminal A (anodo) e mais negativa no
terminal K (catodo);
• Apresenta queda de tensão aproximadamente fixa
(~0,7V) quando a corrente circula;
• Usado em circuitos retificadores: transforma corrente
alternada para contínua.
Felipe Nascimento Martins
83. Prática 3: Não pisca-LED
• LED é um diodo especial
que brilha quando a
corrente circula por ele.
• Experimente inverter a
ligação dos pinos do LED
em nosso circuito e
verifique que ele não vai
mais piscar, mesmo
quando houver diferença
de potencial nos pinos!
Felipe Nascimento Martins
84. Capacitor
• Elemento que armazena energia na forma de campo
elétrico;
• Existem vários tipos: alguns têm polaridade (como os
eletrolíticos), outros não (como os cerâmicos);
• A tensão em seus terminais depende da carga
acumulada, e não varia instantaneamente;
• Em corrente contínua, são usados como filtros ou
“suavizadores” de tensão.
Felipe Nascimento Martins
88. Sensores com Sinais Digitais
• Diversos sensores proveem informação através
de sinais digitais:
• Botão;
• Porta aberta/fechada;
• Andar de elevador;
• Fim-de-curso em máquinas industriais;
• Equipamento ligado/desligado;
• Nível de reservatório;
• Presença;
• Toque;
• Etc.
Felipe Nascimento Martins
89. Sensores com Sinais Digitais
• Do ponto de vista elétrico, comportam-se como se
fossem uma chave liga/desliga;
• Nesses casos, podemos fazer a ligação de modo
que o sinal do sensor seja 0V ou 5V;
• No Arduino, a função utilizada para leitura de sinais
digitais é digitalRead(pino); onde pino é o
número do pino em que o sensor está ligado;
• Para Vs = 5V, retorna 0 (Vpino < 2V) ou 1 (Vpino > 3V).
90. Prática 4: Leitura de Sinal Digital
Felipe Nascimento Martins
• Monte o circuito ao
lado.
• Altere o programa
da prática 1 para
que o LED acenda
com o botão for
pressionado, e
apague quando o
botão for liberado.
93. Funções do Arduino
• Já vimos:
void setup(){
...
}
void loop(){
...
}
Felipe Nascimento Martins
94. Funções do Arduino
• Já vimos:
pinMode(pino, OUTPUT ou INPUT);
digitalWrite(pino, LOW ou HIGH);
delay(número inteiro);
digitalRead(pino);
Felipe Nascimento Martins
95. Funções do Arduino
• Outras funções:
delayMicroseconds(número inteiro);
Pausa o programa pela quantidade definida de
microssegundos.
millis();
Retorna o número de milissegundos que se passou
desde que o microcontrolador foi ligado.
analogRead(pino);
Obtém valor entre 0 e 1023 proporcional à tensão no
pino (entre 0 e 5V). Tempo de conversão = 100μs.
Felipe Nascimento Martins
96. Funções do Arduino
• Outras funções:
delayMicroseconds(número inteiro);
Pausa o programa pela quantidade definida de
microssegundos.
millis();
Retorna o número de milissegundos que se passou
desde que o microcontrolador foi ligado.
analogRead(pino);
Obtém valor entre 0 e 1023 proporcional à tensão no
pino (entre 0 e 5V). Tempo de conversão = 100μs.
Felipe Nascimento Martins
97. Funções do Arduino
• Outras funções:
delayMicroseconds(número inteiro);
Pausa o programa pela quantidade definida de
microssegundos.
millis();
Retorna o número de milissegundos que se passou
desde que o microcontrolador foi ligado.
analogRead(pino);
Obtém valor entre 0 e 1023 proporcional à tensão no
pino (entre 0 e 5V). Tempo de conversão = 100μs.
Felipe Nascimento Martins
98. Funções do Arduino
• Exemplos:
while(analogRead(A2) < 950){
... // bloco de código
}
Executa o bloco de código até que o valor de retorno
da função analogRead seja maior que 950.
for(int conta = 0; conta < 6; conta++){
... // bloco de código
}
Executa o bloco de código até que conta >= 6.
Felipe Nascimento Martins
99. Funções do Arduino
• Exemplos:
while(analogRead(A2) < 950){
... // bloco de código
}
Executa o bloco de código até que o valor de retorno
da função analogRead seja maior que 950.
for(int conta = 0; conta < 6; conta++){
... // bloco de código
}
Executa o bloco de código até que conta >= 6.
Felipe Nascimento Martins
100. Funções do Arduino
• Exemplos:
if (brilho == 0 || brilho == 255) {
... // bloco de código 1
}
else {
... // bloco de código 2
}
Executa o bloco de código 1 se a condição de teste
for verdadeira. Caso contrário, executa o bloco de
código 2.
Felipe Nascimento Martins
101. Criando Funções no Arduino
int led = 13;
void setup(){
pinMode(led, OUTPUT);
}
void inverteLED(){
if (digitalRead(led)==0)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
void loop(){
inverteLED();
delay(500);
}
Felipe Nascimento Martins
102. Tipos de Dados no Arduino
Felipe Nascimento Martins
boolean (8 bits) – true/false;
byte (8 bits) – número entre 0 e 255;
char (8 bits) – caractere (número entre -128 e 127);
unsigned char (8 bits) – mesmo tipo que ‘byte’;
word (16 bits) – número entre 0 e 65.535;
unsigned int (16 bits) – mesmo tipo que ‘word’;
int (16 bits) – número entre -32.768 e 32.767;
unsigned long (32 bits) – número entre 0 e
4.294.967.295;
long (32 bits) – número entre -2.147.483.648 e
2.147.483.647;
float (32 bits) – entre -3,4028235E38 to 3,4028235E38.
108. Exercício: Desenhe o Fluxograma
const int ledPin = 13; // pino do LED
int ledState = LOW; // estado do LED
long previousMillis = 0; // última atualização do LED
long interval = 500; // interval para piscar LED
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
} Felipe Nascimento Martins
109. Prática 5: Leitura de Sinal Digital
Felipe Nascimento Martins
• Monte o circuito ao
lado.
• Altere o programa
da prática 4 para
que o LED troque
de estado a cada
pressionar de
botão: se estiver
apagado, acende; e
vice-versa.
110. Prática 5: Leitura de Sinal Digital
Felipe Nascimento Martins
• Monte o circuito ao
lado.
• Altere o programa
da prática 4 para
que o LED troque
de estado a cada
pressionar de
botão: se estiver
apagado, acende; e
vice-versa.
• Funcionou como
esperado?
114. Felipe Nascimento Martins
int led_pin = 13;
int led_state = LOW;
int button_pin = 0;
int button_state;
// the setup routine runs once when you press reset:
void setup() {
pinMode(led_pin, OUTPUT);
pinMode(button_pin, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// Enquanto o botão não for pressionado, não faz nada.
while (digitalRead(button_pin)!=0){
}
// Depois que o botão é pressionado, aguarda ser solto
while (digitalRead(button_pin)==0){
}
// Atraso para aguardar oscilação de contato terminar
delay(50);
// Inverte o estado da variável led_state
led_state = !led_state;
// Copia variável led_state para o pino do LED
digitalWrite(led_pin, led_state);
}
116. Sensores com Sinais Analógicos
• Diversos sensores proveem informação através
de sinais analógicos:
• Intensidade luminosa (LDR);
• Deslocamento (angular ou linear);
• Força/Torque (SFR, strain gage);
• Proximidade;
• Aceleração;
• Inclinação;
• Temperatura;
• Etc.
Felipe Nascimento Martins
117. Intensidade Luminosa: LDR
• Resistor cuja resistência varia conforme a
intensidade da luz incidente.
• Vários modelos com diferentes sensibilidades.
• Datasheet: http://www.biltek.tubitak.gov.tr/gelisim/elektronik/dosyalar/40/LDR_NSL19_M51.pdf
Felipe Nascimento Martins
119. Prática 6: Usando o sensor de luz
• Monte o circuito com LDR – Light Dependent
Resistor (sensor de luz).
• Escreva um programa que acenda o LED do pino
13 quando houver pouca luz e apague o mesmo
LED quando houver muita luz.
void setup() {
...
}
void loop() {
...
}
Felipe Nascimento Martins
120. Deslocamento
• Deslocamento linear ou angular pode ser medido
com potenciômetros;
• Com alimentação de 5V, o sinal varia de 0 a 5V
(mínimo a máximo deslocamento);
• Há potenciômetros angulares multivoltas e
potenciômetros lineares de longo alcance.
Felipe Nascimento Martins
122. Força e Torque
• FSR (Force Sensing Resistor) e Strain Gage
(extensômetro): resistência varia com a
deformação.
• Usados para medir força e torque.
• Datasheets:
FSR - http://www.trossenrobotics.com/productdocs/2010-10-26-DataSheet-FSR402-Layout2.pdf
Célula de carga - http://www.alfainstrumentos.com.br/manuais/celulas/catalogo_celulas_0302cp.pdf
Felipe Nascimento Martins
124. Proximidade por infravermelho
• Sharp GP2Y0A21YK0F
• Tensão de alimentação: 5V;
• Pode medir distâncias de 10 a 80 cm;
• Sinal: tensão entre 1,65V e 2,15V.
• Há outros modelos com outras faixas de medição.
Datasheet: https://www.sparkfun.com/datasheets/Components/GP2Y0A21YK.pdf
Felipe Nascimento Martins
126. Aceleração/Inclinação
• ADXL335
• Tensão de alimentação: 3,3 V;
• Mede aceleração nos 3 eixos do espaço;
• Mede aceleração de até 3g;
• Mede aceleração da gravidade (estática),
podendo ser usado para medir inclinação.
• Datasheet: https://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf
Felipe Nascimento Martins
127. Temperatura: RTDs
• RTD = Resistance Temperature Detectors
• Normalmente confeccionados com um fio (ou
enrolamento) de alta pureza de cobre, níquel ou
platina (estes são os melhores).
• RTDs comuns podem medir com erros da ordem de
±0,1ºC. Os de platina (PRT – Platinum Resistance
Thermometer) podem chegar a ±0,0001ºC.
• São estáveis e lineares, com ótima repetitividade.
• Aplicações incluem refrigeração de alimentos e
compostos químicos, fornos de fusão (produção de
metais e ligas), destilação fracionada (produção de
bebidas e derivados de petróleo), usinas nucleares e
aquecedores e refrigeradores domésticos.
Felipe Nascimento Martins
128. Temperatura: Termistores NTC/PTC
• São semicondutores cerâmicos que têm sua
resistência alterada com a variação de temperatura.
• Geralmente seu coeficiente de variação é maior que o
dos RTDs, mas a variação de resistência é menos
linear.
• Podem ser de dois tipos: NTC ou PTC (Negative ou
Positive Temperature Coefficient).
• Faixa típica de operação: de -100ºC a 300ºC.
• Resistência a 25ºC: de 0,5Ω a 100MΩ.
• Aplicações: circuitos simples de medição de
temperatura; para reduzir corrente de carga de
capacitores em fontes chaveadas (NTCs) etc.
Felipe Nascimento Martins
134. Comunicação serial
• Bit: menor unidade de informação -> 0 ou 1;
• Informação é enviada bit a bit, em sequência;
• Síncrona: uma linha de dados e outra de clock:
Felipe Nascimento Martins
135. Comunicação serial
• Bit: menor unidade de informação -> 0 ou 1;
• Informação é enviada bit a bit, em sequência;
• Assíncrona: apenas uma linha de dados. A
velocidade deve ser definida:
Felipe Nascimento Martins
136. Comunicação serial
• OK.
• Mas como posso transmitir outras informações
além de “zeros” e “uns”?
Felipe Nascimento Martins
137. Comunicação serial
• OK.
• Mas como posso transmitir outras informações
além de “zeros” e “uns”?
• Existe uma tabela que relaciona caracteres a
sequências de zeros e uns:
• ASCII (American Standard Code for
Information Interchange).
• Esta tabela criou um padrão para troca de
informações em sistemas binários.
Felipe Nascimento Martins
139. Comunicação Serial no Arduino
• Microcontrolador possui hardware para
comunicação serial:
• Pino digital 0 (RX): recepção de dados;
• Pino digital 1 (TX): transmissão de dados;
• Bit 1 = 5V; Bit 0 = 0V;
• A maioria das placas Arduino possui hardware
que converte sinais do padrão serial assíncrono
para USB;
Felipe Nascimento Martins
140. Prática 7: Medindo Temperatura
• Monte o circuito com o sensor de temperatura.
• Escreva um programa que mostre o valor da
temperatura na tela do computador a cada 0,5s.
Felipe Nascimento Martins
141. Prática 7: Medindo Temperatura
• Exemplo de programa:
void setup() {
Serial.begin(9600);
}
void loop() {
int sensor = analogRead(A0);
Serial.println(sensor);
delay(500);
}
Felipe Nascimento Martins
143. Prática 7: Medindo Temperatura
http://123d.circuits.io/circuits/155990-pratica-7-medindo-temperatura-sinal-analogico/embed
Felipe Nascimento Martins
144. Comunicação Serial no Arduino
• Serial.println(analogValue, DEC); //
envia analogValue (int) codificada em
ASCII no formato decimal
• Serial.println(analogValue, HEX); //
envia ASCII no formato hexadecimal
• Serial.println(analogValue, OCT); //
envia ASCII no formato octal
• Serial.println(analogValue, BIN); //
envia ASCII no formato binário
Felipe Nascimento Martins
145. Comunicação Serial no Arduino
• Serial.available(); // retorna 1 se
houver caracter disponível no buffer de
recepção. Caso contrário, retorna 0.
• Serial.read(); // lê um byte recebido
pela Serial (int)
• Exemplo:
int incomingByte;
if (Serial.available() > 0) {
incomingByte = Serial.read();
}
Felipe Nascimento Martins
146. Prática 8: Comunicação bidirecional
• Outro exemplo de comunicação serial: desta vez
o Arduino vai receber um dado do computador,
processá-lo e retornar o resultado pela porta
serial.
• Vamos analisar o programa:
int i, numero;
void setup() {
Serial.begin(9600);
}
void loop() {
while (true) {
Serial.print("Entre com um numero: ");
while (Serial.available()==0);
numero = Serial.read();
Felipe Nascimento Martins
147. if (numero>='0' && numero<='9')
Serial.println(numero-’0’);
else {
Serial.println("O valor deve ser numerico!");
continue;
}
numero-='0';
for (i = 0; i <= 10; i++) {
Serial.print(numero);
Serial.print(" x ");
Serial.print(i);
Serial.print(" = ");
Serial.println(numero*i);
}
Serial.println("");
}
}
Felipe Nascimento Martins
148.
149. Prática 8: Comunicação bidirecional
Felipe Nascimento Martins
http://123d.circuits.io/circuits/155997-pratica-8-comunicacao-bidirecional-tabuada/embed
151. Shift Registers
• Shift registers (ou Registradores de
Deslocamento) são memórias que recebem
uma sequência de bits enviados serialmente e
disponibilizam seus valores de forma
simultânea;
• Muito utilizados em sistemas embarcados
para economizar pinos de E/S dos
microcontroladores;
• CI 74HC595 é um shift register de 8 bits.
• Datasheet: http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf
Felipe Nascimento Martins
154. Prática 9: Usando shift register
• Monte o circuito abaixo.
Felipe Nascimento Martins
155. Prática 9: Usando shift register
int latchPin = 8; //Pin connected to ST_CP of 74HC595
int clockPin = 12; //Pin connected to SH_CP of 74HC595
int dataPin = 11; //Pin connected to DS of 74HC595
void setup() {
//set pins to output so you can control the shift
register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
Felipe Nascimento Martins
156. Prática 9: Usando shift register
void loop() {
// count from 0 to 255 and display the number
for (int numberToDisplay = 0; numberToDisplay < 256;
numberToDisplay++) {
// take the latchPin low: LEDs don't change
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST,
numberToDisplay);
digitalWrite(latchPin, HIGH); // turn LEDs on
delay(500);
}
}
Felipe Nascimento Martins
161. Controle de potência por PWM
P = V2 / R
analogWrite(11, 200);
cria no pino 11 um sinal
PWM com razão cíclica
igual a 200;
f = 490Hz;
apenas alguns pinos
possuem saída PWM.
Felipe Nascimento Martins
162. Prática 10: Controle de brilho
int brilho = 0; // brilho do LED
int sensor; // valor do LDR
void setup() {
pinMode(A2, INPUT); // pino do LDR: entrada A2
pinMode(13, OUTPUT); // pino do LED: saida 13
Serial.begin(9600);
}
void loop() {
sensor = analogRead(A2); // le valor do LDR
brilho = map(sensor, 0, 1023, 0, 255);
Serial.println(brilho); // envia ao PC
analogWrite(13, brilho); // aciona LED
delay(100);
}
Felipe Nascimento Martins
163. Prática 11: Pisca-pisca suave
int brilho = 0; // brilho do LED
int variacao = 5; // quanto varia o brilho
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
analogWrite(13, brilho);
brilho = brilho + variacao;
if (brilho == 0 || brilho == 255) {
variacao = -variacao;
}
delay(30);
}
Felipe Nascimento Martins
165. LCD – Liquid Cristal Display
• Opção prática de apresentar uma grande
quantidade de dados de forma relativamente
simples e barata;
• O módulo é constituído de um display de
cristal líquido (LCD) e de um controlador de
display;
• Existem dois tipos de módulo LCD: caractere
e gráfico.
Felipe Nascimento Martins
166. • Os displays de caracteres são mais baratos e
capazes de apresentar caracteres como
letras, números e símbolos;
• Sua tela é dividida em linhas e colunas, e
cada posição armazena um caractere;
• Não funcionam adequadamente para a
apresentação de gráficos.
LCD – Liquid Cristal Display
Felipe Nascimento Martins
167. • Os displays gráficos são mais caros e
complexos de programar;
• Podem apresentar basicamente qualquer tipo de
informação na tela, inclusive gráficos, fotos etc.
100 x 64 pixels 128 x 64 pixels
LCD – Liquid Cristal Display
Felipe Nascimento Martins
168. • Serão abordados neste curso os módulos de
caractere baseados no chip controlador
Hitachi HD 44780;
• É um chip que é praticamente padrão no
segmento de módulos de display LCD;
• Permite um interface simples com
microcontroladores.
LCD – Liquid Cristal Display
169. • Tem largura de barramento de dados
selecionável para 4 ou 8 bits;
• São necessárias três linhas de controle
adicionais: ENABLE, RS e R/W;
• A comunicação no modo de 4 bits é realizada
utilizando apenas as quatro linhas mais
significativas (D7 a D4). O byte é dividido em
dois nibbles onde o mais significativo é enviado
primeiro.
LCD – Liquid Cristal Display
Felipe Nascimento Martins
170. Bit 1 de dados do LCDD18
Bit 0 de dados do LCDD07
EnableE6
Read/WriteR/W5
Register SelectRS4
ContrasteVo3
Positivo (5V)Vdd2
TerraVss1
FunçãoNomePino
LCD – Liquid Cristal Display
Felipe Nascimento Martins
171. Catodo do back-light (se existir)K16
Anodo do back-light (se existir)A15
Bit 7 de dados do LCDD714
Bit 6 de dados do LCDD613
Bit 5 de dados do LCDD512
Bit 4 de dados do LCDD411
Bit 3 de dados do LCDD310
Bit 2 de dados do LCDD29
FunçãoNomePino
LCD – Liquid Cristal Display
Felipe Nascimento Martins
172. • O HD 44780 possui as seguintes memórias:
– 80 bytes de memória RAM (DDRAM – Data
Display RAM);
– 64 bytes de RAM para o gerador de
caracteres (CGRAM – Caracter Generator
RAM);
– 9920 bits de memória ROM (CGROM): 208
caracteres 5x8 ou 32 caracteres 5x10.
LCD – Liquid Cristal Display
Felipe Nascimento Martins
173. • O Arduino possui uma biblioteca para
utilização de LCDs de caractere;
• Após incluir a biblioteca, é necessário
declarar o display informando a que pinos do
Arduino o LCD está conectado;
• Em seguida, deve ser chamada a função de
inicialização, passando como parâmetros o
número de caracteres e de linhas que o LCD
possui.
LCD – Liquid Cristal Display
Felipe Nascimento Martins
174. Prática 12: Dados no LCD
#include <LiquidCrystal.h>
// inicializa bib. informando os pinos conectados:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2); // inicializa o LCD
lcd.print("hello, world!"); // mostra mensagem
}
void loop() {
// coloca cursor na coluna 0, linha 1:
lcd.setCursor(0, 1);
// mostra numero de segundos desde o reset:
lcd.print(millis()/1000);
delay(100);
}
Felipe Nascimento Martins
177. • Outras funções interessantes:
lcd.home(); // retorna cursor ao início
lcd.write(char); // imprime um caracter
lcd.blink(); // aciona cursor piscante
lcd.noBlink(); // desliga cursor piscante
lcd.autoscroll(); // ativa deslocamento a esquerda
lcd.noAutoscroll(); // desliga deslocamento
lcd.noDisplay(); // apaga tela (texto na memória)
lcd.display(); // liga tela (exibe caracteres)
lcd.rightToLeft(); // próxima letra à esquerda
lcd.leftToRight(); // próxima letra à direita
lcd.clear(); // limpa a tela
LCD – Liquid Cristal Display
Felipe Nascimento Martins
178. Prática 13: Valor do sensor no LCD
• Modifique o programa anterior para fazer com que a
primeira linha do LCD mostre o valor de temperatura
e a segunda linha mostre um relógio tipo HH:MM:SS.
Felipe Nascimento Martins
179. LCD gráfico 128 x 64 pixels
Detalhes: http://nossosrobos.blogspot.com.br/2012/01/lcd-para-seu-robo-com-arduino.html
Felipe Nascimento Martins
182. Motor de Corrente Contínua (CC)
Felipe Nascimento Martins
• Alimentado em corrente contínua;
• Possui ímã e bobinas internamente;
• Velocidade é ajustada pela tensão de
alimentação (pode ser por PWM!);
• Sentido de giro é alterado pela polaridade.
183. Motor de Passo
Felipe Nascimento Martins
• Alimentado com sinais
digitais;
• Alimentação das
bobinas deve ser
sequencial;
• Permite controle preciso
de posição;
• Torque cai muito com o
aumento da velocidade.
184. Medição de deslocamento (encoder)
• Permite medir a velocidade e posição angular
dos motores;
• Precisão: número de pulsos por volta.
Felipe Nascimento Martins
187. Servomotor
Felipe Nascimento Martins
• É um motor CC que possui um sistema de
interno de medição e de controle:
• angular – controla a posição (giro) do eixo;
• contínuo – controla a velocidade do eixo;
189. Servomotor
Felipe Nascimento Martins
• Normalmente é feito com um motor de
corrente contínua, um circuito eletrônico e
engrenagens para aumentar o torque;
194. #include <Servo.h>
Servo myservo; // create servo object
Servo myservo2;
int potpin = 0; // used to connect the potentiometer
int val; // value from the analog pin
void setup() {
myservo.attach(9); // attaches the servo on pin
myservo2.attach(10);
}
void loop() {
val = analogRead(potpin); // entre 0 e 1023
val = map(val, 0, 1023, 0, 179); // escalona
myservo.write(val);
myservo2.write(179-val);
delay(15);
} Felipe Nascimento Martins
Exemplo: Controle de Servomotores
195. Outros motores com Arduino
• Cada pino do Arduino pode fornecer, no máximo,
40mA de corrente -> pode não ser suficiente para
acionar um motor!
• Solução: usar transistores.
Felipe Nascimento Martins
196. Transistor
• Um transistor pode ser entendido
como uma “válvula” eletrônica: é
capaz de acionar cargas de alta
corrente a partir de um sinal de
controle de baixa corrente.
• Quanto maior for a corrente no pino
de “base” (B), maior será a corrente
entre os pinos “coletor” (C) e “emissor”
(E).
• Por exemplo, se a corrente na base
variar de 0 a 0,01 A, a corrente de
coletor pode variar de 0 a 1A!
Felipe Nascimento Martins
199. • Com um transistor é possível ligar e desligar um
motor, além de controlar sua velocidade (PWM);
• Mas, para inverter o sentido de giro de um motor
CC é necessário inverter o sentido de circulação
da corrente no motor;
• Com um transistor, a corrente circula apenas num
sentido;
• Solução: usar quatro transistores conectados em
forma de ponte: Ponte H.
Ponte H
Felipe Nascimento Martins
207. Comunicação Serial no Arduino
• A maioria das placas Arduino possui hardware
para implementação de comunicação serial em
diferentes padrões:
• SPI – Serial Peripheral Interface;
• TWI – Two Wire serial Interface (I2C);
• USART – Universal Synchronous and
Asynchronous serial Receiver and
Transmitter (estilo RS-232) – Já vimos este
tipo;
Felipe Nascimento Martins
208. SPI – Serial Peripheral Interface
Felipe Nascimento Martins
209. SPI
• SPI – Serial Peripheral Interface – é uma
interface de comunicação serial síncrona
utilizada para comunicação a curta distância:
• CIs conversores A/D e D/A;
• Memórias Flash e EEPROM;
• Relógios de tempo real;
• Sensores;
• Potenciômetros digitais;
• Telas de LCD; etc.
Felipe Nascimento Martins
210. SPI
• Na comunicação SPI sempre existe um
dispositivo mestre (em geral é o próprio
microcontrolador) que controla os periféricos;
• Três linhas são comuns a todos os dispositivos:
– MISO (Master In Slave Out) – linha pela qual o
escravo envia dados ao mestre;
– MOSI (Master Out Slave In) – linha pela qual o
mestre envia dados aos escravos;
– SCK (Serial Clock) – clock gerado pelo mestre
para sincronizar a comunicação.
Felipe Nascimento Martins
211. SPI
• Além das linhas MISO, MOSI e SCK, cada
dispositivo está conectado a uma linha SS:
• SS (Slave Select) – cada escravo possui uma
entrada desta linha, que é controlada pelo
mestre para habilitar ou desabilitar os
dispositivos individualmente:
• Em nível baixo: comunicação habilitada;
• Em nível alto: escravo ignora o mestre.
Felipe Nascimento Martins
215. SPI com Arduino
• A biblioteca do Arduino faz a placa operar em
modo mestre;
• Ordem de transmissão dos dados (primeiro pelo
MSB ou pelo LSB): SPI.setBitOrder()
• Linha de clock fica em nível alto ou baixo
quando inativa e modo de amostragem de
dados: SPI.setDataMode()
• Velocidade de comunicação:
SPI.setClockDivider()
Felipe Nascimento Martins
217. Cartão de Memória SD
• A biblioteca “SD.h” provê meios de
utilização de cartões de memória SD com o
Arduino.
• Esse tipo de memória se comunica com o
microcontrolador por SPI.
Felipe Nascimento Martins
219. Cartão de Memória SD
Alimentação: 3,3V uso de resistores em 5V!
Felipe Nascimento Martins
220. Exemplo: data logger
#include <SD.h>
const int chipSelect = 4;
void setup()
{
Serial.begin(9600);
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT); // chip select
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
}
Felipe Nascimento Martins
221. Exemplo: data logger
void loop()
{
// make a string for assembling the data to log:
String dataString = "";
// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3;
analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}
Felipe Nascimento Martins
222. Exemplo: data logger
// open the file. only one file can be open at a
time,
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
Felipe Nascimento Martins
223. TWI – Two Wire serial Interface
(I2C)
Felipe Nascimento Martins
224. I2C
• I2C (Inter-Integrated Circuit) foi desenvolvido
pela PHILIPS no início da década de 1980 para
transferência de dados entre
microcontroladores e equipamentos;
• Barramento de comunicação serial de dados
entre dispositivos onde a conexão é feita
através de 2 fios;
• É half-duplex, ou seja, em determinado
instante, apenas recebe ou envia informação;
Felipe Nascimento Martins
225. I2C
• Taxa de transferência: até 100kbits/s;
• Operação em modo mestre/escravo: um
dispositivo ou processo (mestre) tem controle
unidirecional sobre um ou mais outros
dispositivos (escravos);
• Pode possuir mais de um mestre, mas só um
controla o barramento de cada vez.
Felipe Nascimento Martins
228. I2C
• Um fio transporta o sinal do clock (SCL – Serial
Clock Line) e o outro, os dados (DAS - Serial
Data Line);
• A comunicação é síncrona. Primeiro é enviado o
endereço do dispositivo destinatário. Em
seguida, o dado é enviado ao barramento.
230. TWI (I2C)
• No Arduino a biblioteca Wire possui as funções
para implementação da comunicação I2C;
• Esta biblioteca implementa apenas
endereçamento de 7 bits;
• Caso use dispositivos que exijam 8 bits de
endereçamento, deve-se configurar seu
endereço para a faixa 0-127.
Felipe Nascimento Martins
232. Exemplo: Potenciômetro Digital
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c (address optional for master)
}
byte val = 0;
void loop() {
Wire.beginTransmission(44); // transmit to device #44
// device address is specified in datasheet
Wire.write(byte(0x00)); // sends instruction byte
Wire.write(val); // sends potentiometer value byte
Wire.endTransmission(); // stop transmitting
val++; // increment value
if(val == 64) { // if reached 64th position (max)
val = 0; // start over from lowest value
}
delay(500);
}
Felipe Nascimento Martins
233. Arduino e NXT via RS-485 e I2C
Felipe Nascimento Martins
Arduino Nano
234. Arduino e NXT via RS-485 e I2C
Detalhes: http://nossosrobos.blogspot.com.br/2011/08/arduino-conversando-com-nxt-via-rs-485.html
http://nossosrobos.blogspot.com.br/2013/03/comunicacao-ic-entre-lego-nxt-e-arduino.html
Felipe Nascimento Martins
236. Comunicação sem-fio
• Wixel shield for Arduino, com dois módulos Wixel;
• Rádio de 2,4GHz para até 30 metros, 350kbps;
• Possui microcontrolador programável por interface
amigável;
• Tem 15 pinos de I/O, com 6 entradas analógicas, que
podem ser programados de forma independente da
comunicação;
• Permite a criação de uma rede com até 128 módulos de
comunicação;
• A comunicação é feita como se fosse comunicação
serial padrão;
• Permite gravar programas no Arduino sem ligar o cabo
USB à placa!
Felipe Nascimento Martins
238. Conexão Bluetooth
• Modelo JY-BT03 - Shenzhen Jiayuan Electronic Co. Ltd.;
• Conexão com pinos RX-TX do microcontrolador;
• Comunicação Bluetooth 2.0;
• Baud rate: 2.400 a 1.382.400 bps;
• Tensão de alimentação: 5,0 V (3,6V a 6,0V);
• Corrente: 35mA quando realiza "pareamento"; 8mA
quando conectado;
• Antena impressa na própria placa;
• Possui LED que indica o estado da conexão Bluetooth;
• Senha padrão: 1234.
Felipe Nascimento Martins
242. Conexão em rede ZigBee
• ZigBee designa um conjunto de especificações
para a comunicação sem-fio entre dispositivos
eletrônicos, com ênfase na baixa potência de
operação, na baixa taxa de transmissão de
dados e no baixo custo de implantação;
• Pode-se formar uma rede com vários módulos,
de maneira que a informação seja transmitida
de um ao seguinte (Mesh) para aumentar o
alcance total.
Felipe Nascimento Martins
243. Módulo XBee – ZigBee
• Módulo Digi XBee ZB - Antena Wire - Low Power
• Frequência de Transm.: 2,4 GHz
• Potência de Transm.: 1,25 mW
• Alcance Máximo estimado: até 120m (+1 dBm)
• Topologias de rede: P-to-P, P-to-M, ZigBee/Mesh
• Sleep Mode < 1µA
• RF Data Rate 250 kbps
• Segurança: 128-bit AES
• (10) GPIO, (4) ADC e 3V3 CMOS UART
Felipe Nascimento Martins
244. Módulo XBee – ZigBee
• XBee e XBee-PRO ZB
• Frequência de Transm.: 2,4 GHz
• Potência de transm.: 63 mW (+18 dBm) / Int'l
10 mW (+10 dBm)
• Alcance Máximo estimado: 3200 m
• RF Data Rate: RF 250 kbps, Serial até 1 Mbps
• Segurança: 128-bit AES
• Antena PCB - Ref: PIT
Felipe Nascimento Martins
250. Controle de um Robô
Detalhes: http://nossosrobos.blogspot.com.br/2012/09/monte-seu-robo-com-arduino.html
Felipe Nascimento Martins
251. Robôs baseados em Arduino
• DFRobotShop Rover - Arduino
Compatible Tracked Robot
Felipe Nascimento Martins
252. Robôs baseados em Arduino
• DFRobotShop Rover 2.0 – Arduino
Compatible Mecanum
Felipe Nascimento Martins
253. Robô Arduino oficial
• Arduino Robot
Felipe Nascimento Martins
Detalhes: http://nossosrobos.blogspot.com.br/2013/07/arduino-robot-o-primeiro-robo-arduino.html
254. Softwares gratuitos
Felipe Nascimento Martins
• IDE de programação do Arduino:
www.arduino.cc
• Fritzing - para fazer esquemas elétricos, de
proto-board e placas de circuito impresso:
www.fritzing.org
• 123D Circuits.io - para simulação de circuitos
com ou sem Arduino e projeto de placas de
circuito impresso (roda no navegador):
http://123d.circuits.io
255. Referências
Felipe Nascimento Martins
• ARDUINO. Language Reference. Disponível em:
<http://arduino.cc/en/Reference/HomePage>. MAR/2014.
• ERIKSSON, Fredrik. Industrial Circuits Application Note - Stepper
Motor Basics.
• FONSECA, Érika e BEPPU, Mathyan. Apostila Arduino. CT/UFF, 2010.
• JUSTEN, Álvaro. Curso de Arduino (apostila), 2011.
• LIMA, Charles B. de; VILLAÇA, Marco V. M. AVR e Arduino – Técnicas
de Projeto. 2ª ed. 2012.
• MARTINS, Felipe N. Introdução à Eletrônica com Arduino. Disponível
em: <http://www.slideshare.net/felipenm/oficina-de-introduo-a-eletrnica-
com-arduino>.
• Nossos Robôs: www.nossosrobos.blogspot.com
• POMÍLIO, J.A. Eletrônica de Potência. UNICAMP (apostila para o
curso de graduação). Acesso em AGO/2010.
• http://www.labdegaragem.com.br/wiki
• http://www.learningaboutelectronics.com/
• VALPEREIRO, Filipe. Workshop Arduino, 2008.