




























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila Arduino
Tipologia: Notas de estudo
1 / 36
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























Arduino^1 ´e um projeto que engloba software e hardware e tem como objetivo fornecer uma plataforma f´acil para prototipa¸c˜ao de projetos interativos, utilizando um microcontrolador. Ele faz parte do que chamamos de computa¸c˜ao f´ısica: ´area da computa¸c˜ao em que o software interage diretamente com o hardware, tornando poss´ıvel integra¸c˜ao f´acil com sensores, motores e outros dispositivos eletrˆonicos. A parte de hardware do projeto, uma placa que cabe na palma da m˜ao, ´e um computador como qualquer outro: possui microprocessador, mem´oria RAM, mem´oria flash (para guardar o software), temporizadores, contadores, dentre outras funcionalidades. Atualmente, o projeto est´a na vers˜ao Uno, por´em muitos Arduinos encontrados hoje s˜ao da vers˜ao Duemilanove (2009, em italiano), que possui um clock de 16MHz, 2kB de mem´oria RAM, 32kB de mem´oria flash, 14 portas digitais e 6 entradas anal´ogicas.
Figura 1.1: Foto do hardware de um Arduino Duemilanove
A principal diferen¸ca entre um Arduino e um computador convencional ´e que, al´em ter menor porte (tanto no tamanho quanto no poder de processamento), o Arduino utiliza dispositivos diferentes para entrada e sa´ıda em geral. Por exemplo: em um PC utilizamos teclado e mouse como dispositivos de entrada e monitores e impressoras como dispositivos de sa´ıda; j´a em projetos com o Arduino os dispositivos de entrada e sa´ıda s˜ao circuitos el´etricos/eletrˆonicos. Como a interface do Arduino com outros dispositivos est´a mais perto do meio f´ısico que a de um PC, podemos ler dados de sensores (temperatura, luz, press˜ao etc.) e controlar outros circuitos (lˆampadas, motores, eletrodom´esticos etc.), dentre outras coisas que n˜ao conseguir´ıamos diretamente com um PC. A grande diferen¸ca com rela¸c˜ao ao uso desses dispositivos, no caso do Arduino, ´e que, na maior parte das vezes, n´os mesmos constru´ımos os circuitos que s˜ao utilizados, ou seja, n˜ao estamos limitados apenas a produtos existentes no mercado: o limite ´e dado por nosso conhecimento e criatividade! O melhor de tudo nesse projeto ´e que seu software, hardware e documenta¸c˜ao s˜ao abertos. O software ´e livre (GNU GPL^2 ), o hardware ´e totalmente especificado (basta entrar no site e baixar os esquemas) e a documenta¸c˜ao est´a dispon´ıvel em Creative Commons^3 – os usu´arios podem colaborar (seja escrevendo documenta¸c˜ao, seja traduzindo) atrav´es da wiki!
(^1) http://www.arduino.cc/ (^2) http://www.gnu.org/licenses/gpl.html (^3) http://creativecommons.org/licenses/
Figura 1.2: Arduino IDE vers˜ao 0018 rodando no Ubuntu GNU/Linux 10.
Quando ensinamos linguagens de programa¸c˜ao novas, geralmente o primeiro exemplo ´e um hello world. Como o Arduino n˜ao vem por padr˜ao com um display, nosso primeiro exemplo ser´a fazer um LED piscar – e por isso ser´a chamado blink. Nosso LED ficar´a aceso durante um segundo e apagado durante outro segundo e ent˜ao recome¸car´a o ciclo. Abra a IDE e digite o seguinte c´odigo:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
Chamamos um c´odigo feito para Arduino de sketch e o salvamos em um arquivo com a extens˜ao .pde. Com nosso sketch pronto, bastar´a conectar o Arduino na porta USB e clicar no bot˜ao upload (segundo, da direita para a esquerda – destacado na figura acima). Ap´os o processo, ser´a vista a mensagem Done uploading na IDE e ent˜ao o sketch estar´a rodando no Arduino, ou seja, o LED acender´a e apagar´a, de 1 em 1 segundo. Vamos agora `a explica¸c˜ao do processo:
O Arduino possui 14 portas digitais, que podemos utilizar como entrada ou sa´ıda. Nesse caso, vamos utilizar a porta de n´umero 13 como sa´ıda, dessa forma, podemos controlar quando a porta ficar´a com 5V ou quando ficar´a com 0V – internamente o Arduino possui um LED conectado `a porta 13 e, por isso, teremos como “ver” nosso software funcionando.
Para que nosso software funcione corretamente no Arduino, precisamos criar duas fun¸c˜oes espec´ıficas: setup e loop. A fun¸c˜ao setup ´e executada assim que o Arduino d´a boot, j´a a fun¸c˜ao loop fica sendo executada continuamente (em loop) at´e que o Arduino seja desligado. Como as portas digitais s˜ao de entrada ou sa´ıda, definimos ent˜ao dentro da fun¸c˜ao setup que a nossa porta 13 ´e uma porta de sa´ıda – fazemos isso atrav´es da chamada `a fun¸c˜ao pinMode, que j´a vem na biblioteca padr˜ao do Arduino.
Depois de configurarmos corretamente a porta 13 como sa´ıda, precisamos acender e apagar o LED que est´a conectado a ela. Para alterar a tens˜ao na porta, utilizamos a fun¸c˜ao digitalWrite (que tamb´em est´a na biblioteca padr˜ao do Arduino); passamos para essa fun¸c˜ao a porta que queremos alterar a tens˜ao e o novo valor de tens˜ao (HIGH = 5V, LOW = 0V). Depois das chamadas para acender e apagar o LED, chamamos a fun¸c˜ao delay passando o parˆametro 1000 – o que essa fun¸c˜ao faz ´e esperar um tempo em milisegundos para ent˜ao executar a pr´oxima instru¸c˜ao.
Deve-se ressaltar que a IDE Arduino inclui automaticamente todas as bibliotecas que utilizamos. Se vocˆe est´a acostumado com C/C++, note que n˜ao precisamos digitar as diretivas include para arquivos como o stdlib.h, por exemplo. Tudo ´e feito de forma autom´atica para facilitar o desenvolvimento do projeto!
Como o Arduino j´a vem com um LED internamente conectado `a porta 13, n˜ao precisaremos de circuitos externos para que esse projeto funcione, ou seja, bastar´a fazer upload daquele c´odigo e j´a teremos o resultado esperado:
(a) LED apagado (b) LED aceso
Figura 1.3: Arduino Duemilanove rodando o exemplo Blink
Por´em, se quisermos acender um LED externo a placa, podemos conect´a-lo diretamentea porta 13. Podemos utilizar um LED de 5mm que acende com 2,5V. O problema, nesse caso, se d´a por conta da porta digital: ela assume ou a tens˜ao 0V, ou a tens˜ao 5V – e caso coloquemos 5V no LED ele ir´a queimar.
Para solucionar esse problema precisamos ligar algum outro componente que seja respons´avel por dividir parte dessa tens˜ao com o LED, para que ele n˜ao queime, ent˜ao utilizaremos um resistor. Portanto, ligamos um resistor de 120Ω em s´erie com o LED, o resistor a porta 13 e o LEDa porta GND – ground ou terra –, como na Figura 1.4.
Internamente, o circuito do Arduino ´e alimentado com uma tens˜ao de 5V. Quando ligamos o Arduino em uma porta USB do PC, o pr´oprio PC, atrav´es do cabo USB, alimenta o Arduino. Por´em nem sempre temos um PC por perto; para esses casos, podemos utilizar uma outra fonte de energia de 5V (a fonte deve ser ligada diretamente nos pinos 5V e GND do Arduino).
Como n˜ao possu´ımos pilhas/baterias em abundˆancia no mercado com tens˜ao de 5V, fica complicado alimentar um Arduino dessa forma alternativa – se tivermos uma tomada de 127/220VAC por perto, poder´ıamos ligar uma fonte AC/DC (essas sim, existem aos montes). Para resolver esse problema, o Arduino possui um regulador de tens˜ao que aceita tens˜oes de 7 a 12V (na verdade, ele consegue funcionar com tens˜oes entre 6 e 20V, apesar de n˜ao ser recomendado). Com o regulador de tens˜ao podemos combinar pilhas em s´erie, utilizar uma bateria de 9V ou mesmo baterias de carros, motos e no-breaks (12V).
Figura 1.5: Arduino alimentado por uma bateria de 9V Retirado de http://www.arduino.cc/playground/Learning/9VBatteryAdapter
Assim como a IDE j´a vem com diversas fun¸c˜oes pr´e-definidas, o Arduino possui outras bibliotecas para controle de servomotores, displays LCD, gera¸c˜ao de ´audio, recep¸c˜ao de sinais de sensores e outros dispositivos (como teclado PS/2), dentre muitas outras coisas! E quem pensa que essa estensibilidade toda se restringe a parte de software est´a muito enganado: o Arduino possui o que chamamos de shields, que s˜ao placas que se acoplama placa original, agregando funcionalidades `a mesma.
Existem shields dos mais variados tipos, para as mais diversas fun¸c˜oes. 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¸c˜oes eletrˆonicas envolvidas, outros possuem leitor de cart˜ao SD, acelerˆometro, GPS e diversos outros sensores que podem gerar dados importantes para o software que est´a rodando no microcontrolador.
Figura 1.6: Arduino Duemilanove com shield Ethernet
Existem tamb´em outros shields mais elaborados, que s˜ao sistemas completos. Um deles, por exemplo, cria uma plataforma para desenvolvimento de jogos no Arduino: o Video Game Shield^10 , que possui uma sa´ıda RCA e duas entradas para controles Numchuck do Nintendo Wii. Al´em do hardware, existe uma biblioteca para ser utilizada em conjunto, que j´a possui v´arias fun¸c˜oes pr´e-programadas para fazermos desenhos na televis˜ao e capturar os dados dos movimentos nos controles.
Apesar de o Arduino ser um computador independente, em alguns casos podemos nos aproveitar de um PC por perto e explorar outra funcionalidade muito boa do projeto: o Arduino consegue conversar com o computador atrav´es da porta USB. Isso nos permite desenvolver um software que roda no PC e se comunica com o software que roda no Arduino, o que nos abre um mar de possibilidades! Podemos, por exemplo, criar um software em Python^11 que recebe os dados de um sensor, via USB (atrav´es do Arduino), e envia para algum banco de dados na Internet – assim teremos, de certa forma, nosso Arduino online, enviando dados para o mundo, atrav´es de um PC! Existem in´umeros projetos interessantes que fazem interface entre linguagens de programa¸c˜ao e o Arduino
(^10) http://www.wayneandlayne.com/projects/video-game-shield/ (^11) http://www.python.org/ (^12) http://code.google.com/p/arduinoscope/ (^13) http://www.justen.eng.br/Turiquinhas (^14) http://www.firmata.org/
Figura 1.8: Esquema el´etrico ligando um bot˜ao ao Arduino
Montado o circuito acima, vamos programar o Arduino com o seguinte c´odigo:
#define BOTAO 2 #define LED 13
void setup() { pinMode(LED, OUTPUT); pinMode(BOTAO, INPUT); }
void loop() { if (digitalRead(BOTAO) == HIGH) { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } }
A fun¸c˜ao digitalRead nos retorna o valor correspondente `a tens˜ao que est´a na porta que passamos entre parenteses. Em nosso exemplo, utilizamos a porta BOTAO (que na verdade ´e uma constante, definida atrav´es da diretiva #define), cujo valor ´e 2. O valor retornado ´e uma constante, mapeado da seguinte forma:
O que o programa faz, ent˜ao, ´e apagar o LED caso o bot˜ao esteja pressionado e acendˆe-lo caso n˜ao esteja. Fica como exerc´ıcio entender o c´odigo a seguir, que ´e uma otimiza¸c˜ao do anterior e possui mesma funcionalidade:
#define BOTAO 2 #define LED 13
void setup() { pinMode(LED, OUTPUT); pinMode(BOTAO, INPUT); }
void loop() { digitalWrite(LED, !digitalRead(BOTAO)); }
Dica: o caractere “!”, em linguagem C, significa not e tem como finalidade negar a express˜ao que segue `a sua direita.
PWM significa Modula¸c˜ao por Largura de Pulso (Pulse-Width Modulation, do Inglˆes) e consiste em manipu- larmos a raz˜ao c´ıclica de um sinal (conhecida do Inglˆes como duty cycle) a fim de transportar informa¸c˜ao ou controlar a potˆencia de algum outro circuito. Basicamente, teremos um sinal digital que oscila entre 0V e 5V com determinada frequˆencia (o Arduino trabalha com um padr˜ao perto de 500Hz) – funciona como se fosse um clock, por´em os tempos em que o sinal permanece em 0V e 5V podem ser diferentes. Duty cycle ´e a raz˜ao do tempo em que o sinal permanece em 5V sobre o tempo total de uma oscila¸c˜ao. A Figura 1.9 ilustra melhor esse conceito:
Figura 1.9: Sinal PWM com duty cycle de 25%
Assim, temos: duty cycle = x x + y
x T O que controlamos atrav´es de software ´e justamente a duty cycle, ou seja, o percentual de tempo em que o sinal fica em 5V. Dessa forma, podemos utilizar essa t´ecnica para limitar a potˆencia de algum circuito. Por exemplo, considere que um LED L 1 seja alimentado o tempo inteiro por um sinal constante de 5V; j´a o LED L 2 ´e alimentado pelo sinal PWM acima (duty cycle de 25%). Atrav´es de um c´alculo simples de potˆencia podemos notar que o LED L 2 consumir´a apenas 25% da potˆencia do primeiro. Infelizmente, por limita¸c˜oes de hardware, o Arduino n˜ao possui PWM em todas as portas digitais: apenas as portas 3, 5, 6, 9, 10 e 11 s˜ao privilegiadas e podem utilizar esse recurso. Para exemplificar o uso de controle de potˆencia de um circuito utilizando PWM vamos utilizar um LED em s´erie com um resistor ligados `a porta 11 (o circuito ´e o mesmo do experimento Blink, s´o vamos mudar a porta) e o seguinte c´odigo:
#define LED 11 void setup() { pinMode(LED, OUTPUT); }
void loop() { for (int i = 0; i < 255; i++) { analogWrite(LED, i); delay(30); } }
Na fun¸c˜ao loop acima temos um la¸co for, que conta de 0 a 255 (armazenando o valor do contador na vari´avel i), chamando a fun¸c˜ao analogWrite (passando como parˆametros a porta do LED (11) e i) e esperando por 30 milisegundos a cada itera¸c˜ao.
Figura 1.11: Circuito com LDR e LED
Como os conversores anal´ogico-digital possuem 10 bits de precis˜ao, a fun¸c˜ao analogRead nos devolve um valor entre 0 e 1023, onde 0 corresponde a uma leitura de 0V na porta anal´ogica e 1023 corresponde a 5V (para valores intermedi´arios, basta fazer uma regra de trˆes simples, de maneira an´aloga com o PWM). Vamos carregar em nosso Arduino o seguinte c´odigo:
#define LED 11 #define LDR 5
void setup() { pinMode(LED, OUTPUT); }
void loop() { int leitura = analogRead(LDR); int valorPWM = - 0.25 * leitura + 255; analogWrite(LED, valorPWM); }
Os valores 0.25 e 255 da linha que definem a vari´avel valorPWM devem ser calibrados conforme ilumina¸c˜ao do ambiente, resistores utilizados e luminosidade desejada. Para o c´odigo acima, teremos o seguinte comportamento do valor que colocamos na porta PWM a partir dos valores lidos na porta anal´ogica:
Figura 1.12: Gr´afico da fun¸c˜ao PWM versus leitura anal´ogica
Ficam trˆes exerc´ıcios: