Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

apostila - rev4, Notas de estudo de Cultura

Apostila Arduino

Tipologia: Notas de estudo

2013

Compartilhado em 24/04/2013

giovane-goncalves-5
giovane-goncalves-5 🇧🇷

4.9

(35)

8 documentos

1 / 36

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24

Pré-visualização parcial do texto

Baixe apostila - rev4 e outras Notas de estudo em PDF para Cultura, somente na Docsity!

4 SUM ARIO´

Cap´ıtulo 1

Conceitos b´asicos

8 CAP´ITULO 1. CONCEITOS B ASICOS´

1.1 O Projeto Arduino

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/

10 CAP´ITULO 1. CONCEITOS B ASICOS´

Figura 1.2: Arduino IDE vers˜ao 0018 rodando no Ubuntu GNU/Linux 10.

1.3 Primeiro projeto

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:

1.3. PRIMEIRO PROJETO 11

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.

1.4. BIBLIOTECAS E SHIELDS 13

1.3.2 Alimenta¸c˜ao do circuito

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

1.4 Bibliotecas e shields

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.

14 CAP´ITULO 1. CONCEITOS B ASICOS´

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.

1.5 Integra¸c˜ao com o PC

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

  • existem implementa¸c˜oes para Python, Ruby, Java, C, dentre outras linguagens. E n˜ao para por a´ı: al´em de o software que roda no PC receber dados, ele pode tamb´em enviar dados, controlando o Arduino! Dessa forma, podemos, por exemplo, receber dados da Web e enviar comandos ao Arduino, baseados nesses dados. Um exemplo de aplica¸c˜ao que utiliza a porta USB para comunica¸c˜ao do Arduino com o PC ´e o projeto Arduinoscope^12 , que tem como finalidade criar um oscilosc´opio, onde podemos ver em tempo real, no PC, gr´aficos das tens˜oes que est˜ao ligadas `as portas anal´ogicas do Arduino. Outro exemplo ´e um projeto que criei, onde controlo um carrinho atrav´es de Wi-Fi, o Turiquinhas^13. Fica a dica para quem quer come¸car um projeto Arduino assistido por computador de maneira f´acil: vale a pena estudar um protocolo de comunica¸c˜ao e controle chamado Firmata^14 , cuja implementa¸c˜ao est´a dispon´ıvel

(^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/

16 CAP´ITULO 1. CONCEITOS B ASICOS´

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:

  • HIGH, caso a tens˜ao na porta seja 5V;
  • LOW, caso a tens˜ao na porta seja 0V;

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); }

1.6. PORTAS ANAL OGICAS E DIGITAIS´ 17

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

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.

1.6. PORTAS ANAL OGICAS E DIGITAIS´ 19

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:

20 CAP´ITULO 1. CONCEITOS B ASICOS´

Figura 1.12: Gr´afico da fun¸c˜ao PWM versus leitura anal´ogica

Ficam trˆes exerc´ıcios:

  • Aprenda a utilizar um potenciˆometro e o utilize para regular o brilho do LED, em vez do LDR;
  • Volte o LDR para seu lugar anterior e utilize o potenciˆometro para configurar os valores 0.25 e 255;
  • Leia o datasheet do circuito integrado LM35 e monte um circuito parecido com o anterior, por´em sens´ıvel a temperatura (e n˜ao mais a luz).