A Deus.alvaroluiz.com/Kazuma/ArduinoBook/Arduino Guia para colocar suas... · Todo autor tem uma...

208

Transcript of A Deus.alvaroluiz.com/Kazuma/ArduinoBook/Arduino Guia para colocar suas... · Todo autor tem uma...

ADeus.

À Cecília Regina Bryan Frizzarin e ao Gilson WaldemarFrizzarin,meuspais,pelacriação.

À Priscila Keli de Lima Pinto Frizzarin, ao Eduardo PintoFrizzarin e ao Bruno Pinto Frizzarin, minha família, pelo amorincondicional.

AoProf.MarcosTeixeira,pelaamizadeemuitosensinamentos.

Ao Vinicius Donadelli e ao Prof. José Alberto Matioli, peloincentivo.

À Profª. Vanessa Juliato e à Profª. Magda Silva Rizzeto, porreforçarqueoconhecimentoémesmoumadescoberta.

Ao Octavio Nogueira, por parte dos equipamentos e poracreditar.

AoVictorBadolatoAthayde,pelas ilustrações, ideiasedebatesacalorados.

Ao COTIL/UNICAMP, por me permitir ensinar – eis aprofissãomaisapaixonantedomundo.

AGRADECIMENTOS

FernandoBryanFrizzarin,naturaldeAmericana,é técnicoemInformática,bacharelemCiênciadaComputaçãoePsicopedagogo,especialista em Redes de Computadores e MBA em GestãoEstratégicadeNegócios.

Ele é professor do Magistério Secundário Técnico naUniversidade Estadual de Campinas (UNICAMP), professor doensino superior nas Faculdades Integradas Einstein de Limeira, esupervisor de Informática doDepartamento deÁgua e Esgoto deAmericana.TambémévoluntárionaFundaçãoRominoNúcleodeEnsino Integrado, emSantaBárbarad’Oeste (SP), comoconsultorparaoensinoderobóticanoEnsinoFundamental.

Coautor da patente BR1020140270159/2014: Dispositivoautomatizado de liberação controlada, projeto desenvolvido emconjuntocomosalunosBiancadeMoriMachadoAmaraleFelipeFerreiradaSilva,incluindoapoiodaArqªMarylisBarbosadeSouza.EsseprojetofoidesenvolvidonasdisciplinasdeDesenvolvimentodeProjetoseTópicosAvançadosemInformáticanoColégioTécnicodeLimeira(UNICAMP),eodepósitofeitopormeiodaAgênciadeInovaçãodaUNICAMP(INOVA).

SOBREOAUTOR

Todo autor tem uma preconcepção de como seu livro deveriaserutilizado, e eunão sou exceçãopara essa "regra",mas acreditoque este livro deva ser usado da forma mais criativa que vocêconseguir.Sejalivreparavoar.

Aqui estão, basicamente, anotações de aulas de laboratóriosapresentadosduranteváriosanos,paraváriasclassese,sendoassim,para muitos alunos. E tudo isso carrega a vantagem de que asexperiências e a teoria foram extensivamente testadas, ajustadas etestadasnovamente,semprenaprocuradeumasequênciaeumtomideal.

Logo, o livro é especialmente direcionado para estudantes,mesmoquenãonecessariamentedasáreas técnicasde informáticaou eletrônica digital, interessados em saber como conceberequipamentosecriarsoluçõesparaosmaisdiversosproblemas.

Hánecessidadedeumconhecimentoprévio,porémbásico,delógicadeprogramaçãoemqualquerlinguagem,jáquenestelivroalinguagem a ser utilizada serámostrada na teoria e na prática deforma fácilde compreender.A ideia éque sepossausar este livroprincipalmentecomomaterialdeconsultaparaquaisqueraulasqueenvolvamArduino.

Você pode deixar este livro em uma estante para consultasesporádicas, ou pode andar com ele em baixo do braço paraconsultas constantes. Importante mesmo é que ele lhe seja útil eacrescentenovosconhecimentoseabranovoscaminhos.

Minha formação construtivista e minhas experiênciasprofissionaismostramqueo importanteéapresentarosconceitos,as ferramentas e osmétodos para, em seguida, desafiar o aluno a

COMOUTILIZARESTELIVRO

encontrarutilidadedetudoissoemseumundo,dentrodocontextodoseudiaadia,deformaquepossaimpactaremudar,paramelhor,oseumundointerioreexterior.

1

46

11

1215

16172836

37394142444849

50

Sumário

1Introdução

2OqueéArduino2.1ComponentesdeumArduinoUNOR32.2Aseguir...

3PorqueusarArduino?3.1Aseguir...

4Oqueseránecessárioter4.1SimuladordeArduino4.2IDEArduino4.3Aseguir...

5EntendendooIDEArduino5.1MenuArquivoesuasopções5.2MenuEditaresuasopções5.3MenuSketchesuasopções5.4MenuFerramentasesuasopções5.5MenuAjudaesuasopções5.6Aseguir...

6Comocolocartudoemprática

SumárioCasadoCódigo

505253

545456

5758606366697272

74757878

798284

87929394

95

6.1Naplacadeensaiosouprot-o-board6.2Nosimulador6.3Aseguir...

7ProgramandooArduino7.1Sintaxebásicaparaalinguagem7.2Aseguir...

8Estruturaprincipaldalinguagem8.1Experiêncianº01-AcenderoLEDdopino138.2Experiêncianº02-PiscaroLEDdopino138.3Experiêncianº03-PiscarumLEDexterno8.4Experiêncianº04-Sequencialcom3LEDs8.5Experiêncianº05-ControlandoumLEDRGB8.6Exercite8.7Aseguir...

9Asfunçõesparapinosdigitais9.1Experiêncianº06-Usandoumbotão9.2Exercite9.3Aseguir...

10Tiposdedados,variáveiseconversores10.1Variáveis10.2Experiêncianº07-Usandoumdisplayde7-segmentos10.3Experiêncianº08-Mostrandonúmerosde0a9emumdisplayde7-segmentos10.4Conversoresdedados10.5Exercite10.6Aseguir...

11Operadoreseestruturasdeseleçãoerepetição

CasadoCódigoSumário

9596969798

100

106108111111

103

112113115117118

119120121124125

126129134135135

136

11.1Operadoresdecomparação11.2Operadoresmatemáticos11.3Operadoreslógicos11.4Operadoresbit-a-bit11.5Estruturasdeseleção11.6Estruturasderepetição11.7Experiêncianº09-OspinosPWM(Pulse-withModulation)11.8Experiêncianº10-Fazendobarulhocomumbuzzer11.9Experiêncianº11-Fazendobarulhocomumalto-falante11.10Exercite11.11Aseguir...

12Funçõesparapinosanalógicos12.1Experiêncianº12-Usandoumpotenciômetro12.2Experiêncianº13-Usandoumsensorluminosidade12.3Exercite12.4Aseguir...

13Funçõesespeciais13.1Funçõesdetempo13.2Experiêncianº14-Programandoumrelógio13.3Exercite13.4Aseguir...

14Funçõesmatemáticas14.1Funçõesparacaracteres14.2Funçõesparanúmerosaleatórios14.3Exercite14.4Aseguir...

15Funçõesparacomunicação

SumárioCasadoCódigo

140

143146151151

152153154157

161165165

166166

169171172

174

177177179

181

183

15.1Experiêncianº15-EnviardadosdoArduinoparaocomputadorpelacomunicaçãoserial15.2Experiêncianº16-ReceberdadosdocomputadorpelaconexãoserialecontrolarumLED15.3Experiêncianº17-Controlar3LEDspelaserial15.4Exercite15.5Aseguir...

16Bibliotecasadicionais16.1TFT16.2Experiêncianº18-ComousaramemóriaEEPROM16.3Experiêncianº19-Acionandoumservomotor16.4Experiêncianº20-RealizandocomunicaçãoserialentreArduinos16.5Exercite16.6Aseguir...

17AcionandomotoresDC17.1Experiêncianº21-AcionandoummotorDCusandorelê17.2Experiêncianº22-AcionandoummotorDCusandotransistor17.3Exercite17.4Concluindo

18ApêndiceA-Listademateriais

19ApêndiceB-Exercíciosresolvidos19.1Exercíciodocapítulo8.Estruturaprincipaldalinguagem19.2Exercíciodocapítulo9.Asfunçõesparapinosdigitais19.3Exercíciodocapítulo10.Tiposdedados,variáveiseconversores19.4Exercíciodocapítulo11.Operadoreseestruturasdeseleçãoerepetição

CasadoCódigoSumário

186187191193195196

19.5Exercíciodocapítulo12.Funçõesparapinosanalógicos19.6Exercíciodocapítulo13.Funçõesespeciais19.7Exercíciodocapítulo14.Funçõesmatemáticas19.8Exercíciodocapítulo15.Funçõesparacomunicação19.9Exercíciodocapítulo16.Bibliotecasadicionais19.10Exercíciodocapítulo17.AcionandomotoresDC

SumárioCasadoCódigo

CAPÍTULO1

Comoacontece commuitosprofessores, alguns alunos semprecomentamsobreaquantidadedematériaqueprecisamabsorverecopiar: "Nossa professor! É tanta coisa que daria um livro". Essaideiasempreficouecoando,atéqueganhoucorpocomestetexto.

Há também alguns outros professores que sugeriram que asminhas aulas não ficassem “presas” dentro da sala de aula, ouapenas com os alunos que conseguem vir aprender conosco nocolégio ou na faculdade. "O conhecimento foi feito para serespalhadoomáximopossível";incentivosnuncafaltaram.

Pois aqui estão as minhas aulas de Arduino, utilizadasprincipalmente nas aulas de Automação e Controle eDesenvolvimentodeProjetosnoCOTIL/UNICAMPeprojetosnaFundação Romi. Logicamente, não foi simplesmente umatranscrição literal,muitacoisa foimelhoradaouadaptadaparaserapresentadanoatualformato.

A união dessas duas disciplinas, Automação e Controle eDesenvolvimento de Projetos, visa responder às observações docrescimentoacentuadosobreasexigênciasdeprofissionaiscadavezmais inovadores, capazes de inovar, inventar e reinventar-se,adaptando-se aos novos desafios impostos pela competiçãomercadológica.

Espera-se que os profissionais que ingressarão no mercado

INTRODUÇÃO

1INTRODUÇÃO 1

daquipara frentenãosejamapenasexecutoresde tarefas,massimsolucionadoresdeproblemaseentregadoresdesoluções.Sercapazde observar umdado problema e resolvê-lo com criatividade serácadavezmaispré-requisitoparateracessoaosmelhorespostosdetrabalhoeascendernacarreiraprofissional.

Nomundocadavezmaiscompetitivoemquevivemosondehásempreanecessidadeurgentedeumnovoprodutoouserviçoparaganharnovosmercados.

Inovarnãoénecessariamenteinventar,einventartambémnãoénecessariamente inovar. Inventar também não é descobrir!Descobrirétrazer,à luzdaciência, fatos,objetosoutécnicasantesdesconhecidas que representam uma solução para o que já existe.Inventaré,quaseinvariavelmente,umasoluçãoparaumproblema,muitasvezestécnicoepartedocotidianodoinventor.

Para saber mais sobre esse assunto, sugiro a leitura da LeiFederal brasileira nº 9.279 de 14 de maio de 1996, que regula osdireitoseobrigaçõesrelativosàpropriedadeindustrial.

Inventar é um ato de convivência com o problema, muitaimaginação e criatividade. Bons inventores dedicam-se em,principalmente,ouvireobservaromundoeseusproblemas.Hoje,écomum a figura do funcionário que passa dias observando otrabalho de outros funcionários, como lidam com as ferramentas(tecnologias) e com os demais colegas para tentar encontrar(inventar) algum método ou ferramenta que melhore e facilite otrabalho.

Normalmente, empresas que mantêm funcionários assimpossuem Departamento de Pesquisa e Desenvolvimento (P&D) econtam até com verbas públicas de fomento, já que esse tipo detrabalhogerapatentes,royaltieseknow-how.

2 1INTRODUÇÃO

Já inovação é a concepção de um novo produto ou processo,bemcomoaagregaçãodenovasfuncionalidadesqueimpliquememmelhoriasincrementaisaoquejáexiste.Melhoriasestasquepodemsernoganhodaqualidade,produtividade,usabilidade,longevidadeoucompetitividade.Ainovaçãocomeçanainvenção,umavezqueimplementarumanova ideia é tãoessencialquantocriá-la,porémseráassuntoparapróximaoportunidade.

Oobjetivofinaldeste livroéservircomoreferênciaparaousodo Arduino de forma a ajudar que o leitor entenda todas suaspossibilidades.Nãocomprojetosprontose,decertopontodevista,limitantes, mas com experiência que possam ser interconectadas,combinadas,modificadaseaprimoradasparaqueanecessidadesejasuprida.Ou seja,dar subsídiosparaqueo leitorpossa, apartirdepequenas montagens e códigos-fontes simples, liberar toda suacriatividade e, assim, inventar e inovar a partir do que seráapresentado.

O ensino de robótica nas escolas de ensino fundamental, delógicadeprogramaçãoeautomação,enasescolasdeensinomédioetécnica, desde o mais cedo possível, traz inúmeras vantagens aosalunos,às escolaseà sociedade.Estaúltimaéamaiorbeneficiáriadessemovimento, jáqueemum futuropróximocolheráos frutosdementesmaiscriativaseinovadoras.

Estesiméumexcelenteinvestimento.

1INTRODUÇÃO 3

CAPÍTULO2

Arduino é uma plataforma formada por um equipamentoeletrônico e um ambiente de programação integrado (IntegratedDevelopmentEnviroment - IDE)paraprototipagemeletrônicaedesoftware.OequipamentoeletrônicodaplataformaArduinoconsisteemumaplacade circuitos integrados, devidamente equipada comseus componentes eletrônicos e cujo componente central é ummicroprocessadordotipoAVRdaAtmel®.

Figura2.1:UmArduinoUNOfrenteeverso

O Ambiente de Desenvolvimento Integrado (IDE) é, comoveremoscommaisdetalhesadiante,umsoftwaredesenvolvidoparasermultiplataforma.Ele é escritona linguagemJava, e automatizatarefascomodepuração,compilaçãoeenviodobináriocompilado

OQUEÉARDUINO

4 2OQUEÉARDUINO

paraomicrocontroladornaplacaeletrônicaArduino.Alinguagemde programação utilizada para a programação para o Arduino éumavariaçãodaLinguagemC,baseadanalinguagemWiring.

Figura2.2:AtelaprincipaldoIDEArduino

Atualmente,existem12versõesdaplacaeletrônicaArduinoquepodemservistasnositehttps://www.arduino.cc/en/Main/Products.Tambémexistemdezenasdekitsemódulos,chamadosshields,quepodem ser interligados com as placas Arduino de forma a lheconferirhabilidadesefuncionalidadesadicionaiseespecíficas.

2OQUEÉARDUINO 5

Figura2.3:DuasoutrasversõesdeArduino,àesquerdaoArduinoMinieàdireitaoLilyPadArduino(fonte:arduino.cc)

Para este livro, vou considerar como placa padrão o ArduinoUNOR3,mostradonaprimeirafigura,omaisdifundidodetodos,principalmente noBrasil, onde é fácil encontrá-lo em lojas e sitesespecializados.

TodasasvariaçõesdeArduinopossuem,basicamente,omesmoesquema de funcionamento, mas com variações nas interfaces,velocidade de processamento, capacidade de memória,armazenamento interno e algumas funcionalidades específicas,comointerfacederedecomousemfio,Bluetoothetc.Porémtodasessas “alterações” podem ser incluídas tambémnoArduinoUNOR3 através de módulos (shields), inclusive capacidade dearmazenamento, exceto o que envolve capacidade deprocessamento.

2.1COMPONENTESDEUMARDUINOUNOR3

Principaiscomponentes

6 2.1COMPONENTESDEUMARDUINOUNOR3

Figura2.4:PrincipaiscomponentesdoArduinoUNO

1. MicrocontroladorAtmel®Atmega328P.

Figura2.5:OmicrocontroladordoArduinoUNOseparadodaplaca

2. Clockde16MHz.

3. Conector para alimentação em corrente contínua de 6V até20V(recomendadode7Vaté12V).

2.1COMPONENTESDEUMARDUINOUNOR3 7

4. Reguladordevoltagem.

5. ConectorUSBcomumconversorUSB-Serialintegrado.

6. InterfaceICSP.

7. BotãodeReset.

Figura2.6:InterfacesexistentesnoArduinoUNO

1. Pinosdigitais

São 14 pinos digitais ao todo, sendo que os pinos 0 (RX –receptor) e 1 (TX – transmissor) são usados emcompartilhamento à comunicação serial nativa domicrocontrolador.Ospinos3,5,6,9,10e11comamarcaçãode uma acentuação til (~) são pinos PWM (Power-withModulation), sendo os demais sem capacidade específica.Deste lado da placa, ainda há um pino GND (terra) e umAREF(tensãodereferênciaparaentradasanalógicas).

Interfaces

8 2.1COMPONENTESDEUMARDUINOUNOR3

Esses pinos podem assumir osmodo de entrada ou saída eapenasdoisestados,sendoHIGH(logicamentealto)ouLOW(logicamentebaixo).

2. Pinoanalógicos

São6pinosanalógicosaotodoquepodemassumirosmodosde entrada ou saída, ler e/ou receber variações de tensão econvertê-lasemvaloresdigitais.

3. Pinosdealimentação

São6ospinosdealimentação,sendoeles:

Vin–Voltagemdeentradapode-sealimentaroArduinoporessepino,masassociadoaelenãoháumreguladordevoltagem,portanto,éprecisocuidado;

Gnd–Terra;

5V–Saídade5Vapartirdoreguladordevoltagem;

3,3V–Saídade3,3Vapartirdoreguladordevoltagem;

Reset – Deixando esse pino como estado lógico LOWreinicializaráomicrocontrolador;

IORef – Voltagem de referência de operação domicrocontrolador.

Luzesindicativas

2.1COMPONENTESDEUMARDUINOUNOR3 9

Figura2.7:LuzesindicativasdoArduinoUNO

1. LEDindicadordefuncionamento,permaneceacesoenquantooArduinoestiverligado.

2. LED indicador de atividade de comunicação serial pararecepção(RX).

3. LED indicador de atividade de comunicação serial paratransmissão(TX).

4. LED integradoaopinodigital13,quandoopinoécolocadoemestadológicoHIGHoLEDacenderá,equandoécolocadoemLOW,oLEDapagará,comoveremosmaisadiante.

OArduinopossui4tiposdememóriasinternasdiferentesparadeterminados propósitos. Uma delas é a memória Flash, comcapacidade de 32 KiB sendo que desse montante 512 bytes sãoocupados pelo programa inicialização (bootloader) e o restante é

Memóriasinternas

10 2.1COMPONENTESDEUMARDUINOUNOR3

ocupado pelos programas que desenvolvemos e carregamos nomicrocontrolador.

Obootloaderéoprimeiroprogramaaserexecutadoquandoomicrocontrolador é ligado, e comanda o carregamento einicializaçãodoprogramacarregadopornósnomicrocontrolador.Éobootloaderquepossuiumconjuntodeinstruçõesquepermiteagravaçãodaaplicaçãoesuaexecução.

Osdadosquesãocriadosemanipuladospornossosprogramas,tais como variáveis e constantes, e são armazenados na memóriaSRAM,ouStaticRam(memóriaestáticadeacessorandômico),quepossui células de memória que não precisam ser atualizadas detemposetempos,poupandoassimoconsumodeeletricidade.

Há também a memória EEPROM, ou Electrically-ErasableProgrammable Read-Only Memory (Memória EletricamenteApagável e Programável apenas para Leitura) com capacida de 1KiB.AEEPROMéumamemóriaregravávelnãovolátil,ouseja,nãoperdeosdadosquandooequipamentoédesligadoenormalmenteéusada para guardar informações por longo períodos, informaçõesquepodemserostatusdoequipamento,dadosdeconfiguraçõesetc.Comotodamemóriapossuiumavidaútil,sendoqueonúmerode(re)gravaçõesélimitadoentre100mile1milhãodevezes.

Agora que você sabe que o Arduino é uma placa eletrônicadotada de um microcontrolador, várias interfaces analógicas edigitais,vamosveraspossibilidadesqueelenostrazparaquetudofuncionedamaneiraquevocêdesejar.

2.2ASEGUIR...

2.2ASEGUIR... 11

CAPÍTULO3

Arduino é, como será detalhado durante todo o livro,basicamente uma plataforma de prototipagem de baixo custo epequena curva de aprendizagem. Ele vem de encontro com asfilosofiasMakerouhobbistasdofaça-você-mesmoque,emresumo,significam fazer sistemas físicos interativos pelo uso de software ehardware que possam “sentir” e “responder” ao ambiente ondeestão inseridos - seja pela construção de um carrinho de controleremotoquepodeserguiadopelousodoaparelhocelular,matrizesdeLEDouatépainéisinterativosparacontroledefilas.

Também é possível pensar emArduino pela ótica da InternetdasCoisas(ouInternetofThings-IoT)quevisacriarequipamentoscom capacidade e objetivo de transmitir dados e interagirdiretamente com a internet sem a efetiva intervenção humana.Exemplos para esse uso são vastos e passam por estaçõesmeteorológicas automáticas, sensores de presença e liberação deacessoatérastreadoresveiculares.

Pessoalmente, acredito que é possível agrupar todos essescampos sob a única definição de Computação Física (PhysicalComputing), pois nessa definição podemos incluir praticamentetodos os equipamentos e funcionalidades desejadas, como porexemplo,emsistemasdecontroledetráfego,automaçãoindustrial,residencialecomercial,ejogos.

É nesse contexto, de trazer ao mundo toda criação possível

PORQUEUSARARDUINO?

12 3PORQUEUSARARDUINO?

CAPÍTULO4

TerumArduinoeoscomponentesdosquaisfalaremosaolongodolivroserámuitoútil,masnãotê-lonãoseráumimpeditivoparaaprendersobreele.

Para utilizar e realizar todas as experiências deste livro, seránecessário ter basicamente um computador com um bomnavegador instalado e acesso à internet. Todas as experiênciaspoderão ser realizadas pelo simulador de Arduino, sem anecessidadedeseteroscomponenteseplacasfisicamente.Porém,ocontato físicocomesse tipodeequipamentoéenriquecedore trazconsigoasnoçõesdetamanho,peso,temperatura,movimentoetc.

O simulador emespecial permite que sejamvencidosmedos elimitações econômicas para começar a estudar e entender oecossistemadoArduino.Vocêpoderáaprender,estudarecriarseuscircuitossempraticamentequalquercusto.

Minhasugestãoinicialédetreinarbastanteusandoosimulador,masquando se sentir seguro e comcondições,passe a adquirirosequipamentos físicos, começando por umArduino e, em seguida,pelosdemaiscomponentesapresentadosnestelivro.

Mesmoassim,umacoisa,osimulador,deveserencaradacomocomplementodaoutra,oArduino físico (evice-versa),pois ideiassurgematodoomomento,deváriasformaselugares.

OQUESERÁNECESSÁRIOTER

16 4OQUESERÁNECESSÁRIOTER

A Autodesk Inc.® criou e disponibiliza um simulador decircuitoseletrônicoson-lineque incluioArduinoemsuasversõesUno R3, DFRduino R3, Uno e Micro, até o momento da ediçãodestelivro.Acreditoqueatendênciaéque,comotempo,cadavezmais versões de Arduino e componentes eletrônicos sejamincorporadosàsimulação.

Osimuladorpodeseracessadoemhttp://123d.circuits.ioeseráutilizadonasexperiênciasapresentadas.

AlgumasimagensdestelivrosãocapturasdeteladaAutodesk,comreimpressãosobcortesiadaAutodesk,Inc.

4.1SIMULADORDEARDUINO

4.1SIMULADORDEARDUINO 17

Figura4.1:Telaprincipaldosimulador

Para poder simular circuitos, é necessário inscrever-se no site.Para isso, use o linkSignUp que está no lado direito superior datela. Você terá de, como primeiro passo, determinar o país de

18 4.1SIMULADORDEARDUINO

residênciaeadatadeseuaniversário.

Figura4.2:Telaparaaseleçãodepaísedatadeaniversário

Apósavançar,vocêteráaseguintetela:

4.1SIMULADORDEARDUINO 19

Figura4.3:Janeladelogincombotãocriarconta

Digite seu e-mail e uma senha e, em seguida, clique em criarconta. Você também pode, em vez de criar uma conta, usar suascredenciaisdoFacebook.Notequeasregrasparasenhasãoqueeladeveconternomínimo8caracteres,comaomenosumnúmeroeumaletra.

20 4.1SIMULADORDEARDUINO

Figura4.4:Janeladeboasvindas

Pronto!Contacriada.Àdireita,nocantosuperior,vocêtemumíconeparaeditarosdetalhesdasuaconta.

4.1SIMULADORDEARDUINO 21

Figura4.5:Destaqueparaoíconedaconta

Paracomeçaraeditarumnovocircuito,cliquenolinkCreate.

Figura4.6:Destaqueparaolinkcreate

Agora,cliquenolinkOpenElectronicsLabHub.

22 4.1SIMULADORDEARDUINO

Figura4.7:Destaqueparalinkopenelectronicslabhub

Nessateladeboas-vindas,cliquenolinkNewElectronicsLab.

4.1SIMULADORDEARDUINO 23

Figura4.8:DestaqueparaolinkNewElectronicsLab

Vocêserá levadoao laboratóriodeeletrônicaedeverá terumaplacadeensaiosnasuatela.

24 4.1SIMULADORDEARDUINO

Figura4.9:Janelacomaprot-o-boardnomeio

Asprincipaisfuncionalidadesdisponíveissão:

Figura4.10:Janelacomasfuncionalidadesnumeradasdaesquerdaparaadireita

1. Acesso à página principal do seu laboratório, com todos osseuscircuitos;

2. Nomedocircuitoatual;

3. Mensagem de salvamento das alterações realizadas (isso

4.1SIMULADORDEARDUINO 25

aconteceautomaticamente);

4. Visão de laboratório, com a placa de ensaios e demaiscomponentesmostradoscomosefossemreais;

5. Visãoesquemática,sendooscomponentesvistosemformatodeesquemautilizando-seasimbologiapadrãoparaeletrônica;

6. Visão de PCB, Printed Circuit Board ou Placa de CircuitosImpressos;

7. Listademateriais;

8. Configuraçõesdoseucircuito,taiscomonome,resumotagseconvidadosatrabalharneleemconjuntocomvocê;

9. Feedback,ondeépossívelrealizarpesquisasdeajuda;

10. Sua conta, onde é possível ter uma visão geral de todos oscircuitosquevocê jácrioue, entreoutrascoisas, alterar seusdados;

Semprequeacessaro123DCircuits,vocêteráatelaondeestãotodosseuscircuitos.Paravoltaraeditarseucircuitooulaboratório,basta clicar sobre o link Edit, à esquerda do nome dele, quandoestivernapáginadasuaconta.

Figura4.11:Páginacomalgunscircuitoscriados

Háaindaasseguintesferramentas:

26 4.1SIMULADORDEARDUINO

Figura4.12:Prot-o-boardcomasegundalinhadeíconesnumeradadaesquerdaparaadireita

1. Rotacionarocomponenteselecionado;

2. Apagarocomponenteselecionado;

3. Zoom to fit, ou ajustar o zoom, para que todos oscomponentessejamvistosnatela;

4. Undo,quedesfazaúltimaalteraçãoacadaclique;

5. Redo,querefazacadacliqueúltimaalteraçãodesfeita;

6. Codeeditor,editordecódigos,ondepodemosescrevernossoprogramaparaoArduino;

7. Components, onde podemos selecionar os componentes aserem utilizados na experiência, bastando arrastá-lo sobre ocircuitoouplacadeensaios;

8. Start Simulation, que faz com que a simulação do circuitotenhainício.

Tambémépossíveleditaraspropriedadesdoscomponentesnajanela que aparece automaticamente quando clicamos sobre eles.Cadacomponentetempropriedadesespecíficasdesdesimplesmenteonomeatéaresistência,tensão,correnteecor,entreoutros;

4.1SIMULADORDEARDUINO 27

Figura4.13:Componentequalquercomajaneladepropriedadesaparecendo

Antesdecomeçar,valeapenaexplorarumpoucoosimulador,mesmoquesemsabermuitoparaquecadacomponenteserve.Nãosepreocupe,duranteasexperiênciasvocêvaicompreendermelhorousodeles.Arraste-osparaaplacadeensaios,mudepropriedades,altere entre as visões e as propriedades do circuito. Familiarize-secomoambienteparaquepossamoscontinuar.

Logovocêsaberácriarcircuitosusandoosimulador.

Se você possui um Arduino e não quer usar o simulador,tambémserápossívelrealizartodasasexperiênciasconstantesdestelivro. Basta ter instalado no seu computador o IDE (IntegratedDevelopment Enviroment, ou Ambiente de Desenvolvimento

4.2IDEARDUINO

28 4.2IDEARDUINO

Integrado)doArduinoinstaladonoseucomputador.

O IDE é um editor de códigos-fonte que tem como funçõescompilareenviaroprogramaaoArduinode formaautomatizada,dispensandoanecessidadedeconhecimentodecódigosecomandoscomplexos e muitas vezes longos, que normalmente seriamexecutadoscasooIDEnãoexistisse.

ParaobteroIDEArduino,bastaentraremwww.arduino.cc.

Figura4.14:Ositehttp://arduino.cc

CliquenolinkDownloadnaporçãosuperiordapágina.

Existem instalações disponíveis para sistemas operacionaisWindows, Linux eMacOSX. Basta selecionar qual é o sistema erealizar odownload.Porém,para a versãoLinux, vocêdeveoptarpelaversãoparasistemasde32-bitsou64-bits.Emtodososcasos,o

4.2IDEARDUINO 29

driverdoconversorUSB-SerialpresentenoArduinoestáincluso.

Figura4.15:Ositehttp://arduino.cc

Para todas as opções de download, você verá uma tela paraefetuarumadoaçãoàArduinoSoftware,queéogrupoquemantéma IDE e algumas bibliotecas. A doação não é obrigatória, mas sevocê optar por realizá-la, clique no valor e no linkContribute &Download. Se não for realizar uma doação, clique em JustDownload.

Nodownload, dê preferência para a versãoWindows Installer.Nela virá tudo incluso, e a instalação será mais simples. Após odownloadrealizado,cliqueduasvezessobreoarquivobaixadoparainiciarainstalação.

AinstalaçãonoWindows

30 4.2IDEARDUINO

AprimeiratelaseráparavocêconhecerostermosdelicençadoArduinoSoftware-nãoémuitolongoe,apesardeestarapenaseminglês,achointeressantelê-lo.Emseguida,cliquenobotãoIAgree.

Na tela InstallationOptions, você pode selecionar se deseja ounãoinstalarodriverUSB,criarounãooíconenomenuiniciarenaáreade trabalho, e associar arquivos comextensão.ino ao IDEArduino.Sugirodeixartodasasopçõesselecionadas.

Figura4.16:AjanelaInstallationOptions

Natelaseguinte(InstallationFolder),vocêpodeselecionaroutrolocalondeosoftwareserá instaladooudeixarno localsugerido.Éimportante saber onde a instalação ocorreu no caso de desejarincluirbibliotecasdeterceirosnaIDE.

4.2IDEARDUINO 31

Figura4.17:AjanelaInstallationFolder

Após clicar no botão Install, a instalação finalmente ocorrerá.Apósseufim,cliquenobotãoClose.Nasuaáreadetrabalho,casovocê não tenha alterado essa opção, você terá o ícone da IDEArduino.

Figura4.18:OíconedaIDEArduino

Pronto,ainstalaçãoparaWindowsestápronta!

AinstalaçãonoLinux

32 4.2IDEARDUINO

Como existem várias distribuições Linux hoje em dia, vouconsiderar para esse passo a passo a distribuição Debian comambiente gráfico GNOME. Mas se você estiver usando qualqueroutra distribuição, não deve haver quaisquer problemas e ainstalaçãodeveocorrernormalmente.

Antesdecontinuar,certifique-sedequeseusistemaoperacionalesteja atualizado e que você possua a senha do superusuário(root).

Localize a aplicaçãoTerminal do seu Linux ou alterne entre ainterfacegráficaeterminalusandoCTRL+ALT+F1-vocêpodevoltar para a interface gráfica novamente usandoCTRL+ALT+F7.

No terminal digite o comando su e em seguida a senha dosuperusuárioroot.

Figura4.19:Ocomandosusolicitadoadigitaçãodeumasenha

ParaoDebian,executeaseguintelinhadecomandos:

apt-getinstallarduino

4.2IDEARDUINO 33

Para distribuições derivadas doRedHat, como o Fedora ou oCentOS,executeaseguintelinhadecomando:

dnfinstallarduino

Serão informadas várias dependências e softwares que serãoinstaladose,emseguida,aperguntasedesejacontinuar.DigiteSdeSim,epressioneENTER.

Figura4.20:Omomentodedecidiremcontinuarainstalaçãoounão

Ainstalaçãovaiiniciar,bastaesperarumpouco.

34 4.2IDEARDUINO

Figura4.21:Instalaçãoconcluída

Após feito isso, você encontrará na área de trabalhos o íconeparaoArduinoIDE.

AinstalaçãodoIDEArduinonoscomputadorescomosistemaoperacionalMacOSX é amais simples de todos os três sistemasoperacionaisapresentadosnestelivro.

Façaodownloaddoarquivoparaessesistemaoperacional.Apósodownload completo, copieo arquivopara suaÁreadeTrabalhoououtralocalizaçãoqueacharmaispertinente.

Clique duas vezes para abrir o programa.Apenas no primeiroacessooarquivoseráverificado:

AInstalaçãonoMacOSX

4.2IDEARDUINO 35

Figura4.22:Teladeverificaçãodoarquivo

Depois,seráexibidaumateladeconfirmação,cliqueemabrir:

Figura4.23:TeladeconfirmaçãonoMacOSX

Pronto! Instalado e funcionando.Nos próximos acessos, todasessasconfirmaçõesnãoserãosolicitadas.

Independente de você escolher utilizar a IDE Arduino ou osimulador da Autodesk Inc., é de extrema importância que vocêsaiba o que o IDE pode proporcionar na hora de facilitar aprogramação. O simulador usa os mesmos conceitos do IDEArduino, portanto, a seguir, ele será mostrado em profundidadeparaquevocêpossaentendê-loecompreendaoseufuncionamentoparaquepossadominá-loapartirdoseuuso.

4.3ASEGUIR...

36 4.3ASEGUIR...

CAPÍTULO5

Figura5.1:AtelasplashdoArduinoIDE

Como jámostrado anteriormente, o IDE é um ambiente paraediçãodecódigos-fonte,ondepodemosescrevernossosprogramas,compilá-los, enviá-los ao Arduino e, se necessário, realizarcomunicaçãoserialentreoArduinoeocomputador,independentedosistemaoperacionalquevocêestiverusando.

Aseguir,vejaaimagemdateladoIDE:

ENTENDENDOOIDEARDUINO

5ENTENDENDOOIDEARDUINO 37

Figura5.2:OIDEArduino

Para este livro,usarei a versão1.6.6do IDE,masnão acreditoque haja grandes alterações para as próximas versões, a não sermelhoriasdeestabilidade,algumafuncionalidadeedesempenho.

Ter emmente todas as funcionalidades do IDE vai ajudar nahora de utilizá-lo, portanto, a seguir estão todos os menus, suasopções e atalhos, seguidos de uma breve explicação dafuncionalidadedecadaum.

38 5ENTENDENDOOIDEARDUINO

programaenoMonitorSerialparaqueosdadossejaminteligíveis.

Figura5.9:OmenuAjuda

NomenuAjuda, você encontrará ligações para as páginas deinternet correspondentesao suportegeraldo IDEedaLinguagemparaArduino.

5.5MENUAJUDAESUASOPÇÕES

48 5.5MENUAJUDAESUASOPÇÕES

Agora que você já sabe todas as opções disponíveis no IDEArduino, que possui muitas ferramentas super úteis na hora deajudaraprogramar,aseguirserãoapresentadasumareferênciadalinguagemCeváriasexperiênciasparacolocarmostudoemprática.Vocêterátodasasprincipais funçõesecomandosnecessáriosparaqualquerprogramaaserdesenvolvido.

5.6ASEGUIR...

5.6ASEGUIR... 49

CAPÍTULO6

Consideraremos que você possa querer montar todas asexperiências,tantousandoumaplacadeensaioscomoosimuladormostradoanteriormente.

Paramontar as experiências, siga os passos descritos em cadaumadela,considerandooesquemamostradoaseguir.

Aplacadeensaios(ouprot-o-board)éumaplacacomorifíciosqueseconectamentresiporumanteparometálicocontidodentrodela, como mostrado nas figuras seguintes. Essa é uma operaçãobemsimples,bastateratençãoeconferirsempreasligaçõesantesdeativarouinicializarqualquercoisa.

COMOCOLOCARTUDOEMPRÁTICA

6.1 NA PLACA DE ENSAIOS OU PROT-O-BOARD

50 6COMOCOLOCARTUDOEMPRÁTICA

Figura6.1:Aplacadeensaiosouprot-o-board(Cortesia:VictorBadolatoAthayde)

Parausá-la,conectamososcomponentese fiosnosorifíciosdemaneira que formem contato entre eles nos terminais desejados,considerandoasligaçõesentreelescomovemosnafigura:

Figura6.2:Oscontatosdentrodaplacadeensaios(Cortesia:VictorBadolatoAthayde)

Vejaumexemplo:

6.1NAPLACADEENSAIOSOUPROT-O-BOARD 51

Figura6.3:UmresistorconectadoaumLEDeambosconectadosemumArduinousandoumaplacadeensaios

Nosimulador,amecânicaéamesma.Paraligarosfiosvirtuais,cliquesobreoorifíciodaplacadeensaios,edepoisnopinoououtroorifício que desejar. Não é necessário manter o botão do mousepressionado,cliqueumavezemumpontoeestiqueofiovirtualatéooutroponto.

6.2NOSIMULADOR

52 6.2NOSIMULADOR

Figura6.4:UmresistorconectadoaumLEDeambosconectadosemumArduinousandoosimulador

Para que os componentes fiquem ligados, basta colocar osterminais deles sobre os orifícios da placa de ensaios virtual, quetem os contatos iguais à placa de ensaios real, mostradosanteriormente.

A seguir, vamos ao que interessa: colocar as mãos na massa!Adiantevocêencontrarátudooqueprecisasabersobrealinguagempara oArduino e como utilizá-la para realizar várias experiênciasem que terá a oportunidade de exercitar os conceitos por trás datecnologiaecompreendê-lo.

6.3ASEGUIR...

6.3ASEGUIR... 53

CAPÍTULO7

A linguagem C é a base para a programação para Arduino.Apesardeteralgunscomandosespecíficosparaomicrocontrolador,é basicamente a mesma utilizada em programação paracomputadores. Se você tiver alguma familiaridade comprogramação usando linguagem C em computadores, não teráqualquerdificuldade,emesmosevocênãotiver, tambémnãoteráproblemas,porqueasexperiênciasserãoautoexplicativas.

Há diversas formas de se pensar emqual seria o ponto inicialpara se aprender ausaroArduinopara criar coisas.Poderia ser apartirdaeletrônicageraldoequipamento,ouapartirdalinguagemutilizadaparaprogramá-lo.Resolviseguirosegundocaminho.

Conhecendo bem a linguagem de programação e como usá-lapara atuar sobreohardware,os conceitos eletrônicos ficarãomaisfáceisde fixar,ea lógicadecomotudofuncionaabriráportasquedemorariammaisseofocofosseaeletrônica.

Aliás, considero que oArduino é essencialmente um exercíciodeprogramação,jáqueseusmóduloseafacilidadedeencaixá-losecolocá-losparafuncionardeixaaeletrônicatrivial.Poisbem,vamosprogramá-lo!

PROGRAMANDOOARDUINO

7.1SINTAXEBÁSICAPARAALINGUAGEM

54 7PROGRAMANDOOARDUINO

Toda linguagem de programação tem seus "detalhes" maisbásicos.AlinguagemdeprogramaçãoparaoArduino,quecomojávimos é baseadana linguagemC, também temessesdetalhes, queveremosaseguir.

O ponto e vírgula (;) é usado para terminar as linhas decomandos,masháexceções.Porexemplo,nãoéutilizadodepoisdedeclaração de funções e nem na declaração das estruturas decontroleourepetição.

Esquecê-lacausaráumerrodecompilaçãoeesseerropoderáounãoapontar esse esquecimentodiretamente.Vocêpode conferirousodeponto-e-vírgulaemtodasasexperiências.

Indicamoinícioquando{,etérminoquando},deblocosdecomandos.Delimitaaporçãodecódigoparaumafunção,estruturade seleção ou repetição. Considero como o símbolo ou comandomais importantedetodaa linguagemC.Vocêpodeconferirousodechavesemtodasasexperiências.

Elessãoessenciaisparamanterocódigo-fontedoseuprogramaorganizadoegarantirquevocêvaientendê-lodepois.

Usarduasbarras//indicaquedelasatéofinaldalinhaéumcomentário.Também,usar/*e*/indicaquetudooqueestiverescrito entre barra e asterisco e depois asterisco e barra é umcomentário.

Vejaumexemplo:

Pontoevírgula

Chaves

Comentários

7.1SINTAXEBÁSICAPARAALINGUAGEM 55

/*Todoestetextoéconsideradocomocomentário*/

voidsetup(){//estalinhaéumcomentário}

voidloop(){//estalinhaéumcomentário}

OquefoimostradoaquiseráusadoparaqualquerprogramanalinguagemCparaoArduino.Éobásicoe indispensável.Aseguir,começaremosaestudarasestruturasdalinguagemcolocando-asempráticapormeiodasexperiênciaspropostas.

7.2ASEGUIR...

56 7.2ASEGUIR...

CAPÍTULO8

Todalinguagemdeprogramaçãotemseuscomponentesbásicose essenciais. Vimos anteriormente os básicos e aqui veremos osessenciais.AlinguagemCparacomputadores,porexemplo, temaobrigatoriedade da função main() , que é o que torna umprogramaexecutáveldepoisdecompilado.ParaoArduino,afunçãomain()nãoexiste,masnoseulugar,temosoutrasduas:setup()eloop(),detalhadasnasequência.

Afunçãosetup()éaprimeiracoisaaserexecutadaquandooArduino é ligado, e é executada apenas uma vez. É usada parainicializar variáveis, modos de atuação dos pinos, declaração deobjetoseusodebibliotecas.

Vocêveráafunçãosetup()emtodasasexperiências.

Após executar a função setup(), é a função loop() quepassa a ser executadadoprimeiro aoúltimocomando.Depois elavolta para o primeiro comando e repete tudo novamenteinfinitamente-oumelhor,enquantooArduinoestiverligado.

Caso o Arduino seja desligado, a função setup() será

ESTRUTURAPRINCIPALDALINGUAGEM

setup()

loop()

8ESTRUTURAPRINCIPALDALINGUAGEM 57

executadanovamenteedepoisafunçãoloop() entraráemcena.Para exemplificar bem esse funcionamento, sugiro realizarmos aexperiência a seguir: apenas acender o LED embutido no pinodigital13.

Essa é a experiência mais básica que se pode fazer com oArduino, por isso considera-se que seja o “Hello World” (“OláMundo!”). A ideia aqui é conhecer o Arduino, seu Ambiente deProgramaçãoesualinguagemdeprogramaçãonaprática.

Comovocêjáviuanteriormente,oArduinopossuiintegradoaoseu pino digital 13 um LED que pode ser controlado bastandoenviaro sinal alto (HIGH) para acendê-lo, ou sinal baixo (LOW)paraapagá-lo,eéexatamenteoquefaremos.

1xArduinoUNO

Nãohánecessidadedequalquer componente excetoopróprioArduino.

8.1EXPERIÊNCIANº01-ACENDEROLEDDOPINO13

Oqueénecessário

Esquemademontagem

58 8.1EXPERIÊNCIANº01-ACENDEROLEDDOPINO13

Figura8.1:Esquemademontagemdaexperiêncianº01

voidsetup(){pinMode(13,OUTPUT);}

voidloop(){digitalWrite(13,HIGH);}

Nafunçãosetup(), ajustamosomododeoperaçãodopinodigital 13 do Arduino para saída usando o comandopinMode(13,OUTPUT). Dessa forma, poderemos colocar ou nãotensãoneleusandoasconstantesHIGHeLOW.

Nafunçãoloop(),queéexecutadainfinitamenteenquantooArduino estiver ligado, como já vimos anteriormente, usamos ocomandodigitalWrite(13,HIGH)paraindicarquehaverásaídadetensãopositivade5V(HIGH)pelopinodigital13doArduino.

ApósfazeruploadparaoArduino,oprogramafarácomqueoLEDdopinodigital13permaneçaacesootempotodo.

Programação

Oquefoifeito

Resultadoesperado

8.1EXPERIÊNCIANº01-ACENDEROLEDDOPINO13 59

Ótimo, você acabou de verificar como um programa paraArduino deve funcionar. Primeiro, a função setup() entra emação,éexecutadaapenasumavezlogoqueoArduinoéligado.Emseguida,éavezdafunçãoloop(),queficarárodandoemquantooArduinoestiverligado.

Vamostentarumasegundaexperiência,dessavezfazendocomqueoLEDdopinodigital13mudedeestado.

EstaéasegundamaisbásicaexperiênciaquesepodefazercomoArduino,econsisteemumacontinuaçãodaexperiênciaanterior.

Na primeira experiência, conseguimos ligar o LED do pinodigital 13. Agora, vamos desligá-lo também a cada período detempoquedefiniremosnaprogramação.Comisso,oLEDpiscará.

1xArduinoUNO

Nãohánecessidadedequalquer componente excetoopróprioArduino.

8.2 EXPERIÊNCIA Nº 02 - PISCAR O LED DOPINO13

Oqueénecessário

Esquemademontagem

60 8.2EXPERIÊNCIANº02-PISCAROLEDDOPINO13

Figura8.2:Esquemademontagemdaexperiêncianº02

voidsetup(){pinMode(LED_BUILTIN,OUTPUT);}

voidloop(){digitalWrite(LED_BUILTIN,HIGH);delay(1000);digitalWrite(LED_BUILTIN,LOW);delay(1000);

}

Nafunçãosetup(), ajustamosomododeoperaçãodopinodigital13comosaída,usandoocomandopinMode(13,OUTPUT).Nafunçãoloop(),usamosocomandodigitalWrite(13,HIGH)para colocar no pino digital 13 um valor de saída alto (HIGH),correspondentea1.Comisso,eleapresentará tensãopositivade5volts,fazendocomqueoLEDacenda.

Com o comando delay(1000), o microcontrolador entraráemestadodepausanaexecuçãodoprogramaduranteumsegundo,já que, como vimos anteriormente na referência da linguagem C

Programação

Oquefoifeito

8.2EXPERIÊNCIANº02-PISCAROLEDDOPINO13 61

1xArduinoUNO

1xLED

1xResistorde220Ω

ColoqueoLEDnaplacadeensaioscomomostradonafiguraaseguir, lembrando do que foi exposto anteriormente sobre comousaraplacadeensaios.

Usandoumcabinho,ligueoterminalnegativodoLEDaumdospinosGNDdisponíveisnoArduino.ParaidentificarnoLEDqualéoterminalnegativoequaléopositivo,saibaqueonegativoéomaiscurto,jáopositivoéomaiscomprido.

LigueoterminalpositivodoLEDaumresistorde,pelomenos,220Ωcomona figura a seguir.Usandoumcabinho, ligueooutroterminaldoresistoraopinodigital2doArduino:

Figura8.3:Esquemademontagemdaexperiêncianº03

Oqueénecessário

Esquemademontagem

64 8.3EXPERIÊNCIANº03-PISCARUMLEDEXTERNO

voidsetup(){pinMode(2,OUTPUT);}

voidloop(){digitalWrite(2,HIGH);delay(1000);digitalWrite(2,LOW);delay(1000);

}

Note que a programação é idêntica à da experiência anterior,apenasmudamosonúmerodopinodigitalquevamosutilizar,masvamoslánovamente.

Nafunçãosetup(), ajustamosomododeoperaçãodopinodigital2comosaídausandoocomandopinMode(2,OUTPUT).Nafunção loop() , usamos o comando digitalWrite(2,HIGH)para colocar no pino digital 2 um valor de saída alto (HIGH),correspondentea1.Comisso,eleapresentará tensãopositivade5volts,fazendocomqueoLEDacenda.

Com o comando delay(1000), o microcontrolador entraráemestadodepausanaexecuçãodoprogramaduranteumsegundo,já que, como vimos anteriormente na referência da linguagem Cpara o Arduino, o tempo determinado entre parênteses para essecomandodeveseremmilissegundos.Ouseja,1.000milissegundos,queéiguala1segundo.

Continuando, colocamos a linha de comandodigitalWrite(2,LOW)ondecolocamosnopinodigital2umvalorde saída baixo ( LOW ), correspondente a 0. Com isso, eleapresentarátensãoneutra(0volts)eissoapagaráoLED;

Programação

Oquefoifeito

8.3EXPERIÊNCIANº03-PISCARUMLEDEXTERNO 65

Comarepetiçãodocomandodelay,teremosmaisumapausadeumsegundoantesdeoprogramaretornarnovamenteaoinícioda função loop() e permanecer executando todo o códigoindeterminadamente até que o Arduino seja desligado, ou recebanovaprogramação.

ApósfazeruploadparaoArduino,oprogramafarácomqueoLEDconectadoaopinodigital2permaneçaacesoeapagadoporumsegundo.

AgoraqueestáclaroedominadocomoacionarLEDsusandooArduino,vamoscriarumsequênciade3LEDsexternosnapróximaexperiência.

Seguindooaumentodecomplexidadenessaexperiência,vamoscontrolar 3 LEDs em uma montagem. A lógica é a mesma paraapenasumLED,masaspossibilidadessãoquaseinfinitasdoquesepodefazeremrelaçãoàsequênciadeacendereapagarosLEDs.

Sugestões de projetos não faltam, tais como um semáforosimples,comastrêsluzesquecompõemum.SaltardetrêsparaseisLEDs não deve ser muito difícil, basta um pouco de paciência etempo para entender melhor a programação, e construir umcruzamento com dois semáforos também pode ser um exercíciointeressante.

Vale a pena parar um pouco nesta experiência e soltar aimaginaçãoparaexercitarocontroledeLEDsexternosaoArduino.

Na figura damontagem, as cores sugeridas para os LEDs são

Resultadoesperado

8.4EXPERIÊNCIANº04-SEQUENCIALCOM3LEDS

66 8.4EXPERIÊNCIANº04-SEQUENCIALCOM3LEDS

vermelho,verdeeazul,masvocêpodeusartodosdamesmacorouquaisquercoresqueencontrarouestiveremdisponíveis.Nocasodosemáforo, você pode trocar o azul por um LED amarelo, porexemplo.

1xArduinoUNO

3xLEDs

3xResistoresde220Ω

Coloque os LEDs na placa de ensaios conforme mostrado nafigura do esquema de montagem. Usando um cabinho, ligue oterminal negativo do primeiro LED (sugiro que cada LED tenhauma cor diferente, então esse pode ser o vermelho), que comovimosnaexperiêncianº03,éoterminalmaislongo,aumdospinosGND disponíveis no Arduino. Em seguida, faça omesmo com oterminal negativo do segundo LED (verde, se seguir a minhasugestão) ao terminal negativo do primeiro LED (vermelho), efinalmente ligue o terminal negativo do terceiro LED (azul) aoterminalnegativodosegundoLED(verde).

AgoraligueoterminalpositivodoprimeiroLEDaumresistorde pelo menos 220Ω e, em seguida, ligue o outro terminal doresistor,usandoumcabinho,aopinodigital4doArduino.

SeguindoomesmoesquemadoprimeiroLED,ligueoterminalpositivodosegundoLEDaumresistordepelomenos220Ωeligueooutroterminaldoresistor,usandoumcabinho,aopinodigital3doArduino.

Finalizando, ligue o terminal positivo do terceiro LED a um

Oqueénecessário

Esquemademontagem

8.4EXPERIÊNCIANº04-SEQUENCIALCOM3LEDS 67

resistor de pelomenos 220Ω e ligue o outro terminal do resistor,usandocabinho,aopinodigital2doArduino.

Figura8.4:Esquemademontagemdaexperiêncianº04

voidsetup(){pinMode(2,OUTPUT);pinMode(3,OUTPUT);pinMode(4,OUTPUT);}

voidloop(){digitalWrite(2,HIGH);delay(1000);digitalWrite(2,LOW);digitalWrite(3,HIGH);delay(1000);digitalWrite(3,LOW);digitalWrite(4,HIGH);delay(1000);digitalWrite(4,LOW);}

Programação

Oquefoifeito

68 8.4EXPERIÊNCIANº04-SEQUENCIALCOM3LEDS

Na funçãosetup(), como você já deve ter notado que é depraxe,ajustamosospinos2,3e4comosaídausandooscomandos pinMode(2,OUTPUT) , pinMode(3,OUTPUT) epinMode(4,OUTPUT). Isso nos permitirá colocar ou não tensãoneles.

Já na função loop() usamos os comandos digitalWritepara colocarmosnospinosdigitais 2, 3 e4umvalorde saída alto(HIGH), correspondente a 1. Com isso, eles apresentarão tensãopositiva de 5 volts e isso acenderá os LEDs. Como já vimos naexperiênciaanterior,usamosdelay(1000) para fazerumapausanaexecuçãodoprogramadeumsegundo.

Nasequência,usamosocomandodigitalWrite novamenteparacolocarmosnospinosdigitais2,3e4umvalordesaídabaixo(LOW), correspondente a 0. Com isso, eles apresentarão tensãoneutra(0volts)eissoapagaráosLEDs.

O“segredo”mesmoestána sequência emqueesses comandossão colocados, isso fará com que o primeiro LED (vermelho)acenda, então será aguardado um segundo, o primeiro LED(vermelho) apagará e o segundo LED (verde) acenderá. Seráaguardado outro segundo, o segundo LED (verde) apagará e oterceiro LED (azul) acenderá, entãomais um segundo, o terceiroLED (azul) apagará e o loop estará completo, voltando a acendernovamente o primeiro LED (vermelho). Teremos assim umsequencial.

Continuando na mesma linha de experiências, vamos acionarumLEDRGB.

Resultadoesperado

8.5EXPERIÊNCIANº05-CONTROLANDOUM

8.5EXPERIÊNCIANº05-CONTROLANDOUMLEDRGB 69

Para controlar um LED RGB, não há praticamente nadadiferentedoque controlar trêsLEDs independentes cadaumcomumacor,nocaso,vermelho,verdeeazul.Asprincipaisdiferençassão que, como no LEDRGB, as cores estãomontadas nomesmoinvólucro,tornandopossívelacendê-lasemdiferentescombinações.Ecomamisturadasluzesgeradas,sãopossíveisváriastonalidadesdecores.Bastalembrardasaulasdaescolasobreascoresprimáriasecomoépossívelcriaroutrascoresapartirdelas.

Paraessaexperiência,tambémusamostrêspinosPWM(Pulse-withModulation)paraalteraraintensidadedecadacordoLED.JásobreospinosPWM,veremosmaisdetalhesadiante.

1xArduinoUNO

1xLEDRGB

3xResistores220Ω

Coloque o LED RGB na placa de ensaios conforme mostra apróxima figura.Usandoumcabinho, ligueo terminalnegativodoLED(terminalmaislongo)aumdospinosGNDdoArduino.

Emseguida,ligueoterminalvermelhodoLED(vejanafigura)aum resistor de pelo menos 220Ω, e ligue o outro terminal doresistor,usandoumcabinho,aopinodigital6doArduino.

Agora, ligue o terminal verde do LED (veja na figura) a umresistor de pelomenos 220Ω e ligue o outro terminal do resistor,usandocabinho,aopinodigital5doArduino.Finalmente, ligueo

LEDRGB

Oqueénecessário

Esquemademontagem

70 8.5EXPERIÊNCIANº05-CONTROLANDOUMLEDRGB

terminalazuldoLED(vejanafigura)aumresistordepelomenos220Ω,eligueooutroterminaldoresistor,usandocabinho,aopinodigital3doArduino.

Casonão tenha certezadequais são as coresdos terminaisnoLED,nãosepreocupe,depoisdecolocá-loparafuncionarseráfácilidentificá-loseajustaroquefornecessário.

Figura8.5:Esquemademontagemdaexperiêncianº05

voidsetup(){pinMode(3,OUTPUT);pinMode(5,OUTPUT);pinMode(6,OUTPUT);}

voidloop(){analogWrite(3,255);analogWrite(5,255);analogWrite(6,255);}

Programação

Oquefoifeito

8.5EXPERIÊNCIANº05-CONTROLANDOUMLEDRGB 71

Na função setup(), ajustamos os pinos 3, 5 e 6 para saídausandooscomandospinMode(3,OUTPUT),pinMode(5,OUTPUT)epinMode(6,OUTPUT).Assimpoderemos colocar ounão tensãoneles.

Jánafunçãoloop()usamosocomandoanalogWrite paracolocarmosnospinosdigitais3,5e6umvalordecimalparasaída255. Ele pode variar de 0 (intensidade mínima da cor) até 255(intensidademáximadacor).

Escolhideixarfixoem255paramostrartodasascoresacesasnaintensidade máxima, para que você possa compreender primeirocomotudoissofunciona.

VocêpodegerarascoresprimáriasdoLED(vermelho,verdeeazul)colocando255norespectivopinoe0nosdemais.Paragerarqualqueroutracor,bastamudaraintensidadeentreospinos.

Projete e construa um conjunto de semáforos em umcruzamento.Vocêterádecontrolardoissemáforosdeveículoscom3luzes(vermelho,amareloeverde)emaisdoisdepedestrescom2luzes(vermelhoeverde).

Façatudosincronizado,inclusivedandotemposuficienteparaopedestre atravessar enquanto dos dois semáforos de veículospermanecemvermelho.

Após executar as cinco experiências propostas neste capítulo,

Resultadoesperado

8.6EXERCITE

8.7ASEGUIR...

72 8.6EXERCITE

vocêjádeveestaransiosoporexpandirseuhorizonteequeriralémdecontrolarLEDs.Massaibaqueessapráticaésuperimportanteevaleapenapararumpouconelaatéquetodososconceitosestejambemassimilados.

Aseguir,vocêteráumdetalhamentodetodasasfunçõesparaospinosdigitaisdoArduino.

8.7ASEGUIR... 73

CAPÍTULO9

Uma das interfaces do Arduino são os pinos digitais, que sãocapazes de escrever (enviar) uma tensão alta (HIGH) de 5V oumanter a ausência de tensão (LOW) com 0V. Por essa variação,como já pode ser visto nas experiências anteriores, é possívelcontrolar equipamentos e, como veremos adiante, receber valoresdesensores.

Na sequência, estão todas as funções para a manipulação dospinosdigitaisdoArduino.

Configura um determinado pino para comportar-se comoentrada(INPUT)ousaída(OUTPUT).

Vejaumexemplodesintaxe:

pinMode(pino,mododeoperação);

Vejaexemplosdeuso:

pinMode(13,OUTPUT);

pinMode(13,INPUT);

ASFUNÇÕESPARAPINOSDIGITAIS

pinMode()

digitalWrite()

74 9ASFUNÇÕESPARAPINOSDIGITAIS

Se o pino for configurado para saída (OUTPUT), o comandodigitalWritepoderáajustaravoltagemdopinopara5V(HIGH)ou0V(LOW).

Vejaumexemplodesintaxe:

digitalWrite(pino,valor);

Vejaexemplosdeuso:

digitalWrite(13,HIGH);

digitalWrite(13,LOW);

Lêovaloratualdeumpinoespecificado,quepodeserLOWouHIGH.

Sintaxe:

digitalRead(pino);

Exemplos:

intvalor=digitalRead(4);

OK,aproveiteipara incluirtodasasfunçõesparapinosdigitaisdoArduino.AdigitalWrite já vimosnaprática.Agora,para adigitalRead,dêumaolhadanaexperiênciaseguinte.

Umdosdispositivosanalógicosmaisusadosparainteragircomo Arduino são os botões, ou chaves. Botões são utilizados parapermitir e/ou interromper a passagem de sinal elétricotemporariamente.

digitalRead()

9.1EXPERIÊNCIANº06-USANDOUMBOTÃO

Oqueénecessário

9.1EXPERIÊNCIANº06-USANDOUMBOTÃO 75

1xArduinoUNO

1xBotão

1xResistorde10KΩ

Guiando-sepelafiguraaseguir,ligueumresistorde10KΩentreopinoGNDeopinodigital2doArduino,usandodoiscabinhos.Tambémusandocabinhos, ligueobotãoentreopinodigital2eopino5VdoArduino.

Figura9.1:Esquemademontagemdaexperiêncianº06

intled=13;intbotao=2;intpress=0;

voidsetup(){pinMode(led,OUTPUT);pinMode(botao,INPUT);}

Esquemademontagem

Programação

76 9.1EXPERIÊNCIANº06-USANDOUMBOTÃO

voidloop(){press=digitalRead(botao);if(press==HIGH){digitalWrite(led,HIGH);}else{digitalWrite(led,LOW);}}

Declaramosduasvariáveisdotipointeiroparaindicaremqualpino digital está ligado o LED - que será aceso ou apagado pelaatuaçãodobotão(intled=13) -epara indicaremqualpinodigital está conectado o botão (int botao = 2). Uma terceiravariável guardará o estado do pressionamento do botão ( intpress=0).

Na função setup(), ajustamos o pino digital do LED parasaída usando pinMode(led,OUTPUT), e o pino digital do botãopara entrada usando pinMode(botao,INPUT). Agora, na funçãoloop(),lemosoestadodopinodigitaldobotãoearmazenamosoqueforlidonavariávelpress,destinadaaisso,usandopress=digitalRead(botao).

Então,bastaverificar seoestadodobotão forHIGH (ou seja,está pressionado), acendemos o LED; caso contrário (o estado dobotão for LOW), apagamos o LED. Tudo isso é feito usando if(press == HIGH) para ver se o botão está pressionado, digitalWrite(led,HIGH) para acender o LED, edigitalWrite(led,LOW)paraapagaroLED.

DepoisdecompilarecarregaroprogramanoArduino,sevocêpressionar o botão, o LED do pino 13 acenderá. E quando você

Oquefoifeito

Resultadoesperado

9.1EXPERIÊNCIANº06-USANDOUMBOTÃO 77

soltarobotão,eledeveapagar.

Faça com que um LED pisque uma vez a cada segundo e emseguida adicione um botão ao projeto. Quando você apertar obotão,oLEDdeveparardepiscar.Apertandonovamente,eledevevoltarapiscar.

Coma linguagemCbásicaparaoArduino jánacabeçaecomdomínio sobreospinosdigitais, chegouahorade aprofundarmosmais na linguagem. A seguir, estarão todos os tipos de dadospossíveis na linguagem, além de detalhes sobre variáveis econversoresentreostiposdedados.

9.2EXERCITE

9.3ASEGUIR...

78 9.2EXERCITE

CAPÍTULO10

Como você viu nas experiências anteriores, onde usamosvariáveis,elasprecisamserdeclaradas,eomodocorretodesefazerisso é indicaro tipodedadosque elas vão armazenar, seguidononomepeloqualserãoidentificadas.

Saber declará-las corretamente é importantíssimo, pois temosdisponíveisquantidadesmuito limitadasdememóriasparautilizarnoArduino.Porisso,nasequência,temostodosostiposdedadosea quantidade dememória que cada variável de cada tipo de dadoocupa, além dos conversores para que seja possível intercambiardadosentrevariáveisdetiposdiferentes.

Alémdisso,éprecisodarnomesóbviosparasuasvariáveis,porexemplo,paraumavariávelqueguardaráoresultadodeumasoma,onomemaisóbvioémesmosoma.

Declaraçõesde funções tambémpodemserprecedidasporumtipo de dado, e isso indicará qual é o retorno que essas funçõesproverão.Porexemplo,intsoma() indica que a funçãosomaretornaumnúmerointeirodepoisde,provavelmente,realizarumasoma.Para os nomesde funções, use amesma lógica quepara osnomesdevariáveis.

TIPOSDEDADOS,VARIÁVEISECONVERSORES

10TIPOSDEDADOS,VARIÁVEISECONVERSORES 79

valordefinidonadeclaraçãoenãopodeseralteradoemnenhummomentodentrodoprograma.

Odisplayde7-segmentossãobasicamente7LEDsque,quandoacionadosnasequênciacorreta,apresentamodesenhodenúmeros.Épossívelcriarváriasoutrasformasneles,bastausaraimaginação.Vamosentenderodisplayde7-segmentos,edepois faremosoutraexperiência para utilizarmos alguns tipos de dados apresentadosanteriormente.

Displayde 7 segmentos é ummostrador comumenteutilizadoparamostrarnúmeros.Normalmente,sãousadosemconjuntocomumconversorBinário/BCD(BinaryCodedDecimal).Sãobaratoseconstruídos por 7 LEDs que formam seus segmentos e o pontodecimal(DP).

Displayde7segmentospodemserdeânodocomum,quepossuiumpinoque é opolonegativo comuma todosos segmentos quedevemserconectadosaopolopositivoparaseremacesos,oucátodocomum,quepossuiumpinoqueéopolopositivocomumatodosos segmentos que devem ser conectados ao polo negativo paraseremacesos.

OssegmentossãoidentificadosporletrasdeAatéG,maisoDP(ponto decimal). Para formar números e algumas letras, bastaacenderouapagarossegmentos:

10.2 EXPERIÊNCIA Nº 07 - USANDO UMDISPLAYDE7-SEGMENTOS

84 10.2EXPERIÊNCIANº07-USANDOUMDISPLAYDE7-SEGMENTOS

Figura10.1:Umdisplayde7-segmentoscomseussegmentosidentificados

Paratrabalharcomdisplaysde7-segmentos,usamososmesmosconhecimentosquejátemosemtrabalharcomLEDs.

Oqueénecessário

10.2EXPERIÊNCIANº07-USANDOUMDISPLAYDE7-SEGMENTOS 85

1xArduino

1xDisplayde7-segmentoscátodocomum

Orientando-sepelaimagemaseguireusandoumcabinho,ligueos pinos comuns (5V) a um resistor de 220Ω e ao pino 5V doArduino. Agora, também usando um cabinho, ligue o pino dosegmentoAaopinodigital2doArduino.

Figura10.2:Esquemademontagemdaexperiêncianº07

voidsetup(){pinMode(2,OUTPUT);}

voidloop(){digitalWrite(2,HIGH);delay(1000);digitalWrite(2,LOW);delay(1000);}

Esquemademontagem

Programação

86 10.2EXPERIÊNCIANº07-USANDOUMDISPLAYDE7-SEGMENTOS

VocêdeveterpercebidoqueusamosumaprogramaçãoidênticaparaacendereapagarumLED,eosegredoéessemesmo.Paracriarnúmeros nos displays de 7-segmentos, basta acender e apagar ossegmentoscorretosnahoracerta.

Agora que você entendeu a "mágica", na próxima experiênciavamosmostrarnúmerosnodisplay.

O segmento A do display ficará aceso por um segundo eapagadopormaisumsegundo,piscandocomofizemoscomoLEDnasprimeirasexperiências.Sabendotodoofuncionamento,espera-se que você consiga ligar todos os outros segmentos para formarnúmeros.

Paraexemplificarousodos tiposdedados,especificamentedevetoresematrizes,executeaexperiênciaaseguir.

Na experiência anterior, vimos como é simples trabalhar comum display de 7-segmentos. Agora, vamos à montagem e a umcódigocompletoparaumcontadordezeroanove.

Oquefoifeito

Resultadoesperado

Espaçoparaanotações

10.3 EXPERIÊNCIA Nº 08 - MOSTRANDONÚMEROS DE 0 A 9 EM UM DISPLAY DE 7-SEGMENTOS

10.3EXPERIÊNCIANº08-MOSTRANDONÚMEROSDE0A9EMUMDISPLAYDE7-SEGMENTOS 87

Figura10.3:Umdisplayde7-segmentoscomseussegmentosidentificados

1xArduino

1xDisplayde7-segmentoscátodocomum

Oqueénecessário

88 10.3EXPERIÊNCIANº08-MOSTRANDONÚMEROSDE0A9EMUMDISPLAYDE7-SEGMENTOS

inta=3,b=4,c=5,d=6,e=7,f=8,g=9;

intnum[10][7]={{a,b,c,d,e,f},//Zero{b,c},//Um{a,b,e,d,g},//Dois{a,b,c,d,g},//Três{b,c,f,g},//Quatro{a,c,d,f,g},//Cinco{a,c,d,e,f,g},//Seis{a,b,c},//Sete{a,b,c,d,e,f,g},//Oito{a,b,c,f,g}//Nove};

voidsetup(){pinMode(a,OUTPUT);pinMode(b,OUTPUT);pinMode(c,OUTPUT);pinMode(d,OUTPUT);pinMode(e,OUTPUT);pinMode(f,OUTPUT);pinMode(g,OUTPUT);}

voidloop(){for(inti=0;i<10;i++){apaga();numero(i);delay(1000);}}

voidapaga(){digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);}

voidnumero(intn){for(inti=0;i<7;i++)digitalWrite(num[n][i],LOW);}

Oquefoifeito

90 10.3EXPERIÊNCIANº08-MOSTRANDONÚMEROSDE0A9EMUMDISPLAYDE7-SEGMENTOS

Asvariáveisinta=3,b=4,c=5,d=6,e=7,f=8,g=9 indicarãoquais pinosdigitais estão ligados a quaissegmentosdodisplay.Emseguida,declaramosumamatrizcom10linhase7colunas.Cadacolunaseráasequênciadesegmentosaseracesapara{b,c}criarumnúmerododisplay.Cadalinhaseráumnúmeronaordemdezeroaténove,usandoaseguintedeclaração:

intnum[10][7]={{a,b,c,d,e,f},//Zero{b,c},//Um{a,b,e,d,g},//Dois{a,b,c,d,g},//Três{b,c,f,g},//Quatro{a,c,d,f,g},//Cinco{a,c,d,e,f,g},//Seis{a,b,c},//Sete{a,b,c,d,e,f,g},//Oito{a,b,c,f,g}//Nove};

Na funçãosetup(), ajustamos os pinos digitais como saídausando as variáveis nas quais estão identificados. Na função loop() , usando a estrutura de repetição for(int

i=0;i<10;i++), contamos de 0 até 9 usando a variável i queindicaráqualalinhadamatrizqueserálida.

Chamamosemseguidaafunçãoapaga(),queapagatodosossegmentos do display, e depois a função numero(i), passandocomoparâmetroavariávelie indicandoonúmeroquedevesercriadonodisplay.

Aguardamos um segundo para que seja possível visualizar onúmeronodisplayusandoocomandodelay(1000).Emseguida,declaramosafunçãoapaga(),quenãoteráretorno(void),equecolocaovalorHIGH em cadapinodigital correspondente a cadasegmento,fazendocomqueoLEDdessesegmentosejaapagado

Afunçãonumero()tambémnãopossuiretorno(void),masrecebecomoparâmetroumnúmerointeiro,quedeveserentre0e9

10.3EXPERIÊNCIANº08-MOSTRANDONÚMEROSDE0A9EMUMDISPLAYDE7-SEGMENTOS 91

novamente.

Depois dos tipos de dados possíveis para a linguagemC paraArduino,aseguirvocêencontraráasestruturasdedesviodefluxoerepetiçãode execução, alémde todososoperadores comparativos,matemáticos,lógicosedebitsdisponíveisparaalinguagem.

10.6ASEGUIR...

94 10.6ASEGUIR...

Vejaumexemplodesuasintaxe:

if(condição){//blocodecomandos}else{//blocodecomandos}

Vejaumexemplodeuso:

if(a>10){//esteblocodecomandosseráexecutadoseovalor//davariávelaformaiorque10}

if(a!=10){//esteblocodecomandosseráexecutadoseovalor//davariávelafordiferenteque10}else{//esteblocodecomandosseráexecutadoseovalor//davariávelaNÃOfordiferenteque10}

Utilizadopara seleçãode uma variável e comparação comumvalorouumconjuntodevalores.Executaoblocodecomandosatéencontrarocomandobreakqueparaaexecução.Possuiadiretivadefault para caso a variável não coincida com nenhum dosvaloresespecificadosnoscasos.

Vejaumexemplodesuasintaxe:

switch(variável){casecondição://blocodecomandosbreak;}

Vejaumexemplodeuso:

switch(valor){case1://executaesteblocodecomandoscasovalor//sejaiguala1

switch...case

11.5ESTRUTURASDESELEÇÃO 99

break;case2://executaesteblocodecomandoscasovalor//sejaiguala2break;case3..9://executaesteblocodecomandoscasovalor//sejamaiorouiguala3oumenorouigual//a9break;

Faz comqueumblocode comandos seja repetido conformeacondição e o incremento especificado. A estrutura de repetiçãofor consiste em três parâmetros: a inicialização da variável decontrole,umacondiçãoeumincremento:

Vejaumexemplodesuasintaxe:

for(inicialização;condição;incremento){//blocodecomandos}

Vejaumexemplodeuso:

for(intx=1;x<=10;x++){//executaráesteblocodecomandos10vezes}

for(intx=2;x<=100;x+=2){//executaráesteblocodecomando50vezes,//começandoem2,contandoaté100comincrementode2}

for(intx=10;x>=1;x--){//executaráesteblocodecomando10vezes//contandoregressivamente}

11.6ESTRUTURASDEREPETIÇÃO

for

while

100 11.6ESTRUTURASDEREPETIÇÃO

Estrutura de repetição com teste no início. Ela é diferente dofor,quecontrolaavariávelcontadoracomowhile, pois vocêterá de controlá-la. Repete um bloco de comandos enquanto acondição especificada seja verdadeira. Caso a variável de controlesejainicializadacomumvalorquetorneacondiçãofalsa,olaçoderepetiçãonãoaconteceránenhumavez.

Vejaumexemplodesintaxe:

while(condição){//blocodecomandos}

Vejaumexemplodeuso:

inti=1;while(i<=10){//blocodecomandosi++;//incrementaavariável-irácontarde1até10}

inti=100;while(i>1){//blocodecomandosi--;//decrementaavariável-irácontarde100até1}

Estruturade repetição com testeno final.Repeteumblocodecomandos enquanto a condição especificada seja verdadeira. Agrandediferençaentreodo...whileeowhileéque,casoavariável de controle seja inicializada com um valor que torne acondiçãofalsa,olaçoderepetiçãoacontecerápelomenosumavez.

Sintaxe:

do{//blocodecomandos}while(condição);

Exemplo:

dowhile

11.6ESTRUTURASDEREPETIÇÃO 101

inti=1;do{//blocodecomandosi++;//incrementaavariável-irácontarde1até10}while(i<=10);

inti=100;do{//blocodecomandosi--;//decrementaavariável-irácontarde100até1}while(i>1);

Interrompe a execução de qualquer estrutura de repetição etambémnocasodaestruturadeseleçãoswitch...case.

Sintaxe:

break;

Exemplo:

for(intx=1;x<=10;x++){//blocodecomandosif(x==5){break;//interrompeaexecução}}

inti=100;while(i>1){//blocodecomandosi--;if(i==3){break;//interrompeaexecução}}

Fazcomqueaestruturaderepetiçãovolteaoprimeirocomandoapartirdopontoondeestáocomandocontinue.

Sintaxe

break

continue

102 11.6ESTRUTURASDEREPETIÇÃO

continue;

Exemplo:

for(intx=1;x<=10;x++){//blocodecomandosif(x==5){continue;}//bloconãoexecutadonomomentoqueocontinue//acontecer}

inti=1;while(i<100){//blocodecomandosi++;if(i==7){continue;}//bloconãoexecutadonomomentoqueocontinue//acontecer}

Paraexemplificarasestruturasapresentadasatéagorapodemosexecutarmaisalgumasexperiências.

PWMsignificaPulse-withModulation (Pulsocommodulação).Em um pino comum sem PWM, são aceitos apenas níveis alto ebaixo(HIGHeLOW),ouseja,ligado(5V)oudesligado(0V).ComumpinocomPWM,épossívelrealizarumamodulaçãodesinal,ouseja,alternarentreosmodosHIGHeLOWrapidamente,causandocomo resultado um efeito de variação de tensão através daintermitênciadosinal.

AfrequêncianoArduinoUNOédeaproximadamente490HzporpinoPWM.UmpinoPWMpodeserusadopara,porexemplo,variarobrilhodeumLEDouavelocidadedeummotor.Masnote

11.7 EXPERIÊNCIA Nº 09 - OS PINOS PWM(PULSE-WITHMODULATION)

11.7EXPERIÊNCIANº09-OSPINOSPWM(PULSE-WITHMODULATION) 103

que ligar ummotor diretamente em um pino PWM pode causardanosaoArduino.Seránecessáriaumainterfaceparaisso.

1xArduino

1xLED

1xResistorde220Ω

Usandoumcabinho, ligueoterminalpositivodoLED(omaiscurto) aopinodigital 3doArduino.Ligueo terminalnegativodoLEDaumresistorde220Ωnomínimoe,emseguida,usandoumcabinho,ligueooutroterminaldoresistoraoGNDdoArduino.

Figura11.1:Esquemademontagemdaexperiêncianº09

intled=3;

Oqueénecessário

Esquemademontagem

Programação

104 11.7EXPERIÊNCIANº09-OSPINOSPWM(PULSE-WITHMODULATION)

voidsetup(){pinMode(led,OUTPUT);}

voidloop(){inti;for(i=0;i<255;i++){analogWrite(led,i);delay(50);}}

Como prevemos que o LED pode ser colocado em qualquerpinodigital,apesardeeusempresugerirum,começamoscomintled=3,queéavariávelcomovalordopinodigitalondeestaráoLED.

Nafunçãosetup(),ajustamosopinodoLEDparasaídacompinMode(led,OUTPUT). Jána funçãoloop(), usamosintiparadeclararumavariávelcontadoraparaolaçoderepetiçãofor.

Usamos for(i=0;i<255;i++) como laço de repetição quecontarátodosospossíveisvaloresparaumpinoPWM,ouseja,dezeroaté255,onde0equivaleaoestadoLOWe255aoestadoHIGH.

ComosetratadeumpinoPWM,aescritaparaeleéanalógica.Portanto, usamosanalogWrite(led,i) passando para o pino ovalor da variável contadora. Usamos delay(50) para umapequena pausa de 50 milissegundos apenas para conseguirmosdistinguiroefeitodeacendereapagardoLED.

OLEDdeveacendervagarosamente,variandoa luminescênciadeapagadoatétotalmenteaceso.NotequeoLEDnãopossuimuitaprecisão e, em determinado momento, ficará totalmente aceso,

Oquefoifeito

Resultadoesperado

11.7EXPERIÊNCIANº09-OSPINOSPWM(PULSE-WITHMODULATION) 105

mesmoantesdeolaçoderepetiçãoterminar.Aoterminarolaçoderepetição,oLEDapagaráecomeçaráaacendernovamente.

Depoisdetantasluzes,vamosparaumpoucodesomnasduasexperiênciasseguidas,masseguindoamesmalinhadeestruturasdalinguagemapresentadasanteriormenteeousodepinosPWM.

Um buzzer é um componente eletrônico composto de umamembrana vibratória em um invólucro,muitas vezes plástico. Aoexcitá-lo eletricamente, a membrana vibra e produz ruído.Alternando a frequência de excitação, é possível conseguir algunstons.

Obuzzer,quando ligado,produzruídoem1kHz(quilohertz),um bip mais ou menos equivalente à letra i. Esse componente émuitoutilizado emalarmesde rádios-relógios, bipsde centrais dealarmeoupainéisnuméricosparaatendimentoaopúblico.

Comobasta alimentá-lo para que o ruído seja produzido, vejaqueocódigoéamesmacoisaqueusarumsimplesLED.

1xArduino

1xBuzzer5V

Usandoumcabinho,ligueopinopositivo(+)dobuzzernopinodigital9(PWM)e,emseguida,usandooutrocabinho,ligueopinonegativodobuzzernopinoGNDdoArduino.

11.8 EXPERIÊNCIA Nº 10 - FAZENDOBARULHOCOMUMBUZZER

Oqueénecessário

Esquemademontagem

106 11.8EXPERIÊNCIANº10-FAZENDOBARULHOCOMUMBUZZER

Figura11.2:Esquemademontagemdaexperiêncianº10

voidsetup(){pinMode(9,OUTPUT);}

voidloop(){digitalWrite(9,HIGH);delay(150);digitalWrite(9,LOW);delay(3000);}

Na função setup() , usamos o já bem conhecidopinMode(9,OUTPUT)paraajustaropinodobuzzercomosaída.Jánafunçãoloop()usamosdigitalWrite(9,HIGH)paracolocaropinodigitaldobuzzeremHIGH,edelay(150) paradeixar obuzzer emitindo som por 150 milissegundos. Depois usamosdigitalWrite(9,LOW) para colocaropinodigitaldobuzzer emLOWpara que pare de emitir som, e delay(3000) para que o

Programação

Oquefoifeito

11.8EXPERIÊNCIANº10-FAZENDOBARULHOCOMUMBUZZER 107

silênciodure3segundos.

Depois de compilar e enviar o programa para o Arduino, obuzzer emitirá um bit curto de 150milissegundos e esperará trêssegundosparaemiti-lonovamente.

Agora que você já sabe como funciona um buzzer e os pinosPWM,deveterimaginadoemgerartons,comonotasmusicais.Issoé possível, mas como o buzzer vibra apenas na faixa de 1 Hzaproximadamente, é melhor usar um alto-falante, que é capaz dereproduzirfrequênciasmaisvariadas.

Como sabemos que cada notamusical possui uma frequênciaespecífica e uma duração específica, podemos usar o comandotoneparagerartonsnafrequênciadanotamusical,eocomandodelayparamantê-laduranteotemponecessário.

Atabeladenotasxfrequênciaé:

Nota Nome Frequência

C Dó 261Hz

D Ré 294Hz

E Mi 329Hz

F Fá 349Hz

G Sol 392Hz

A Lá 440Hz

B Sí 523Hz

Resultadoesperado

11.9 EXPERIÊNCIA Nº 11 - FAZENDOBARULHOCOMUMALTO-FALANTE

108 11.9EXPERIÊNCIANº11-FAZENDOBARULHOCOMUMALTO-FALANTE

1xArduino

1xalto-falantedenomáximo4Ω

Usandoosprópriosfiosdoalto-falente(seeletiver),ouusandocabinhos, ligue o pino positivo do alto-falante no pino digital 3(PWM)e,emseguida,ligueopinonegativodoalto-falantenopinoGNDdoArduino.

Figura11.3:Esquemademontagemdaexperiêncianº11

voidsetup(){pinMode(3,OUTPUT);}

voidloop(){intC=262,D=294,E=330,F=349,G=392,A=440,B=523;intP=0;

Oqueénecessário

Esquemademontagem

Programação

11.9EXPERIÊNCIANº11-FAZENDOBARULHOCOMUMALTO-FALANTE 109

inti;intode[]={E,E,F,G,G,F,E,D,C,C,D,E,E,D,P,D,P,E,E,F,G,G,F,E,D,C,C,D,E,D,C,P,C,P,D,D,E,C,D,E,P,F,E,C,D,E,P,F,E,D,C,D,P,E,E,D,G,G,F,E,D,C,C,D,E,D,C,P,C};inttempo[]={1,1,1,1,1,1,1,1,1,1,1,1,1.5,1,.5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.5,1,.5,1,1,1,1,1,1,1,1,.5,1,1,1,1,1,.5,1,1.5,1,.5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.5,.125,1,1};for(i=0;i<sizeof(ode)/2;i++){if(ode[i]!=0)tone(3,ode[i]);elsenoTone(3);delay(tempo[i]*500);noTone(3);}noTone(3);delay(10000);}

Depoisdeajustaropinodigitalcomosaídanafunçãosetup()na função loop() , declaramos 7 variáveis para conter asfrequênciasdasnotasmusicais(C,D,E,F,G,AeB),eumaquerecebezeroeserviráparaindicarumapausa(P).

O vetor ode recebe a sequência de notas musicais para amúsica a ser tocada (Ode para Joy), e o vetor tempo recebe asequênciade tempodecadanotamusical, sendoqueaposiçãonanotanovetorodecorrespondeàposiçãodovetortempo.

Comofor(i=0;i<sizeof(ode)/2;i++),criamosumlaçoderepetiçãoparalerovetorode.Comocadaposiçãodovetorocupa2 bytes, para saber a quantidade de posições, basta dividir otamanhodelepordois,ouseja,pelotamanhodememóriaocupadapelotipodedadoint.

Emif(ode[i]!=0)tone(3,ode[i]);elsenoTone(3);,dizemosqueseanotaédiferentedezero(pausa-variávelP),tocaanota, senão para imediatamente de emitir qualquer som. Já o

Oquefoifeito

110 11.9EXPERIÊNCIANº11-FAZENDOBARULHOCOMUMALTO-FALANTE

comandodelay(tempo[i]*500)fazotempoexecuçãodecadanota.Depoisdisso,éprecisointerromperaemissãodetomnopinodigital3,efazemosissousandonoTone(3).

Finalmente,comdelay(10000),esperamos10segundosantesderecomeçaraexecuçãodamúsicanovamente.

DepoisdecompilareenviaroprogramaparaoArduino,umaversão para a música Ode to Joy começará a ser executada, aotérminoserãodados10segundoseamúsicaseráre-executada.

Usandoobuzzereasfunçõescorretas,tentereproduziralgumamúsica simples que seja fácil de reconhecer, como por exemplo,"batatinhaquandonasce" ou "ciranda cirandinha".Deixe amúsicadentro da função setup() para que seja executada apenas umavez.

DepoisexercitarbastantepraticamentetodaalinguagemCparaoArduino,masusandosomenteospinosdigitais,chegouahoradepraticarmos tambémusando os pinos analógicos, que são capazesdeenviarerecebervaloresetensõesentre0V(0)e5V(1024).

Resultadoesperado

11.10EXERCITE

11.11ASEGUIR...

11.10EXERCITE 111

CAPÍTULO12

Alémdospinosdigitais,outrainterfacedoArduinosãoospinosanalógicos que, diferentemente dos primeiros, são capazes deescrever(enviar)ouler(receber)umatensãoentre0Ve5V.Ouseja,podemenviarqualquervariaçãoentreessasduastensões.

A tensão a ser enviada é uma proporção aproximada entre osvaloresdecimaisapresentadosàinterfaceeàtensãodereferênciadoArduino. Emoutras palavras, se o valor decimal for0, a tensãoserá 0V e, se o valordecimal for1204, a tensão será 5V. Sendoassim, se o valor decimal apresentado for 256 , a tensão seráaproximadamente2,5V.

Na sequência, veja todas as funções para a manipulação dospinosanalógicosdoArduino.

Lêovaloratualdeumpinoanalógico.OspinosanalógicosdoArduino possuem um conversor analógico-digital de 10 bits, issoquer dizer que o comando analogRead vai converter voltagensentre0Ve5Vparavaloresdecimaisentre0e255,sendo0sempredesligadoe255sempreligado.

Vejaumexemplodasintaxe:

analogRead(pino);

FUNÇÕESPARAPINOSANALÓGICOS

analogRead()

112 12FUNÇÕESPARAPINOSANALÓGICOS

Vejaumexemplodouso:

intvalor=analogRead(A0);

Escreveumvalor analógicoparaumpino analógicooudigitalPWM. Os valores que podem ser escritos para os pinos podemvariarde0até1023.

Sintaxe:

analogWrite(pino);

Exemplo:

analogWrite(6);//pinodigitalPWM

analogWrite(A2);//pinoanalógico

Os pinos analógicos são usados para ler e escrever valoresanalógicos, ou seja, discretos e não apenas zeros e uns. Um bomexemplodeusodessespinoséopotenciômetro.Vejamosaseguir.

Existemdoistiposderesistores:osfixoseosquesãovariáveis.Os resistores fixos são os que conhecemos bem em circuitoseletrônicos, e os variáveis são denominados potenciômetros oureostatos.Àmedidaqueumcursordeslizantegira,oseupontodecontato com o elemento resistivo muda, variando assim aresistênciaentreosterminais.

ComArduino,podemosconverteratensãoresultanteentreumpinodealimentaçãoeumpinoanalógicoemvalordecimalcomousodeumpotenciômetro.

analogWrite()

12.1 EXPERIÊNCIA Nº 12 - USANDO UMPOTENCIÔMETRO

12.1EXPERIÊNCIANº12-USANDOUMPOTENCIÔMETRO 113

1xArduino

1xPotenciômetrode1KΩ

Usando dois cabinhos, os terminais laterais do potenciômetroserãoligadosaospinosGNDe5VdoArduino.Usandoumterceirocabinho, o terminal central do potenciômetro será ligado ao pinoanalógicoA0doArduino.

Figura12.1:Esquemademontagemdaexperiêncianº12

voidsetup(){Serial.begin(9600);}

voidloop(){Serial.println(analogRead(A0));delay(10);}

Oqueénecessário

Esquemademontagem

Programação

114 12.1EXPERIÊNCIANº12-USANDOUMPOTENCIÔMETRO

Na funçãosetup(), iniciamos a comunicação serial usando Serial.begin(9600) para acompanharmos a leitura dopotenciômetro via Monitor Serial. ComSerial.println(analogRead(A0)), lemos o valor lido no pinoanalógico A0 do Arduino e enviamos via conexão serial para ocomputador.Usamos tambémodelay(10) parauma esperadeapenas10milissegundosapenasparaosnúmerosnãopassaremtãorápido.

DepoisdecompilareenviaroprogramaparaoArduino,abraoMonitorSerialemovaocursordopotenciômetro.Vocêdeveráveros números mudarem de acordo com omovimento realizado nopotenciômetro,resultantedavariaçãodaresistência.

Outrobomexemploéousodeumsensordeluminosidade.

Umdos objetivos daComputação Física é "sentir" omundo einteragir com ele pormeio de equipamentos digitais. Usando umsensor de luminosidade, é possível realizar essa tarefa, sendo quepodemos medir a quantidade de luz em um ambiente e realizaralgumatarefaapartirdessamedição.

1xArduino

1xLDR10KΩ

Oquefoifeito

Resultadoesperado

12.2 EXPERIÊNCIA Nº 13 - USANDO UMSENSORLUMINOSIDADE

Oqueénecessário

12.2EXPERIÊNCIANº13-USANDOUMSENSORLUMINOSIDADE 115

1xResistorde1KΩ

Guiando-sepelafiguraaseguir,ligueumresistorde10KΩentreopinoGNDeopinodigital2doArduino,usandodoiscabinhos.Tambémusando cabinhos, ligue oLDR entre o pinodigital 2 e opino5VdoArduino.

Figura12.2:Esquemademontagemdaexperiêncianº13

intvalor=0;

voidsetup(){Serial.begin(9600);}

voidloop(){valor=analogRead(A0);Serial.println(valor);delay(500);}

Esquemademontagem

Programação

116 12.2EXPERIÊNCIANº13-USANDOUMSENSORLUMINOSIDADE

Primeiro, inicializamos a variável que receberá a leitura comzero com int valor = 0. O próximo passo foi inicializar acomunicação serial na função setup() usandoSerial.begin(9600).

Com valor = analogRead(A0) , lemos o valor do pinoanalógico A0 do Arduino e o valor lido ficará armazenado navariávelvalor.UsamosSerial.println(valor)paraimprimiro valor lido do pino analógico no Monitor Serial. No final, umdelayparaconseguirmosverovalornatela.

DepoisdecompilareenviaroprogramaparaoArduino,abraoMonitor Serial e faça com que o LDR receba mais ou menosluminosidade, e verifique que o valor impresso mudaproporcionalmenteaquantidadedeluz.

Nosimulador,cliquesobreoLDRparaselecionaraquantidadedeluzasersimulada.

Façaumalarmeparadetectaraportaabertadageladeira.Fundaos circuitos do LDR e do buzzer, e crie um programa que, aodetectar luz, emita um alarme sonoro. Esse pequeno e simplesequipamentopode ser deixadodentroda geladeira e, caso a portafiqueaberta,permitindoquealgumaluzentre,eleemitiráoalarme.Façaumalarmeparadetectaraportaabertadageladeira.FundaoscircuitosdoLDRedobuzzer,ecrieumprogramaque,aodetectarluz,emitaumalarmesonoro.Essepequenoesimplesequipamentopode ser deixado dentro da geladeira e, caso a porta fique aberta,

Oquefoifeito

Resultadoesperado

12.3EXERCITE

12.3EXERCITE 117

permitindoquealgumaluzentre,eleemitiráoalarme.

Muitos projetos dependem da contagem de tempo para atuarsobre dispositivos diversos, geração de sons de aviso ou alerta aquemforooperadordoequipamento.Portanto,aseguirvocêteráadescriçãodetodasasfunçõesparaessastarefas.

12.4ASEGUIR...

118 12.4ASEGUIR...

CAPÍTULO13

Como mencionado anteriormente, há algumas funções parageraçãoderuídosdealertaouavisoparaquemestiveroperandooequipamentocriado.Parageraressetipodesinal,usamosospinosdigitaisPWMdoArduino.

As funções tone() e noTone() fazem parte das funçõesespeciais da linguagem. Veja a seguir a especificação para elas etambémparaasfunçõesdecontagemdetempo:

Geraumaondanafrequênciaespecificadaemumpinoatéqueaduração seja cumprida, ou até que a função noTone() sejaexecutada. A frequência mínima em um Arduino Uno é deaproximadamente 31Hz e amáximade aproximadamente 65.535Hz.

Vejaumexemplodasintaxe:

tone(pino,frequência);

tone(pino,frequência,duração);

Vejaumexemplodeuso:

tone(6,240);//pinodigitalPWM6,frequênciade240Hz

tone(6,240,500);//pinodigitalPWM6,frequênciade240Hz//por500milissegundos

FUNÇÕESESPECIAIS

tone()

13FUNÇÕESESPECIAIS 119

Paraageraçãodaondacriadapelocomandotoneemumpinoespecífico.

Sintaxe:

noTone(pino);

Exemplos:

noTone(6);

Retorna um número do tipo unsigned long contendo aquantidadedemilissegundosemqueoprogramaatualencontra-seemexecução.Conseguecontaratéaproximadamente50dias,depoisretornaazeroerecomeçaacontagem.Lembrequeemumsegundohá1.000milissegundos.

Sintaxe:

millis();

Exemplos:

unsignedlongtempo=millis();

Retorna um número do tipo unsigned long contendo aquantidadedemicrossegundosemqueoprogramaatualencontra-seemexecução.Conseguecontaratéaproximadamente70minutos,depois retorna a zero e recomeça a contagem. Note que em umsegundohá1.000.000microssegundos.

noTone()

13.1FUNÇÕESDETEMPO

millis()

micros()

120 13.1FUNÇÕESDETEMPO

Sintaxe:

micros();

Exemplos:

unsignedlongtempo=micros();

Pausa a execução do programa por uma quantidade demilissegundosdeterminada.

Sintaxe:

delay(tempo);

Exemplos:

delay(1000);//pausaoprogramaporumsegundo

delay(13000);//pausaoprogramapor13segundos

Pausa a execução do programa por uma quantidade demicrossegundosdeterminada.

Sintaxe:

delayMicroseconds(tempo);

Exemplos:

delayMicroseconds(1000000);//pausaoprogramaporum//segundo

delayMicroseconds(13000000);//pausaoprogramapor13//segundos

delay()

delayMicroseconds()

13.2 EXPERIÊNCIA Nº 14 - PROGRAMANDOUMRELÓGIO

13.2EXPERIÊNCIANº14-PROGRAMANDOUMRELÓGIO 121

Umbomexemploparaousodasfunçõesdetempoéprogramarumrelógio.VocêpoderáverotempopassandonoMonitorSeriale,se desejar, recorrer às experiências do display de 7-segmentos etentarmontarumrelógio"deverdade".

1xArduino

Nãohánecessidadedequalquer componente excetoopróprioArduino.

Figura13.1:Esquemademontagemdaexperiêncianº14

intseg=0,min=0,hor=0;

voidsetup(){Serial.begin(9600);}

voidloop(){staticunsignedlongult_tempo=0;inttempo=millis();if(tempo-ult_tempo>=1000){ult_tempo=tempo;

Oqueénecessário

Esquemademontagem

Programação

122 13.2EXPERIÊNCIANº14-PROGRAMANDOUMRELÓGIO

seg++;}if(seg>=60){seg=0;min++;}if(min>=60){min=0;hor++;}if(hor>=24){hor=0;min=0;}Serial.print(hor);Serial.print(":");Serial.print(min);Serial.print(":");Serial.println(seg);

}

Primeiro, precisamos criar variáveis para armazenar as horas,minutos e segundos. Fazemos isso com int seg=0, min=0,

hor=0,sendoque,parasegundos,usaremosavariávelseg, paraminutosavariávelmin,eparahorasavariávelhor.

Jánafunçãosetup(),inicializamosacomunicaçãoserialcomSerial.begin(9600) . Na função loop() , usamos staticunsigned long ult_tempo = 0 para declarar e inicializar avariável que será usada para a contagem de tempo, e com inttempo = millis() declaramos a variável tempo que recebe oretornodafunçãomillis()

Com a estrutura de seleção if(tempo - ult_tempo >=

1000) , verificamos se, caso já tenham se passado 1.000milissegundos (1 segundo), incrementamos a quantidade desegundos.

Oquefoifeito

13.2EXPERIÊNCIANº14-PROGRAMANDOUMRELÓGIO 123

É preciso armazenar a última passagem de tempo, já queprecisamosdealgumvalorparacompararotempoatualeoquejápassou.Fazemosissocomult_tempo=tempoe,emseguida,ésóincrementaraquantidadedesegundos(seg++).

Usamos if(seg>=60) para verificar se já se passaram 60segundos (1minuto). Caso positivo, incrementamos a quantidadede minutos, e é preciso zerar os segundos para recomeçar acontagemdeles.Fazemosissocomseg=0emin++.

De forma similar ao que fazemos para os segundos, usamosif(min>=60)paraverificarsejátenhamsepassado60minutos(1hora). Caso positivo, incrementamos a quantidade de horas e éprecisozerarosminutospararecomeçaracontagemdeles.Fazemosissocommin=0ehor++.

Finalmente, só nos falta contar a quantidade de dias, entãousamosif(hor>=24)paraverificarsejásepassaram24horas(1dia).Sesim,éprecisozerarashoraseosminutospararecomeçaracontagemdeles.Fazemosissocomhor=0emin=0.

Depois de tudo isso, basta mostrar o tempo passando noMonitor Serial. Para isso, imprimimos os números usando Serial.print(hor) , Serial.print(":") , Serial.print(min) , Serial.print(":") eSerial.println(seg).

DepoisdecompilareenviaroprogramaparaoArduino,abraoMonitorSerialevocêveráacontagemdetempo.

Junte a experiência deste capítulo como uso de botões, e crie

Resultadoesperado

13.3EXERCITE

124 13.3EXERCITE

umamaneiradeajustarashoras,minutosesegundosusando,pelomenos, três botões: um para incrementar os números, outro paradecrementar, e o terceiro para selecionar a opçãode qual variáveldeseja ajustar. Use o Monitor Serial para mostrar mensagens daopçãoselecionadaeosvaloresajustados.

Apesardeaexperiênciadeprogramarumrelógiopoderrendervárias outras ideias, principalmente, como já sugerido, unida àsexperiências que usam displays de 7-segmentos - e você podeexplorá-las,sequiser-, jápodemoscontinuarosestudos.Aseguir,você encontrará comomanipular números e caracteres utilizandotodasasfunçõesmatemáticasdisponíveisparaa linguagemCparaArduino.

13.4ASEGUIR...

13.4ASEGUIR... 125

CAPÍTULO14

Asfunçõesmatemáticasedecaracteressãoespecialmenteúteisquando é necessário realizar cálculos de dados recebidos desensores,outrosequipamentosoumesmoArduino.Tambémdevemser consideradasnahorade interagir comousuárioparamostrarvaloresinteligíveis.

Retornaomenorvalorentredoisnúmerosespecificados.

Vejaumexemplodesintaxe:

min(valor,valor);

Vejaumexemplodeuso:

intx=min(2,7);//xseráiguala2

Retornaomaiorvalorentredoisnúmerosespecificados.

Sintaxe:

max(valor,valor);

Exemplo:

intx=max(2,7);//xseráiguala7

FUNÇÕESMATEMÁTICAS

min()

max()

abs()

126 14FUNÇÕESMATEMÁTICAS

Retornaomódulodeumvalor(valorabsoluto).

Sintaxe:

abs(valor);

Exemplos:

intx=abs(30);//xseráiguala30

intx=abs(-30);

Verifica se um número pertence a uma faixa de valoresespecificada.

Sintaxe:

constrain(valor,iniciodafaixa,fimdafaixa);

Exemplos:

intresultado=constrain(10,1,20);//retorna10,pois10//estádentrodafaixa

intresultado=constrain(10,20,30);//retorna20,pois10//émenorqueoinício//dafaixa

intresultado=constrain(40,20,30);//retorna30,pois40//émaiorqueoinício//dafaixa

Retorna a relação entre um número e duas faixas de valores.Valorseráumarelaçãoentreaprimeirafaixadevalores(mínimoemáximo)sobreasegundafaixadevalores(mínimoemáximo).

Sintaxe:

map(valor,demenorvalor,demaiorvalor,paramenorvalor,paramaiorvalor);

constrain()

map()

14FUNÇÕESMATEMÁTICAS 127

Exemplos:

intx=map(10,0,10,100,200);//xseráiguala200

intx=map(0,0,10,100,200);//xseráiguala100

Realizapotenciaçãocomumnúmeroemrelaçãoaumexpoente.

Sintaxe:

pow(base,expoente);

Exemplos:

floatx=pow(3,2);//realiza3²sendoassimxseráigual//a9

floatx=pow(4,-2);//realiza4-2sendoassimxserá//iguala2

Calculaaraizquadradadeumnúmero.

Sintaxe:

sqrt(número);

Exemplos:

doublex=sqrt(4);//calculaaraizquadradade4,//sendoassimxseráiguala2

doublex=sqrt(8);//calculaaraizquadradade8,//sendoassimxseráiguala//aproximadamente2.82842712

Calculaosenodeumânguloemradianos.

Sintaxe:

pow()

sqrt()

sin()

128 14FUNÇÕESMATEMÁTICAS

sin(ângulo);

Exemplos:

floatx=sin(90);//calculaosenode90grausradianos,//xseráaproximadamente0.89

floatx=sin(45);//calculaosenode45grausradianos,//xseráaproximadamente0.85

Calculaocossenodeumânguloemradianos.

Sintaxe:

cos(ângulo);

Exemplos:

floatx=cos(90);//calculaocossenode90grausradianos,//xseráaproximadamente-0.45

floatx=cos(45);//calculaocossenode45grausradianos,//xseráaproximadamente0.53

Calculaatangentedeumnúmeroemradianos.

Sintaxe:

tan(ângulo);

Exemplos:

floatx=tan(90);//calculaotangentede90grausradianos,//xseráaproximadamente-2.00

floatx=tan(45);//calculaotangentede45grausradianos,//xseráaproximadamente1.62

cos()

tan()

14.1FUNÇÕESPARACARACTERES

14.1FUNÇÕESPARACARACTERES 129

Retornaverdadeiro(1-TRUE)seocaractereforalfanumérico;casocontrário,retornafalso(0-FALSE).

Vejaumexemplodesintaxe:

isAlphaNumeric(caractere);

Vejaumexemplodeuso:

booleant=isAlphaNumeric('K');//retorna1-TRUE

Retornaverdadeiro(1-TRUE)seocaractereforumaletra;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isAlpha(caractere);

Exemplos:

booleant=isAlpha('K');//retorna1-TRUE

booleant=isAlpha('1');//retorna0-FALSE

Retorna verdadeiro (1 - TRUE) se o caractere for um ASCII;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isAscii(caractere);

Exemplo:

booleant=isAscii('K');//retorna1-TRUE

isAlphaNumeric()

isAlpha()

isAscii()

isWhitespace()

130 14.1FUNÇÕESPARACARACTERES

Retornaverdadeiro(1-TRUE)seocaractereforumespaçoembranco;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isWhitespace(caractere);

Exemplos:

booleant=isWhitespace('');//retorna1-TRUE

booleant=isWhitespace('K');//retorna0-FALSE

Retorna verdadeiro (1 - TRUE) se o caractere for um decontrole;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isControl(caractere);

Exemplo:

booleant=isControl('K');//retorna0-FALSE

Retornaverdadeiro (1 -TRUE) seo caractere forumnúmero;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isDigit(caractere);

Exemplos:

booleant=isDigit('1');//retorna1-TRUE

booleant=isDigit('K');//retorna0-FALSE

isControl()

isDigit()

isGraph()

14.1FUNÇÕESPARACARACTERES 131

Retorna verdadeiro (1 - TRUE) se o caractere for umimprimível;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isGraph(caractere);

Exemplo:

booleant=isDigit('1');//retorna1-TRUE

Retorna verdadeiro (1 - TRUE) se o caractere for uma letraminúscula;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isLowerCase(caractere);

Exemplos:

booleant=isDigit('a');//retorna1-TRUE

booleant=isDigit('A');//retorna0-FALSE

Retorna verdadeiro (1 - TRUE) se o caractere for umimprimível;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isPrintable(caractere);

Exemplo:

booleant=isPrintable('K');//retorna1-TRUE

Retorna verdadeiro (1 - TRUE) se o caractere for um depontuação;casocontrário,retornafalso(0-FALSE).

isLowerCase()

isPrintable()

isPunct()

132 14.1FUNÇÕESPARACARACTERES

Sintaxe:

isPunct(caractere);

Exemplos:

booleant=isPunct(';');//retorna1-TRUE

booleant=isPunct('A');//retorna0-FALSE

Retornaverdadeiro(1-TRUE)seocaractereforumespaçoembranco;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isSpace(caractere);

Exemplos:

booleant=isSpace('');//retorna1-TRUE

booleant=isSpace('P');//retorna0-FALSE

Retorna verdadeiro (1 - TRUE) se o caractere for uma letramaiúscula;casocontrário,retornafalso(0-FALSE).

Sintaxe:

isUpperCase(caractere);

Exemplos:

booleant=isUpperCase('B');//retorna1-TRUE

booleant=isUpperCase('b');//retorna0-FALSE

Retorna verdadeiro (1 -TRUE) se o caractere for umnúmero

isSpace()

isUpperCase()

isHexadecimalDigit()

14.1FUNÇÕESPARACARACTERES 133

hexadecimal(de0até9,deAatéF);casocontrário,retornafalso(0-FALSE).

Sintaxe:

isHexadecimalDigit(caractere);

Exemplos:

booleant=isHexadecimalDigit('C');//retorna1-TRUE

booleant=isHexadecimalDigit('X');//retorna0-FALSE

InicializaogeradordenúmerospseudoaleatóriosdoArduino.ÉimportantegerarasequênciapseudoaleatóriodorandomSeedparaqueocomandorandompossaretornarumnúmeroaleatórioacadaexecuçãoemumprograma.

Vejaumexemplodesintaxe:

randomSeed(número);

Vejaumexemplodeuso:

randomSeed(10000);

Retornaumnúmeroaleatório entre zero eonúmeromáximo,ouentreonúmeromínimoeonúmeromáximo.

Sintaxe:

random(númeromáximo);

random(númeromínimo,númeromáximo);

14.2FUNÇÕESPARANÚMEROSALEATÓRIOS

randomSeed()

random()

134 14.2FUNÇÕESPARANÚMEROSALEATÓRIOS

Exemplos:

longnum=random(300);//retornaumnúmeroaleatório//entrezeroe300

longnum=random(100,200);//retornaumnúmeroaleatório//entre100e200

Crieumprogramaquecalculeosenodetodososângulosentre0e360graus(useumaestruturaderepetição)emostreoresultadonoMonitor Serial. Feche oMonitor Serial e abra o Plotter Serialpara vê-lo mostrar a curva correspondente ao cálculo do seno.Repitaomesmoparaasfunçõesdocossenoedatangenteparaveradiferençanacurva.

Agoravocê jádeve sabercomoarmazenardadosemvariáveis,convertê-lose tratá-loscomasmaisdiversas funçõesapresentadasaté aqui. A seguir, você terá a descrição das funções paracomunicaçãoserialdoArduino.Comelas,épossívelcomunicar-secom sensores, máquinas e equipamentos que usem esse tipo decomunicação e também realizar transmissão de dados entreArduinos.

14.3EXERCITE

14.4ASEGUIR...

14.3EXERCITE 135

CAPÍTULO15

Ograndemotehojeemdiaécomunicar-se,transmitirereceberosdadosmaisvariadospossíveisetransformá-losematuaçãosobreequipamentos, para que seja possível criar sistemas que interajamcom omundo físico. Assim que se faz a Internet das Coisas, porexemplo.

Como já mencionei anteriormente, podemos pensar emArduino pela ótica da Internet das Coisas (Internet of Things, ouIoT), que visa criar equipamentos com capacidade e objetivo detransmitir dados e interagir diretamente com a internet, sem aefetiva intervenção humana. Dentre as vastas possibilidades, citeicomo exemplo estações meteorológicas automáticas, sensores depresença,eletrodomésticosautomatizadosecapazesdeinteragirumcomoutros,liberaçãodeacessoerastreadoresveiculares.

Para esse tipo de funcionalidade, existem muitas funções decomunicação serial para o Arduino, que serão apresentadas nasequência.

Utilizado para comunicação entre um Arduino e umcomputador, ou qualquer outro equipamento que seja capaz derealizar(recebereenviar)comunicaçãoserial.ParaoArduinoUno,

FUNÇÕESPARACOMUNICAÇÃO

Serial()

136 15FUNÇÕESPARACOMUNICAÇÃO

os pinos 0 e 1 são compartilhados com os pinos de comunicaçãoserial do microcontrolador que, por sua vez, também estãoconectados ao conversorUSB-Serial. Portanto, deve-se evitar usaressespinosnasexperiênciasparanãoprejudicaroucausarqualquerinterferêncianacomunicação.

Pararealizaracomunicaçãoserialvocêpodeusaroscomandosaseguir:

Inicia a comunicação serial com a velocidade selecionada. Asvelocidades selecionadas são: 300, 600, 1200, 2400, 4800, 9600,14400,19200,28800,38400,57600ou115200bauds.

Vejaumexemplodesintaxe:

Serial.begin(velocidade);

Vejaumexemplodeuso:

Serial.begin(9600);

Serial.begin(115200);

Retornaonúmerodecaracteresexistentesparaleituraviaportaserial.

Sintaxe:

Serial.avaliable();

Exemplo:

if(Serial.available>0){//sehouveremcaracteres//paraseremlidos//lercaracteres}

Serial.begin()

Serial.avaliable()

15FUNÇÕESPARACOMUNICAÇÃO 137

Envia dados para a porta serial em formato humanamenteinteligível.Podereceberumformatadordedadosparaindicarseosdados deverão ser mostrados como binários, octais, decimais,hexadecimais ou números fracionários. Se o formatador foromitido,osdadossãomostradosliteralmente.

Sintaxe:

Serial.print(caracteres,formatador);

Exemplos:

Serial.print(78,BIN);//mostrará1001110Serial.print(78,OCT);//mostrará116Serial.print(78,DEC);//mostrará78Serial.print(78,HEX);//mostrará4ESerial.println(1.23456,0);//mostrará1Serial.print(1.23456,2);//mostrará1.23Serial.print(1.23456,4);//mostrará1.2346

Envia dados para a porta serial em formato humanamenteinteligível.Podereceberumformatadordedadosparaindicarseosdados deverão ser mostrados como binários, octais, decimais,hexadecimais ou números fracionários. Se o formatador foromitido,osdadossãomostradosliteralmente.

Ao final da linha insere um caractere para retorno de carro(carriage return) e avanço de linha (line feed), equivalente aoENTER.

Sintaxe:

Serial.println(caracteres,formatador);

Exemplos:

Serial.println(78,BIN);//mostrará1001110

Serial.print()

Serial.println()

138 15FUNÇÕESPARACOMUNICAÇÃO

Serial.println(78,OCT);//mostrará116Serial.println(78,DEC);//mostrará78Serial.println(78,HEX);//mostrará4ESerial.println(1.23456,0);//mostrará1Serial.println(1.23456,2);//mostrará1.23Serial.println(1.23456,4);//mostrará1.2346

Enviadados,comoumastring,porexemplo,binariamenteparaaportaserial.Osdadossãoenviadosbyteabyteparaacomunicaçãoserial, eos caracteres representamovalornumérico.Paramostraros caracteres legivelmente, use o Serial.print ouSerial.println. Também retorna a quantidade de bytes queforamenviados.

Sintaxe:

Serial.write(valor);

serial.write(string);

Exemplos:

Serial.write(45);//enviaapenasumbyte//comovalor45

intqtde=Serial.write("Arduino");//enviaastring//Arduinoeretorna7

Enviadados,comoumastring,porexemplo,binariamenteparaaportaserial.Osdadossãoenviadosbyteabyteparaacomunicaçãoserial, eos caracteres representamovalornumérico.Paramostraros caracteres legivelmente, use o Serial.print ouSerial.println.

Ao final da linha, insere um caractere para retorno de carro(carriage return) e avanço de linha (line feed), equivalente ao ENTER . Também retorna a quantidade de bytes que foram

Serial.write()

Serial.writeln()

15FUNÇÕESPARACOMUNICAÇÃO 139

enviados.

Sintaxe:

Serial.writeln(valor);

Serial.writeln(string);

Exemplos:

Serial.writeln(45);//enviaapenasumbytecomovalor45

intqtde=Serial.writeln("Arduino");//enviaastring//Arduinoeretorna7

Lêdadospelaportaserial.Retorna-1casonãohajabytesparaseremlidos.

Sintaxe:

Serial.read();

Exemplos:

if(Serial.available()>0){intqtde=Serial.read();//armazenaráobytelido//navariávelqtde}

Bom, vamos colocar as mãos na massa. A experiência nº 15serve para lidar com a conexão serial entre o Arduino e ocomputador. Um pouco mais adiante, vamos executar umaexperiência para recebermos dados do computador no Arduino.Estaseráaexperiêncianº16.

Serial.read()

15.1EXPERIÊNCIANº15-ENVIARDADOSDOARDUINO PARA O COMPUTADOR PELACOMUNICAÇÃOSERIAL

140 15.1EXPERIÊNCIANº15-ENVIARDADOSDOARDUINOPARAOCOMPUTADORPELACOMUNICAÇÃOSERIAL

Quando conectamos o Arduino ao computador por meio docaboeportaUSB, imediatamenteécriadaumaportaserialvirtualnocomputadordeformaquepossamosenviarnossossketchesparaaplaca.Damesmamaneira,essaportaserialvirtualpodeserusadaparaenviardadosparaoArduinoetambémreceberdadosgeradospeloArduino.

Nesta experiência, vamosgerardados comoArduino e enviá-los serialmente para o computador. Para ver os dados gerados,utilizaremos o Monitor Serial do Ambiente de ProgramaçãoArduino. Com isso, você pode enviar quaisquer dados para ocomputador ou qualquer outro equipamento que possuacomunicaçãoatravésdeportasseriais.

1xArduino

Não há necessidade de montagens, apenas conecte o seuArduinoaoseucomputadorusandoocaboeaportaUSB.

Figura15.1:Esquemademontagemdaexperiêncianº15

Oqueénecessário

Esquemademontagem

15.1EXPERIÊNCIANº15-ENVIARDADOSDOARDUINOPARAOCOMPUTADORPELACOMUNICAÇÃOSERIAL 141

voidsetup(){Serial.begin(9600);}

voidloop(){Serial.write("Oi!\n");delay(1000);}

ComoocomandoSerial.begin(9600)nafunçãosetup(),iniciamosacomunicaçãoserialcomtaxade9.600bauds.Nafunçãoloop() , usamos o comando Serial.write("Oi!\n") paraenviarasequênciadecaracteresOi!paraaportaserial,seguidodocaracterenewline(\n),quecorrespondeaumENTER.

Coloquei uma pausa de um segundo usando o comandodelay,paraquetudonãofiquemuitorápido.

ApóscompilareenviaraoArduino,abraoMonitorSerial.Vocêveráapalavra"Oi!"serrecebidaacadaumsegundo:

Programação

Oquefoifeito

Resultadoesperado

142 15.1EXPERIÊNCIANº15-ENVIARDADOSDOARDUINOPARAOCOMPUTADORPELACOMUNICAÇÃOSERIAL

Figura15.2:MonitorSerialcomamensagemrecebida

Podemos tanto receber quanto enviar dados do Arduino pelaportaserial(vimosissonaexperiênciaanterior),oqueseráofluxodedadospartindodoArduinoparaocomputador,nestecaso.Masvocê pode usar isso para enviar dados serialmente para qualquerequipamentoquepossuasuporteaessetipodecomunicação.

15.2 EXPERIÊNCIA Nº 16 - RECEBER DADOSDOCOMPUTADORPELACONEXÃOSERIALECONTROLARUMLED

15.2EXPERIÊNCIANº16-RECEBERDADOSDOCOMPUTADORPELACONEXÃOSERIALECONTROLARUMLED 143

Com essa experiência, vamos enviar um caractere para oArduinoe,seessecaracterefora(aletraaminúscula),oLEDdopino13seráaceso;casosejaocaractereb(aletrabminúscula),oLED do pino 13 será apagado.Qualquer outro caractere não teráqualqueraçãosobreoLEDdopino13.

1xArduinoUNO

Não há necessidade de montagens, apenas conecte o seuArduinoaoseucomputadorusandoocaboeaportaUSB.

Figura15.3:Esquemademontagemdaexperiêncianº16

intrecebido=0;intled=13;

voidsetup(){Serial.begin(9600);pinMode(led,OUTPUT);}

voidloop(){

Oqueénecessário

Esquemademontagem

Programação

144 15.2EXPERIÊNCIANº16-RECEBERDADOSDOCOMPUTADORPELACONEXÃOSERIALECONTROLARUMLED

if(Serial.available()>0){recebido=Serial.read();if(recebido=='a'){digitalWrite(led,HIGH);}if(recebido=='b'){digitalWrite(led,LOW);}}}

Primeiro, declaramos uma variável global do tipo inteiro,chamada recebido, que é inicializada com zero. Essa variávelarmazenaráosbytesrecebidospelacomunicaçãoserial.

Com int led = 13, inicializamos com 13 a variável quearmazenará em qual pino está o LED que vamos manipular. Avariável será do tipo inteiro e terá como nome led. Usando ocomandoSerial.begin(9600), iniciamos a comunicação serialcom9.600baudse,emseguida,ajustamosopinodigital13(usandoa variável led ) para saída, usando o comandopinMode(led,OUTPUT).

Com a estrutura de seleçãoif(Serial.available() > 0),verificamossehádadosaseremrecebidospelaportaserial,nocaso,o comando Serial.available(), que retorna a quantidade debytes disponíveis para serem recebidos. Ou seja, se retornarqualquer número maior que zero, é sinal de que há caracteresdisponíveis.

Sehouverdadosaseremlidospelacomunicaçãoserial,usamosrecebido=Serial.read()paralerumcaracteredaportaserialearmazenarnavariávelrecebido.Essavariávelédotipointeiro,poisarmazenaráovalorASCIIdocaractere.

Na sequência, usamos a estrutura de seleção if como

Oquefoifeito

15.2EXPERIÊNCIANº16-RECEBERDADOSDOCOMPUTADORPELACONEXÃOSERIALECONTROLARUMLED 145

if(recebido=='a') para verificar se o caractere recebido foiumaletraaminúscula.Notequesãousadasaspassimplesemvezdeaspasparaindicarumbyte.Aspassãousadasparaindicarcadeiradecaracteres,ouseja,Strings.

Caso a letra a minúscula que tenha sido recebida, usamosdigitalWrite(led,HIGH)paraacenderoLEDdopinodigital13.Comif(recebido=='b'),verificamosseocaractererecebidofoi a letra b minúscula. Caso a letra b tenha sido recebida,usamos digitalWrite(led,LOW) para apagar o LED do pinodigital13.

Após compilar e enviar aoArduino, abra oMonitor Serial doambientedeprogramação.Sevocêenviaraletraa(minúsculo),oLEDconectadoaopino13vaiacendere,casovocêenviealetrab(minúsculo),oLEDconectadoaopino13apagará.

Agora vamos unir a comunicação serial e LEDs, os resultadosserãofantásticos,vejanaexperiênciaseguinte.

A montagem para essa experiência é basicamente igual àexperiência de número 4, porém na programação poderemosescolheroLEDquequeremosacenderusandodadosenviadospelaportaserial.

Vamos escolherumcaractere, que seráumnúmero,para cadaLED.Quandorecebido,vaiacendê-locasoestejaapagado,eapagá-locasoestejaaceso.

Resultadoesperado

15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL

146 15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL

1xArduinoUNO

3xLED

3xResistoresde220Ω

Oprimeiropasso,comosempre,écolocarosLEDsnaplacadeensaios.Oriente-sepelafiguraaseguir.

Usandoumcabinho,ligueoterminalnegativodoprimeiroLEDao um dos pinos GND disponíveis no Arduino. Repita omesmoparaosdoisoutrosLEDs.Lembre-sedequeoterminalnegativoéomaislongoemumLED.

AgoraligueoterminalpositivodoprimeiroLEDaumresistorde pelo menos 220Ω e, em seguida, usando um cabinho, ligue ooutroterminaldoresistoraopinodigital4doArduino.

VamosrepetiramesmacoisaparaosdemaisLEDs,então,ligueo terminal positivodo segundoLEDaum resistordepelomenos220Ω.Depoisligueooutroterminaldoresistoraopinodigital3doArduino,usandoumcabinho.

Finalmente, ligue o terminal positivo do terceiro LED a umresistor de pelo menos 220Ω, e depois ligue o outro terminal doresistor,usandoumcabinho,aopinodigital2doArduino.

Oqueénecessário

Esquemademontagem

15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL 147

Figura15.4:Esquemademontagemdaexperiêncianº17

intrecebido=0;intdois=HIGH;inttres=HIGH;intquatro=HIGH;

voidsetup(){Serial.begin(9600);pinMode(2,OUTPUT);pinMode(3,OUTPUT);pinMode(4,OUTPUT);digitalWrite(2,dois);digitalWrite(3,tres);digitalWrite(4,quatro);}

voidloop(){if(Serial.available()>0){recebido=Serial.read();if(recebido=='2'){if(dois==HIGH)dois=LOW;elsedois=HIGH;digitalWrite(2,dois);}if(recebido=='3'){if(tres==HIGH)tres=LOW;

Programação

148 15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL

elsetres=HIGH;digitalWrite(3,tres);}if(recebido=='4'){if(quatro==HIGH)quatro=LOW;elsequatro=HIGH;digitalWrite(4,quatro);}}}

Como já fizemos nas experiências anteriores, começamos afunçãosetup() declarando uma variável chamada recebidopara receber o byte que virápela comunicação serial. Eladeve serinicializadacomzero.

Continuando, declaramos três variáveis do tipo inteiro, umaparacadaLED,queserãoinicializadascomovalorinicialHIGH,ouseja,osLEDscomeçarãoacesos.Maisadiante,elasterãoseusvaloresalternadosentreLOWeHIGHnovamente,permitindoacenderouapagar o LED. As variáveis terão como nome dois, tres equatro para lembrar-nosdospinosdigitais ondeosLEDs estãoconectados.

Como receberemosdadospela comunicação serial, precisamosinicializá-la,oque fazemoscomSerial.begin(9600).Tambémprecisamosajustarospinosdigitais2,3e4parasaída.Fazemosissocom pinMode(2,OUTPUT) , pinMode(3,OUTPUT) epinMode(4,OUTPUT).Aindana funçãosetup(), acendemosostrês LEDs enviando o conteúdo das variáveis dois, tres equatroquesãoHIGHparaeles.

Precisamossabersehádadosdacomunicaçãoserialparaseremlidos. Fazemos isso usando a estrutura de seleção if(Serial.available() > 0) e conjunto com o comandoSerial.available(),queretornaonúmerodebytesdisponíveis

Oquefoifeito

15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL 149

paraseremrecebidos.Ouseja,seretornarqualquernúmeromaiorquezero,ésinaldequehácaracteresdisponíveis.

Com recebido = Serial.read(), lemos um caractere daporta serial e armazenamos seu valor na variável recebida. Essavariável é do tipo inteiro, pois vai armazenar o valor ASCII docaractere.

Apartirdesseponto,começamosaverificarqualLEDdeveseraceso,casoestejaapagado;ouapagado,casoestejaaceso.OnúmeroaserrecebidoéigualaopinodigitalemqueoLEDestáconectado,assimficamaisfácildememorizar.

Por exemplo, caso o caractere recebido seja o número 2,verificadocomif(recebido=='2'), eo conteúdodavariáveldois sejaHIGH (LED aceso), então ele deve ser apagado; casocontrário, eledeve ser aceso. Issoacontecenaestruturade seleçãoif(dois==HIGH)dois=LOW;elsedois=HIGH.

NotequeovalorHIGHeLOW é atribuído à variáveldois,correspondente ao LED. Para efetivamente acender ou apagar,precisamos enviar esse valor ao pino digital; fazemos isso usandodigitalWrite(2,dois) . Na sequência, realizamos as mesmasoperaçõescomosLEDsqueestãonospinosdigitais3e4.

Após compilar e enviar aoArduino, abra oMonitor Serial doambiente de programação. Se você enviar o número 2 e o LEDconectadoaopino2estiveraceso,elevaiapagar;casocontrário,elevaiacender.Sevocêenviaronúmero3eoLEDconectadoaopino3estiver aceso, ele apagará; caso contrário, ele acenderá. E se vocêenviaronúmero4eoLEDconectadoaopino4estiveraceso,elevaiapagar;casocontrário,eleacenderá.

Resultadoesperado

150 15.3EXPERIÊNCIANº17-CONTROLAR3LEDSPELASERIAL

Faça a experiência de acender o LED do pino 13 usando umbotão emdoisArduinos.Depois,modifique a experiência,usandoas funções de comunicação serial, e faça com que o botão de umArduinocontroleoLEDdooutro,evice-versa.

Juntar todas as experiências mostradas neste capítulo com asanteriorestraráàluzváriaspossibilidadesdeprojetos,aindamaiseunidas às que serão apresentadas a seguir, que são as experiênciasque usam as bibliotecas adicionais para a linguagem C paraArduino.

15.4EXERCITE

15.5ASEGUIR...

15.4EXERCITE 151

CAPÍTULO16

AsbibliotecasestendemoconjuntodecomandosdalinguagemC para Arduino, de forma que novas funcionalidades sejampossíveis, e outras, que antes requeriam grande esforço deprogramação,sejamaindamaisfáceis.

AsqueestãoincluídasnoIDEArduinosão:

Possui funções para ler e gravar dados em armazenamentopermanente. Essa biblioteca em especial é especialmente útil,portanto,vamostestá-lanaexperiêncianº18,maisàfrente.

PossuifunçõesparacontrolarServoMotores.Controlarservosémuitodivertidoepodeabrira imaginaçãoparaacriaçãoderobôsdiversos.Logo,vamosexperimentá-latambémnaexperiêncianº19,maisadiante.

Possuifunçõesquepermitemcomunicar-seserialmenteusandopinosquenãosejamospinospadrãodecomunicaçãoserial,comopor exemplo, no Arduino UNO os pinos 0 e 1. É mais fácil deentendertestando,oqueseráfeitonaexperiêncianº20.

BIBLIOTECASADICIONAIS

EEPROM

Servo

SoftwareSerial

152 16BIBLIOTECASADICIONAIS

Possui funções para conectar o Arduino à rede Ethernet eInternetusandoumShieldEthernet.

Possui funções para comunicar-se com aplicações em umcomputadorusandooprotocoloserialpadrão.

Possui funçõesparaconectar-seàredeGSM/GPRSusandoumShieldGSM.

PossuifunçõesparacontrolardisplaysdeLCD.

PossuifunçõesparaleregravaremcartõesdotipoSD.

PossuifunçõesparacomunicaçãoentreequipamentosusandoaSerialPeripheralInterface.

Possuifunçõesquepermitemcontrolarmotoresdepasso.

Possui funções quer permitem desenhar, imprimir imagens efiguras em telas TFT (Thin Film Transistor, ou Transistor de

Ethernet

Firmata

GSM

LiquidCrystal

SD

SPI

Stepper

16.1TFT

16.1TFT 153

PelículaFina).

Possui funções para conectar o Arduino à rede Ethernet eInternetusandoumShieldWiFi.Dependedeshieldexterno.

PossuifunçõesparaousodasduasinterfacesWire:TWIeI2C.

Como já vimos, o microcontrolador no Arduino possui umamemória Electrically-Erasable Programmable Read-Only Memory(EEPROM),ouemportuguês,memóriaprogramávelsomenteparaleituraapagáveleletricamente.

Essa é uma memória que armazena dados mesmo semalimentação elétrica. Esses dados podem ser gravados e apagados,mas essas operações podem ser feitas por um número de vezeslimitado,algoentre100mile1milhãodevezes.

OsmicrocontroladoresATmega328possuemEEPROMde1024bytes,jáoATmega168eoAtmega8possuem512bytes.

Essa memória é importante quando necessitamos armazenar,por exemplo, configurações do equipamento, que devem sermantidasmesmodepoisqueelefordesligado,paraquenopróximouso as configurações não tenham que ser refeitas. A gravação naEEPROMéfeitautilizando-seabibliotecaEEPROM.h, e enviandobyteabyteparaamemória.

Nessaexperiência,criaremosumcontadorqueserágravadona

WiFi

Wire

16.2 EXPERIÊNCIA Nº 18 - COMO USAR AMEMÓRIAEEPROM

154 16.2EXPERIÊNCIANº18-COMOUSARAMEMÓRIAEEPROM

EEPROMquecontinuaráacontardomesmonúmero,mesmoseoArduinofordesligadoereligado.

Primeiro,verificamosseosdadosqueestãonaEEPROMsãoosque esperamos que fossem: na primeira posição da memória(posição zero), é um sinalizador que inventamos e, na segundaposição (posição um), é o valor do nosso contador, que seráincrementadoemumacadasegundo.

Você deve reparar que acessar a memória EEPROM é muitosimples, basta referenciar-se a ela como se fosse um vetor dotamanho da quantidade de bytes disponíveis nela, no caso doArduinoUNOR3,dezeroaté1023(1KiB).Acomunicaçãoserialentre o computador e o Arduino será usada como interface paraconferirmosoqueestáacontecendo.

1xArduino

Nãohánecessidadedequalquer componente excetoopróprioArduino.

Figura16.1:Esquemademontagemdaexperiêncianº18

Oqueénecessário

Esquemademontagem

16.2EXPERIÊNCIANº18-COMOUSARAMEMÓRIAEEPROM 155

#include<EEPROM.h>

intcontador=0;

voidsetup(){Serial.begin(9600);if(EEPROM[0]!=9){EEPROM[0]=9;EEPROM[10]=0;}else{contador=EEPROM[10];}}

voidloop(){Serial.println(contador);contador++;EEPROM[10]=contador;delay(1000);}

Primeiro,importamosabibliotecaEEPROMqueimplementaoscomandos e interfaces para facilitar o uso da memória usando#include<EEPROM.h>.Emseguida,usamosintcontador=0paradeclarareinicializaravariávelcontador,quearmazenaráovalor e será incrementado. Já na função setup() , usamosSerial.begin(9600) para iniciar a comunicação serial entre ocomputadoreoArduino.

ComooacessoàmemóriaEEPROMfuncionacomoseelafosseum vetor predefinido com o nome EEPROM (em maiúsculas),usamosif(EEPROM[0] != 9) para verificar se há o valor 9 naprimeiraposiçãodamemória(0).Casonãohaja o valor 9nessaposição, quer dizer que nosso contador está sendo usado pelaprimeiravezedeveserinicializado.

ComEEPROM[0]=9,colocamosovalor9naprimeiraposição

Programação

Oquefoifeito

156 16.2EXPERIÊNCIANº18-COMOUSARAMEMÓRIAEEPROM

da EEPROM, indicando que ele já foi inicializado uma vez. ComEEPROM[1]=0 na segundaposiçãodamemória, vaio valordocontador iniciado com zero. Bom, se o contador já tiver sidoiniciado alguma vez, o código depois do else é que seráexecutado.

Usamos contador = EEPROM[1] para ler o conteúdo dasegunda posição da memória para a variável contador, eSerial.println(contador)paramostraroconteúdodavariávelcontadornoMonitorSerial.Comcontador++,incrementamosemumocontadore,comEEPROM[1]=contador,armazenamosna memória o valor da variável contador . Finalmente, umdelay(1000)parapausarporumsegundo.

DepoisdecompilareenviaroprogramaparaoArduino,abraoMonitorSerialevocêveráocontadorserincrementadoumacadasegundo. Se você resetar o Arduino, ou desligá-lo e ligá-lonovamente, o contador continuará do número imediatamenteseguinteaoqueestavaquandofoiresetadooudesligado.

Noteque:

1. Se você não abrir o Monitor Serial, o contador funcionarámesmo assim. Portanto, você não verá os números sendoincrementados;

2. Essa experiência funcionará apenas no Arduino real, nosimulador ainda não há implementação das memóriasinternasdomicrocontrolador.

Resultadoesperado

16.3 EXPERIÊNCIA Nº 19 - ACIONANDO UMSERVOMOTOR

16.3EXPERIÊNCIANº19-ACIONANDOUMSERVOMOTOR 157

Umservomotoréummotorcapazde reagir commovimentoproporcional a um pulso aplicado a ele. O tamanho do pulsodeterminaaposiçãodoeixo.

Ao contrário dos motores comuns, ele tem liberdade,normalmente,deapenas180grausepossuigrandeprecisãoquantoàposição.Porém,saibaqueexistemservosmotoresquepodemtergirode260graus.

Sãocompostosde3partesbásicas:

1. Sistema atuador, sendo o motor propriamente dito.Normalmente acionado por corrente contínua. O torque,velocidade,material das engrenagens e caixa de redução sãodeterminantesdascaracterísticasdeumservomotor.

2. Sensor,queéumpotenciômetro ligadoaoeixodomotor.Ovalor da resistência elétrica do sensor (potenciômetro)determinaaposiçãodoeixodomotor.Aqualidadedosensorinfluinaprecisão,durabilidadeeestabilidadedoservomotor.

3. Circuitodecontrolerecebeocomandoedeterminaaposiçãodoeixodomotoremrelaçãoàresistênciaelétricadosensor.Ocomandonormalmenteéumpulsocujotamanhodeterminaaposição.

158 16.3EXPERIÊNCIANº19-ACIONANDOUMSERVOMOTOR

Figura16.2:Umminiservomotor

1xArduino

1xMiniservomotorde5V

Usando um cabinho ou fazendo a ligação diretamente com ocabodisponívelnomotor,ligueofiodealimentação+5Vdoservomotor (geralmente vermelho) no 5V do Arduino. Em seguida,tambémusandoumcabinhooufazendoaligaçãodiretamentecomocabodisponívelnomotor, ligueofioterraGNDdoservomotor(geralmentemarromoupreto)aoGNDdoArduino.

Finalmente,usandoomesmoesquemadosdoisfiosanteriores,ligueofiodepulso(geralmentebrancoouamarelo/laranja)aopinodigital2doArduino.

Oqueénecessário

Esquemademontagem

16.3EXPERIÊNCIANº19-ACIONANDOUMSERVOMOTOR 159

Figura16.3:Esquemademontagemdaexperiêncianº19

#include<Servo.h>

Servomm;

voidsetup(){mm.attach(2);pinMode(13,OUTPUT);}

voidloop(){mm.write(1);digitalWrite(13,HIGH);delay(2000);mm.write(180);digitalWrite(13,LOW);delay(2000);}

Ousodebibliotecasecriaçãodeobjetosésemelhanteaousodacomunicação serial,mas, obviamente, dessa vez será para acionarumservomotor.

Com #include<Servo.h> , adicionamos ao programa abiblioteca Servo.h , que possui os comandos específicos paracontrolar servo motores, como geração do pulso no tamanhocorretoparagirá-loquantosgraus foremnecessáriosoudesejados.ComocomandoServomm,declaramosoobjetommcomosendo

Programação

Oquefoifeito

160 16.3EXPERIÊNCIANº19-ACIONANDOUMSERVOMOTOR

umservomotor.

Nafunçãosetup() coma linhamm.attach(2), indicamosque o fio de sinal do servo estará conectado ao pino digital 2 doArduino.Declareiopinodigital13comosaídaparausarmosoLEDdesse pino paradebug. Ou seja, verificar se a experiência está emfuncionamento.

Nafunçãoloop(),ocomandomm.write(1)indicaaoservomotorparaqueeleseposicioneem1grau.Emseguida,acendemosoLEDdopinodigital13comdigitalWrite(13,HIGH).

Aguardamos dois segundos e, em seguida, com o comando mm.write(180) , indicamos ao servo motor para que ele seposicioneem180graus.Depois,apagamosoLEDdopinodigital13maisdoissegundosdeesperaparapodermosperceberomovimentodomotor.

Depois de compilar e enviar o programa ao Arduino, o servomotordevecomeçarasemovimentarcolocandoprimeirooeixonaposição de 1°, aguardar dois segundos e reposicioná-lo em 180°,aguardar mais dois segundos e repetir toda a ação. Antes deposicionar o motor em 1°, o LED do pino 13 deverá acender, edepoisdereposicioná-loem180°,oLEDdopino13deveapagar.

Emváriosprojetos,sãonecessáriosdoisoumaisArduinos,sejapela falta de pinos disponíveis, necessidade de maiorprocessamento,gerenciamentodevários sensoresouváriosoutrosmotivos.ÉpossívelinterligarváriosArduinosdeváriasformas,por

Resultadoesperado

16.4 EXPERIÊNCIA Nº 20 - REALIZANDOCOMUNICAÇÃOSERIALENTREARDUINOS

16.4EXPERIÊNCIANº20-REALIZANDOCOMUNICAÇÃOSERIALENTREARDUINOS161

exemplo,ligaçãoserialcomfio, ligaçãoserialsemfio,eatémesmoatravésdesinalcomumemumpino(HIGHouLOW).Vamosusarcomunicaçãoserialcomfioparaessaexperiência.

Ocaboserial (3 fios)entreosArduinospode terentre15e30metros,dependendodataxadetransmissãodedadosqueforusada.Astaxassuportadassão(bit/s):300,1200,2400,4800,9600,19200,38400,57600e115200.

2xArduino

Usandoumcabinho, ligueopinodigital10deumArduinoaopinodigital11dooutroArduino.Comumsegundocabinho,ligueo pino digital 11 de um Arduino ao pino digital 10 do outroArduino.Comum terceirocabinho, ligueoGNDdeumArduinoaoGNDdooutroArduino.

Se preferir, em vez de três fios separados, você pode usar umcabodetrêsvias.

Oqueénecessário

Esquemademontagem

162 16.4EXPERIÊNCIANº20-REALIZANDOCOMUNICAÇÃOSERIALENTREARDUINOS

Figura16.4:Esquemademontagemdaexperiêncianº20

#include<SoftwareSerial.h>

SoftwareSerialoutro_arduino(10,11);//RXTXintrecebido=0;

voidsetup(){Serial.begin(9600);outro_arduino.begin(4800);}

voidloop(){if(Serial.available()>0){outro_arduino.write(Serial.read());}if(outro_arduino.available()>0){Serial.write(outro_arduino.read());}}

Programação

16.4EXPERIÊNCIANº20-REALIZANDOCOMUNICAÇÃOSERIALENTREARDUINOS163

A primeira coisa feita foi importar a biblioteca SoftwareSerialusando #include <SoftwareSerial.h>, que é uma bibliotecapadrãodoambienteArduinoquepossibilitacriarumaportaserialemdoispinosdigitaisquaisquer.

Com a biblioteca importada, é preciso criar um objetoindicandoquaisospinosqueserãoutilizadospararecebereenviardados. Fazemos isso com SoftwareSerial

outro_arduino(10,11).Opinodigitalderecepção(RX)seráo10,eopinodigitalparatransmissão(TX)seráo11.EssespinosserãousadosparaacomunicaçãoentreosArduino.

Nafunçãosetup(),avariávelrecebido receberáoqueforrecebidopelacomunicaçãoserial,eSerial.begin(9600)iniciaráa comunicação serial entre o Arduino e o computador. Jáoutro_arduino.begin(4800)iniciaráacomunicaçãoserialentreosArduinospelaportaserialcriadanospinosdigitais10e11.

Comoa ideia é enviar caracteresdeumArduinoparaooutrousandooMonitorSerial,primeiroverificamosseháalgumacoisaaser lida vindo do computador. Caso haja, enviamos o que forrecebido para a comunicação entre os Arduinos. Fazemos issousando if(Serial.available() > 0) , para ver se há dadosrecebidos pela comunicação serial entre o Arduino e o PC, eoutro_arduino.write(Serial.read()), para enviar o que foilidoparaooutroArduino.

Agora verificamos se há caracteres a serem lidos dacomunicaçãoentreosArduino.Casohaja,enviamosoqueforlidopara o computador usando a conexão serial correspondente.Usamosif(outro_arduino.available() > 0) para ver se hádados recebidos pela comunicação entre os Arduinos pela portaserial criada nos pinos digitais 10 e 11, e

Oquefoifeito

164 16.4EXPERIÊNCIANº20-REALIZANDOCOMUNICAÇÃOSERIALENTREARDUINOS

Serial.write(outro_arduino.read()) para enviar o que foilidoparaacomunicaçãoserialentreoArduinoeocomputador.

CompilaecarregueomesmoprogramaemambososArduinos.No caso do uso do simulador, você deve selecionar umArduino,enviar, e depois selecionar o outro Arduino e enviar. Você deveabrirumMonitorSerialparacadaumdelese, aoenviardadosdeMonitor Serial, eles serão mostrados no Monitor Serial do outroArduino,comosefosseumbate-papo,porexemplo.

Unaaexperiênciaemqueusamosumpotenciômetrocomaquecontrolamosumservomotor,efaçacomqueopotenciômetropassea controlar a posição do servo motor. Quando você mover opotenciômetroparaumlado,omotordevemover-separaomesmolado.

Para terminar, a seguir você verá como fazer para acionarmotoresDC(correntecontínua)usandooArduino.Quandoessesmotores são unidos com tudo o que vimos anteriormente, osprojetosganhamvida!

Resultadoesperado

16.5EXERCITE

16.6ASEGUIR...

16.5EXERCITE 165

CAPÍTULO17

OspinosdigitaiseanalógicosdoArduinopodemserutilizadospara acionar uma grande variedade de equipamentos. Entretanto,elesnãopossuempotênciaparaalimentarmotores,porexemplo,jáqueomáximodecorrente fornecidaoudrenadaporessespinoséde40mA.

Aseguir,vejaduasexperiênciasdecomolidarcomessetipodeproblema.

Oprimeiropasso,ouoúltimo,dependendodopontovista,paramontar um robô com rodas é saber controlar os motores paramovimentá-lo. Com o Arduino, isso é relativamente simples enecessitadepoucaspeçasecomponenteseletrônicosbaratos.

Porém, é preciso entender que oArduinonãopossui correntenempotênciasuficienteemseuspinosparacontrolarummotorDC(corrente contínua).Por isso,nempense em ligarqualquermotordiretamenteaoseuArduino,poisissopode“matá-lo”.Pararesolverisso, você pode usar um relê para isolar o circuito do motor docircuitodoArduino.

ACIONANDOMOTORESDC

17.1 EXPERIÊNCIA Nº 21 - ACIONANDO UMMOTORDCUSANDORELÊ

166 17ACIONANDOMOTORESDC

1xArduino

1xRelê5Vnabobinaepelomenos9Vnoscontatos

1xMotorDC9V

Usandocabinhos,ligueumterminaldabobinadorelênoGNDdoArduino.Emseguida, ligueooutro terminaldabobinadorelênopinodigital7doArduino,eligueonegativodabateriaaopinodachavedorelê.

Agora, ligue um terminal do motor (a polaridade apenasinfluencianadireçãoderotaçãodomotor)nooutropinodachavedorelêe, finalmente, ligueopositivodabateriaaooutro terminaldomotor.

Oqueénecessário

Esquemademontagem

17.1EXPERIÊNCIANº21-ACIONANDOUMMOTORDCUSANDORELÊ 167

Figura17.1:Esquemademontagemdaexperiêncianº21

intrele=7;

voidsetup(){pinMode(rele,OUTPUT);}

voidloop(){digitalWrite(rele,HIGH);delay(1000);digitalWrite(rele,LOW);delay(1000);}

Primeiro, com int rele = 7, definimos como valor 7 avariávelinteirarele,poiselaseráutilizadaparaindicarquemqual

Programação

Oquefoifeito

168 17.1EXPERIÊNCIANº21-ACIONANDOUMMOTORDCUSANDORELÊ

pino digital está ligado o rele.Na funçãosetup(), definimos opino digital 7 (variável rele ) como saída usandopinMode(rele,OUTPUT).

Já na função loop() , acionamos o rele( digitalWrite(rele,HIGH) ), aguardamos um segundo(delay(1000)) em que o motor ficará em movimento e, emseguida, desligamos o rele (digitalWrite(rele,LOW)), fazendocom que o motor pare, também aguardando um segundo(delay(1000))emqueomotorficaráparado.

Depois de compilar e enviar o programa para o Arduino, omotor deverá ficar um segundo ligado (girando) e um segundodesligado(parado).

Essaéumasegundaversãoparaaexperiênciaanteriorque,emvezdeusarumrelê,usaumtransistorparaatarefadechaveamentoparaomotor.

1xArduino

1xTransistorTIP120

1xMotorDC9V

Usando cabinhos, ligue o terminal base do transistor ao pino

Resultadoesperado

17.2 EXPERIÊNCIA Nº 22 - ACIONANDO UMMOTORDCUSANDOTRANSISTOR

Oqueénecessário

Esquemademontagem

17.2EXPERIÊNCIANº22-ACIONANDOUMMOTORDCUSANDOTRANSISTOR169

digital 7, depois ligue o terminal emissor do transistor a umterminal do motor, e ligue o terminal coletor do transistor aopositivodabateria.

Agora,ligueooutroterminaldomotoraonegativodabateriae,finalmente,ligueonegativodabateriaaoGNDdoArduino.

Figura17.2:Esquemademontagemdaexperiêncianº22

inttransistor=7;

voidsetup(){pinMode(transistor,OUTPUT);}

voidloop(){digitalWrite(transistor,HIGH);delay(1000);digitalWrite(transistor,LOW);

Programação

170 17.2EXPERIÊNCIANº22-ACIONANDOUMMOTORDCUSANDOTRANSISTOR

delay(1000);}

Primeiro,cominttransistor=7,definimoscomovalor7avariávelinteiratransistor,poiselaseráusadaparaindicarqualpinodigitalestáligadootransistor.

Na função setup() , definimos o pino digital 7 (variável transistor ) como saída usandopinMode(transistor,OUTPUT).Jánafunçãoloop(),acionamosotransistor(digitalWrite(transistor,HIGH)),aguardamosumsegundo(delay(1000))emqueomotorficaráemmovimentoe,depois, desligamos o transistor(digitalWrite(transistor,LOW)), fazendo com que o motorpare,tambémaguardandoumsegundo(delay(1000))emqueomotorficaráparado.

Basicamente,oquemudaentreessaexperiênciaeaqueacionaumLEDéaeletrônica, sóque,emvezdeumLEDacender, éummotorquegira.

Depois de compilar e enviar o programa para o Arduino, omotor deverá ficar um segundo ligado (girando) e um segundodesligado(parado).

JunteaexperiênciadecontroledeummotorDC,tantoporrelêquantoportransistor,comaexperiênciadecontrolarLEDseadobotão.FaçaumprogramaqueiniciecomumLEDvermelhoacesoe,quando o botão for pressionado, omotor comece a girar, o LED

Oquefoifeito

Resultadoesperado

17.3EXERCITE

17.3EXERCITE 171

vermelho apague e um LED verde acenda. Quando o botão forsolto,omotordeveparardegirar,oLEDverdedeveapagareoLEDvermelhodeveacender.

Com tudo o que foi apresentado, você poderá estudar ecompreender o funcionamento do Arduino e sua lógica paraprogramação.Conscientedosmecanismosbásicos,vocêpodeagoradesenvolver os mais variados projetos, seja os sugeridos nasexperiênciasouqualqueroutro.

É importante praticar e manter-se praticando o tempo todo,pois isso trará desafios que lhe impulsionarão para encontrarsoluçõese,conformecresceracomplexidadedessesdesafios,novoshorizontesserãomostrados.

O simulador é uma grande ferramenta que pode garantir umcomeçomaissuave,semreceiosdedanificarqualquercomponente.Mas depois de ganhar confiança, procure usar o Arduino e osdemaiscomponentesreais.Tê-losnasmãoslhedarásensodepesoetamanho.

Não tema em errar, aprenda com seus erros. O Arduino é oequipamentomais carode todosda lista demateriais queusamosdurante o livro e, ainda assim, não passa de algumas dezenas dereais.OsdemaiscostumamcustarcentavosesempremenosdeR$10,00.

Desafie-se!

Para terminar, a seguir você terá uma lista de materiaisutilizados em todas as experiências apresentadasno livro, comelavocê pode programar-se para adquirir todos os componentes eexperimentá-losconformesuaimaginação.

17.4CONCLUINDO

172 17.4CONCLUINDO

17.4CONCLUINDO 173

CAPÍTULO18

Para a realização de todas as experiênciasmostrada durante olivro, você pode optar por usar o simulador de Arduinodisponibilizado pela Autodesk. Mas caso deseje realizar todosusandoos equipamentos e componentes físicos, a seguir estáumalistade tudodoquevocêprecisará, asdevidasquantidades eumapequenadescriçãodautilizaçãodocomponente.

1. ArduinoUNOR3-Originalouclone-2unidades.

2. Prot-o-board-Placadeensaios-1unidade.

3. LED-Tipodediodoqueiluminaquandoaeletricidadepassaporele.Temapenasumacor-3unidades.

4. Resistor 220Ω - Resiste ao fluxo de energia elétrica em umcircuito,resultandonaalteraçãodavoltagemeacorrente-3unidades.

5. Resistor 10KΩ -Resiste ao fluxode energia elétrica emumcircuito,resultandonaalteraçãodavoltagemeacorrente-1unidade.

6. Resistor 1KΩ - Resiste ao fluxo de energia elétrica em umcircuito,resultandonaalteraçãodavoltagemeacorrente-1unidade.

APÊNDICEA-LISTADEMATERIAIS

174 18APÊNDICEA-LISTADEMATERIAIS

7. LEDRGB-Tipodediodoqueiluminaquandoaeletricidadepassaporele.Conseguegerarqualquercor-1unidade.

8. Botão - Chave momentânea que permite a passagem deeletricidadequandomantidopressionado-1unidade.

9. Potenciômetro - Resistor variável.Quando os pinos lateraisdopotenciômetrosãoconectadosàvoltagemeàterra,opinocentral vai fornecer a diferença em voltagem com relação àrotaçãodocursor-1unidade.

10. Mini ServoMotor -Motor capaz de controlar a posição doeixoderotaçãobaseando-senocomprimentodeumsinal-1unidade.

11. Displayde7-segmentos - Éuma formadedisplay capazdemostrarnúmerosdecimaiscompostopor7LEDs(segmentos)e,emalgunscasos,maisoponto(DP)-1unidade.

12. Buzzer-Dispositivodesinalaudívelquepodesermecânico,eletromecânicooupiezelétrico-1unidade.

13. Speaker-Dispositivodesinalaudívelquepodesermecânico,eletromecânicooupiezelétrico-1unidade.

14. Relê5V-Chavemecânicaoperadaeletricamente-1unidade.

15. MotorDC9V-Tipodemotorelétricomovidoporcorrentecontínua-1unidade.

16. Suporteparabateria9V-Suporteparaacoplarabateriade9volts-1unidade.

17. Bateria9V-Acumuladorelétrico-1unidade.

18. TransistorTIP120-Equipamentoeletrônicocapaz,masnãosomente,deteromesmofuncionamentodeumrelê,massem

18APÊNDICEA-LISTADEMATERIAIS 175

ocomponentemecânico-1unidade.

19. LDR10KΩ - O diodo dependente de luz (Light DependentResistor)éumcomponentederesistênciavariávelquefornecea diferença em voltagem com relação à quantidade de luzincidentesobreele-1unidade.

176 18APÊNDICEA-LISTADEMATERIAIS

CAPÍTULO19

Projete e construa um conjunto de semáforos em umcruzamento.Vocêterádecontrolardoissemáforosdeveículoscom3luzes(vermelho,amareloeverde),emaisdoisdepedestrescom2luzes(vermelhoeverde).

Façatudosincronizado,inclusivedandotemposuficienteparaopedestre atravessar enquanto dos dois semáforos de veículospermanecemvermelho.

APÊNDICEB-EXERCÍCIOSRESOLVIDOS

19.1EXERCÍCIODOCAPÍTULO8.ESTRUTURAPRINCIPALDALINGUAGEM

Sugestãodemontagem

19APÊNDICEB-EXERCÍCIOSRESOLVIDOS 177

Figura19.1:Sugestãodemontagemdoexercíciodocapítulo08

//Definindoospinosintvei1_red=2;intvei1_yel=3;intvei1_gre=4;intped1_red=5;intped1_gre=6;intvei2_red=7;intvei2_yel=8;intvei2_gre=9;intped2_red=10;intped2_gre=11;

voidsetup(){//AjustandoomododospinospinMode(vei1_red,OUTPUT);pinMode(vei1_yel,OUTPUT);pinMode(vei1_gre,OUTPUT);pinMode(ped1_red,OUTPUT);pinMode(ped1_gre,OUTPUT);pinMode(vei2_red,OUTPUT);pinMode(vei2_yel,OUTPUT);pinMode(vei2_gre,OUTPUT);pinMode(ped2_red,OUTPUT);pinMode(ped2_gre,OUTPUT);

Sugestãodeprogramação

178 19.1EXERCÍCIODOCAPÍTULO8.ESTRUTURAPRINCIPALDALINGUAGEM

}

voidloop(){//AcendendoeapagandoluzesdigitalWrite(ped1_gre,HIGH);digitalWrite(ped1_red,LOW);digitalWrite(ped2_red,HIGH);digitalWrite(vei1_red,HIGH);digitalWrite(vei2_gre,HIGH);delay(3000);digitalWrite(vei2_gre,LOW);digitalWrite(vei2_yel,HIGH);delay(3000);digitalWrite(vei2_yel,LOW);digitalWrite(vei2_red,HIGH);digitalWrite(ped1_gre,HIGH);digitalWrite(ped2_gre,HIGH);digitalWrite(ped2_red,LOW);delay(3000);digitalWrite(vei1_red,LOW);digitalWrite(vei1_gre,HIGH);digitalWrite(ped1_gre,LOW);digitalWrite(ped1_red,HIGH);delay(3000);digitalWrite(vei1_gre,LOW);digitalWrite(vei1_yel,HIGH);delay(3000);digitalWrite(ped1_gre,HIGH);digitalWrite(ped2_gre,LOW);digitalWrite(ped2_red,HIGH);digitalWrite(vei1_yel,LOW);digitalWrite(vei2_red,LOW);}

Faça comque umLEDpisque uma vez a cada segundo e, emseguida, adicione um botão ao projeto. Quando você apertar obotão,oLEDdeveparardepiscar.Apertandonovamente,eledevevoltarapiscar.

19.2 EXERCÍCIO DO CAPÍTULO 9. ASFUNÇÕESPARAPINOSDIGITAIS

Sugestãodemontagem

19.2EXERCÍCIODOCAPÍTULO9.ASFUNÇÕESPARAPINOSDIGITAIS 179

Figura19.2:Sugestãodemontagemdoexercíciodocapítulo09

intled=2;intbotao=3;intpress=0;intstatus=0;

voidsetup(){pinMode(led,OUTPUT);pinMode(botao,INPUT);}voidloop(){press=digitalRead(botao);//whileaoinvésdeifporqueobotão//podeserseguradoapertadowhile((press==HIGH)&&(status==0)){status=1;press=LOW;}while((press==HIGH)&&(status==1)){status=0;press=LOW;}if(status==0){digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);

Sugestãodeprogramação

180 19.2EXERCÍCIODOCAPÍTULO9.ASFUNÇÕESPARAPINOSDIGITAIS

delay(500);}}

Adicione um botão ao circuito da experiência que mostranúmeros de zero a dez no display de 7-segmentos. Quando vocêapertarobotão,acontagemdevezerar.

Lembre-sedequeacontagemdeveirapenasaténoveedepoisvoltaratézeronovamente.

Figura19.3:Sugestãodemontagemdoexercíciodocapítulo10

intbotao=2;intpress=0;intstatus=0;inta=3,b=4,c=5,d=6,e=7,f=8,g=9;

19.3 EXERCÍCIO DO CAPÍTULO 10. TIPOS DEDADOS,VARIÁVEISECONVERSORES

Sugestãodemontagem

Sugestãodeprogramação

19.3EXERCÍCIODOCAPÍTULO10.TIPOSDEDADOS,VARIÁVEISECONVERSORES 181

intnum[10][7]={{a,b,c,d,e,f},//0{b,c},//1{a,b,e,d,g},//2{a,b,c,d,g},//3{b,c,f,g},//4{a,c,d,f,g},//5{a,c,d,e,f,g},//6{a,b,c},//7{a,b,c,d,e,f,g},//8{a,b,c,f,g}//9};

voidsetup(){pinMode(a,OUTPUT);pinMode(b,OUTPUT);pinMode(c,OUTPUT);pinMode(d,OUTPUT);pinMode(e,OUTPUT);pinMode(f,OUTPUT);pinMode(g,OUTPUT);}

voidloop(){for(inti=0;i<10;i++){apaga();numero(i);delay(1000);press=digitalRead(botao);if(press==HIGH)break;}}

voidapaga(){digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);}

voidnumero(intn){for(inti=0;i<7;i++)digitalWrite(num[n][i],LOW);}

182 19.3EXERCÍCIODOCAPÍTULO10.TIPOSDEDADOS,VARIÁVEISECONVERSORES

Usandoobuzzereasfunçõescorretas,tentereproduziralgumamúsica simples que seja fácil de reconhecer, como por exemplo,"batatinhaquandonasce" ou "ciranda cirandinha".Deixe amúsicadentro da função setup() para que seja executada apenas umavez.

Figura19.4:Sugestãodemontagemdoexercíciodocapítulo11

intsom=9;intDo=262;intRe=294;intMi=330;intFa=349;intSol=392;intLa=440;

19.4 EXERCÍCIO DO CAPÍTULO 11.OPERADORESEESTRUTURASDESELEÇÃOEREPETIÇÃO

Sugestãodemontagem

Sugestãodeprogramação

19.4EXERCÍCIODOCAPÍTULO11.OPERADORESEESTRUTURASDESELEÇÃOEREPETIÇÃO 183

intSi=494;intDo1=277;intRe1=311;intFa1=370;intSol1=415;intLa1=466;intDo2=523;intRe2=587;intMi2=659;

voidsetup(){pinMode(som,OUTPUT);tone(som,Mi);delay(200);noTone(som);tone(som,Fa);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Fa);delay(200);noTone(som);tone(som,Mi);delay(200);noTone(som);tone(som,La);delay(200);noTone(som);tone(som,La);delay(200);noTone(som);delay(200);tone(som,Re);delay(200);noTone(som);tone(som,Mi);delay(200);noTone(som);tone(som,Fa);delay(200);

184 19.4EXERCÍCIODOCAPÍTULO11.OPERADORESEESTRUTURASDESELEÇÃOEREPETIÇÃO

noTone(som);tone(som,Fa);delay(200);noTone(som);tone(som,Fa);delay(200);noTone(som);tone(som,Mi);delay(200);noTone(som);tone(som,Re);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);delay(200);tone(som,Mi);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Fa);delay(200);noTone(som);tone(som,Mi);delay(200);noTone(som);tone(som,Do2);delay(200);noTone(som);tone(som,Si);delay(200);noTone(som);tone(som,La);delay(200);noTone(som);tone(som,Sol);delay(200);noTone(som);tone(som,Fa);

19.4EXERCÍCIODOCAPÍTULO11.OPERADORESEESTRUTURASDESELEÇÃOEREPETIÇÃO 185

delay(200);noTone(som);tone(som,Mi);delay(200);noTone(som);tone(som,Re);delay(200);noTone(som);tone(som,Do);delay(200);noTone(som);}

voidloop(){}

Façaumalarmeparadetectaraportaabertadageladeira.Fundaos circuitos do LDR e do buzzer, e crie um programa que, aodetectar luz, emita um alarme sonoro. Esse pequeno e simplesequipamentopode ser deixadodentroda geladeira e, caso a portafiqueabertapermitindoquealgumaluzentre,eleemitiráoalarme.

19.5 EXERCÍCIODO CAPÍTULO 12. FUNÇÕESPARAPINOSANALÓGICOS

Sugestãodemontagem

186 19.5EXERCÍCIODOCAPÍTULO12.FUNÇÕESPARAPINOSANALÓGICOS

Figura19.5:Sugestãodemontagemdoexercíciodocapítulo12

intvalor=0;

voidsetup(){Serial.begin(9600);}

voidloop(){valor=analogRead(0);Serial.println(valor);if(valor>=600){//Limiardeluztone(2,1000);//paradispararoalarmedelay(300);noTone(2);delay(300);}}

Junte a experiência deste capítulo como uso de botões, e crie

Sugestãodeprogramação

19.6 EXERCÍCIODO CAPÍTULO 13. FUNÇÕESESPECIAIS

19.6EXERCÍCIODOCAPÍTULO13.FUNÇÕESESPECIAIS 187

umamaneiradeajustarashoras,minutosesegundosusando,pelomenos, três botões: um para incrementar os números, outro paradecrementar, e o terceiro para selecionar a opçãode qual variáveldeseja ajustar. Use o Monitor Serial para mostrar mensagens daopçãoselecionadaeosvaloresajustados.

Figura19.6:Sugestãodemontagemdoexercíciodocapítulo13

intseg=0,min=0,hor=0;intbup=12,bdown=11,bsele=10;intpsele=0,pup=0,pdown=0;intmostra_menu=1,opcao=0,teste=0;

voidsetup(){Serial.begin(9600);pinMode(bup,OUTPUT);pinMode(bdown,OUTPUT);pinMode(bsele,OUTPUT);}

voidloop(){//Primeiromenupsele=digitalRead(bsele);if(psele==HIGH){while(teste==0){if(mostra_menu==1){Serial.println("Pressionebselenovamenteparasel

Sugestãodemontagem

Sugestãodeprogramação

188 19.6EXERCÍCIODOCAPÍTULO13.FUNÇÕESESPECIAIS

ecionar");Serial.println("Pressionebupebdownparanavegar");if(opcao==0)Serial.println("Ajustarahora?");if(opcao==1)Serial.println("Ajustarosminutos?");if(opcao==2)Serial.println("Ajustarossegundos?");mostra_menu=0;}psele=digitalRead(bsele);pup=digitalRead(bup);pdown=digitalRead(bdown);if(psele==HIGH){teste=99;psele=LOW;}if(pup==HIGH){opcao++;mostra_menu=1;pup=LOW;if(opcao>2)opcao=0;}if(pdown==HIGH){opcao--;mostra_menu=1;pdown=LOW;if(opcao<0)opcao=2;}}}//------------//Segundomenumostra_menu=1;while(teste==99){if(mostra_menu==1){if(opcao==0)Serial.println("Ajustandoashorasbseleencerra");if(opcao==1)Serial.println("Ajustandoasminutosbseleencerra");if(opcao==2)Serial.println("Ajustandoassegundosbseleencerra");

19.6EXERCÍCIODOCAPÍTULO13.FUNÇÕESESPECIAIS 189

Serial.println("bupparaincrementarebdownparadecrementar");mostra_menu=0;}psele=digitalRead(bsele);pup=digitalRead(bup);pdown=digitalRead(bdown);if(psele==HIGH){teste=0;psele=LOW;break;}if(pup==HIGH){//whileevitaobotãopressionadopormuitotempowhile(pup==HIGH)pup=digitalRead(bup);if(opcao==0)hor++;if(opcao==1)min++;if(opcao==2)seg++;if(hor>23)hor=0;if(min>59)min=0;if(seg>59)seg=0;pup=LOW;Serial.print(hor);Serial.print(":");Serial.print(min);Serial.print(":");Serial.println(seg);}if(pdown==HIGH){while(pdown==HIGH)pdown=digitalRead(bdown);if(opcao==0)hor--;if(opcao==1)min--;if(opcao==2)seg--;if(hor<0)hor=23;if(min<1)min=59;if(seg<1)seg=59;pdown=LOW;Serial.print(hor);Serial.print(":");Serial.print(min);Serial.print(":");Serial.println(seg);}}//------------staticunsignedlongult_tempo=0;inttempo=millis();if(tempo-ult_tempo>=1000){

190 19.6EXERCÍCIODOCAPÍTULO13.FUNÇÕESESPECIAIS

ult_tempo=tempo;seg++;}if(seg>=60){seg=0;min++;}if(min>=60){min=0;hor++;}if(hor>=24){hor=0;min=0;}Serial.print(hor);Serial.print(":");Serial.print(min);Serial.print(":");Serial.println(seg);}

Crieumprogramaquecalculeosenodetodososângulosentre0e360graus(useumaestruturaderepetição)emostreoresultadonoMonitor Serial. Feche oMonitor Serial e abra o Plotter Serialpara vê-lo mostrar a curva correspondente ao cálculo do seno.Repitaomesmoparaasfunçõesdocossenoedatangenteparaveradiferençanacurva.

19.7 EXERCÍCIODO CAPÍTULO 14. FUNÇÕESMATEMÁTICAS

Sugestãodemontagem

19.7EXERCÍCIODOCAPÍTULO14.FUNÇÕESMATEMÁTICAS 191

Figura19.7:Sugestãodemontagemdoexercíciodocapítulo14

floatpi=3.14159;

voidsetup(){Serial.begin(9600);}

voidloop(){for(inti=0;i<360;i++){//TemqueconverterosgrauspararadianosSerial.println(sin(i*(pi/180)));}}

Sugestãodeprogramação

192 19.7EXERCÍCIODOCAPÍTULO14.FUNÇÕESMATEMÁTICAS

Figura19.8:OresultadonoPlotterSerialdoexercíciodocapítulo14

Faça a experiência de acender o LED do pino 13 usando umbotão emdoisArduinos.Depois,modifique a experiência,usandoas funções de comunicação serial, e faça com que o botão de umArduinocontroleoLEDdooutroevice-versa.

19.8 EXERCÍCIODO CAPÍTULO 15. FUNÇÕESPARACOMUNICAÇÃO

Sugestãodemontagem

19.8EXERCÍCIODOCAPÍTULO15.FUNÇÕESPARACOMUNICAÇÃO 193

Figura19.9:Sugestãodemontagemdoexercíciodocapítulo15

#include<SoftwareSerial.h>

SoftwareSerialoutro_arduino(10,11);//RXTX

intrecebido=0;intled=13;intbotao=2;intpress=0;

voidsetup(){pinMode(led,OUTPUT);pinMode(botao,INPUT);Serial.begin(9600);outro_arduino.begin(4800);}voidloop(){press=digitalRead(botao);if(press==HIGH){

Sugestãodeprogramação

194 19.8EXERCÍCIODOCAPÍTULO15.FUNÇÕESPARACOMUNICAÇÃO

digitalWrite(led,HIGH);outro_arduino.write("1");}else{digitalWrite(led,LOW);outro_arduino.write("0");}if(Serial.available()>0){outro_arduino.write(Serial.read());}if(outro_arduino.available()>0){recebido=outro_arduino.read();Serial.println(recebido);if(recebido==49){digitalWrite(led,HIGH);delay(10);}else{digitalWrite(led,LOW);delay(10);}}}

Unaaexperiênciaemqueusamosumpotenciômetrocomaquecontrolamosumservomotor,efaçacomqueopotenciômetropassea controlar a posição do servo motor. Quando você mover opotenciômetroparaumlado,omotordevemover-separaomesmolado.

19.9 EXERCÍCIO DO CAPÍTULO 16.BIBLIOTECASADICIONAIS

Sugestãodemontagem

19.9EXERCÍCIODOCAPÍTULO16.BIBLIOTECASADICIONAIS 195

Figura19.10:Sugestãodemontagemdoexercíciodocapítulo16

#include<Servo.h>

Servosrv;intpos=0;

voidsetup(){Serial.begin(9600);srv.attach(2);}

voidloop(){//De0a1024dopotenciômetropara//0a180grausdoservomotorpos=map(analogRead(A0),0,1024,0,180);srv.write(pos);}

Sugestãodeprogramação

19.10 EXERCÍCIO DO CAPÍTULO 17.ACIONANDOMOTORESDC

196 19.10EXERCÍCIODOCAPÍTULO17.ACIONANDOMOTORESDC

JunteaexperiênciadecontroledeummotorDC,tantoporrelêquantoportransistor,comaexperiênciadecontrolarLEDseadobotão.FaçaumprogramaqueiniciecomumLEDvermelhoacesoe,quando o botão for pressionado, omotor comece a girar, o LEDvermelho apague e um LED verde acenda. Quando o botão forsolto,omotordeveparardegirar,oLEDverdedeveapagareoLEDvermelhodeveacender.

Figura19.11:Sugestãodemontagemdoexercíciodocapítulo17)

intrele=7;intled_r=2;intled_b=3;intbotao=12;intpress=0;

Sugestãodemontagem

Sugestãodeprogramação

19.10EXERCÍCIODOCAPÍTULO17.ACIONANDOMOTORESDC 197

voidsetup(){pinMode(rele,OUTPUT);pinMode(led_r,OUTPUT);pinMode(led_b,OUTPUT);pinMode(botao,INPUT);}

voidloop(){press=digitalRead(botao);if(press==HIGH){press=LOW;digitalWrite(led_r,LOW);digitalWrite(led_b,HIGH);digitalWrite(rele,HIGH);}else{digitalWrite(led_r,HIGH);digitalWrite(led_b,LOW);digitalWrite(rele,LOW);}}

198 19.10EXERCÍCIODOCAPÍTULO17.ACIONANDOMOTORESDC