Arduino-ce_ Automação residencial com celular usando Arduino Mega
A Deus.alvaroluiz.com/Kazuma/ArduinoBook/Arduino Guia para colocar suas... · Todo autor tem uma...
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
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