Ilovepdf Merged
Ilovepdf Merged
Jeremy Blum
explorando Arduino®: Técnicas e Ferramentas para Engenharia Wizardry
www.wiley.com
Copyright © 2013 por John Wiley & Sons, Inc., Indianapolis, Indiana
10 9 8 7 6 5 4 3 2 1
Nenhuma parte desta publicação pode ser reproduzida, armazenada em um sistema de recuperação ou transmitida de qualquer forma ou por qualquer meio,
eletrônico, mecânico, fotocópia, gravação, digitalização ou de outra forma, exceto conforme permitido sob as seções 107 ou 108 de 1976 Direitos Autorais dos
EUA Act, sem qualquer autorização prévia por escrito do editor, ou autorização através do pagamento da adequada taxa por cópia ao Copyright Clearance Center
222 Rosewood drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646 -8600. Pedidos para o Publisher para a permissão deve ser endereçada ao Departamento
de Permissões, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748-6008, ou online
emhttp://www.wiley.com/go/permissions.
Limite de Responsabilidade / Isenção de Garantia:O editor eo autor não faz representações ou garantias quanto à exatidão ou completude do conteúdo
deste trabalho e, especificamente, assumem todas as garantias, incluindo, sem limitação, garantias de adequação a um propósito particular. Nenhuma garantia
pode ser criado ou estendido por vendas ou materiais promocionais. Os conselhos e estratégias contidas neste documento podem não ser adequados para cada
situação. Este trabalho é vendido com o entendimento de que a editora não está envolvida na prestação jurídica, contabilidade ou outros serviços profissionais.
Se a assistência profissional é necessária, os serviços de um profissional competente devem ser procurados. Nem a editora nem o autor será responsável por
danos surgidos a partir deste. O facto de um sítio organização ou Web é referida neste trabalho como uma citação e / ou uma fonte potencial de mais
informações não significa que o autor ou a editora subscreve as informações da organização ou o site pode fornecer ou recomendações que podem fazer. Além
disso, os leitores devem estar cientes de que os sites da Internet listados neste trabalho pode ter mudado ou disap-ceu entre quando este trabalho foi escrito e
quando é lido.
Para informações gerais sobre nossos outros produtos e serviços, por favor entre em contato com nosso Departamento de Atendimento dentro dos Estados
Unidos em (877) 762-2974, fora dos Estados Unidos em (317) 572-3993 ou fax (317) 572-4002.
Wiley publica em uma variedade de formatos impresso e eletrônico e de print-on-demand. Algum material incluído com as versões de impressão padrão de
este livro não pode ser incluída no e-books ou em print-on-demand. Se este livro refere-se a mídia, como um CD ou DVD que não está incluído na versão
que você comprou, você pode baixar esse material emhttp://booksupport.wiley.com. Para mais informações sobre produtos de Wiley, visitawww.wiley.com.
Marcas:Wiley eo logotipo Wiley são marcas comerciais ou marcas registradas da John Wiley & Sons, Inc. e / ou suas afiliadas, nos Estados Unidos e em outros
países, e não podem ser utilizadas sem autorização por escrito. Arduino é uma marca tered-regis de Arduino, LLC. Todas as outras marcas comerciais são
propriedade dos seus respectivos proprietários. John Wiley & amp; Sons, Inc. não está associada a qualquer produto ou fornecedor mencionado neste livro.
Para minha avó, cuja curiosidade ao longo da vida e incentivo
me inspira a ser uma pessoa melhor a cada dia.
créditos
editor técnico
Neil Edde
Scott Fitzgerald
Editor associado
editor de produção
Jim Minatel
Daniel Scribner
Coordenador do Projecto, Tampa
Editor de cópia
Katie Crocker
Keith Cline
Compositor
Gerente Editorial
Cody Gates, Happenstance Type-O-
Mary Beth Wakefield Rama
Gerente Editorial Freelancer
revisor
Rosemarie Graham
James Saturnio, Word One
Associate Director of Marketing
Indexador
David Mayhew
John Sleeva
Gerente de marketing
cover Designer
Ashley Zurcher
Ryan Sneed
Gerente de negócios
Imagem de capa
Amy Knies
Cortesia de Jeremy Blum
Gerente de produção
Tim Tate
iv
Sobre o autor
(Que são utilizados por pessoas de todo o mundo, e por organizações notáveis tais
como NASA), ea eletrônica do protótipo e firmware para a MakerBot digitador
Scanner 3D. Como um pesquisador no renomado criativa Machines Lab, ele tem contribuído para a criação
de robôs que podem montar-se, robôs quadrúpedes de auto-aprendizagem, e as impressoras 3D que
redefinem fabricação pessoal. Ele apresentou esta pesquisa em revistas e jornais e em conferências tão
distantes como a Índia.
v
vi Sobre o Editor Técnico
foram apresentados no Discovery Channel, e ganharam vários prêmios e A-thons hack-. Jeremy foi
selecionado pelo Instituto Americano de Engenheiros Elétricos e Eletrônicos como o novo rosto de
Engenharia 2012.
Ele oferece serviços de consultoria em engenharia através de sua firma, Blum Idea Labs
LLC, e ele ensina engenharia e sustentabilidade para jovens estudantes em New York City. A paixão de
Jeremy está melhorando a vida das pessoas eo nosso planeta através de soluções de engenharia
criativos. Você pode aprender mais sobre Jeremy e seu trabalho em seu site:www.jeremyblum.com.
Scott Fitzgerald é um artista e educador que tem vindo a utilizar o plat-forma Arduino como ferramenta
de ensino e na sua prática desde 2006. Foi professor de computação física no Programa de
Telecomunicações Interativas (ITP) de Nova York
Em primeiro lugar, devo agradecer aos meus amigos na publicação Wiley para ajudar a fazer isso
possível: Mary James, por me encorajar a escrever este livro em primeiro lugar; e Jennifer Lynn, por me
manter na pista enquanto eu trabalhava através da escrita de todos os capítulos. Também devo um
grande obrigado a Scott Fitzgerald por seu olhar crítico na edição técnica deste livro.
Se não fosse para os grandes povos em element14, eu nunca pode ter começado em
produzindo o meu Arduino Tutorial Series, um prelúdio para o livro que você está prestes
ler. Sabrina Deitch e Sagar Jethani, em particular, têm sido parceiros maravilhosos com quem eu tive
o privilégio de trabalhar.
Eu escrevi a maior parte deste livro, enquanto completando simultaneamente o meu mestrado
grau e correndo duas empresas, então eu devo uma quantidade enorme de gratidão aos meus
professores e colegas que me aturar enquanto eu tentava equilibrar todas as minhas responsabilidades.
Finalmente, quero agradecer a minha família, especialmente meus pais e meu irmão,
David, cuja constante encorajamento me lembra porque eu faço as coisas que faço.
vii
Conteúdo at a Glance
Introdução xix
Índice 349
ix
Conteúdo
Introdução xix
XI
xii Conteúdo
Índice 349
Introdução
Você tem excelente timing. Como muitas vezes eu gosto de dizer, "Nós estamos vivendo no futuro." Com
as ferramentas disponíveis para você hoje, muitos dos quais você vai aprender neste livro, você tem a
oportunidade ea capacidade de dobrar o mundo físico para seus caprichos. Até muito recentemente, não
foi possível para alguém para pegar um microcontrolador e tê-lo controlar o seu mundo em poucos
minutos. Como você deve ter adivinhado, ummicrocontroladoré uma plataforma programável que lhe dá o
poder de definir a operação de complexos sistemas mecânicos, elétricos e de software usando comandos
relativamente simples. As possibilidades são end-less, e da plataforma microcontrolador Arduino vai se
tornar sua nova ferramenta favorita como você explorar o mundo da eletrônica, programação, interação
humano-computador, arte, sistemas de controle, e muito mais. Durante todo o curso deste livro, você vai
usar o Arduino para fazer tudo, desde a detecção de movimento para a criação de sistemas de controle de
fio-menos para comunicar através da Internet.
xix
xx Introdução
WhoThisBookIsFor
Este livro é para os entusiastas do Arduino de todos os níveis de experiência. capítulos construir
um sobre o outro, utilizando conceitos e componentes do projeto de tulo anterior
ters para desenvolver idéias mais complexas. Mas não se preocupe. Sempre que você enfrentar novas
idéias, complexas, uma referência cruzada você lembra onde você encontrou pela primeira vez todos os
conceitos de blocos de construção relevantes para que você pode facilmente refrescar a sua memória.
Este livro assume que você tem pouca ou nenhuma experiência anterior de trabalho
com programação ou engenharia elétrica. Para facilitar os leitores de vários níveis de experiência, o livro
apresenta uma série de seções opcionais e barras laterais, ou trechos curtos, que explicam um
determinado conceito em maior detalhe. Embora essas barras laterais não são obrigatórias para você
ganhar um bom entendimento de como
para usar o Arduino, eles fornecem um olhar mais atento a temas técnicos para a
mais curioso leitor.
WhatYou'llLearninThisBook
Este livro não é um livro de receitas. Se você quiser seguir as instruções passo-a-passo que informam
exatamente como construir um projeto específico sem realmente explicar-ing porque você está
fazendo o que está fazendo, este livro não é para você. Você pode
pensar que este livro como uma introdução à engenharia elétrica, ciência da computação,
design de produto, eo pensamento de alto nível usando o Arduino como um veículo para ajudá-lo a
experimentar esses conceitos de uma forma prática.
Este livro irá ensinar conceitos de física, algoritmos, princípios de design digital,
e conceitos de programação Arduino específicas do. A minha esperança é que o trabalho através
os projectos neste livro não só vai torná-lo um Arduino devel-oper bem versado, mas que também irá
dar-lhe as habilidades que você precisa para desenvolver sistemas elétricos mais complexos, e de
prosseguir os esforços de engenharia em outros campos, e com diferentes plataformas.
introdução xxi
FeaturesUsedinThisBook
Os seguintes recursos e ícones são utilizados neste livro para ajudar a chamar a aten-ção de algumas
das informações mais importantes ou úteis no livro:
ATENÇÃO Besuretotakeheedwhenyouseeoneoftheseasides.Whenpar-
ticularstepscouldcausedamagetoyourelectronicsifperformedincorrectly, you'llseeoneoftheseasides.
DICA Theseasidescontainquickhintsabouthowtoperformsimpletasksthat
mightproveusefulforthetaskathand.
NOTA Theseasidescontainadditionalinformationthatmaybeofimportance
toyou, includinglinkstovideosandonlinematerialthatwillmakeiteasiertofol-lowingalongwiththedevelopmentofaparticularproject
TÍTULO DA AMOSTRA
Theseasidesgointoadditionaldepthaboutthecurrenttopicorarelatedtopic.
GettingtheParts
Sorte para você, você pode facilmente obter os componentes necessários para executar os projetos
neste livro. parceiro deste livro, Newark element14, criou kits especialmente concebidos para o
conteúdo deste livro. Você ainda pode usar o código de cupom na parte de trás deste livro para obter
um desconto!
Você deve solicitar o kit básico de primeiros. Então você pode comprar kits de add-on como você
progredir através do livro. Não quero comprar um kit? Não se preocupe. Ao iniciar-ning de cada capítulo,
você encontrará uma lista detalhada de peças que você precisa para completar o capítulo. O site do
companheiro para este livro,
www.exploringarduino.com,
também fornece links para onde você pode encontrar as peças para cada capítulo.
WhatYou'llNeed
Além das peças reais que você vai usar para construir seus projetos Arduino,
existem algumas outras ferramentas e materiais que você precisa no seu Arduino
aventuras. Mais importante, você precisará de um computador que é compatível com o
Arduino ambiente de desenvolvimento integrado (IDE) (Max OSX 10.4+, o Windows XP +, ou de uma
Distro Linux). Estou disposto a dar instruções para todos os sistemas operacionais quando tal se
justifique.
Você também pode querer algumas ferramentas adicionais que serão utilizados ao longo do livro
depurar, montar hardware, etc. Estes não são explicitamente necessárias para concluir os projetos neste
livro. Como você desenvolver o seu conjunto de habilidades de engenharia elétrica, estas ferramentas serão
úteis para outros projectos. Eu recomendo o seguinte:
Um ferro de solda e solda (Nota:. Você não vai precisar de solda para com-pletar os projetos neste
■■
livro, mas você pode desejar para montar seus próprios circuitos em um protoboard, ou você
pode querer comprar proteções que exijam a montagem de solda)
Um multímetro (Isso vai ser útil para depurar conceitos dentro deste
■■
SourceCodeandDigitalContent
errata
Fazemos todos os esforços para garantir que não há erros no texto ou no código. No entanto, ninguém é
perfeito, e os erros ocorrem. Se você encontrar um erro neste livro, como um erro de ortografia ou uma
peça com defeito de código, ficaríamos muito gratos pelo seu feedback. Através do envio de errata, você
pode economizar mais horas leitor de frustração, e, ao mesmo tempo, você pode nos ajudar a fornecer
informações qualidade ainda maior.
SupplementaryMaterialandSupport
Durante suas aventuras com o seu Arduino, você vai, inevitavelmente, perguntas
e talvez executar em problemas. Uma das melhores partes sobre usando o Arduino é
o excelente comunidade de suporte que você pode encontrar na Web. Esta base extremamente ativa
dos usuários Arduino prontamente ajudá-lo junto à sua maneira. O follow-ing são apenas alguns
recursos que você vai achar útil em sua jornada:
www.arduino.cc/en/Reference/HomePage
www.jeremyblum.com/category/arduino-tutorials
learn.adafruit.com/category/learn-arduino
learn.sparkfun.com/tutorials
www.arduino.cc/forum
www.element14.com/community/groups/arduino
Se você já esgotou todos esses recursos e ainda não conseguir resolver o problema,
chegar a mim no Twitter ( @ sciguy14); Talvez eu possa ajudar. Você também pode entrar em
contato comigo diretamente através da página de contato no meu site w ( ww.jeremyblum
.com / contato), Mas eu geralmente não garantem tempos de resposta rápidos.
xxiv Introdução
WhatIsanArduino?
A melhor parte sobre a plataforma de prototipagem Arduino é que é o que você quiser que ele seja. O
Arduino pode ser um sistema de controle automático de rega de plantas. Pode ser um servidor web. Pode
até ser um piloto automático Quadrotor.
AnOpenSourcePlatform
Se você é novo para o mundo do código aberto, você está em uma surpresa. Este livro não entrar em
detalhes sobre o movimento hardware open source, mas vale a pena
saber um pouco sobre as ideologias que tornam o trabalho com o Arduino assim
Maravilhoso. Se você quiser um resumo completo do que hardware open source é, confira as
definições oficiais no site Association Hardware Open Source
(www.oshwa.org/definition).
NOTA LearnallabouttheopensourcemovementfrommyTEDxTalk:
www.jeremyblum.com/portfolio/tedx-cornell-university-2011/.
YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthisIntroduction.
Porque o Arduino é hardware de código aberto, todos os arquivos de projeto, diagramas esquemáticos,
e código-fonte está disponível gratuitamente para todos. Não só isso significa que você pode facilmente
cortar o Arduino para servir uma função muito particular, mas você também pode até mesmo integrar a
plataforma Arduino em seus projetos, fazer e
introdução xxv
vender clones Arduino, e usar as bibliotecas de software Arduino em outros projetos. Embora este
livro centra-se principalmente sobre o uso de hardware oficial Arduino, você também pode usar
centenas de Arduino placas de derivativos (muitas vezes com funções específicas adicionados a
eles) para criar os projetos neste livro.
A licença de código aberto Arduino também permite a reutilização comercial de seus projetos
(Contanto que você não utilizar a marca Arduino em seus projetos). Então, se você usar um Arduino
para protótipo um projeto emocionante e pretende transformá-lo em um produto comercial, você pode
fazer isso. Por exemplo, você vai ler sobre produtos como a impressora MakerBot Replicator 3D, que usa
eletrônicos baseados no Arduino plataforma mega (www.thingiverse.com/thing:16058). (Divulgação
completa: Eu projetei essa placa-mãe).
BeyondThisBook
Alguns de vocês podem já estar familiarizado com a minha série popular de YouTube
Arduino e eletrônica tutoriais ( www.youtube.com/sciguy14). Refiro-me a eles
ao longo deste livro como uma maneira de ver orientações mais detalhadas dos tópicos cobertos aqui.
Se você está curioso sobre algumas das coisas notáveis que você pode fazer com combinações
inteligentes de eletrônicos, microcontroladores, computador sci-cia e criatividade, veja minha carteira (
www.jeremyblum.com/portfolio)
para uma amostra de projectos. Como Arduino, mais do que eu faço é liberado através de licenças de
código aberto que permitem duplicar facilmente o meu trabalho para suas próprias necessidades.
Estou ansioso para ouvir sobre o que fazer com as habilidades que você adquire a partir desta
livro. Encorajo-vos a compartilhá-los comigo e com o resto do mundo. Boa sorte em suas aventuras
Arduino!
par t
Eu
Arduino Engenharia Basics
InThisPart
Obtendo-se e piscando
com o Arduino
cabo Arduino
UnoUSB
downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser
encontrada em www.exploringarduino.com/content/ch1 .
Agora que você tem alguma perspectiva sobre a plataforma Arduino e as suas ca-pabilities, é hora
de explorar as suas opções no mundo do Arduino. Neste capítulo, você examinar o hardware
disponível, aprender sobre o ambiente de programação e linguagem, e obter o seu primeiro
programa instalado e funcionando. Uma vez que você tem um controle sobre a funcionalidade que o
Arduino pode fornecer, você vai escrever o seu primeiro programa e obter o Arduino a piscar!
3
4 parte I ■ Arduino Engenharia Basics
ExploringtheArduinoEcosystem
Em suas aventuras com o Arduino, você vai depender de três componentes principais para seus
projetos:
A placa Arduino em si
■■
Todos estes componentes do sistema funcionam em conjunto para permitir-lhe fazer praticamente
qualquer coisa com seu Arduino.
Você tem um monte de opções quando se trata de Arduino placas de desenvolvimento, mas
este livro centra-se sobre o uso de placas oficiais Arduino. Porque as placas são todos concebidos para
ser programável através do mesmo IDE, você geralmente pode usar qualquer uma das placas Arduino
modernas para completar os projectos neste livro com zero ou
pequenas alterações. No entanto, quando necessário, você verá advertências sobre o uso de diferentes
placas para vários projetos. A maioria dos projectos usar o Arduino Uno.
Você começa a explorar a funcionalidade básica cozido para cada placa Arduino.
Então você examinar as diferenças entre cada placa moderno para que você possa tomar uma decisão
informada ao escolher uma placa de usar para o seu próximo projeto.
ArduinoFunctionality
Todas as placas Arduino tem algumas capacidades e funções chave. Tome um momento para examinar o
Arduino Uno (veja a Figura 1-1); será sua configuração básica. Estes são alguns componentes-chave que
você vai ser referentes-se com:
Atmel microcontrolador
■■
/ O pins Breakout I
■■
Botão de reset
■■
Debug LED
conector USB
programação MCU
conector (ICSP)
Serial-to-USB circuitos
entrada de 7-12VDC
Atmel microcontroladores
segurando todo o seu código compilado e executar os comandos que você especificar. o
linguagem de programação Arduino lhe dá acesso a periféricos do microcontrolador,
incluindo analógico-digitais conversores (ADCs), entrada de uso geral / saída (I / O) pinos,
barramentos de comunicação (incluindo I 2
C e SPI), e interfaces seriais.
Toda essa funcionalidade útil é quebrado para fora dos minúsculos pinos do micro-controlador para
cabeçalhos femininos acessíveis na Arduino que você pode conectar fios
Interfaces de programação
Geral I / O e ADCs
A parte do Arduino que você se importa o mais aproximadamente durante seus projetos é o general-
purpose de I / O e ADC pinos. Todos esses pinos podem ser tratadas individualmente através dos
programas que você vai escrever. Todos eles podem servir como entradas e saídas digitais. Os pinos ADC
também pode atuar como entradas analógicas que podem medir volt-idades entre 0 e 5V (geralmente a
partir de sensores resistivos). Muitos destes pinos também são multiplexados para servir a funções
adicionais, que você vai explorar durante
Suprimentos de energia
5V é usado para toda a lógica no tabuleiro. Em outras palavras, quando você alternar um pino
■■
circuitos.
8 parte I ■ Arduino Engenharia Basics
UMAbootloaderisachunkofcodethatlivesinareservedspaceintheprogrammemoryoftheArduino'smainMCU.Ingeneral, AVRmicrocontro
whichtalkstothemicrocontrollerviaaserialperipheralinterface (SPI) .Programmingviathismethodisfairlystraight-forward,
butnecessitatestheuserhavingahardwareprogrammersuchasanSTK500oranAVRISPMKIIprogrammer (seeFigure1-2).
BootloadersaregreatbecausetheyenablesimpleprogrammingviaUSB
withnoexternalhardware.However, theydohavetwodownsides:
programitdirectlybyconnectingyourprogrammertotheICSPheaderandusingtheFile
dUploadUsingProgrammercommandfromwithintheIDE.
ArduinoBoards
Este livro não pode cobrir todas as placas Arduino disponíveis; Há muitos,
e os fabricantes estão constantemente lançando novos com vários recursos. o
secção seguinte destaca algumas das características nos quadros de oficiais Arduino.
O Uno (veja a Figura 1-3) é o carro-chefe Arduino e será usado pesadamente
neste livro. Ele usa um chip conversor 16U2 USB-to-serial e um 328p ATmega como a MCU principal.
Ele está disponível em ambas DIP e versões SMD (que define se o MCU é removível).
Capítulo 1 ■ Obtendo-se e piscando com o Arduino 9
www.arduino.cc
Crédito: Arduino,
Figura 1-3: O Arduino Uno
www.arduino.cc
Crédito: Arduino,
O mega 2560 (veja a Figura 1-5) emprega um ATmega 2560 como o principal MCU,
que tem 54 I geral / Os para que você possa interagir com muitos outros dispositivos. Mega também tem
mais canais ADC, e tem quatro hardware interfaces seriais
www.arduino.cc
Crédito: Arduino,
Figura 1-5: O Arduino mega 2560
Ao contrário de todas as outras variantes Arduino, que utilizam 8 bits AVR MCUs, o Due
(Veja a Figura 1-6) usa um 32-bit ARM Cortex M3 SAM3X MCU. As ofertas Devido
ADCs de alta precisão, resolução de modulação por largura de pulso selecionável (PWM), Digital-to-
Analog Converters (DACs), um conector de host USB e um 84 MHz
Velocidade do relógio.
www.arduino.cc
Crédito: Arduino,
O Nano (veja a Figura 1-7) é projetado para ser montado para a direita em uma placa de ensaio
socket. Seu fator de forma pequeno torna-o perfeito para uso em projetos mais elaborados.
www.cookinghacks.com
Crédito: Cozinhar Hacks,
Figura 1-7: O Arduino Nano
O ADK mega (ver Figura 1-8) é muito semelhante ao do mega 2560, excepto que
ele tem a funcionalidade de host USB, permitindo que ele se conectar a um telefone Android para que
que possa se comunicar com aplicativos que você escreve.
www.arduino.cc
Crédito: Arduino,
O LilyPad (veja a Figura 1-9) é único porque ele é projetado para ser costurado em
vestuário. Usando fio condutor, você pode conectar-lo até sensores sewable, LEDs e mais. Para manter o
tamanho para baixo, você precisa programá-lo usando um cabo FTDI.
12 parte I ■ Arduino Engenharia Basics
www.arduino.cc
Crédito: Arduino,
Figura 1-9: O Arduino Lilypad
CreatingYourFirstProgram
Agora que você entende o hardware que você vai usar ao longo deste livro, você pode instalar o
software e executar o seu primeiro programa. Comece por down-carregar o software Arduino ao
computador.
DownloadingandInstallingtheArduinoIDE
RunningtheIDEandConnectingtotheArduino
Agora que você tem o IDE baixado e pronto para ser executado, você pode conectar o Arduino ao
computador via USB, como mostrado na Figura 1-12. máquinas Mac e Linux instalar os drivers
(principalmente) automaticamente.
Se você estiver usando OS X, a primeira vez que você conecte um Uno ou um mega 2560, você
receberá uma notificação de que um novo dispositivo de rede foi adicionado. Clique no
botão Preferências de rede. Na nova janela, clique em Aplicar. Mesmo que o
conselho vai aparecer como "Não configurado" na lista de dispositivos de rede, será
pronto para usar. Agora, saia de Preferências do Sistema.
Se você estiver usando um Arduino moderna em um computador Windows, você prova-
habilmente necessário instalar drivers. Você pode pular as seguintes indicações, se você não estiver
usando um computador com Windows que precisa ter os drivers instalados. Se você instalou o IDE
usando o instalador do Windows, então essas etapas foram concluídas para você. Se você baixou o ZIP
no seu computador Windows, então você vai precisar
2. Abra o menu Iniciar, clique com botão direito em Meu computador e selecione Propriedades.
7. Selecione o driver apropriado a partir do diretório motoristas do Arduino IDE que você acabou
de baixar (não o diretório de drivers FTDI).
Agora, inicie o Arduino IDE. Você está pronto para carregar o seu primeiro programa em
o Arduino. Para garantir que tudo está funcionando como esperado, você vai carregar o
Blink exemplo de programa, que começa a piscar a bordo LED. A maioria dos Arduinos têm
um LED conectado ao pino 13. Navegue até Arquivo d Exemplos dBasic, e clique no programa Blink.
Isso abre uma nova janela IDE com o programa Blink já escrito para você. Primeiro, você vai programar
o Arduino com este exemplo esboço, e então você vai analisar o programa para compreender os
componentes importantes para que você possa começar a escrever seus próprios programas no
próximo capítulo.
Antes de carregar o programa, você precisa dizer ao IDE que tipo de Arduino
de ter ligado e qual porta ele está conectado. Vá em FerramentasdConselho e garantir que a prancha
certa é selecionado. Este exemplo usa o Uno, mas se você estiver usando uma placa diferente,
selecione que um (supondo que ele também tem um LED conectado ao pino 13).
O último passo antes da programação é informar ao IDE que porta o seu conselho é
conectado a. Navegue para FerramentasdSerial Port e selecione a porta apropriada. Em máquinas
Windows, este será
COM *, Em que * é um número representando
o número da porta serial.
Você está finalmente pronto para carregar o seu primeiro programa. Clique no botão )Upload
em (
a parte superior esquerda do IDE. A barra de status na parte inferior do IDE mostra uma barra de
progresso, uma vez que compila e envia o seu programa. Quando o upload for concluído, o
LED amarelo no seu Arduino deve estar piscando uma vez por segundo. Parabéns!
Você acabou de enviar o seu primeiro programa Arduino.
BreakingDownYourFirstProgram
Tome um momento para desconstruir o programa Blink para que você entenda a estrutura básica de
programas escritos para o Arduino. Considere a Figura 1-13. As chamadas numeradas mostrados na
figura correspondem à lista seguinte.
1. Este é um comentário de várias linhas. Comentários são importantes para documentar seu
código. Tudo que você escreve entre esses símbolos não será ou mesmo visto pelo seu Arduino
empilhados-com. comentários de várias linhas começam com
/*
e terminam com * /. comentários de várias linhas são geralmente usados quando você tem
que dizer muito (como a descrição deste programa).
3. Este código é uma declaração de variável. Uma variável é um lugar na memória do Arduino que
contém informações. Variáveis têm tipos diferentes. Neste caso, é do tipoint, O que significa que
irá realizar um inteiro. Neste caso, uma
4. void setup () é uma das duas funções que deve ser incluído em cada
programa Arduino. UMAfunçãoé um pedaço de código que faz uma tarefa específica. Código
dentro das chaves do
configuração()função é executada uma vez na
o início do programa. Isso é útil para configurações de uma só vez, como definir a direção de pinos,
inicializar interfaces de comunicação, e assim por diante.
Capítulo 1 ■ Obtendo-se e piscando com o Arduino 17
6
7
8
9
10
5. pinos digitais do Arduino pode funcionar como entrada ou saídas. Para configurar a sua
direcção, use o comando
pinMode (). Este comando leva dois
argumentos. Aargumento dá ordens informações sobre como deveriam
operar. Argumentos são colocados dentro dos parênteses na sequência de um com-mand. O
primeiro argumento para
pinModedetermina o pino que está tendo sua
direcção definida. Como você definiu o conduziuvariável no início do programa,
você está dizendo o comando que você deseja definir a direção do pino 13. O segundo
argumento define a direção do pino:
ENTRADAou SAÍDA. pins
são entradas por padrão, então você precisa configurá-los explicitamente para as saídas se você
quer que eles funcionar como saídas. Porque você quer acender um LED, que definiu o pino
levou a uma saída (corrente está fluindo para fora do pino de I / O). Note que você tem que fazer
isso apenas uma vez. Ela irá então funcionar como uma saída para o resto do programa, ou até
que você alterá-lo para uma entrada.
18 parte I ■ Arduino Engenharia Basics
7. digitalWrite () é utilizado para definir o estado de um pino de saída. É possível configurar o pino
quer para 5V ou 0V. Quando um LED e resistor está conectado a um pino, set-ting-lo para 5V
irá permitir-lhe para acender o LED. (Você aprenderá mais sobre isso no próximo capítulo.) O
primeiro argumento para
digitalWrite () é o pino
você deseja controlar. O segundo argumento é o valor que você deseja configurá-lo para,
sejaALTO(5V) ou BAIXO(0V). O pino permanece neste estado até que seja
alterada no código.
ou 1 segundo. Isso resulta no LED ficar em durante 1 segundo antes de executar o próximo
comando.
9. Aqui, digitalWrite () é utilizado para ligar o LED off, definindo o estado pin
para BAIXO.
10. Mais uma vez, atrasar por 1 segundo para manter o LED no estado desligado antes de o loop se
repete e muda para o sobre o estado novamente.
Isso é tudo que existe para ela. Não se intimide se você não compreender totalmente
todo o código ainda. Como você juntar mais exemplos nos capítulos seguintes, você vai se tornar cada
vez mais proficiente em compreender o fluxo do programa, e escrever seu próprio código.
Resumo
Como o bootloader Arduino permite programar Arduino firmware através de uma conexão
■■
USB
downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch2 .
19
20 parte I ■ Arduino Engenharia Basics
Piscar um LED é grande, como você aprendeu no capítulo anterior, mas o que
faz com que o microcontrolador Arduino plataforma é tão útil que o sistema está
equipado com as entradas e saídas. Através da combinação de ambos, suas oportunidades são quase
ilimitadas. Por exemplo, você pode usar uma chave de palheta magnética para ouvir música quando o
seu porta se abre, crie um cofre eletrônico, ou construir um instrumento musical light-up!
Neste capítulo, você começa a aprender as habilidades que você precisa para construir projetos como
estes. Você explorar capacidade de entrada digital do Arduino, aprender sobre pullup
e pulldown resistências, e aprender a controlar saídas digitais. A maioria dos Arduinos
não têm saídas analógicas, mas é possível utilizar Modula-ção de largura de impulso digital para emular
em muitos cenários. Você aprende sobre a geração de sinais de largura de pulso modulada neste
capítulo. Você também vai aprender a Debounce comutadores digitais, uma habilidade fundamental ao
ler a entrada humana. No final do capítulo, você será capaz de construir e programar um RGB
controlável (Vermelho, Verde, Azul) nightlight LED.
NOTA YoucanfollowalongwithavideoasIteachyouaboutdigitalinputsand
saídas, debouncing, andpulse-widthmodulation (PWM):www.jeremyblum.com/ 2011/01/10 / arduino-tutorial-2-agora-com-mais-blinky
/.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Ifyouwanttolearnmoreaboutsomeofthebasicsofelectricalengineeringtouchedoninthischapter, watchthisvideo:www.jeremyblum.com/20
basics-in-arduino-tutorial-3/.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
DigitalOutputs
No Capítulo 1, "Getting Up e piscando com o Arduino", você aprendeu a piscar um LED. Neste
capítulo, você irá explorar ainda mais as capacidades de saída digital de Arduino, incluindo os
seguintes tópicos:
WiringUpanLEDandUsingBreadboards
No Capítulo 1, você aprendeu a piscar o LED a bordo, mas o que diversão é isso? Agora é hora de
sacar a placa de ensaio e fio-se um LED externo ao pino 9 do seu Arduino. Adicionando este LED
externo será um trampolim para ajudar você a entender como conectar-se circuitos externos mais
complexas em
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 21
os próximos capítulos. Além do mais, o pino 9 é habilitado para PWM, o que lhe permitirá prosseguir
os exemplos de saída analógicos mais adiante neste capítulo.
É importante entender como breadboards trabalhar de modo que você pode usá-los de forma eficaz
para os projectos neste livro. UMAplaca de ensaioé uma ferramenta de prototipagem simples que
facilmente lhe permite conectar-se circuitos simples sem ter que soldar juntos peças para uma placa de
circuito impresso costume. Primeiro, considere o azul e
linhas vermelhas que correm o comprimento da placa. Os pinos adjacentes a estes cor-
linhas codificadas são projetados para serem usados como ônibus de alimentação e terra. Todos os
pinos vermelhos são ligados electricamente, e são geralmente usados para o fornecimento de energia.
No caso da maioria dos Arduinos e os projetos neste livro, este será geralmente em 5V. Todos os pinos
de azul estão ligados electricamente e são utilizados para o bus de massa. Todos os pinos alinhados
verticalmente também estão conectados em fileiras, com uma divisão no meio para torná-lo fácil de
montar circuitos integrados na placa de ensaio. Figura 2-1 destaca como os pinos são conectados
eletricamente, com toda a espessura
barramento de terra
área de prototipagem
barramento de energia
barramento de terra
barramento de energia
LEDs de fiação
LEDs quase certamente será uma das peças mais usadas em seus projetos Ao longo de toda
este livro. LEDs são polarizados; Em outras palavras, não importa em que direção você ligá-los. O fio
positivo é chamado deanódioE o condutor negativo é chamado de cátodo. Se olharmos para a parte
superior transparente do diodo emissor de luz, não será normalmente uma superfície plana no bordo do
invólucro. Esse lado é o cátodo. Outra maneira de determinar de que lado está o ânodo e que é o cátodo
é examinando os leads. A vantagem mais curto é o cátodo.
Como você provavelmente já sabe, LED significa diodos emissores de luz. Como todos
diodos, LEDs permitem que a corrente flua em uma única direção-de sua anodo para o seu cátodo. Dado
que os fluxos de corrente de positivo para negativo, o ânodo do diodo emissor de luz deve ser ligado à
fonte de corrente (um sinal digital 5V, neste caso), e o cátodo deverá ser ligado à terra. O resistor pode
ser inserido em série em ambos os lados do LED. Resistores não são polarizados, e assim você não precisa
se preocupar com a sua orientação.
Você vai ligar o LED no pino 9 em série com um resistor. LEDs deve ser sempre
ligados em série com uma resistência para servir como um limitador de corrente. Quanto maior for a resistência
valor, mais ela restringe o fluxo de corrente e o dimmer o LED brilha.
Neste cenário, você usar um resistor 220Ω. Fio-lo para cima, como mostrado na Figura 2-2.
Imagem criada com o Fritzing.
ThemostimportantequationforanyelectricalengineertoknowisOhm'slaw.Ohm'slawdictatestherelationshipbetweenvoltage (m
(measuredinohmsorΩ) inacir-cuit.Acircuitisaclosedloopwithasourceofelectricalenergy (likea9Vbat-tery) andaload (somethin
itisimportanttounderstandwhateachtermmeans, atleastatabasiclevel:
■ Voltagemrepresentsthepotentialelectricaldifferencebetweentwopoints.
■ Atualflowsfromapointofhigherpotentialenergytolowerpotentialenergy.Youcanthinkofcurrentasaflowofwater, andvolta
alwaysflowsfromhighelevation (highervolt-idade) tolowerelevation (solo, oralowervoltage) .Current, likewaterinariver,
rentcanflowfreelythroughit.
Ohm'slawisdefinedasfollows:
V = IR
ConsidertheLEDcircuitshowninFigure2-3.
Imagem criada com o Águia.
contínuo
YoucanuseOhm'slawtodecideonaresistorvalueforthiscircuit.AssumethatthisisastandardLEDwith20mAforwardcurrentanda2V
dropacrossit.Becausethesourcevoltageis5Vanditendsatground, atotalof5Vmustdropacrossthiscircuit.SincetheLEDhasa2Vdrop,
theother3Vmustdropacrosstheresistor.Knowingthatyouwantapproxi-mately20mAtoflowthroughthesecomponents, youcanfindtheres
20mAflowsthroughboththeresistorandLED.Asyouincreasetheresis-tancevalue, lesscurrentisallowedtoflowthrough.220Ωisabitmoreth
butstillallowstheLEDtoglowsufficientlybright, andisaverycom-monlyavailableresistorvalue.
resistivecomponent.Becauseincreasedpowerisassociatedwithincreasedheatdissipation,
componentsgenerallyhaveamaximumpowerrating.Youwanttoensurethatyoudonotexceedthemaximumpowerratingforresis-
torsbecauseotherwisetheymightoverheat.Acommonpowerratingforresistorsis1 / 8ofawatt (abbreviatedasW, milliwattsasmW) .Thep
P = IV
WherePispowerinwatts, andIandVarestilldefinedasthecurrentandvoltage.Fortheresistordefinedearlierwithavoltagedropof3Vandac
ProgrammingDigitalOutputs
Por padrão, todos os pinos do Arduino são definidos para entradas. Se você quer fazer um um pino
saída, você precisa primeiro informar o Arduino como o pino deve ser configurado. Na linguagem de
programação Arduino, o programa exige duas partes: a
prática comum para definir todos os seus pinos como entradas ou saídas na configuração. Você
começa a escrever um programa simples que define o pino 9 como uma saída e transforma-se quando
o programa é iniciado.
Para escrever este programa, utilize o pinMode ()comando para definir a direção de
pino 9 e uso digitalWrite () para fazer a saída alta (5V). Ver listagem 2-1.
{
pinMode (LED, OUTPUT); // Definir o pino de LED como um outputdigitalWrite
(LED, HIGH); // Definir o pino de LED de alta
void loop ()
{
// Nós não estão fazendo nada no laço!
}
Carregar este programa em seu Arduino, com fio, como mostrado na Figura 2-2. Dentro
este programa, também notar que eu usei a constoperador antes de definir o
variável inteira pinos. Normalmente, você vai usar variáveis para armazenar valores que podem
mudar durante a execução do programa. Colocando
constantes de seu DEC- variável
declara-, você está dizendo ao compilador que a variável é "somente leitura" e não vai mudar
durante a execução do programa. Todas as instâncias de
CONDUZIUem seu programa
será "substituído" com 9quando eles são chamados. Quando você está definindo valores
que não vai mudar, usando o constqualificador é recomendado. Em algumas das
exemplos mais adiante neste capítulo, você vai definir variáveis não constantes que podem mudar
durante a execução do programa.
Você deve especificar o tipo para qualquer variável que você declarar. No precedente
caso, é um inteiro (pinos estará sempre inteiros), então você deve defini-lo como tal. Agora você pode
facilmente modificar este esboço para coincidir com o que você fez no Capítulo 1, movendo o digitalWrite ()
UsingForLoops
É frequentemente necessário usar loops com a mudança de valores das variáveis para ajustar os
parâmetros de um programa. No caso do programa que você acabou de escrever, você pode
implementar um paraloop para ver como diferentes taxas intermitentes impacto do seu sistema
operação. Você pode visualizar diferentes taxas intermitentes usando um
paraloop para ciclo
através de várias taxas. O código na Listagem 2-2 realiza isso.
26 parte I ■ Arduino Engenharia Basics
{
pinMode (LED, OUTPUT); // Definir o pino de LED como uma saída
}
void loop ()
{
for (int i = 100; i <= 1000; i = i + 100)
{
digitalWrite (LED, HIGH); delay (i);
digitalWrite (LED, LOW); delay (i);
}
}
■■A primeira entrada define a variável de índice para o loop. Neste caso, o índice é variável Eue
está programado para começar em um valor de
100.
■■A segunda entrada especifica quando o loop deve parar. O conteúdo do loop será executado
uma e outra vez, enquanto que a condição é verdadeira.
<=
indica menos do que ou igual a. Assim, para este ciclo, o conteúdo irá continuar a executar,
enquanto a variável
Eué ainda inferior ou igual a 1000.
■■A entrada final especifica o que deve acontecer com a variável índice no final de cada execução
do loop. Nesse caso,
Euserá definido como seu valor atual
mais 100.
Para entender melhor estes conceitos, considere o que acontece em duas passagens
através de paraloop:
2. O LED está situado no alto, e permanece elevado para 100 ms, o valor atual deEu.
3. O LED é baixo, e permanece baixa para 100 ms, o valor atual de Eu.
4. No final do ciclo, Eué incrementado por 100, Por isso, é agora 200.
6. O LED está situado no alto, e permanece elevado para 200ms, o valor atual de Eu.
8. No final do ciclo, Eué incrementado por 100, Por isso, é agora 300.
9. Este processo se repete até que Eusupera 1000ea função de laço externo repete,
preparando o Euvalor de volta para 100e de iniciar o processo de novo.
Agora que você gerou saídas digitais do seu Arduino, você aprenderá
sobre o uso de PWM para criar saídas analógicas de os pinos de I / O no seu Arduino.
Pulso-WidthModulationwithanalogWrite ()
Então, você domina controle digital de seus pinos. Isso é ótimo para piscar LEDs, controle relés, e
girando motores a uma velocidade constante. Mas o que se pretende reproduzir uma voltagem
diferente 0V ou 5V? Bem, você não-pode-se estiver a utilizar os pinos de digital para analógico (DAC)
na Due ou se estiver usando um chip DAC externo.
No entanto, você pode ficar muito perto de gerar valores de saída analógicos usando
um truque chamado modulação por largura de pulso(PWM). Seleccione pinos de cada Arduino pode usar
oanalogWrite ()comando para gerar sinais PWM que pode emular um sinal analógico puro, quando
utilizado com certos periféricos. Estes pinos são marcadas com um ~ na placa. No Arduino Uno, Pins 3,
5, 6, 9, 10, e 11 são pinos PWM. Se você estiver usando um Uno, você pode continuar a usar o circuito
da Figura 2-1 para testar oanalogWrite ()comando com o seu LED. Presumivelmente, se você
comando aceita dois argumentos: o pino para controlar e o valor para escrever para ele.
A saída de PWM é um valor de 8 bits. Em outras palavras, você pode escrever os valores de
0-28-1 Ou 0 a 255. Experimente usar um semelhante
paraestrutura de loop para o que você usou
anteriormente para percorrer os valores de brilho diferentes (veja a Listagem 2-3).
{
pinMode (LED, OUTPUT); // Definir o pino de LED como uma saída
}
void loop ()
{
for (int i = 0; i <256; i ++)
{
analogWrite (diodo emissor
de luz, i); atraso (10);
28 parte I ■ Arduino Engenharia Basics
}
for (int i = 255; i> = 0; i--)
{
analogWrite (diodo emissor
de luz, i); atraso (10);
}
}
O que faz o LED fazer quando você executar esse código? Você deve observar o LED
desaparecendo de desligado para ligado, em seguida, de ligado para desligado. Claro, porque isso é
tudo no circuito principal, este padrão se repete ad infinitum. Certifique-se notar algumas diferenças
nesteparaloop. No primeiro loop,
i ++é código apenas uma abreviação para representar
i = i + 1.
Similarmente, Eu--é funcionalmente equivalente a i = i-1. O primeiroparalaço desvanece-se o
LED para cima, eo segundo laço desvanece-lo para baixo.
controlo PWM pode ser usado em muitas circunstâncias, para emular con- analógico puro
controle, mas pode nem sempre ser usado quando você realmente precisa de um sinal analógico. Por
exemplo, PWM é ótimo para dirigir motores de corrente contínua (DC) em velocidades variáveis (você
experimentar com isso em capítulos posteriores), mas ele não funciona bem para a condução de alto-
falantes a menos que você completá-lo com alguns circuitos externos. Espere um momento
para examinar como PWM realmente funciona. Considere os gráficos mostrados nas Figura 2-4.
PWM funciona através da modulação do ciclo de trabalho de uma onda quadrada (que um sinal
liga e desliga). ciclo de trabalhorefere-se a percentagem de tempo em que uma onda quadrada é alta
versus baixa. Você provavelmente está mais familiarizado com ondas quadradas que
têm um ciclo de trabalho de 50% -que são elevados metade do tempo, e de baixo de metade do tempo.
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 29
Escrevendo um valor de 0 com analogWrite ()indica uma onda quadrada com uma
■■
Escrevendo um 255 indica uma onda quadrada com um ciclo de trabalho de 100 por cento
■■
(sempre alto).
Escrevendo um 127 indica uma onda quadrada com um ciclo de trabalho de 50 por cento
■■
Os gráficos na Figura 2-4 mostram que, para um sinal com um ciclo de funcionamento de 25 por cento,
é elevada de 25 por cento do tempo, e de baixo 75 por cento do tempo. A frequência desta onda
quadrada, no caso do Arduino, é de cerca de 490Hz. Em outras palavras, o sinal varia entre alta (5V) e
baixo (0V) cerca de 490 vezes por segundo.
Então, se você não está realmente mudando a tensão a ser entregue a um LED,
Por que você vê-lo chegar dimmer como você diminuir o ciclo de trabalho? É realmente um resultado de
seus olhos jogando um truque em você! Se o LED é ligar e desligar a cada 1ms (que é o caso com um
ciclo de trabalho de 50 por cento), parece estar a funcionar a cerca de metade do brilho porque ele está a
piscar mais rápido do que os olhos podem perceber. Portanto, o seu cérebro realmente calcula a média do
sinal e truques você em acreditar que o LED está a funcionar com metade do brilho.
ReadingDigitalInputs
Agora é o momento para o outro lado da equação. Você conseguiu com sucesso
gerarambos (ish) saídas digitais e analógicas. O próximo passo éler digital
insumos, tais como interruptores e botões, para que você possa interagir com o seu projeto em tempo
real. Nesta seção, você aprende a ler entradas, implementar pullup e resistências suspenso e Debounce
um botão no software.
ReadingDigitalInputswithPulldownResistors
Você deve começar por modificar o circuito que você construiu o primeiro a partir da Figura 2-1.
Seguindo Figura 2-5, você poderá adicionar um botão e uma con- pulldown resistor
conectado a um pino de entrada digital.
DICA Besuretoalsoconnectthepowerandgroundbusesofthebreadboardto
theArduino.Nowthatyou'reusingmultipledevicesonthebreadboard, thatwillcomeinhandy.
todas as entradas digitais usar um pullup ou resistor suspenso para definir o "estado padrão" do pino de
entrada. Imagine que o circuito na Figura 2-5, sem o resistor de 10k. Neste cenário, o pino seria
obviamente ler um valor elevado quando o botão é pressionado.
Mas, o que acontece quando o botão não está sendo pressionado? Nesse cenário, o
entrada pino que você estaria lendo está essencialmente ligada a nada-a entrada pino é dito ser
"flutuante". E porque o pino não está fisicamente conectado ao 0V ou 5V, lê-lo poderia causar resultados
inesperados, como o ruído elétrico no pinos nas proximidades faz com que a sua valor a oscilar entre alta e
baixa. Para remediar esta situação, o resistor suspenso é instalado como mostrado na Figura 2-5.
Agora, considere o que acontece quando o botão não está pressionado com o pull
para baixo resistor no circuito: O pino de entrada serão conectados através de uma 10k
resistor à terra. Enquanto a resistência irá restringir o fluxo de corrente, há
ainda o fluxo de corrente é suficiente para assegurar que o pino de entrada irá ler um valor lógico baixo. 10k
é um valor bastante comum resistor suspenso. Valores maiores são disse a serpulldowns fracos porque é
mais fácil superá-los, e valores de resistência menores estão a ser dito pulldowns fortesporque é mais fácil
para o mais corrente flua através deles para o solo. Quando o botão é pressionado, o pino de entrada está
directamente ligado a 5V através do botão.
Ele pode fluir através de um caminho quase zero, resistência ao carril de 5V.
■■
Lembre-se a partir da barra lateral anterior sobre a lei de Ohm e a equação de poder que
actual terá sempre segue o caminho da menor resistência de um circuito. Neste cenário, a maioria da
corrente flui através do botão, e um nível lógico alto é gerado no pino de entrada, porque que é o
caminho de menor resistência.
Agora é hora de escrever o programa para este circuito! Neste primeiro exemplo, você
só tem o LED permanece aceso enquanto o botão é pressionado, e você tem que ficar fora enquanto o
botão é unpressed (consulte a Listagem 2-4).
const int LED = 9; // O LED está ligado ao pino 9const int BUTTON = 2; // O
botão está ligado ao pino 2
void setup ()
{
pinMode (LED, OUTPUT); // Definir o pino de LED como um outputpinMode (Button,
entradas); // Conjunto de botão como entrada (não obrigatório)
void loop ()
{
if (digitalRead (BOTÃO) == LOW)
{
digitalWrite (LED, LOW);
}
outro
{
digitalWrite (LED, HIGH);
}
}
Quando foi a última vez que você teve que segurar um botão para baixo para manter uma luz acesa?
Provavelmente nunca. Faz mais sentido de ser capaz de clicar no botão uma vez para ligá-lo e clique no
botão novamente para desligá-lo. Dessa forma, você não tem que segure o botão para baixo para manter a
luz acesa. Infelizmente, isso não é tão fácil como se poderia primeira adivinhar. Você não pode apenas
olhar para o valor da chave para a mudança
de baixo para cima; você precisa se preocupar com um fenômeno chamadoalternar saltando.
Os botões são dispositivos mecânicos que funcionam como um sistema de mola-amortecedor. Dentro
outras palavras, quando você aperta um botão para baixo, o sinal de que você lê não apenas ir de
baixo para cima, ele salta para cima e para baixo entre esses dois estados por alguns milésimos de
segundo antes de ser assentada. Figura 2-6 ilustra o comportamento esperado ao lado do
comportamento real que você pode ver quando sondando o botão usando um
mostra. No entanto, o botão realmente salta para cima e para baixo antes de se estabelecer, como o
gráfico à direita mostra.
3. Se o estado atual do botão diferente do estado botão anterior, espere 5ms porque o botão deve ter
mudado de estado.
4. Depois de 5ms, reler o estado de botão e usar isso como o estado atual do botão.
5. Se o estado do botão anterior era baixa, e o estado atual do botão é alta, alternar o estado LED.
Esta é uma oportunidade perfeita para explorar o uso funções pela primeira vez.
Funções são blocos de código que podem aceitar argumentos de entrada, executar código
com base nesses argumentos, e retornar opcionalmente um resultado. Sem perceber, você já foi usando
funções pré-definidas ao longo de seus programas. Por exemplo,digitalWrite ()
Dentro do fluxo do programa (listados nas etapas anteriores) é uma série de repetibilidade
ing etapas que precisam ser aplicados a mudança de valores variáveis. Porque você vai querer Debounce
repetidamente o valor da chave, é útil para definir os passos para debouncing como uma função que pode
ser chamado a cada vez. Esta função irá aceitar o estado botão anterior como entrada e gera o estado do
botão filtrada por corrente. O programa a seguir realiza as etapas anteriores e muda o estado de LED cada
vez que o botão é pressionado. Você vai usar o mesmo circuito que o exemplo anterior para este. Tentar
carregá-lo para o seu Arduino e ver como ele funciona (ver Listagem 2-5).
const int LED = 9; // O LED está ligado ao pino 9const int BUTTON = 2; // O botão
está ligado ao pino 2boolean lastButton = LOW; // Variável contendo o botão //
anterior stateboolean currentButton = LOW; // Variável contendo o estado do
botão // atual
34 parte I ■ Arduino Engenharia Basics
void setup ()
{
pinMode (LED, OUTPUT); // Definir o pino de LED como um outputpinMode (Button,
entradas); // Conjunto de botão como entrada (não obrigatório)
/*
* Função Debouncing
* Passe-o estado do botão anterior,
* E voltar o estado do botão filtrada por corrente.
*/
boolean debounce (boolean passado)
{
boolean atual = digitalRead (botão); // Leia o botão stateif (durar! = Atual) // se ele é
diferente ...
{
atraso (5); // Espera 5mscurrent = digitalRead (botão); // Lê-lo novamente
void loop ()
{
currentButton = estabilização (lastButton); // Lê stateif deboucned (lastButton == LOW &&
currentButton == HIGH) // se ele foi pressionado ...
{
Ledon = Ledon!; // Alternar o valor LED
}
lastButton = currentButton; // Redefinir valor botão
Agora, quebrar o código na Listagem 2-5. Em primeiro lugar, os valores constantes são definidas
para os pinos ligados ao botão e LED. Em seguida, três booleanavariáveis estamos
declarado. Quando oconstqualificador não é colocado antes uma declaração de variável, você está
indicando que essa variável pode mudar dentro do programa. por defin-
ing estes valores no topo do programa, você está declarando-os como global variáveis que podem ser
utilizados e modificados por qualquer função dentro deste esboço.
As três variáveis booleanas declarados no topo deste esboço são inicializado assim, o que significa que
eles foram fixados para um valor inicial (
BAIXO, BAIXOe falso
respectivamente). Mais tarde no programa, os valores destas variáveis pode ser alterado com um operador
de atribuição (um único sinal de igual:
=).
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 35
último). Esta função aceita um valor booleano (um tipo de dados que tem apenas dois estados: true /
false, alto / baixo, on / off, variável 1/0) de entrada chamada últimoe retorna um valor booleano
valor que representa o valor pin filtrada por corrente. Esta função compara o estado atual do botão
com o anterior (
último) Estado de botão que foi passado
a ele como um argumento. o! =representa a desigualdade e é usado para comparar as actuais e
anteriores valores dos botões no
E sedeclaração. Se eles forem diferentes, então o
botão deve ter sido pressionado eo E sedeclaração irá executar o seu conteúdo.
o E sedeclaração aguarda 5ms antes de verificar o estado do botão novamente. Este 5ms dá tempo
suficiente para que o botão para parar de saltar. O botão é então verificada
novamente para determinar o seu valor estável. Como você aprendeu anteriormente, as funções podem, opcio
retornar valores. No caso de esta função, o corrente de retornoinstrução retorna
o valor do atualvariável booleana quando a função é chamada. atual
é um localvariável é declarada e usada apenas dentro da função de estabilização. Quando a função de
estabilização é chamado a partir do loop principal, o valor retornado é escrito para oglobal
Este código deve alterar o estado de LED cada vez que o botão é pressionado. E se
tentar fazer a mesma coisa sem debouncing o botão, você vai encontrar os resultados imprevisíveis,
com o LED, por vezes, funcionando como esperado e às vezes não.
BuildingaControllableRGBLEDNightlight
Neste capítulo, você aprendeu como controlar saídas digitais, como ler botões filtrada por, e como usar
PWM para alterar o brilho de LED. Usando essas habilidades, agora você pode ligar um LED RGB e um
botão filtrada por dar um ciclo
36 parte I ■ Arduino Engenharia Basics
através de algumas cores para uma lâmpada LED RGB controlável. É possível misturar as cores RGB
com um diodo emissor de luz, alterando o brilho de cada cor.
Neste cenário, você usa um cátodo comum LED. Isso significa que o diodo emissor de luz tem
quatro pistas. Um deles é um pino do cátodo que é compartilhado entre todos os três diodos, enquanto
os outros três pinos de conexão com os ânodos de cada cor diodo. Fio que levaram a três pinos PWM
através de resistores limitadores de corrente no Arduino
Você pode configurar um botão filtrada por para percorrer uma seleção de cores
cada vez que você pressiona-lo. Para fazer isso, é útil para adicionar uma função adicional para
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 37
definir o LED RGB para o próximo estado no ciclo de cor. No programa seguinte (veja a Listagem 2-6), defini
sete estados totais de cores, além de um fora do estado para o LED. usando oanalogWrite ()função, você
pode escolher suas próprias combinações de mistura de cores. A única alteração ao
const int BLED = 9; LED // azul no Pin 9const int GLED = 10; LED // Verde
sobre Pin 10const int RLED = 11; LED // vermelha no Pin 11const int
BUTTON = 2; // O botão está ligado ao pino 2
void setup ()
{
pinMode (Bled, OUTPUT); LED // Set Azul como OutputpinMode (GLED, OUTPUT); LED
// Set Verde como OutputpinMode (RLED, OUTPUT); LED // Set Vermelho como
OutputpinMode (Button, entradas); // Conjunto de botão como entrada (não
obrigatório)
/*
* Função Debouncing
* Passe-o estado do botão anterior,
* E voltar o estado do botão filtrada por corrente.
*/
boolean debounce (boolean passado)
{
boolean atual = digitalRead (botão); // Leia o botão stateif (durar! = Atual) // se ele é
diferente ...
{
atraso (5); // Espera 5mscurrent = digitalRead (botão); // Lê-lo novamente
}
voltar corrente; // Retorna o valor atual
}
/*
* Seleção do Modo de LED
* Passe um número para o Estado LED e defini-lo em conformidade.
*/
vazio setMode (modo int)
38 parte I ■ Arduino Engenharia Basics
{
// REDif (modo == 1)
{
digitalWrite (RLED, HIGH);
digitalWrite (GLED, LOW);
digitalWrite (Bled, LOW);
}
// GREENelse se (modo ==
2)
{
digitalWrite (RLED, LOW);
digitalWrite (GLED, HIGH);
digitalWrite (Bled, LOW);
}
// BLUEelse se (modo == 3)
{
digitalWrite (RLED, LOW);
digitalWrite (GLED, LOW);
digitalWrite (Bled, HIGH);
}
// ROXO (RED + AZUL) if
(modo == 4)
{
analogWrite (RLED, 127);
analogWrite (GLED, 0); analogWrite
(Bled, 127);
}
// TEAL (AZUL + VERDE) else if
(modo == 5)
{
analogWrite (RLED, 0); analogWrite
(GLED, 127); analogWrite (Bled,
127);
}
// Laranja (verde + vermelho) else
if (modo == 6)
{
analogWrite (RLED, 127);
analogWrite (GLED, 127);
analogWrite (Bled, 0);
}
// BRANCO (verde + vermelho + AZUL)
else if (modo == 7)
{
analogWrite (RLED, 85);
analogWrite (GLED, 85);
analogWrite (Bled, 85);
}
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 39
{
digitalWrite (RLED, LOW);
digitalWrite (GLED, LOW);
digitalWrite (Bled, LOW);
}
}
void loop ()
{
currentButton = estabilização (lastButton); // Lê stateif deboucned (lastButton == LOW &&
currentButton == HIGH) // se ele foi pressionado ...
{
ledMode ++; // Incrementar o valor LED
}
lastButton = currentButton; // Redefinir valor botão // se tiver um ciclo através
das diferentes opções, // repor o contador a 0if (ledMode == 8) ledMode = 0;
setMode (ledMode); // Alterar o estado de LED
Isto pode parecer um monte de código, mas não é nada mais do que um conglomera-
ção de trechos de código que você já tenha escrito ao longo deste capítulo.
De que outra forma você pode modificar esse código? Você pode adicionar botões adicionais para
controlar, independentemente, uma das três cores. Você também pode adicionar modos intermitentes,
usando o código a partir do capítulo 1, que piscou o LED. As possibilidades são ilimitadas.
Resumo
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch3 .
41
42 parte I ■ Arduino Engenharia Basics
O mundo ao seu redor é analógico. Mesmo que você pode ouvir que o mundo
"vai digital", a maioria das características observáveis em seu ambiente
será sempre analógico na natureza. O mundo pode assumir um número infinito de estados potenciais, se
você está considerando a cor da luz solar, a tempera-tura do oceano, ou a concentração de
contaminantes no ar. Este capítulo centra-se no desenvolvimento de técnicas para a discretização dessas
infinitas possibilidades em valores digitais palatáveis que podem ser analisadas com um sistema de
microcontrolador como o Arduino.
NOTA YoucanfollowalongwithavideoasIteachyouaboutreadingfromanalog
entradas:entradas www.jeremyblum.com/2011/01/24/arduino-tutorial-4-analog-~~number=plural
/.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Ifyouwanttolearnmoreaboutthedifferencesbetweenanaloganddigitalsig-nais, checkoutthisvideothatexplainseachindepth:www.jeremyb
obter-digital ou analógico /.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
UnderstandingAnalogandDigitalSignals
Se você deseja que os seus dispositivos de interface com o mundo, eles serão inevitavelmente
com interface de dados analógicos. Considere os projetos que você completou na preced-
ing capítulo. Você usou um interruptor para controlar um LED. Um switch é um insumo-it digital tem
apenas dois estados possíveis: ligado ou desligado, altas ou baixas, 1 ou 0, e assim por diante. A
informação digital (o computador ou os processos Arduino) é uma série de dados binários (ou digitais).
Cada bit só tem um de dois valores.
ComparingAnalogandDigitalSignals
Os gráficos na Figura 3-1 mostra como os sinais analógicos e digitais de comparação uns com os outros.
À esquerda é uma onda quadrada que varia entre apenas dois valores: 0 e 5 volts. Assim como com o
botão que você usou no capítulo anterior, esse sinal é apenas uma "alta lógica" ou valor "lógico baixo".
À direita é parte de uma onda de co-seno. Embora seus limites ainda são 0 e 5 volts, o sinal assume um
infinito
Os sinais analógicos são aqueles que não podem ser classificados de forma discreta; eles variar dentro
um intervalo, teoricamente assumir um número infinito de valores possíveis dentro desse intervalo.
Pense sobre a luz solar como um exemplo de uma entrada analógica você pode querer medir.
Naturalmente, há uma gama razoável sobre o qual você pode medir a luz solar. Muitas vezes, medido
em lux, ou fluxo luminoso por unidade de área, você pode razoavelmente esperar para medir valores
entre 0 lux (para breu) e
130.000 lux na luz solar direta. Se o dispositivo de medição eram infinitamente preciso, você poderia
medir um número infinito de valores entre os dois. uma coberta
configuração pode ser de 400 lux. Se fosse ligeiramente mais brilhante, pode ser 401 lux, em seguida, 401.1
Lux, em seguida, 401,11 lux, e assim por diante. Um sistema de computador nunca poderia viabilizar medir
um número infinito de casas decimais para um valor analógico porque a memória e poder de computador
devem ser valores finitos. Se for esse o caso, como você pode interagir seu Arduino com o "mundo real?" A
resposta é analógico-digital converter-ers (ADC), que pode converter valores analógicos em representações
digitais com uma quantidade finita de precisão e velocidade.
44 parte I ■ Arduino Engenharia Basics
ConvertinganAnalogSignaltoaDigitalOne
Suponha que você quer medir o brilho do seu quarto. Presumivelmente, um sensor de luz boa poderia
produzir uma tensão de saída que varia, que muda com o brilho do ambiente. Quando é escuro como
breu, o dispositivo de saída 0V, e quando ele está completamente saturado pela luz, que seria saída de
5V, com valores em entre correspondente à quantidade variável de luz. Isso é tudo muito bem, mas
como é que você vai ler esses valores com um Arduino para descobrir o quão brilhante o quarto é? Você
pode usar o conversor analógico-digital do Arduino (ADC) pinos para converter valores de tensão
analógico em número de representações que você pode trabalhar com.
NOTA Ifyouwanttolearnmoreaboutusingyourownreferencevoltageor
usingadifferentinternalvoltagereference, checkouttheanalogReference ()pageontheArduinowebsite:www.arduino.cc/en/Refere
3
A ADC 3-bit tem 3 bits de resolução. porque 2 = 8, existem oito ní- total de lógica
ELS, de 0 a 7. Portanto, qualquer valor analógico que é passada para um 3-bit ADC terá que ser atribuído
um valor de 0 a 7. Observando a Figura 3-2, pode ver que os níveis de tensão são convertidos em
discreta valores digitais que podem ser utilizados pelo microcontrolador. Quanto maior a resolução, mais
passos que estão disponíveis para representar cada valor. No caso de o Arduino Uno, existem passos, em
vez de 1024 a 8 mostrado aqui.
ReadingAnalogSensorswiththeArduino: analogRead ()
Agora que você entende como converter sinais analógicos em valores digitais,
você pode integrar esse conhecimento em seus programas e circuitos. Arduinos diferentes têm
diferentes números de pinos de entrada analógica, mas você lê-los todos da mesma maneira,
usando o
analogRead ()comando. Primeiro, você vai experimentar com
um potenciómetro e um sensor análogo embalados. Então, você vai aprender como divisores de tensão
funcionam, e como você pode usá-los para fazer seus próprios sensores analógicos a partir de
dispositivos que variam sua resistência em resposta a algum tipo de entrada.
ReadingaPotentiometer
O sensor analógico mais fácil de ler é um potenciômetro simples (uma panela, para abreviar).
As probabilidades são que você tem toneladas destes em torno de sua casa, em seus aparelhos de som, alto-fala
termostatos, carros e em outros lugares. Potenciômetros são divisores de tensão variáveis (discutidas
mais adiante neste capítulo) que se parecem com botões. Eles vêm em lotes de tamanhos e formas,
mas todos eles têm três pinos. Que ligar um dos pinos exteriores para a terra, e o outro para a 5V.
Potenciômetros são simétricas, por isso não importa de que lado você conectar o 5V e terra para. Você
conectar o pino do meio para entrada analógica 0 no seu Arduino. Figura 3-3 mostra como ligar
corretamente o potenciômetro para um Arduino.
Como você gira o potenciômetro, você pode variar a tensão que você está alimentando
entrada analógica 0 entre 0V e 5V. Se você quiser, você pode confirmar isso com um multímetro no modo
de medição de tensão, ligando-o como mostra a Figura 3-4 e lendo a exposição como você girar o botão.
O vermelho sonda (positivo) deve ser ligado ao pino do meio, eo negro sonda (negativa) deve ser con-
conectado a qualquer lado é ligado à terra. Note-se que o seu potenciômetro e multímetro pode ser
diferente do que é mostrado aqui.
46 parte I ■ Arduino Engenharia Basics
const int POT = 0; // Pot on 0int pino analógico val = 0; // Variável para manter a
leitura analógica do POT
void setup ()
{
Serial.begin (9600);
}
void loop ()
{
val = analogRead (POT);
Serial.println (val); atraso (500);
}
48 parte I ■ Arduino Engenharia Basics
Você vai investigar a funcionalidade da interface serial mais nos próximos capítulos.
Por enquanto, apenas estar ciente de que a interface serial para o computador deve ser iniciado em
a configuração. Serial.begin () Recebe um argumento que especifica a comunicação
velocidade ou taxa de transmissão. otaxa de transmissãoespecifica o número de bits a serem transferidos
por segundo. taxas de transmissão mais rápidas permitem-lhe transmitir mais dados em menos tempo,
mas também pode introduzir erros de transmissão em alguns sistemas de comunicação. 9600 é um valor
comum, e é o que você usa ao longo deste livro.
Depois de colocar essa informação em seu Arduino, você notará que o LED de TX no seu
Arduino pisca a cada 500ms (pelo menos deveria ser). Este LED indica que o Arduino está transmitindo
dados através da ligação USB ao terminal serial no seu computador. Você pode usar uma variedade de
programas de terminal para ver o que o seu Arduino está enviando, mas o Arduino IDE
convenientemente tem um construído na direita!
Clique no botão circulado mostrado na Figura 3-5 para iniciar o monitor serial.
Depois de lançar o monitor serial, você deverá ver uma janela com números
streaming de perto. Gire o botão e você verá os números de ir para cima e para baixo para
correspondência com a posição do potenciómetro. Se você ligá-lo todo o caminho em uma direção, os
números devem se aproximar
0, E se você transformá-lo todo o caminho
no outro sentido, os números devem se aproximar 1023. Será parecido com o
exemplo mostrado na Figura 3-6.
sensores analógicos para controlar outras peças de hardware. Por agora, você usa o familiar
LED, mas nos próximos capítulos você usa motores e outros dispositivos de saída para visualizar suas
entradas analógicas.
50 parte I ■ Arduino Engenharia Basics
UsingAnalogSensors
Embora potenciómetros gerar um valor de voltagem analógico num pino, que não são realmente sensores
no sentido tradicional. Eles "sentir" o seu giro da marcação, mas isso fica chato muito rapidamente. A boa
notícia é que todos os tipos de sensores geram valores de saída analógicos correspondentes à acção
"mundo real". Exemplos de tais incluem o seguinte:
Acelerómetros que detectam a inclinação (muitos smartphones e tablets agora têm as)
■■
Os sensores de temperatura que podem lhe dizer sobre o ambiente operacional do seu projeto
■■
www.exploringarduino.com/parts/IR-Distance-Sensor
www.exploringarduino.com/parts/TMP36
.
www.analog.com
Crédito: Analog Devices, Inc.,
Figura 3-7: Tensão para Correlação de temperatura
www.exploringarduino.com/parts/TriAxis-Analog-Accelerometer
acelerômetros triplo eixo são grandes para a detecção de orientação. Acelerómetros de saída
analógica um valor analógico correspondente a cada um dos eixos de
www.exploringarduino.com/parts/DualAxis-Analog-Gyroscope
Os giroscópios, ao contrário de acelerómetros, não são afectados pela gravidade. sua analógico
tensões de saída variar em conformidade com a aceleração angular em torno de um eixo. Estes
revelar-se particularmente útil para detectar movimentos de torção. Para um exemplo de um
giroscópio em ação com um Arduino, confira o meu SudoGlove, uma luva eu projetei que captura
gestos para controlar o hardware como sintetizadores de música e carros de RC:
www.sudoglove.com. Gostar
acelerômetros, estar ciente de que muitos giroscópios são 3.3V partes.
Agora que você já escolheu um sensor, é hora de colocar esse sensor para usar.
52 parte I ■ Arduino Engenharia Basics
Para começar, o fio de seu LED RGB como fez no capítulo anterior, e
fio do sensor de temperatura até 0 entrada analógica, como mostrado na Figura 3-8.
Usando este circuito, você vai fazer um sistema de alerta de temperatura simples. A luz
acenderá em verde quando a temperatura está dentro de uma faixa aceitável, ficará vermelho quando
fica muito quente, e ficará azul quando fica muito frio.
Primeiro de tudo, você precisa saber quais os valores que você deseja usar como seu
cortes. Usando o mesmo desenho exato da Listagem 3-1, utilize o monitor serial
para descobrir o que os valores analógicos correspondem à temperatura de pontos de corte que você
preocupam. Meu quarto é de cerca de 20$C, o que corresponde a uma leitura de cerca de analógico 143.
Estes números podem ser diferentes para você, para lançar o esboço de antes, abra o terminal serial, e
dar uma olhada nas leituras que você está recebendo. Você pode confirmar os valores matematicamente
usando o gráfico da Figura 3-7. No meu caso, um valor de 143/1023 corresponde a uma entrada de tensão
de cerca de 700mV.
Derivando da folha de dados, a seguinte equação pode ser usada para converter
entre a temperatura ($C) e a tensão (mV):
Ligar o valor de 700mV, você pode confirmar que equivale a uma temperatura
tura de 20$C. Usando a mesma lógica (ou simplesmente observando a janela de série e escolher um
valor), você pode determinar que 22$C é um valor digital
147e
18$C é um valor digital 139. Esses valores servirão como pontos de corte que irão mudar a cor do LED
para indicar que ele está muito quente ou muito frio. usando o
void setup ()
{
pinMode (Bled, OUTPUT); LED // Set Azul como OutputpinMode (GLED,
OUTPUT); LED // Set Verde como saída
54 parte I ■ Arduino Engenharia Basics
void loop ()
{
val = analogRead (TEMP);
Se (val <LOWER_BOUND)
{
digitalWrite (RLED, LOW);
digitalWrite (GLED, LOW);
digitalWrite (Bled, HIGH);
}
else if (val> UPPER_BOUND)
{
digitalWrite (RLED, HIGH);
digitalWrite (GLED, LOW);
digitalWrite (Bled, LOW);
}
outro
{
digitalWrite (RLED, LOW);
digitalWrite (GLED, HIGH);
digitalWrite (Bled, LOW);
}
}
Esta listagem de código não introduz novos conceitos; em vez disso, ele combina o
você aprendeu até agora para fazer um sistema que usa as entradas e saídas para interagir com o
ambiente. Para testá-lo, apertar o sensor de temperatura com os dedos ou exalar sobre ele para aquecê-
lo. Soprar para esfriá-la.
UsingVariableResistorstoMakeYourOwnAnalogSensors
Graças à física, toneladas de dispositivos resistência à mudança, como resultado da ação física.
Por exemplo, algumas tintas condutoras mudar resistência quando esmagado ou flexionada (sensores de
força e sensores Flex), alguns semicondutores mudar a resistência ao ser atingido pela luz
(fotorresistências), e alguns polímeros mudar resistência quando aquecido ou resfriado (termistores). Estes
são apenas alguns exemplos de componentes que você pode aproveitar para construir seus próprios
sensores analógicos. Porque estes sensores estão mudando a resistência e não de tensão, você precisa
criar um circuito divisor de tensão para que você possa medir a sua mudança de resistência.
Capítulo 3 ■ Leitura Sensores analógicos 55
UsingResistiveVoltageDividers
Um divisor de tensão resistivo utiliza duas resistências de saída de uma tensão que é uma fracção da
tensão de entrada. A tensão de saída é uma função directamente relacionada com o valor das duas
resistências. Assim, se um dos resistores é um resistor variável, é possível monitorizar a alteração na
tensão do divisor de tensão que resulta da
variando de resistência. O tamanho do outro resistor pode ser usado para definir a sensibilidade
do circuito, ou você pode usar um potenciômetro para fazer a sensibilidade ajustável.
Primeiro, considere um divisor de tensão fixa e as equações associados com ele, tal como
mostrado na Figura 3-9. A0 na Figura 3-9 refere-se a pino analógico 0 no Arduino.
Neste caso, a tensão de entrada é 5V, ea tensão de saída é o que você vai ser
da introdução em um dos pinos analógicas do Arduino. No caso em que R1 e R2 são combinados (ambos
10k por exemplo), a 5V é dividido por dois para fazer 2.5V na entrada analógica. Confirmar esta ligando
valores na equação:
Suponhamos agora que um desses resistores é substituído com uma resistência variável, tal
como um fotoresistor. Fotorresistências (veja a Figura 3-10) resistência a mudança dependerá-ing sobre
a quantidade de luz que os atinge. Neste caso, eu vou optar por usar um photoresistor 200kΩ. Quando
em completa escuridão, a sua resistência é de cerca de 200kΩ; quando saturado com luz, a resistência
cai para quase zero. Se você optar por substituir R1 ou R2 e qual o valor que você escolher para fazer o
resistor fixo vai afetar a escala ea precisão das leituras que você recebe. Experimente
com diferentes configurações e usando o monitor serial para ver como seus valores
alterar. Como exemplo, vou optar por substituir R1 com o photoresistor, e eu vou fazer R2 um resistor de
10k (veja a Figura 3-11). Você pode deixar o LED RGB no lugar
Por enquanto, porém você só vai usar uma das cores para este exercício.
www.element14.com
Crédito: element14,
Carregar o seu esboço impressão serial fiel novamente (Listagem 3-1) e tente alte-
ing as condições de iluminação sobre o photoresistor. Segurá-la até uma luz e um copo com as mãos. As
probabilidades são, você não vai estar a bater toda a gama de
0-1023 porque a resistência variável nunca terá uma resistência de zero. Em vez,
provavelmente você pode descobrir os valores máximos e mínimos que são susceptíveis de receber.
Você pode usar os dados do seu photoresistor para fazer um mais
nightlight inteligente. O nightlight deve ficar mais brilhante como a sala fica mais escura,
e vice versa. Usando o seu esboço monitor serial, escolher os valores que representam quando o seu
quarto está em pleno brilho ou escuridão completa. No meu caso, eu descobri que um quarto escuro tem
um valor de cerca de
200e uma sala completamente luminoso tem
um valor em torno 900. Estes valores irão variar para você com base em suas condições de iluminação, o
valor do resistor que você está usando, e o valor da sua photoresistor.
UsingAnalogInputstoControlAnalogOutputs
valoré a informação que você está começando com. No seu caso, isso é o mais
recente leitura da entrada analógica. fromLowe fromHighsão a entrada
fronteiras. Estes são valores que você encontrou para corresponder ao mínimo e máximo brilho no
seu quarto. No meu caso, eles eram
200e 900. muito baixo
e toHighsão os valores que você deseja mapeá-los para. Porque analogWrite ()
espera valor entre 0e 255, Você pode usar esses valores. No entanto, queremos um ambiente mais escuro
para mapear a um LED mais brilhante. Portanto, quando a entrada do ADC é um valor baixo, você quer a
saída para o LED para ser um valor alto, e vice-versa.
58 parte I ■ Arduino Engenharia Basics
// Nightlight automática
const int RLED = 9; LED // vermelha no pino 9 (PWM) const int LUZ = 0; // Lght
Sensor no pino analógico 0const int MIN_LIGHT = 200; // Mínima esperada int
MAX_LIGHT luz valueconst = 900; // Máxima esperada valueint Luz val = 0; //
Variável para manter a leitura analógica
void setup ()
{
pinMode (RLED, OUTPUT); // Conjunto de LED do pino como saída
}
void loop ()
{
val = analogRead (LUZ); // Leia a luz sensorval = map (val, MIN_LIGHT, MAX_LIGHT, 255, 0); //
Mapa a luz readingval = constranger (val, 0, 255); // Restringir luz valueanalogWrite (RLED,
val); // Controle o LED
}
Capítulo 3 ■ Leitura Sensores analógicos 59
Observe que esse código reutiliza o valvariável. Você pode, alternativamente, usar uma dife-
variável rentes para cada chamada de função. Em funções, tais como mapa()Onde valé
tanto a entrada e a saída, o valor anterior de valé usada como entrada,
e seu valor é redefinido para o valor actualizado quando a função foi concluída.
Brincar com o seu nightlight. Será que funciona como esperado? Lembre-se, você
pode ajustar a sensibilidade alterando os limites mínimos e máximos de
a função de mapeamento ou alterar o valor do resistor fixo. Use o monitor serial
para observar as diferenças com configurações diferentes até encontrar um que funciona melhor. você
pode combinar este esboço com o nightlight de selecção de cores que você projetou no capítulo
anterior? Tente adicionar um botão para alternar entre as cores e usar o photoresistor para ajustar o
brilho de cada cor.
Resumo
II
Controlar o Seu Ambiente
InThisPart
Usando transistores e
Motores de condução
63
64 parte II ■ Controlar o Seu Ambiente
DC
motorBreadboardPotentiome
terSN754410 H-Bridge IC
downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch4 .
tipos de motores e atuadores, e com a ajuda de transistores, você pode usar seu
Arduino para gerar ação física no mundo real. Por motores de emparelhamento com o seu Arduino,
você pode dirigir robôs, construir braços mecânicos, adicionar um grau adicional de liberdade para
distanciar sensores, e muito mais.
Neste capítulo, você aprenderá a controlar cargas indutivas como corrente contínua
(DC) motores, como usar transistores para alternar dispositivos de alta corrente, e como fazer a interface
com atuadores de precisão (ou seja, servo motores). No final deste capítulo, você construir um sensor de
distância de varredura capaz de identificar a loca-ção de obstáculos próximos. Este sensor é perfeito para
a montagem sobre um carro robótico auto-condução, por exemplo. Tendo completado este capítulo, você
terá todas as habilidades que você precisa para construir uma máquina que você pode realmente interagir
com!
DrivingDCMotors
motores de corrente contínua, que você pode encontrar em vários dispositivos em sua casa, girar
continuamente quando uma voltagem CC é aplicada através deles. Tais motores são com-mumente
encontrado como os motores de condução em controle de rádio (RC) carros, e como os motores que
fazem os discos girar no seu leitor de DVD. DC motores são grandes, porque eles vêm em uma enorme
variedade de tamanhos e são geralmente muito barato. Ajustando a tensão de aplicar a eles, você pode
mudar a sua velocidade de rotação. Ao inverter a direção da tensão aplicada a eles, você pode mudar
sua direção de
rotação bem. Isso geralmente é feito usando um H-ponte, que você aprende
mais adiante neste capítulo.
motores de corrente contínua escovado, Como a que você está usando para este capítulo, empregam
ímãs estacionários e uma bobina de fiação. A electricidade é transferido para a bobina
usando "escovas", daí a razão pela qual eles são chamados escovadomotores de corrente contínua. Ao
contráriobrushlessmotores de corrente contínua (tais como motores de passo), motores DC escovado são
baratos e têm controle de velocidade mais fácil. No entanto, escovado motores DC não duram tanto
tempo porque as escovas podem desgastar-se ao longo do tempo. Estes motores funcionam através de
uma força indutiva. Quando a corrente passa através da bobina de fiação, que gera um campo magnético
que é atraído para um ou outro ou repelidos pelos magnetos estacionários, dependendo da polaridade.
Ao usar as escovas para trocar a polaridade cada meia rotação, você pode gerar momento angular. A
mesma configuração exacta pode ser usado para criar um gerador de se activar manualmente o induzido.
Isto irá gerar um campo magnético flutuante que irá, por sua vez, geram corrente. Isto é como geradores
hidroeléctricas trabalhar-caindo a água se transforma o veio, e uma corrente é produzido. Esta
capacidade para criar corrente no sentido oposto é por isso que você vai usar um diodo mais adiante
neste capítulo para garantir que o motor não pode enviar corrente de volta para o seu circuito quando é
forçado virou.
HandlingHigh-CurrentInductiveLoads
motores de corrente contínua em geral, exigem mais corrente do que built-in potência do Arduino
alimentação pode fornecer, e eles podem criar picos de tensão prejudiciais devido à sua indução
natureza tiva. Para resolver esse problema, você primeiro aprender a isolar efetivamente um motor de
corrente contínua a partir do seu Arduino e, em seguida, como ligá-lo usando uma oferta secundária.
Um transistor vai permitir que o Arduino para desligar o motor ligado e desligado com segurança, bem
como controlar a velocidade usando as técnicas de modulação por largura de pulso (PWM) que você
aprendeu no Capítulo 3, "Leitura Sensores analógicos." Referência do esquema mostrado na Figura 4-1
como você aprender sobre os vários componentes que entram em conectar um motor de corrente
contínua a um Arduino com uma fonte de alimentação secundária.
Antes de ligar o seu motor de corrente contínua, é importante compreender o que todos
esses componentes estão fazendo:
Um resistor 1k é usado para separar o pino base do transistor do pino do Arduino controlo.
■■
U1 é o motor DC.
■■
transistor para fazer um simples interruptor controlado eletricamente. Cada BJT tem três pinos (ver
figura 4-2): O emissor (E), o coletor (C) e a base (B).
E
3C
2B
1E
Figura 4-2: Um NPN BJT
o transistor, e o motor gira como um resultado. O 5V gerado pelas / O pins Arduino eu mais do que
suficiente para ligar o transistor. Tirando proveito de PWM, você pode controlar a velocidade do motor
girando rapidamente o transistor ligado e desligado. Porque o motor pode manter a dinâmica, o dever de
o ciclo do sinal PWM determina a velocidade do motor. O transistor é essencialmente conectar e
desconectar uma ligação do motor a partir do solo e determinar quando um circuito completo pode ser
feito com a bateria.
É importante considerar problemas causados por motores DC agindo como indutores. (indutoressão
dispositivos eléctricos que armazenam energia nos seus campos magnéticos e resistem a alterações na
corrente.) como o motor de corrente contínua gira, a energia é acumulada e armazenada na indutância
das bobinas do motor. Se o poder é instantaneamente removido do
Note-se, assim, a partir do diagrama de circuito mostrado na Figura 4-1 que o poder sup-ply para o
motor é 9V, em vez do habitual 5V a partir da conexão USB que você está usando. Para os efeitos
desta experiência, uma bateria de 9V é suficiente, mas você também pode usar um adaptador de
parede AC-DC. A razão para usar uma fonte de energia separada do Arduino do built-in fonte de 5V é
duplo:
1. Usando uma alimentação separada, você reduz as chances de que a fiação inadequada de um
circuito de alta potência poderiam prejudicar o seu Arduino.
2. Você pode tirar proveito de limites de corrente mais altas e mais altas tensões.
Alguns motores de corrente contínua pode consumir mais corrente do que o fornecimento Arduino 5V pode
fonte. Além disso, muitos motores são classificados em tensões superiores a 5V. embora eles
pode girar em 5V, você pode alcançar sua velocidade máxima de apenas 9V ou 12V (dependendo das
especificações do motor).
Note que você deve conectar o chão de ambos sua fonte de alimentação secundária
eo chão Arduino. Esta ligação assegura um ponto de referência comum entre os níveis de tensão nas
duas partes do circuito.
Fiação do Motor
Agora que você entende os meandros de controlar um motor DC escovado, é hora de fazê-lo com fio
acima em sua placa de ensaio. Tente conectá-lo apenas por referência ao esquema anterior (mostrado
na Figura 4-1). Depois de ter tentado montar o circuito usando apenas o esquema, referência a versão
gráfica mostrada na Figura 4-3 para confirmar que você wired-lo corretamente.
1. Certifique-se de que está conectado a terra de sua bateria de 9V para o chão do seu Arduino.
Você pode querer usar o ônibus horizontal na placa de ensaio para alcançar este objetivo, conforme
mostrado na Figura 4-3.
2. Certifique-se de que o fornecimento de 9V não está ligado à fonte de 5V. Na verdade, você não
precisa mesmo de ligar a fonte de 5V à placa de ensaio.
3. Certifique-se de que a orientação do transistor está correto. Se você não estiver usando o mesmo
NPN BJT listado na lista de peças para este capítulo, referência a folha de dados para garantir que o
emissor, base e coletor está conectado
Capacitor
Transistor
Bateria
4. Certifique-se de que a orientação do diodo é correto. A corrente flui desde o lado sem listra para
o lado com a tira. A listra no dispositivo physi-cal corresponde a linha no símbolo esquemático. Você
usa uma cerâmica
Em seguida, é hora de começar este motor girando. Você pode querer anexar um pedaço
de fita ou de uma roda para a extremidade do motor, de modo que pode ver mais facilmente a
velocidade à qual ele está girando. Antes de escrever o programa, você pode confirmar que o circuito
está a funcionar correctamente, fornecendo energia para o Arduino através da conexão USB, ligar a
bateria de 9V, e conectar o pino da base do transistor (após o resistor) diretamente para 5V do Arduino.
Isso simula um alto comando lógico e deve fazer a rotação do motor. Ligar esse mesmo fio para a terra
irá garantir que ele não gira. Se isso não funcionar, verifique sua fiação antes de passar para a próxima
etapa: programação.
70 parte II ■ Controlar o Seu Ambiente
ControllingMotorSpeedwithPWM
Primeiro, você pode usar um programa muito semelhante ao que você usou para ajustar o brilho LED de
sua luz noturna no Capítulo 3 para ajustar a velocidade do seu motor. Através do envio de sinais
variados ciclo de trabalho para o transistor, o fluxo de corrente através do motor rapidamente inicia e
para que resulte uma alteração na velocidade. Experimentar o programa na Listagem 4-1 a rampa
repetidamente a velocidade do motor para cima e para baixo.
void setup ()
{
pinMode (MOTOR, OUTPUT);
}
void loop ()
{
for (int i = 0; i <256; i ++)
{
analogWrite (MOTOR, i); delay (10);
}
delay (2000); for (int i = 255; i> =
0; i--)
{
analogWrite (MOTOR, i); delay (10);
}
atraso (2000);
}
Se tudo está ligado corretamente, este código deve lentamente rampa do motor
acelerar, em seguida, voltar para baixo novamente em um loop. Usando essas técnicas, você poderia
facilmente fazer um robô mecha simples.
Em seguida, você pode combinar seus novos conhecimentos sobre motores de corrente contínua com o seu
conhecimento de sensores analógicos. Usando um potenciômetro, você pode ajustar manualmente a
velocidade do motor. Para começar, adicionar um potenciómetro ao pino analógico 0, como mostrado
nas
Figura 4-4. Observe que é necessário conectar o pino 5V do Arduino ao
trilho de alimentação na placa de ensaio, se você quiser ligar o potenciômetro para essa linha no
tabuleiro.
Capítulo 4 ■ Usando transistores e condução Motors 71
Capacitor
Transistor
Bateria
Agora você pode modificar o programa para controlar a velocidade do motor com base na
presente definição do potenciômetro. Com o potenciômetro em zero, o motor pára; com o potenciômetro
girado totalmente, o motor funciona em velocidade máxima. Lembre-se que o Arduino está sendo
executado muito rápido; ele está realmente em execução através do laço
int val = 0;
void setup ()
{
pinMode (MOTOR, OUTPUT);
}
void loop ()
{
val = analogRead (POT); val = map (val, 0,
1023, 0, 255); analogWrite (MOTOR, val);
Um monte de este código deve parecer familiar a partir de sua experiência de negociação anterior
com sensores analógicos. Note-se que o constrangerfunção não é necessária quando
usando um potenciômetro, porque você pode usar toda a gama de entrada, eo valor nunca vai abaixo 0ou
acima 1023. Depois de carregar o código para o seu Arduino, ajustar o pote e observar a velocidade da
mudança em conformidade motor.
UsinganH-BridgetoControlDCMotorDirection
Assim, você pode mudar DC velocidade do motor. Isso é ótimo para a fabricação de rodas em um
Arduino controlado robô ... contanto que você só quer dar um impulso. Qualquer motor de corrente
contínua útil deve ser capaz de girar em dois sentidos. Para conseguir isso, você pode usar um
dispositivo prático chamado deH-ponte. A operação de uma ponte-H
você pode descobrir por que ele é chamado de H-ponte? Observe que o motor no com-
combinação com os quatro interruptores forma um maiúscula H. Embora o diagrama
mostra-lhes como interruptores, os componentes de comutação são realmente transistores,
semelhantes aos que utilizou no exercício anterior. Alguns circuitos adicionais, incluindo diodos de
proteção, também é construída no circuito integrado da H-ponte.
O H-ponte tem quatro principais estados de funcionamento: aberto, travagem, para a frente, e
para trás. No estado aberto, todos os interruptores estão abertos e o motor não irá girar. No estado para a
frente, dois interruptores diagonalmente opostas estão envolvidos, fazendo com que a corrente flua de 9V,
através do motor, e para baixo para terra. Quando o
BeawareofoneextremelyimportantconsiderationwhenusingH-bridges.Whatwouldhappenifbothswitchesontheleftorbothswitc
Itwouldcauseadirectshortbetween9Vandground.Ifyou'veevershorteda9Vbatterybefore, youknowthatthisisnotsome-thingyou
inrarecircumstances, couldburstorleak.Furthermore, ashortcoulddestroytheH-bridgeorotherpartsofthecircuit.AnH-
bridgeisararescenariowhereyoucouldpotentiallydestroyapieceofhardwarebyprogrammingsomethingwrong.Forthisexperime
HDriver.Thischiphasabuilt-inthermalshutdownthatshouldkickinbeforeashortcircuitdestroysanything, butit'sstillagoodideato
Toensurethatyoudon'tblowanythingup,sempredisablethechipbefore
flippingthestatesofanyoftheswitches.Thisensuresthatashortcannotbecreatedevenwhenyouquicklyswitchbetweenmotordire
oneforcontrollingthetoptwogates, oneforcontrollingthebottomtwogates, andoneforenablingthecircuit.
Com as considerações anteriores em mente, é hora de construir o circuito. O chip ponte-H que você
usa é o motorista SN754410 Quádruplo Half-H. Two Half-H
condutores são combinadas em um controlador completa-H, tal como o mostrado na Figura 4-5.
Para este exercício, basta usar dois dos quatro pilotos Half-H para conduzir um motor DC. Se você
quiser fazer um carro de RC, por exemplo, você poderia usar este chip para controlar dois motores DC
(um para as rodas da esquerda e um para as rodas direita). Antes de realmente obtê-lo prendido
acima, dê uma olhada no pin-out e mesa lógica da folha de dados do item (veja a Figura 4-6).
74 parte II ■ Controlar o Seu Ambiente
Pin numeração em circuitos integrados (ICs) começa sempre no pino superior esquerdo
e vai em torno da parte anti-horário. Fritas sempre terá algum tipo de indicador para mostrar o pino que é
Pin 1, de modo que você não ligar o IC na cabeça para baixo. Em partes através de buracos (que é o que
você vai usar exclusivamente neste capítulo), um semi-círculo em uma extremidade do chip indica o topo
do chip (onde o pino 1 está localizado). Alguns chips podem ter um pequeno círculo marcada ao lado de
um pino sobre o invólucro de plástico, além de, ou em vez do semi-círculo.
GND (pinos 4, 5, 12, e 13): Os quatro pinos no meio conectar a um terreno compartilhado entre
■■
seus 9V e 5V suprimentos.
V
■■ (Pin 8): V fornece a corrente do motor, de modo que o ligar ao 9V.
CC2 CC2
V
■■ (Pin 16): V poderes lógica do chip, para que você conectá-lo a 5V.
CC1 CC1
1Y e 2A (pinos 3 e 6):Estas são as saídas do controlador para a esquerda. Os fios do motor ligar a
■■
estes pinos.
1A e 2A (pinos 2 e 7): Os estados dos interruptores à esquerda são con-trolada por estes pinos,
■■
1,2EN (Pin 1):Este pino é usado para ativar ou desativar o driver esquerda. Ele é ligado a um
■■
pino de PWM no Arduino, de modo que a velocidade pode ser controlada dinamicamente.
Porque você está usando apenas o motorista esquerda, você pode deixá-los desligados.
controlados por estes pinos, mas você estiver usando apenas o condutor esquerda neste
exemplo, para que você possa deixá-los desligados.
Capítulo 4 ■ Usando transistores e condução Motors 75
3,4EN (Pin 9):Este pino é usado para ativar ou desativar o driver correto. Porque
■■
você não vai estar usando o driver correto, você pode desativá-lo, ligando este pino
diretamente para GND.
Para referência, confirme sua fiação com a Figura 4-7. Mantenha o potenciômetro
com fio, como era antes.
Bateria
H-ponte
motor DC
Você pode confirmar que o circuito está a funcionar antes de programá-lo enganchando
-se o pino de permitir a 5V, ligando um dos UMA pinos para a terra, ea outra UMA
fixar a 5V. Você pode inverter a direção, trocando o que oUMA pinos estão conectados.
ATENÇÃO Youshoulddisconnectthe9VbatterywhileswappingtheUMApinsto
ensurethatyoucan'tpossiblycauseanaccidentalshortcircuitwithintheH-ponte.
76 parte II ■ Controlar o Seu Ambiente
Em seguida, você escrever um programa para controlar a direcção do motor e velocidade usando
o potenciômetro eo H-ponte. Ajuste do potenciómetro em uma faixa intermediária
pára o motor, definindo o potenciómetro numa gama acima do meio aumenta a velocidade para a frente, e
definir o potenciómetro numa gama abaixo do meio aumenta a velocidade para trás. Esta é mais uma
oportunidade perfeita para empregar funções em seu programa Arduino. Você pode escrever uma função
para parar o motor, um para fazer com que ele gire para a frente a uma velocidade set, e uma para causar-
lhe a girar para trás a uma velocidade set. Certifique-se de desativar corretamente o H-ponte no início da
função antes de alterar o modo de motor; isso reduz a probabilidade de que você vai cometer um erro e
acidentalmente curto o H-ponte.
Seguindo o diagrama lógico da Figura 4-6, você pode rapidamente descobrir como
é preciso controlar os pinos para alcançar os resultados desejados:
Para interromper o fluxo de corrente através do dispositivo, defina o pino de baixo habilitar.
■■
Para definir as opções para a rotação em uma direção, definir um alto, outro baixo.
■■
Para definir comutadores para a rotação no sentido oposto, de comutação que é elevado e que
■■
é de baixo.
Para fazer com que o motor pare imediatamente, defina ambos os interruptores baixa.
■■
NOTA Alwaysdisablethecurrentflowbeforechangingthestateoftheswitches
toensurethatamomentaryshortcannotbecreatedastheswitchesflip.
Primeiro, você deve desenvolver as funções que com segurança executar o anteriormente
movimentos descritos. Criar um novo esboço Arduino e começar a escrever o seu
novas funções:
{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
HIGH); analogWrite (PT, a taxa);
Capítulo 4 ■ Usando transistores e condução Motors 77
// Pára freio
motorvoid ()
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
LOW); digitalWrite (PT, HIGH);
void loop ()
{
val = analogRead (POT);
// Ir forwardif (val>
562)
{
velocidade = map (val, 563, 1023, 0, 255); para a frente
(velocidade);
// Ir backwardelse if (val
<462)
{
= velocidade de mapa (Val, 461, 0, 0, 255); reversa
(velocidade);
// brakeelse
{
freio();
}
}
são convertidas em valores digitais entre 0 e 1023. Consultar a Figura 4-8 para melhor
compreender o esquema de controle e comparar isso com o código de ciclo anterior.
Quando o potenciómetro se encontra dentro dos 100 unidades que rodeiam o ponto central,
a freiofunção é chamada. Conforme o valor aumenta de potenciómetro 562para
1023, A velocidade aumenta a frente. Da mesma forma, a velocidade de aumento no inverso
direção entre valores potenciômetro de 462e 0. omapafunção deve
parece familiar para você a partir do capítulo anterior. Aqui, ao determinar o
velocidade reversa, observe a ordem das variáveis: 461é mapeado para 0e 0é
mapeado para 255; amapafunção pode inverter o mapeamento, quando as variáveis são passados em
ordem decrescente. Colocar o loop juntamente com as funções e oconfiguração, Você recebe um
programa completo que se parece com o mostrado na Listagem 4-3. Certifique-se de que o seu
programa corresponde a um aqui e carregá-lo em seu Arduino.
void setup ()
{
pinMode (PT, OUTPUT); pinMode (MC1, OUTPUT);
pinMode (MC2, OUTPUT); freio (); // Inicializar com
motor parado
void loop ()
{
val = analogRead (POT);
// Ir forwardif (val>
562)
{
Capítulo 4 ■ Usando transistores e condução Motors 79
// Ir backwardelse if (val
<462)
{
= velocidade de mapa (Val, 461, 0, 0, 255); reversa
(velocidade);
// brakeelse
{
freio();
}
}
{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
HIGH); analogWrite (PT, a taxa);
// Pára freio
motorvoid ()
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
LOW); digitalWrite (PT, HIGH);
Será que tudo funciona como esperado? Se não, certifique-se de que você fio o seu
circuito corretamente. Como um desafio adicional, pegue um segundo motor DC e um gancho
-lo para a outra metade do chip ponte-H. Você deve ser capaz de conduzir dois
motores em simultâneo com o mínimo esforço.
80 parte II ■ Controlar o Seu Ambiente
DrivingServoMotors
motores de corrente contínua servir como excelentes motores de acionamento, mas eles não são tão ideal
para trabalhos de precisão, porque nenhum feedback ocorre. Em outras palavras, sem o uso de um encoder
externo de algum tipo, você nunca vai saber a posição absoluta de um motor DC. servo motores, ou servos,
em contraste, são os únicos que você comandá-los para rodar para uma posição angular particular e eles
ficam lá até que você diga a eles para se mover para uma nova posição. Isto é importante para quando
você precisa mover o seu sistema para uma posição conhecida. Exemplos incluem a actuação fechaduras
de portas, movendo
UnderstandingtheDifferenceBetweenContinuousRotationandStandardServos
Você pode comprar ambos os servos de rotação padrão e contínuos. servos não modificados
ter sempre uma faixa fixa (geralmente de 0 a 180 graus), porque existe uma
potenciômetro em linha com o eixo de acionamento, que é usado para relatar a posição pres-ent. servo-
controlo é conseguido através do envio de um impulso de um determinado comprimento. O comprimento
do pulso, no caso de uma rotação do servo padrão, determina a posição absoluta que o servo irá rodar
para. Se remover o potenciómetro, no entanto, o servo é livre para rodar continuamente, e o
comprimento de impulso define a velocidade do motor, em vez.
Neste livro, você usa servos standard que giram para uma posição absoluta. Você
pode experimentar com servos rotação contínua, quer através da abertura de um padrão
servo e remover com cuidado o potenciômetro, ou através da compra premodified
servos configurado para rotação contínua.
UnderstandingServoControl
Ao contrário de suas contrapartes do motor DC, servo motores têm três pinos: Potência (usu-aliado
vermelho), terra (geralmente marrom ou preto), e de sinal (geralmente de cor branca ou laranja). Estes
fios são codificados por cores, normalmente na mesma ordem, e geralmente olhar como os mostrados
na Figura 4-9. Alguns fabricantes podem usar ordenação não-padrão, por isso sempre se esqueça de
verificar a folha de dados para garantir que está a fiação do servo corretamente.
A coloração pode variar ligeiramente entre servos, mas os esquemas de cores listados
anteriormente são os mais comuns. (Verifique a documentação do servo se você estiver
inseguro.) Como motores de corrente contínua, servos pode tirar um pouco de uma corrente (normalmente
Capítulo 4 ■ Usando transistores e condução Motors 81
mais do que o Arduino pode fornecer). Embora às vezes você pode executar um ou dois servos
diretamente da fonte de 5V do Arduino, você aprender aqui como usar uma fonte de alimentação
separada para os servos de modo que você tem a opção de adicionar mais
se você precisar.
Servos têm um pino de controle dedicado, ao contrário de motores de corrente contínua, que instrui-los
que posição a quem recorrer. As linhas de alimentação e terra de um servo deve sempre ser
conectado a uma fonte de energia constante.
Servos são controlados usando larguras de pulso ajustável na linha de sinal. Para
um servo standard, o envio de um pulso 1ms 5V liga o motor para 0 graus, e enviando um pulso 2ms 5V
liga o motor a 180 graus, com comprimentos de pulso no meio de escala de forma linear. Um pulso
1.5ms, por exemplo, o motor gira a 90 graus. Uma vez que um pulso foi enviada, o servo se volta para
essa posição e estadias
lá até que outra instrução de pulso é recebido. No entanto, se você quer um servo para
"Segurar" a sua posição (resistir a ser empurrado e tentar manter a posição exata),
você apenas reenviar o comando uma vez a cada 20 ms. Os comandos de servo Arduino que serão,
posteriormente empregar cuidar do presente para você. Para entender melhor como funciona o controle
de servo, estudar o diagrama de tempo mostrado na Figura 4-10.
82 parte II ■ Controlar o Seu Ambiente
Note-se que em cada um dos exemplos na Figura 4-10 do impulso é enviado a cada 20ms.
Como o comprimento do pulso aumenta de 1 ms a 2 ms, o ângulo de rotação do
motor (mostrado à direita do gráfico de pulso) aumenta de 0 a 180 graus.
Como mencionado antes, servos pode desenhar mais corrente do que o Arduino pode
ser capaz de fornecer. No entanto, a maioria dos servos são projetados para funcionar em 5V, não 9V ou
12V como um motor DC. Mesmo que a tensão é a mesma que a de um Arduino, você quer usar uma fonte
de energia separada que pode fornecer mais corrente.
Para fazer isso, você aprender aqui como usar uma bateria de 9V e um regulador linear para
gerar uma fonte de 5V a partir de sua bateria de 9V. Um regulador linear é um dispositivo
extremamente simples, que geralmente tem três pinos: tensão de entrada, tensão de saída, e
terrestres. O pino terra está ligado tanto a base da alimentação de entrada e no chão da saída. No caso
dos reguladores lineares tensão, a tensão de entrada sempre deve ser maior do que a tensão de saída,
e a tensão de saída é ajustada a um valor fixo de acordo com o regulador de utilizar.
Usando todas essas informações, é hora de conectar um servo. Fazendo referência a Figura 4-12,
conectar o servo, o regulador de 5V, eo potenciômetro. Deixar o potenciômetro
ligado ao pino analógico 0, conectar o pino de controle servo ao pino 9, e garantir que o regulador de
5V fornece o poder do servo.
Enquanto fiação, tenha em mente algumas coisas importantes. Em primeiro lugar, garantir que você
ter a orientação correcta do regulador. Com a guia de metal no lado
mais distante de você, conectar a bateria ao pino mais à esquerda, o terreno para o pino central, ea linha
de alimentação do servo para o pino direita. Em segundo lugar, se estiver usando capacitores eletrolíticos
polarizados (como na Figura 4-12), certifique-se de colocá-los na direção correta. A faixa indica o terminal
negativo e deve ser ligado à terra comum. Certifique-se de que os pinos não tocam; caso contrário,
poderá provocar um curto. Depois que você está todo ligado, passar para a próxima seção para aprender
a programar o controlador servo.
84 parte II ■ Controlar o Seu Ambiente
capacitores de desacoplamento
Bateria
ItmakessensethatyouneedtouseanexternalsupplywithaDCmotorbecauseyouneedthehighervoltage, butwhydoesaservoneedanex
supplyifitisatthesamevoltageastheArduino? TheArduinogeneratesthe5VusedforthelogiceitherdirectlyfromtheUSBorbyusingabuilt-
inlinearregulatorwiththeDCbarreljackasthesupplyvoltage.WhenyouuseUSB, amaximumof500mAisavailabletotheArduinoandallitspe
becausethatiswhattheUSBspecificationallows.Whenyouuseanexternalsupplyofsufficientcurrent, thebuilt-inregulatorcansupplyupto1
Capítulo 4 ■ Usando transistores e condução Motors 85
Servoshaveatendencytoconsumecurrentinburstsastheyturn.They
generallyconsumelittlecurrentwhilestationary,
andtheyconsumeseveralhundredmilliampsforafewmillisecondswhentheyareactuated.Thesecurrentspikescanrippleonthe5V
componentes, likeLEDs.Bykeepingthesupplyfortheservoonaseparaterail, youensurethatthisdoesnothappen.
Insufficientcurrentforaservomightalsocauseittobehaveerratically.
. Whenyoufinishthefinalprojectforthischapter, tryhookingtheservosup-plypinuptothebuilt-in5Vrail (Don'tworry;. Thiswon'tda
WhentheservoispoweredoverUSB, youmayseetheservodoingallkindsofunexpectedmotionsduetoaninsufficientcurrentsupply
thedegreeofthisbehaviordependsonthespecificationofyourparticularservo.
ControllingaServo
O Arduino IDE inclui uma biblioteca interna que torna o controle servos um
brisa. Uma biblioteca de software é um conjunto de código que é útil, mas não é sempre necessária em
desenhos. O Arduino IDE contém um número de bibliotecas para tarefas com-mon. A biblioteca servo
abstrai as rotinas de tempo que você precisa para escrever em seu próprio país para pulsar o pino
servo. Tudo que você tem a fazer é anexar um "objeto" servo a um pino especial e dar-lhe um ângulo
para girar para. A biblioteca cuida do resto, mesmo definindo o pino como uma saída. A maneira mais
simples para testar a funcionalidade do seu servo é mapear o potenciômetro diretamente a posições
servo. Virando o potenciômetro para
#include <Servo.h>
void setup ()
{
myServo.attach (SERVO);
86 parte II ■ Controlar o Seu Ambiente
void loop ()
{
val = analogRead (POT); // Leia Potval = map (val, 0, 1023, 0, 179); // Escalá-lo
para myServo.write gama servo (val); // Define o atraso de servo (15); //
Espera para o servo
BuildingaSweepingDistanceSensor
Para encerrar este capítulo, você aplicar seu conhecimento a partir dos últimos capítulos para construir
um sensor de distância varrendo light-up. O sistema consiste de um infravermelho
sensor (RI) distância montado sobre um servo motor e quatro LEDs. À medida que o servomotor
ciclos, ele roda o sensor de distância ao redor da sala, o que lhe permite determinar aproximadamente
onde os objetos estão perto e onde eles estão agora. Os quatro LEDs cor-responder a quatro
quadrantes do brilho de varredura e mudança dependendo de como próximo um objeto é nesse
quadrante.
NOTA Youcanwatchademovideoofthesweepingdistancesensoronline:
www.exploringarduino.com/content/ch4.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Comece quente colando-o sensor de distância para o topo de um servo-motor, como mostrado
na Figura 4-13. Eu gosto de usar cola quente porque mantém bem e é bastante fácil de remover, se
você precisar. No entanto, você também pode usar super-cola, massa de vidraceiro, ou fita
PWM para controlar nesses dois pinos. Assim, foram escolhidas as outras quatro pinos PWM.
(Se você quer fazer este projecto com mais LEDs, use o Arduino Mega ou implementar uma solução
PWM software, algo que este livro não cobre.) Siga o diagrama de fiação na Figura 4-14 para
confirmar que você tem tudo
com fio corretamente. Eu escolhi usar LEDs azuis, mas você pode usar qualquer cor que você quiser.
Depois de ter tudo cabeada, considere gravá-la para baixo, como mostrado na Figura 4-13.
88 parte II ■ Controlar o Seu Ambiente
distância do IR
sensor
Dissociação
capacitores
Bateria
void setup ()
{
myServo.attach (SERVO); // Fixe o ServopinMode (LED1,
OUTPUT); // Conjunto de LED para OutputpinMode (LED2,
OUTPUT); // Conjunto de LED para OutputpinMode (LED3,
OUTPUT); // Conjunto de LED para OutputpinMode (LED4,
OUTPUT); // Conjunto de LED para saída
void loop ()
{
// Varrer o Servo em 4 regiões e alterar o LEDsdist1 = readDistance (15); // Medida
Distância IR em 15 degreesanalogWrite (LED1, dist1); // Ajuste Brightnessdelay LED
(300); // Atraso antes próxima medição
Resumo
motores de corrente contínua usar indução eletromagnética para criar ação mecânica
■■
de mudanças na atual.
Os motores são cargas indutivas que devem utilizar uma protecção adequada e os circuitos de
■■
velocidade do motor de corrente contínua e a direcção pode ser controlada com PWM e uma ponte-H.
■■
Arduino Servo.
Um regulador linear pode ser utilizado para criar uma fonte de 5V secundário a partir de uma
■■
bateria de 9V.
fazendo Sounds
Arduino UnoUSB
cablePushbuttons (n5)
10kohms resistores (n5)
altifalante 150Ω
resistorJumper
wiresBreadboard10KΩ
potentiometer8Ω
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch5 .
91
92 parte II ■ Controlar o Seu Ambiente
Os seres humanos têm cinco sentidos. Como você deve ter adivinhado, você não vai ser a interface
o seu sentido do paladar com muitos produtos eletrônicos; lambendo seu Arduino é um pobre
idéia. Da mesma forma, cheiro não será geralmente entram em jogo. Na verdade, se você pode cheirar o seu
eletrônica, algo provavelmente está queimando (e você deve parar o que está fazendo). Isso só deixa os
sentidos do tato, visão e som. Você já interligado com potenciômetros e botões que se aproveitam de seu
senso de toque, e você ter ligado LEDs que fazem interface com você sentido da visão. Agora, o que
acontece com os seus sentidos auditivos? Este capítulo se concentra no uso do Arduino para fazer sons
para que você possa mais facilmente recolher feedback dos seus projetos.
UnderstandingHowSpeakersWork
Antes que você possa fazer sons com o Arduino, você precisa entender o que são sons e como os seres
humanos percebem-los. Nesta primeira seção, você aprenderá sobre como as ondas sonoras são geradas,
suas propriedades, e como a manipulação dessas propriedades pode produzir música, vozes, e assim por
diante.
ThePropertiesofSound
O som é transmitido através do ar como uma onda de pressão. Como um objeto, como um alto-falante,
um tambor, ou um vibra sino, esse objeto também vibra o ar em torno dele. À medida que as partículas
de ar vibrar, transferem energia para as partículas em torno deles, vibrando estas partículas também.
Desta forma, uma onda de pressão é transferida da fonte para o tímpano, criando uma reação em
cadeia de vibrar par-tigos. Então, por que você precisa saber isso para entender como fazer sons com o
Arduino?
Você pode controlar duas propriedades dessas partículas vibrando com o seu Arduino:
frequência e amplitude. ofreqüência representa quão rapidamente as partículas do ar
vibrar e para trás, eo amplitude representa a magnitude da sua
vibrações. No sentido físico, sons de amplitude mais elevados são mais altos, e os sons de amplitude mais
baixos são mais silenciosos. sons de alta frequência são um tom mais alto (como uma soprano), e sons de
baixa frequência são um tom mais baixo (como baixo). Considere o diagrama na Figura 5-1, que mostra
representações senoidais de ondas sonoras de várias amplitudes e frequências.
capítulo 5 ■ fazendo Sounds 93
Figura 5-1 mostra três notas de piano: baixo, médio e soprano C. Cada um
mostra as frequências dadas em ambas as amplitudes altas e baixas. Como exemplo, para entender
frequência e amplitude, foco no meio C. Oriente C tem uma frequência de 261,63 Hertz (Hz). Em
outras palavras, um alto-falante, uma corda de guitarra, ou
uma corda de piano iria completar 261.63 oscilações por segundo. Ao tomar o
recíproco desse valor, você pode encontrar o período da onda, que é fácil de ver na Figura 5-1. 1 /
261,63 milissegundos é igual a 3.822, que é a largura de uma oscilação completa no gráfico. Usando o
Arduino, você pode definir esse período para uma onda quadrada e, assim, ajustar o tom da nota.
HowaSpeakerProducesSound
Alto-falantes, bem como os motores que você aprendeu sobre no capítulo anterior, tirar proveito de forças
eletromagnéticas que transformam eletricidade em movimento. Tente segurar um pedaço de metal até a
parte traseira do seu alto-falante. Você notou alguma coisa interessante? O metal, provavelmente, varas
para a parte traseira de seu alto-falante, porque todos os alto-falantes têm um íman permanente
considerável montado na parte de trás. Figura 5-2
Usingtone () toMakeSounds
O Arduino IDE inclui uma função built-in para fazer facilmente sons de freqüências arbi-trário.
otom()função gera uma onda quadrada da frequência seleccionada no pino de sua escolha de saída.
o
tom()função aceita três
argumentos, embora o último é opcional:
O terceiro (opcional) argumento define a duração do tom. Se o terceiro argumento não for
■■
Porque tom()usa um dos temporizadores de hardware do ATMEGA, você pode iniciar uma
tom e fazer outras coisas com o Arduino ao mesmo tempo que continua a reproduzir o som de
fundo.
IncludingaDefinitionFile
Quando se trata de reprodução de música, um arquivo de definição que mapeia frequências notar
nomes se mostrou útil. Isso torna mais intuitiva para reproduzir clipes musicais simples. Para aqueles
familiarizados com partituras leitura, você sabe que as notas são indicadas por letras que representam o
seu campo. O Arduino IDE inclui um arquivo de cabeçalho que correlaciona cada uma dessas notas com
sua respectiva frequência. Em vez de dig-Ging através do Arduino diretório de instalação para encontrá-
lo, basta visitar o Explorando
Capítulo Arduino 5 página web, e fazer o download do arquivo de campo para o seu desktop
(www.exploringarduino.com/content/ch5 ). Você vai colocá-lo em sua direção esboço
tory depois que você criou.
Em seguida, abra o IDE Arduino e salvar o esboço em branco que é automaticamente
criado quando você abre o IDE. Como você provavelmente já percebeu, quando você salvar um esboço,
ele realmente salva uma pasta com esse nome e coloca um arquivo .ino dentro dessa pasta. Ao adicionar
outros arquivos para essa pasta, você pode incluí-los em seu programa, tudo ao mesmo tempo manter
seu código melhor organizado. Copie o arquivo pitches.h você salvou na área de trabalho para a pasta
criada pelo IDE; em seguida, fechar o Arduino IDE. Abra o arquivo .ino no Arduino IDE e observe as duas
abas que aparecem agora (veja a Figura 5-3).
96 parte II ■ Controlar o Seu Ambiente
Clique na guia pitches.h para ver o conteúdo do arquivo. Note-se que é apenas uma lista
de instruções de definição, que mapeiam nomes legíveis para valores de frequência dadas. Basta ter o
arquivo de cabeçalho no IDE não é suficiente, no entanto. Para garantir que o compilador realmente usa
essas definições ao compilar o seu
programa para o Arduino, você precisa dizer ao compilador para procurar o arquivo. fazendo
por isso é fácil. Basta adicionar esta linha de código para o início do seu arquivo .ino:
WiringtheSpeaker
Agora que você tem seu arquivo de campos de cabeçalho incluído, você está pronto para construir um
circuito de teste e escrever um programa simples que pode jogar um pouco de música. A instalação
elétrica é bastante simples e envolve apenas ligar um alto-falante para um pino do seu Arduino saída. No
entanto, lembre-se que você aprendeu nos capítulos anteriores sobre resistores limitadores de corrente.
Tal como aconteceu com LEDs, que pretende colocar um resistor limitador de corrente em série com
o alto-falante para garantir que você não tente chamar muita corrente de um dos
pinos de I / O do Arduino. Como você aprendeu anteriormente, cada pino de I / O podem fornecer apenas
um máximo de 40 mA, então escolha uma resistência que o impede de superior a isso. o
capítulo 5 ■ Fazendo sons 97
alto-falante que vem com kit deste livro tem uma resistência interna de 8Ω (como a maioria dos alto-
falantes que você pode comprar); esta resistência vem dos enrolamentos de fio que formam o electroiman.
Lembre-se que a lei de Ohm estabelece que V = IR. Neste cenário, o pino de I / O é saída 5V, e você não
quer exceder 40 mA. Resolvendo para R, você achar que a resistência mínima deve ser: R = 5V / 40mA =
125Ω. 8Ω já está contabilizada pelo alto-falante, para que o seu resistor-line in deve ser de pelo menos
125Ω - 8Ω = 117Ω. O resistor comum mais próxima é 150Ω, então você pode usar isso. Ao ajustar esse valor
resistor, você pode alterar o volume do alto-falante. Para fazer isto tão fácil quanto possível, você pode usar
um potenciômetro em linha com o resistor de 150Ω, conforme mostrado na Figura 5-4. No esquema, o
símbolo R1 representa o 150Ω
resistor, e R2 é o potenciómetro.
dos pinos de extremidade se conecta ao resistor 150Ω. Quando o botão é girado toda a
caminho para o terminal sem ligação, toda a resistência do potenciómetro
é adicionado à resistência em série do resistor 150Ω, e diminui os volumes.
Quando o botão é girado todo o caminho em direção ao terminal final conectado, ele
acrescenta nenhuma resistência à série, eo orador é com o volume no máximo. Referenciando o esquema
na Figura 5-4, fio de seu alto-falante com o Arduino. Em seguida, confirme
Alto-falantes não têm uma polaridade; você pode conectá-los em qualquer direção.
Depois da fiação seu alto-falante com sucesso, você está pronto para fazer música!
MakingSoundSequences
Para reproduzir algumas músicas, você primeiro aprender sobre como usar matrizes para armazenar
vários valores facilmente. Você, então, implementar um loop simples para percorrer as matrizes de
notas e reproduzi-los no alto-falante.
usando Arrays
Uma matriz é uma sequência de valores que estão relacionados de alguma forma. Agrupando-os em
conjunto, é um formato ideal para percorrer. Você pode pensar em uma matriz como uma lista numerada.
Cada posição tem um índice que indica sua localização na lista, e cada índice tem um valor que você deseja
armazenar. Você usar uma matriz aqui para armazenar a lista de notas que você quer jogar, na ordem em
que você quer jogar.
Note-se que as matrizes são zero indexado. Em outras palavras, o primeiro número é a
posição 0, O segundo está na posição 1, e assim por diante. Você pode acessar os elementos
em uma matriz em qualquer índice, colocando o índice do valor relevante em um colchete após o nome
da variável. Se você quiser definir o brilho de um LED conectado ao pino 9 para a terceira entrada em
uma matriz, por exemplo, você pode fazê-lo como este:
Em seguida, você vai usar matrizes (como mostrado nestes exemplos) para criar uma estrutura
que pode conter a sequência de notas que você quer jogar em seu alto-falante.
Para armazenar as informações sobre a música que você quer jogar, você pode usar duas matrizes do
mesmo comprimento. O primeiro contém a lista dos campos, ea segunda contém a lista de durações para
o qual cada nota deve jogar em milissegundos. Você pode então percorrer os índices dessas matrizes e
reproduzir a sua música.
// Nota Arrayint notas [] = {NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_E4,
NOTE_D4, NOTE_C4, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E3, NOTE_A4, 0
};
Note-se que ambas as matrizes têm o mesmo comprimento: 20 itens. Observe que alguns dos
são especificados como notas
0. Estes são restos musicais (batidas não reproduzidos). Cada pares de notas
com uma duração da segunda matriz. Para aqueles familiarizados com a teoria da música, note que eu
fiz notas de um quarto 250ms e colcheias 125ms. A música está em "quatro por quatro" tempo, em
termos musicais.
Experimente esta sequência dada nota, em primeiro lugar; em seguida, tentar criar o seu próprio!
Completando o Programa
A última etapa é realmente adicionar a funcionalidade de reprodução para o esboço. Isto pode ser
conseguido com um simples
paraloop que passa por cada índice na matriz,
e reproduz a nota dada para a duração dada. Desde que você provavelmente não
quer ouvir isso uma e outra vez, você pode colocar a funcionalidade de reprodução
no configuração()função para que ele só acontece uma vez. Você pode reiniciar a reprodução
pressionando o botão Reset. Listagem 5-1 mostra o programa de reprodução completa.
// Nota Arrayint notas [] = {NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_E4,
NOTE_D4, NOTE_C4, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E3, NOTE_A4, 0
};
void setup ()
{
// Tocar cada nota para a direita durationfor (int i
= 0; i <20; i ++)
{
tons (alto-falante, notas [i], tempos [i]);
atraso (vezes [i]);
}
}
void loop ()
{
// Pressione o botão Reset para jogar novamente.
}
102 parte II ■ Controlar o Seu Ambiente
Se você quiser fazer sua própria música, certifique-se de que as matrizes se manterem com uma
comprimento igual e que você alterar o limite superior na para()loop. Porque
a tom()função pode ser executado em segundo plano, é importante usar o demora()
função. Ao atrasar o código para uma quantidade de tempo igual à duração do
nota, você garante que o Arduino não joga a próxima nota até que a anterior não terminou jogando para
o tempo especificado.
UnderstandingtheLimitationsofthetone () função
o tom()função tem algumas limitações a ter em conta. Como a biblioteca de servo,tom()conta com um
timer de hardware que também é usado pela modulação por largura de pulso funcionalidade do
conselho (PWM). Se você usar
tom(), PWM não funciona
direito sobre os pinos 3 e 11 (em que não sejam o mega placas).
Lembre-se também que os / O pins Arduino I não são digital-analógico conversores
ers (DACs). Assim, eles saída somente uma onda quadrada com a frequência prevista, não uma onda
senoidal. Embora isso é suficiente para fazer sons com um alto-falante, você vai encontrá-lo
indesejável para a reprodução de música. Se você deseja reproduzir arquivos de onda, as opções
incluem o uso de um escudo música-playing (como o adafruit Onda
BuildingaMicroPiano
Reprodução de sequências de notas é ótimo para adicionar um feedback de áudio para projetos que você
já criou. Por exemplo, considere a substituição ou aumento de um LED com um som de confirmação de
confirmação verde. Mas, e se você quiser Dynami-camente controlar o som? Para encerrar este capítulo,
você construir um piano pentatônica simples. A escala pentatônica consiste de apenas cinco notas por
oitava vez dos habituais sete. Curiosamente, as notas de uma escala pentatônica tem mínima Disso-
tenção entre arremessos, o que significa que sempre soam bem juntos. Assim, faz muito sentido usar
notas pentatônicas para fazer um piano simples.
capítulo 5 ■ Fazendo sons 103
Para fazer o seu piano Arduino, você usar esta escala pentatônica: C, D, E, G, A.
Você pode escolher o oitava a ser usado conforme a sua preferência. Eu escolhi usar a quarta oitava de
cabeçalho do arquivo.
Em primeiro lugar, fio cinco botões para cima no seu Arduino. Tal como acontece com os botões no Capítul
"Entradas digitais, saídas e Pulse-Width Modulation" você usa 10k pull-down resistores com os botões.
Neste cenário, você não precisa Debounce as, mas-toneladas, porque a nota será só jogou enquanto o
botão desejado é pressionado. Fios os botões, como mostrado na Figura 5-6 e manter o alto-falante ligado
como você tinha
que anteriormente.
// Piano Pentatonic //
CDEGA
void setup ()
{
// Nenhuma configuração necessária
função Tone // define saídas
void loop ()
{
while (digitalRead (BUTTON_C)) Tom
(ALTO-FALANTE, NOTE_C), enquanto
(digitalRead (BUTTON_D)) Tom (ALTO-
FALANTE, NOTE_D), enquanto
(digitalRead (BUTTON_E)) Tom (ALTO-
FALANTE, NOTE_E), enquanto
(digitalRead (BUTTON_G)) tom (ALTO-
FALANTE, NOTE_G), enquanto
(digitalRead (BUTTON_A)) tom (ALTO-
FALANTE, NOTE_A);
}
capítulo 5 ■ Fazendo sons 105
Resumo
Alto-falantes criar uma onda de pressão que viaja através do ar e é por percebida como som
■■
Alterando corrente eléctrica induz um campo magnético que pode ser utilizado para criar um
■■
som de um altifalante.
o
■■tom() função pode ser usada para gerar sons de FREQUEN-cies e durações arbitrárias.
seqüências de dados.
o volume das colunas pode ser ajustado usando um potenciômetro em série com um alto-
■■
falante.
Capítulo
107
108 parte II ■ Controlar o Seu Ambiente
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch6 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no capítulo 06 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
Talvez a parte mais importante de qualquer Arduino é sua capacidade de ser pro-
programado diretamente através de uma porta serial USB. Esta funcionalidade permite-lhe programar a
Arduino sem qualquer hardware especial, como um AVR ISP MKII. Normalmente, microcontroladores
dependem de um pedaço específico de hardware externo (tal como o MKII) para servir como
umprogramadorque se conecta entre o computador e o microcontrolador você está tentando programar.
No caso de o Arduino, esta pró-gramática é essencialmente incorporada à placa, em vez de ser uma
peça externa de
hardware. Além do mais, isso lhe dá uma conexão direta com o ATmega integrada Universal
Synchronous / Asynchronous Receiver e Transmissor
(USART). Usando esta interface, você pode enviar informações entre o computador host eo Arduino,
ou entre o Arduino e outros componentes de série habilitados (incluindo outra Arduinos).
Este capítulo abrange praticamente tudo que você poderia querer saber sobre con-
necting um Arduino ao computador via USB e transmissão de dados entre os dois. Arduinos diferentes
têm diferentes capacidades de série, de modo que este capítulo aborda cada um deles, e você
construir projetos de amostra com cada tecnologia comu-nicação de série para ficar familiarizado com
a forma de aproveitá-las da melhor forma possível. Note-se que, como um resultado disto, a lista de
peças inclui vários tipos de Arduinos. Dependendo de qual Arduino você está tentando aprender sobre,
você pode escolher quais seções para ler, que exemplos
para explorar, e que as peças da lista de peças que você realmente precisa para o seu
explorações Arduino.
UnderstandingtheArduino'sSerialCommunicationCapabilities
Como já aludido na introdução deste capítulo, as diferentes placas Arduino oferecer lotes de diferentes
implementações de série, tanto em termos de como o hardware implementa os adaptadores USB-a-
série e em termos de suporte de software para vários recursos. Em primeiro lugar, nesta seção, você
aprenderá sobre as diversas interfaces de hardware de comunicação de série oferecidos em diferentes
placas Arduino.
Capítulo 6 ■ USB e Serial Comunicação 109
As placas Arduino originais veio equipado com uma porta serial que você con-
conectado ao computador através de um cabo serial de 9 pinos. Hoje em dia, alguns computadores ainda
tem essas portas, embora você possa usar adaptadores para fazer DB-9 (o tipo de 9 pinos
conector) portas seriais de portas USB. Microcontroladores como o ATmega328P que você encontra
no Arduino Uno tem uma porta serial hardware. Ele inclui uma transmissão (TX) e receber o pino (RX)
que pode ser acessado nos pinos digitais 0 e
1. Como explicado na barra lateral no Capítulo 1, "Getting Up e piscando com o Arduino", o Arduino é
equipado com um bootloader que permite pro gram-lo através desta interface serial. Para facilitar isso,
os pinos são "multiplexado" (o que significa que eles estão ligados a mais de uma função); eles se
conectam, indiretamente, para a transmissão e recepção linhas de seu cabo USB. No entanto, serial e
USB não são directamente compatíveis, de modo que um dos dois métodos é utilizado para colmatar
110 parte II ■ Controlar o Seu Ambiente
os dois. Uma opção é usar um circuito secundário integrado (IC) para facilitar a conversão entre os
dois (dentro ou fora da placa Arduino). Este é o tipo de interface presente em um Uno, em que um IC
intermediário facilita a comunicação USB-to-serial. Opção dois é optar por um microcontrolador que
tem um controlador USB construído em (como a do Arduino Leonardo 32U4 MCU).
ArduinoBoardswithanInternalorExternalFTDIUSB-a-SerialConverter
Como foi explicado, muitas placas Arduino (e clones Arduino) utilizam um circuito integrado secundário
para facilitar a conversão USB-to-serial. O chip "FTDI" é um chip popular que tem apenas uma função:
converter entre série e USB. Quando o computador se conecta a um chip FTDI, ele mostra-se no seu
computador como uma "porta serial virtual", que você pode acessar como se fosse uma porta DB9 com
fio para a direita em seu computador. A Figura 2/6 mostra a parte inferior de um Arduino nano, que
FTDI chip
Chapter6pageontheExploringArduinowebsite.
Em algumas placas, normalmente para reduzir o tamanho da placa, o chip FTDI é externo ao
placa principal, com um 6-pin padronizado "conector FTDI" esquerda para a conexão com um cabo
FTDI (Um cabo USB com um chip FTDI construído para o fim do
cabo) ou uma pequena placa de fuga FTDI. Figuras 6-3 e 6-4 mostram essas opções.
.
www.adafruit.com
Crédito: Indústrias Adafruit,
Usando uma placa com um programador FTDI removível é grande se você estiver design-
ing um projeto que não precisará ser conectado a um computador via USB para ser executado. Isto irá
reduzir o custo se você estiver fazendo vários dispositivos, e irá reduzir o tamanho global do produto
acabado.
A seguir está uma lista de placas Arduino que usam um chip FTDI a bordo. Nota,
novas placas Arduino não usa um chip FTDI, de modo a maioria destes foram descontinuados. No
entanto, ainda existem muitos clones dessas placas disponíveis para a compra, assim que eles são
listados aqui para ser completo:
Arduino Nano
■■
Arduino extrema
■■
Arduino NG
■■
Arduino Diecimila
■■
Arduino Duemilanove
■■
A seguir está uma lista de placas Arduino que usam um programador FTDI externo:
Arduino Pro
■■
Arduino Lilypad
■■
Arduino Fio
■■
Arduino Mini
■■
Arduino Ethernet
■■
ArduinoBoardswithaSecondaryUSB-CapableATMegaMCUEmulatingaSerialConverter
O Arduino Uno foi o primeiro bordo para introduzir a utilização de um circuito integrado
outra do que o chip FTDI USB para tratar-se de série de conversão. Funcionalmente, ele funciona
exatamente da mesma maneira, com algumas pequenas diferenças técnicas. Figura 6-5 mostra o
conversor serial 8U2 do Uno (agora um 16U2 em revisões mais recentes).
Primeiro, no Windows, placas com esta nova conversão solu-ção USB-to-serial exigir um
■■
driver personalizado para ser instalado. Este controlador vem com o Arduino IDE quando
você baixá-lo. (Drivers não são necessários para OS X ou Linux.)
Capítulo 6 ■ USB e Serial Comunicação 113
Em segundo lugar, a utilização desta segunda unidade microcontrolador (MCU) para a conver-
■■
Atmel 8U2 ou
chip 16U2
Por último, porque o MCU secundário é totalmente programável (ele está executando uma pilha
■■
firmware chamado LUFA que emula um USB-a-série conversor), você pode mudar o seu
firmware para fazer o Arduino mostrar-se como algo diferente de uma porta serial virtual, tais
como um dispositivo de joystick, teclado ou MIDI. Se você fosse fazer esse tipo de mudança, a
série USB-to-LUFA
A seguir está uma lista de placas Arduino que utilizam uma MCU secundário a bordo
para lidar com USB-a-série de conversão:
Arduino Uno
■■
ArduinoBoardswithaSingleUSB-CapableMCU
O Arduino Leonardo foi a primeira placa de ter apenas um chip que atua tanto como a MCU
programável pelo usuário e como a interface USB. O Leonardo (e
Em primeiro lugar, o custo é reduzido porque bordo menor número de peças são necessárias, e porque
um a menos etapa da programação de fábrica é necessária para produzir as placas. Em segundo lugar,
a placa pode mais facilmente ser usado para emular outros do que uma porta serial (como um teclado,
mouse ou joystick) dispositivos USB. Em terceiro lugar, a porta USART comum único no ATmega não têm
ser multiplexados com o programador USB, assim, a comunicação com o computador central e um
dispositivo de série secundário (tal como uma unidade de GPS) pode ocorrer em simultâneo.
A seguir está uma lista de placas Arduino que usam um único MCU USB com capacidade de:
Arduino Esplora
■■
Arduino Leonardo
■■
Arduino Micro
■■
ArduinoBoardswithUSB-HostCapabilities
Algumas placas Arduino pode se conectar a dispositivos USB como um host, permitindo-lhe con-
dispositivos NECT tradicionais USB (teclados, mouses, telefones Android) para um Arduino.
Naturalmente, deve haver drivers apropriados para apoiar o dispositivo que são con-necting para. Por
exemplo, você não pode simplesmente ligar uma webcam para um Arduino Devido
e esperar para ser capaz de tirar fotos sem trabalho adicional. A Devido presentemente
Capítulo 6 ■ USB e Serial Comunicação 115
suporta uma classe host USB que permite conectar um teclado ou mouse para os de vencimento em-
the-go porta USB para controlá-lo. O Arduino mega ADK utiliza o Android Open Acessório Protocol
(AOA) para facilitar a comunicação entre
ListeningtotheArduino
A função de série mais básica que você pode fazer com um Arduino é imprimir ao terminal de série do
computador. Você já fez isso em vários dos capítulos PREVI-ous. Nesta seção, você explora a
funcionalidade de forma mais aprofundada, e mais tarde no capítulo você construir alguns aplicativos
de desktop que respondem aos dados que você enviar em vez de apenas imprimi-lo para o terminal.
Este processo é o mesmo para todos os Arduinos.
UsingprintStatements
Para imprimir os dados para o terminal, você só precisa utilizar três funções:
Serial.begin
■■ (BAUD_RATE)
Serial.print
■■ ( "Mensagem")
Serial.println
■■ ( "Mensagem")
Como você já aprendeu, Serial.begin () deve ser chamado uma vez no início
do programa em configuração()para preparar o porta serial para comunicação. Depois de
de ter feito isso, você pode usar livrementeSerial.print () e Serial.println ()
funções para escrever dados para a porta serial. A única diferença entre os dois é que Serial.println ()
adiciona um símbolo de retorno no final da linha (de modo que
a próxima coisa impressa aparece na linha seguinte). Para experimentar com esta funcionalidade,
conectar um circuito simples com um potenciômetro conectado ao pino A0 no Arduino, como
mostrado na Figura 6-6.
116 parte II ■ Controlar o Seu Ambiente
void setup ()
{
Serial.begin (9600); // Inicie porta serial com transmissão = 9600
}
void loop ()
{
int val = analogRead (POT); // Leia potentiometerint per = map (val, 0, 1023, 0,
100); // Converte em percentageSerial.print ( "Analog Reading:"); Serial.print
(Val); // Imprimir valueSerial.print analógico raw ( "Percentual:"); Serial.print
(per); // Percentagem impressão analógico valueSerial.println ( "%"); // Impressão
% sinal e newlinedelay (1000); // Espere um segundo, em seguida, repita
UsingSpecialCharacters
Você também pode transmitir uma variedade de "caracteres especiais" ao longo de série, que
permitem que você alterar a formatação dos dados de série que pretende imprimir. Você indicar esses
caracteres especiais com um caractere de barra escape (
\), Seguido de um com-
caráter mand. Há uma variedade destes caracteres especiais, mas os dois de maior interesse são os
caracteres de tabulação e nova linha. Para inserir um caractere de tabulação, adicionar um \ tpara a
cadeia. Para inserir um caractere de nova linha, adicionar um
\ npara a cadeia. este
prova particularmente útil se você quiser uma nova linha a ser inserido no início de uma cadeia, em vez
de no final como a função faz. Se, por
Serial.println ()
alguma razão, você realmente deseja imprimir\ nou \ tna seqüência, você pode fazê-lo
impressão \\ nou \\ t, Respectivamente. Listagem 6-2 é uma modificação do código anterior para
usar esses caracteres especiais para mostrar os dados em um formato tabular.
118 parte II ■ Controlar o Seu Ambiente
void setup ()
{
Serial.begin (9600); // Iniciar Porta Serial com Baud = 9600
}
void loop ()
{
Serial.println ( "\ nAnalog Pin \ tRaw Valor \ tPercentage"); Serial.println (
"----------------------------- ------------- "); for (int i = 0; i <10; i ++)
{
int val = analogRead (POT); // Leia potentiometerint per = map (val, 0, 1023, 0,
100); // Converte em porcentagem
}
}
ChangingDataTypeRepresentations
TalkingtotheArduino
Que bom é uma conversa com o seu Arduino se ele só vai em um direc-ção? Agora que você entende
como o Arduino envia dados para o computador, vamos passar algum tempo discutindo como enviar
comandos do seu computador para o Arduino. Você provavelmente já percebeu que o monitor serial
Arduino IDE tem um campo de entrada de texto na parte superior, e um menu drop-down na parte
inferior.
Figura 6-8: Captura de tela do terminal serial destacando campo de entrada de texto e de fim de linha no menu
suspenso Opções
120 parte II ■ Controlar o Seu Ambiente
Primeiro, certifique-se de que o drop-down está definida para nova linha. O menu drop-down
determina o que, se alguma coisa, é anexado ao fim dos seus comandos quando você enviá-los para o
Arduino. Os exemplos nas seções seguintes assumem que
você tem nova linha selecionada, que apenas acrescenta um\ npara o final de qualquer coisa
que você enviar a partir do campo de entrada de texto na parte superior da janela do monitor de série.
Ao contrário de alguns outros programas de terminal, monitor serial do Arduino IDE
envia a sua cadeia de comando inteira de uma só vez (na taxa de transmissão que você especificar)
quando você pressiona a tecla ou botão Send Enter. Isso está em contraste com outros terminais de
série como massa de vidraceiro (ligadas a partir da página de conteúdo digital deste capítulo no
ReadingInformationfromaComputerorOtherSerialDevice
Você começa usando o monitor serial Arduino IDE para enviar comandos manualmente para o Arduino.
Uma vez que está trabalhando, você vai aprender como enviar vários valores COM-mand de uma vez e
como construir uma interface gráfica simples para o envio de comandos.
A coisa mais simples que você pode fazer é ter o Arduino eco de volta tudo o que você enviá-lo. Para
alcançar este objetivo, o Arduino basicamente só precisa monitorar seu buffer de entrada serial e
imprimir qualquer personagem que ele recebe. Para fazer isso, você precisa implementar dois novos
comandos a partir da
Serialobjeto:
Serial.available
■■ () devolve o número de caracteres (ou bytes) que são
atualmente armazenado no buffer serial de entrada do Arduino. Sempre que é mais do que
zero, você vai ler os caracteres e eco-los de volta para o computador.
Serial.read
■■ () lê e retorna o próximo caractere que está disponível em
o tampão.
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600
}
void loop ()
{
// Só imprimir quando os dados é receivedif
(Serial.available ()> 0)
{
data = Serial.read (); // Leia byte de dataSerial.print (de
dados); // Byte impressão de dados
}
}
Quando você envia um caractere alfanumérico através do monitor serial, você não está real-
aliado passando uma "5", ou um "A". Você está enviando um byte que o computador interpreta como um
personagem. No caso da comunicação serial, o conjunto de caracteres ASCII é usado para representar
todas as letras, números, símbolos e comandos especiais que você pode querer enviar. O conjunto de
caracteres ASCII de base, mostrada na Figura 6-9, é um conjunto de 7 bits e contém um total de 128
personagens únicas ou comandos.
53. Você pode confirmar isso olhando para a tabela de referência ASCII na Figura 6-9.
122 parte II ■ Controlar o Seu Ambiente
.
www.benborowiec.com
Crédito: Ben Borowiec,
Figura 6-9: tabela ASCII
No entanto, muitas vezes você vai querer enviar valores numéricos para o Arduino. Então, como
você faz aquilo? Você pode fazê-lo em algumas maneiras. Em primeiro lugar, você pode simplesmente
comparar os caracteres diretamente. Se você quiser virar um LED ligado quando envia um
1, você pode
comparar os valores de caracteres como este:
if (Serial.read () == '1') . Observe que
as aspas simples ao redor do '1'indicam que ele deve ser tratado como um personagem.
Uma segunda opção é converter cada byte de entrada para um número inteiro subtraindo
o caráter de valor zero, como este: int val = Serial.read () - '0' . Contudo,
isso não funciona muito bem se você pretende enviar números que são maiores do que 9,
porque eles vão estar vários dígitos. Para lidar com isso, o Arduino IDE inclui uma função útil
chamadaparseInt () que tenta extrair números inteiros de um
fluxo de dados serial. Os exemplos que se seguem elaborado sobre estas técnicas.
Antes de seu mergulho para analisar cadeias maiores de números de vários dígitos, começar por
escrever um esboço que usa uma comparação simples personagem para controlar um LED.
Capítulo 6 ■ USB e Serial Comunicação 123
Você vai enviar um 1para ligar um LED, e um 0para desligá-lo. Fio de um LED-se ao pino
9 do seu Arduino como mostrado na Figura 6-10.
Como foi explicado na seção anterior, quando apenas o envio de um único personagem,
a coisa mais fácil a fazer é fazer uma comparação simples personagem em Eum
sedeclaração.
Cada vez que um carácter é adicionado ao tampão, ele é comparado com umum '1'e
'0'ou
a ação apropriada seja tomada. Carregar o código na Listagem 6-4 e experiências com o envio de
uma0ou um 1de série do terminal.
124 parte II ■ Controlar o Seu Ambiente
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600 baudpinMode
(LED, OUTPUT);
void loop ()
{
// Agir apenas quando os dados está disponível no bufferif
(Serial.available ()> 0)
{
data = Serial.read (); // Leia byte de dados // sua vez,
levou onif (dados == '1')
{
digitalWrite (LED, HIGH);
Serial.println ( "LED ON");
}
// Sua vez, levou offelse if
(dados == '0')
{
digitalWrite (LED, LOW); Serial.println
( "LED OFF");
}
}
Envio de um único caractere de comando é bom para controlar um único pino digital, mas o que se quer
realizar alguns esquemas de controle mais complexas? Esta seção explora o envio de vários valores
separados por vírgulas para comandar simultaneamente vários dispositivos. Para facilitar a testar este, fio
até um cátodo comum
Para controlar esse LED RGB, você envia três valores de 8 bits separados (0-255) para definir
o brilho de cada LED cor. Por exemplo, para definir todas as cores para cheia brilhante-ness, você
envia"255,255,255". Isto apresenta alguns desafios:
■■Você precisa ativar essa sequência de caracteres em números inteiros que você pode passar
para analogWrite ()funções.
■■Você precisa ser capaz de lidar com o facto de que os valores podem ser um, dois, ou três
dígitos.
Felizmente, o Arduino IDE implementa uma função muito útil para a identificação de
e extrair números inteiros: Serial.parseInt () . Cada chamada para esta função espera até
um valor não numérico entra no buffer serial, e converte os dígitos anteriores em um número inteiro.
Os dois primeiros são valores lidos quando são detectadas as virgulas, e o último valor é lido quando a
nova linha é detectada.
Para testar essa função para si mesmo, carregar o programa mostrado na Listagem 6-5 na
no seu Arduino.
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600
void loop ()
{
// Continue trabalhando enquanto dados estão no bufferwhile
(Serial.available ()> 0)
Capítulo 6 ■ USB e Serial Comunicação 127
{
rval Serial.parseInt = (); // Integergval Primeira válido =
Serial.parseInt (); // Integerbval Segundo válido = Serial.parseInt
(); // Inteiro válido Terceira
}
}
}
O programa continua olhando para os três valores inteiros até que uma nova linha é
detectou. Uma vez que isto acontece, os valores que foram lidos são usados para definir a luminosidade
ness dos LEDs. Para usar isso, abra o monitor serial e entrar três valores entre 0 e 255 separados por
uma vírgula, como
"200,30,180". Tente misturar tudo
tipos de cores bonitas!
TalkingtoaDesktopApp
Eventualmente, você é obrigado a se cansar de fazer toda a sua comunicação de série através do
monitor serial Arduino. Convenientemente, praticamente qualquer ambiente de trabalho linguagem pro-
gramação que você pode pensar tem bibliotecas que permitem a interface com as portas seriais em seu
computador. Você pode usar a sua linguagem favorita de desktop programa-ming para escrever
programas que enviam comandos seriais para o seu Arduino
e que reage a dados em série a ser transmitido a partir do Arduino para o computador.
Neste livro, o processamento é a linguagem de programação de desktop de escolha
porque é muito semelhante à linguagem Arduino que você já tenha se tornado
familiar com. Na verdade, a linguagem de programação Arduino é baseado em processamento de!
Outros idiomas desktop populares (que bem documentados bibliotecas de série comu-nicação)
incluem Python, PHP, Visual Basic, C, e muito mais. Primeiro, você vai aprender a ler dados seriais
transmitidos em Processing, e então você vai aprender como você pode usar o processamento para
criar uma simples interface gráfica do usuário (GUI) para enviar comandos para o Arduino.
TalkingtoProcessing
saída com base em dados seriais transmitidos a partir do seu Arduino. Uma vez que isso é trabalho-
ing, você implementar a comunicação na direção oposta para controlar o seu Arduino a partir de uma
interface gráfica no seu computador.
Processamento de instalar
ção, e você deve ver um IDE que se parece com o mostrado na Figura 6-12.
Para sua primeira experiência com Processing, você usa um potenciômetro conectado ao Arduino para
controlar a cor de uma janela no seu computador. Fio-se o Arduino com um potenciômetro, consultando a
Figura 6-6 novamente. Você já sabe o código Arduino necessário enviar os valores analógicos do potenti-
ometer para o seu computador. O fato de que agora você está alimentando os dados seriais em
Processamento não tem qualquer impacto sobre a maneira como você transmiti-lo.
Listagem 6-6: Código Arduino para enviar dados para o computador-pot_to_processing / arduino_read_pot
void setup ()
{
Serial.begin (9600); // Iniciar Serial
}
void loop ()
{
val = map (analogRead (POT), 0, 1023, 0, 255); // Leia e mapear POTSerial.println (val); //
Enviar valuedelay (50); // Atraso de modo que não inundar // o computador
Agora vem a parte interessante: escrever um esboço de processamento para fazer algo
interessante com esses dados de entrada. O esboço na Listagem 6-7 lê os dados no buffer de série e
ajusta o brilho de uma cor na tela do seu computador com base no valor que recebe. Primeiro, copie o
código da Listagem 6-7 em um novo esboço de processamento. Você precisa mudar apenas uma parte
importante. O esboço de processamento precisa saber qual porta serial que esperar de dados para
chegar a. Esta é a mesma porta que você foi a programação do Arduino a partir. No
130 parte II ■ Controlar o Seu Ambiente
seguinte listagem, substitua "COM3"com o seu número de porta serial. Lembre-se que em Linux e
Mac será parecido com
/ Dev / ttyUSB0, por exemplo. Você pode copiar o
nome exato de dentro do Arduino IDE se não tiver certeza.
Listagem 6-7: Código de processamento para ler dados e mudam a cor na tela-pot_to_processing /
processing_display_color
void setup ()
{
tamanho (500.500); // Janela sizeport = new Serial (this, "COM3", 9600); //
Configurar serialport.bufferUntil ( '\ n'); // Configurar porta para ler até //
nova linha
draw void ()
{
fundo (0,0, brilho); // Atualiza a janela
}
Agora que você já viu isso funcionar, vamos percorrer o código para obter uma melhor
compreensão de como o esboço de processamento está funcionando. Ao contrário do Arduino, a
biblioteca de série não é importado automaticamente. chamando
processamento de importação
.serial.*; ePorta serial; está a importar a biblioteca de série e MAK
ing um objeto de série chamada
porta.
Capítulo 6 ■ USB e Comunicação Serial 131
port.bufferUntil ( '\ n') informa Processing para tamponar a entrada serial e não fazer
nada com as informações até que vê um caractere de nova linha.
Ao invés de loop (), Processamento define outras funções especiais. Este programa usa
desenhar()e serialEvent () . odesenhar()função é similar a Arduino de loop ();
ele é executado continuamente e atualiza a exibição. o fundo()função define o
cor da janela, definindo valores de vermelho, verde e azul (as três argumentos da função). Neste caso, o
valor a partir do potenciômetro está controlando a intensidade azul e vermelho e verde estão definidos
para
0. Você pode mudar a cor que o seu pote
está ajustando simplesmente troca que argumento brilhoestá preenchendo. RGB
valores de cor são valores de 8 bits que variam0para
de 255, Razão pela qual o potenciômetro
é mapeado para esses valores antes de serem transmitidos.
serialEvent () é chamado sempre que o bufferUntil () condição de que você
especificado na configuração()é cumprida. Sempre que um caractere de nova linha é recebida, o
serialEvent () função é acionado. A informação em série de entrada é lido
como uma string com port.readStringUntil ( '\ n') . Você pode pensar em uma string como um
matriz de texto. Para usar a string como um número, você deve convertê-lo para um número de
ponto flutuante comflutuador() . Isso define a variável de brilho, mudando a
cor de fundo da janela do aplicativo.
Para parar a aplicação e fechar a porta serial, clique no botão Parar na
IDE de transformação; é a praça localizada ao lado do botão Executar.
132 parte II ■ Controlar o Seu Ambiente
TheSudoGloveisacontrolglovethatdrivesRCcarsandcontrolsotherhardware.IdevelopedaProcessingdebuggingdisplaythatgraphicallys
ors.Youcanlearnmoreaboutithere:
www.sudoglove.com.
DownloadthesourcecodefortheProcessingdisplayhere:
www.jeremyblum.com/2011/03/25/processing-based-sudoglove- visual-depurador
/.YoucanalsofindthissourcecodeontheWileywebsiteshownatthebeginningofthischapter.
O próximo passo óbvio é fazer o oposto. Fio-se um LED RGB para o seu
Arduino, como mostrado na Figura 6-11 e carga sobre o mesmo programa de mais cedo
que você usou para receber uma seqüência de três valores separados por vírgula para definir o
intensidades de vermelho, verde e azul (Listagem 6-5). Agora, em vez de enviar uma série de três
valores do monitor serial, você seleciona uma cor usando um seletor de cores.
Listagem 6-8: Processamento de esboço para definir Arduino RGB Colors- processing_control_RGB /
processing_control_RGB
void setup ()
{
tamanho (640.256); // Tamanho do HSV imageimg = loadImage ( "hsv.jpg"); //
Carregar no fundo imageport = new Serial (this, "COM9", 9600); // Porta serial Aberto
draw void ()
{
fundo (0); // Preto BackgroundImage (img, 0,0); //
Imagem Overlay
anular mousePressed ()
{
cor c = get (mouseX, mouseY); // Obter a cor RGB, em que o mouse foi pressedString cores =
int (vermelho (c)) + "," + int (verde (c)) + "," + int (azul (c)) + "\ n"; // Extrair valores de
Colorprint (cores); cores // impressão para debuggingport.write (cores); // Envia valores ao
Arduino
Quando você executar o programa, você deve ver uma tela como a mostrada na
Figura 6-15 aparecer. Clique cores diferentes e os valores RGB serão transmitidos
ao Arduino para controlar a cor do LED RGB. Observe que o console serial também exibe os comandos
de serem enviados para ajudá-lo em qualquer depuração.
Depois de terminar a olhar para todas as cores bonitas, olhar para trás, o código e
considerar como ele está trabalhando. Como antes, a biblioteca de série é importado e um objeto de
série chamadaportaé criado. UMAPImagechamada de objeto imgTambém é criado. Isto irá manter a
imagem de fundo. No
configuração(), A porta serial é inicializado, o
janela de exibição está definido para o tamanho da imagem, ea imagem é importado para o objeto
imagem chamando img = loadImage ( "hsv.jpg") .
No desenhar()função, a imagem é carregada na janela com imagem (img, 0,0).
imgé a imagem que você quer desenhar na janela, e 0, 0são coordenadas onde
a imagem vai começar a ser desenhado.
0,0é o canto superior esquerdo da janela do aplicativo.
134 parte II ■ Controlar o Seu Ambiente
representando vermelho, verde e azul. Estes valores também são impressos ao tratamento
console de modo que você possa ver o que está sendo enviado.
Certifique-se de que o Arduino está conectado e programado com o código de
Listagem 6-5. Execute o esboço de processamento (com a porta serial correta especificado) e
clique em torno do mapa de cores para ajustar a cor do LED conectado ao Arduino.
LearningSpecialTrickswiththeArduinoLeonardo (andOther32U4-
BasedArduinos)
O Leonardo, além de outros Arduinos que implementam MCUs que con-gar directamente para USB,
tem a capacidade única para emular dispositivos não seriais, como um teclado ou mouse. Nesta
seção, você aprenderá sobre como usar um Leonardo de
Capítulo 6 ■ USB e Serial Comunicação 135
emular estes dispositivos. Você precisa ser extremamente cuidadoso para implementar essas funções de
uma forma que não faz a reprogramação difícil. Por exemplo, se você escrever um esboço que emula um
mouse e continuamente move o ponteiro ao redor da tela, você pode ter problemas para clicar no botão
Upload no Arduino IDE! Nesta seção, você aprende alguns truques que você pode usar para evitar estas
circunstâncias.
DICA Ifyougetstuckwithaboardthat'stoohardtoprogramduetoitskeyboardor
mouseinput, holddowntheResetbuttonandreleaseitwhilepressingtheUploadbuttonintheArduinoIDEtoreprogramit.
Quando você conectar um Leonardo a um computador com Windows, você precisa instalar
motoristas, assim como você fez com o Arduino Uno no primeiro capítulo. Siga as mesmas
instruções emhttp://arduino.cc/en/Guide/ArduinoLeonardoMicro#toc8
para obter instruções específicas-Leonardo. (Estas instruções também estão ligados a partir da página
de conteúdo digital para este capítulo da
www.exploringarduino.com.)
EmulatingaKeyboard
Usando capacidade única do Leonardo para emular dispositivos USB, você pode facilmente transformar
o seu Arduino em um teclado. Emulando um teclado permite que você facilmente enviar comandos-
chave combinação para o seu computador ou tipo de dados diretamente em um arquivo que está
aberto no seu computador.
O Leonardo pode emular um teclado USB, enviando teclas e chave com-combinações. Esta seção
explora como usar ambos os conceitos. Primeiro, você escreve um
programa simples que registra os dados de alguns sensores analógicos em uma vírgula
separados por valor (.csv) formato que mais tarde você pode se abrir com planilhas do Excel ou o
Google para gerar um gráfico dos valores.
Em seguida, criar um circuito simples, como o mostrado na Figura 6-16. Ele irá acompanhar
ambos os níveis de temperatura luz e usando sensores analógicos que você já viu no capítulo 3,
"Leitura Sensores analógicos." Além dos sensores, o circuito inclui um botão para virar a
funcionalidade de log on e off, e um LED que vai indicar se atualmente está registrando dados.
136 parte II ■ Controlar o Seu Ambiente
os sensores e "tipos" esses valores em seu computador em um formato separado por vírgulas uma vez
por segundo. Um indicador LED permanece aceso enquanto você está registrando dados. Porque você
quer o Arduino estar constantemente polling o estado
Capítulo 6 ■ USB e Serial Comunicação 137
do botão, você não pode usar uma demora()função que esperar 1000ms entre cada
atualizar. Em vez disso, você usa omillis () função, que retorna o número de
milissegundos desde o Arduino foi a última reinicialização. Você pode fazer o Arduino enviar dados
cada vez que o função retorna um múltiplo de 1000 ms, de forma eficaz
millis ()
a criação de um atraso não bloqueante de 1 segundo entre as transmissões. Para fazer isso, você pode
usar o operador de módulo (
%). Modulo devolve o resto de uma divisão. E se,
por exemplo, você executou 1,000% 1,000, Você teria que encontrar o resultado é 0 porque
1000/1000 = 1, com um resto de 0. 1500% 1000, Por outro lado, iria retornar
500 porque 1500/1000 é igual a 1, com um resto de 500. Se você tomar o módulo de millis ()
com 1000, O resultado é zero cada vez millis () alcances
um valor que é um múltiplo de 1000. Ao verificar isso com um E se()declaração,
pode executar um código, uma vez a cada segundo.
Examinar o código na Listagem 6-9 e carregá-lo para o seu Arduino Leonardo.
Certifique-se de que você selecionou "Arduino Leonardo" no menu Ferramentas> Board no Arduino
IDE.
const int TEMP = 0; // Sensor de Temp no pino analógico LUZ 0const int = 1; //
Sensor de luz no pino analógico 1const int LED = 3; LED // Red no pino
13const int BUTTON = 2; // O botão está ligado ao pino 2
void setup ()
{
pinMode (LED, OUTPUT); // Definir LED azul como
outputKeyboard.begin (); // Iniciar emulação de teclado
void loop ()
{
currentButton = estabilização (lastButton); // Leia estado filtrada por
if (lastButton == LOW && currentButton == HIGH) // Se ele foi pressionado ... correndo =
correndo!; // Alternar estado de execução
{
digitalWrite (LED, HIGH); // Vire o LED onif (millis ()% 1.000 == 0) // Se
o tempo é múltipla // de 1000ms
{
temperatura = int analogRead (TEMP); // Leia o brilho temperatureint = analogRead
(LUZ); // Leia o levelKeyboard.print luz (contador); // Imprimir o numberKeyboard.print
índice ( ","); // Imprimir um commaKeyboard.print (temperatura); // Imprimir o
temperatureKeyboard.print ( ","); // Imprimir um commaKeyboard.println (brilho); //
Brilho Print, newlinecounter ++; // Incrementa o contador
}
}
outro
{
digitalWrite (LED, LOW); // Se logger não está em execução, vire LED off
}
}
/*
* Função Debouncing
* Passe-o estado do botão anterior,
* E voltar o estado do botão filtrada por corrente.
*/
boolean debounce (boolean passado)
{
boolean atual = digitalRead (botão); // Leia o botão stateif (durar! = Atual) // Se é diferente
...
{
atraso (5); // Espere 5mscurrent = digitalRead (botão); // Leia de novo
}
voltar corrente; // Retorna o valor atual //
Antes de testar o registrador de dados, vamos destacar algumas das novas funcionalidades
que foi implementado neste esboço. Da mesma forma como você inicializado a comunicação serial, a
comunicação teclado é inicializado, colocando
!operador.
Enquanto o Arduino é em correndo modo, a etapa de registro é executado somente a cada
1000 ms utilizando a lógica descrita anteriormente. As funções do teclado funciona muito semelhante às
funções de série. "tipos" a string dada em
Keyboard.print ()
Capítulo 6 ■ USB e Serial Comunicação 139
seu computador. Depois de ler os dois sensores analógicos, o Arduino envia os valores para o
computador como teclas. Quando você usa ,
Keyboard.println ()
o Arduino emula pressionando a tecla Enter ou Return no teclado depois de enviar a string dada. Um
contador incrementar e ambos os valores analógicos são inseridos em um formato separado por
vírgulas.
Siga o vídeo de demonstração a partir da página web deste capítulo para ver este esboço em
açao. Certifique-se de que o cursor é posicionado activamente num documento de texto e, em seguida,
pressione o botão para iniciar o registo. Você deverá ver o documento começa a preencher com dados.
Segure a mão sobre o sensor de luz para alterar o valor ou espremer o sensor de temperatura para ver o
aumento de valor. Quando tiver terminado, pressione o botão novamente para parar o registro. Depois de
salvar o arquivo, você pode importá-lo para o aplicativo de planilha de sua escolha e representar
graficamente ao longo do tempo. Isso é mostrado no vídeo de demonstração.
Além de digitação como um teclado, você também pode usar o Leonardo para a UEM-final combinações
de teclas. Em computadores Windows, pressionando as teclas Windows + L bloqueia a tela do
computador (em Linux, você pode usar Control + Alt + L). Usando esse conhecimento emparelhado com
um sensor de luz, você pode ter o seu bloqueio de computador auto-maticamente quando você desligar
as luzes. OS X usa o Control + Shift + Eject ou teclas Shift + Poder de Controle + para bloquear a
máquina, que não pode ser imitado pelo Leonardo, pois não pode enviar um Eject ou Power simulado
pressione o botão. Neste exemplo, você aprende como bloquear um computador Windows. É possível
continuar a utilizar o mesmo circuito mostrado na Figura 6-16, embora apenas o sensor de luz será
utilizada neste exemplo.
Execute o esboço anterior em alguns níveis diferentes de luz e ver como a luz
mudanças de leitura do sensor. Usando essas informações, você deve escolher um limiar abaixo do
qual você vai querer o seu computador para bloquear. (No meu quarto, eu achei que com as luzes
apagadas o valor foi de cerca de
300, E foi cerca de 700com o
luzes acesas. Então, eu escolhi um valor limite500
de ). Quando as gotas valor do sensor de luz
abaixo desse valor, a trancarcomando irá ser enviada para o computador. Você pode querer
ajustar esse valor para o seu ambiente.
Coloque o desenho na Listagem 6-10 no seu Arduino. Apenas certifique-se que você tem
o limite definido para um valor razoável, em primeiro lugar, por meio de testes que luz níveis no seu
quarto correspondem a vários níveis analógicos. Se você pegar um valor mal calibrado, pode bloquear o
computador assim que você enviá-lo!
140 parte II ■ Controlar o Seu Ambiente
int LUZ const = 1; // Sensor de luz no pino analógico 1const int THRESHOLD = 500; // Brilho
deve cair abaixo deste nível // para bloquear computador
void setup ()
{
Keyboard.begin ();
}
void loop ()
{
int brilho = analogRead (LUZ); // Leia o nível de luz
if (brilho <limiar)
{
Keyboard.press (KEY_LEFT_GUI);
Keyboard.press ( 'L'); atraso (100);
Keyboard.releaseAll ();
}
}
Depois de carregar o programa, tente virar as luzes apagadas. Seu computador deve
bloquear imediatamente. O seguinte vídeo de demonstração mostra isso em ação. este esboço
implementa duas novas funções do teclado: Keyboard.press () e Teclado
.releaseAll () . CorrendoKeyboard.press ()é equivalente ao de partida para realizar uma
baixo chave. Então, se você quer segurar a tecla Windows ea tecla L para baixo no
mesmo tempo, você corre Keyboard.press ()em cada. Então, você atrasar por um curto período
de tempo e executar o Keyboard.releaseAll () função para deixar de ir, ou a liberação,
as chaves. teclas especiais são definidas no site do Arduino: http://arduino.cc/
pt / Referência / KeyboardModifiers . (Esta tabela definição também está ligada a partir
a página de conteúdo para este capítulowww.exploringarduino.com/content/ch6
no .)
EmulatingaMouse
Usando um joystick de dois eixos e alguns botões, você pode usar um Arduino
Leonardo para fazer seu próprio mouse! O joystick irá controlar a localização do mouse,
e os botões irá controlar a esquerda, meio e direito botões do mouse.
Capítulo 6 ■ USB e Serial Comunicação 141
Assim como com a funcionalidade do teclado, a linguagem Arduino tem algumas grandes funções
internas em que se torna mais fácil para controlar a funcionalidade do mouse.
Primeiro de tudo, se o seu circuito configurado com um joystick e alguns botões como
mostrado na Figura 6-17. Não se esqueça que seus botões precisa ter resistências de pull-down! O
joystick irá se conectar aos pinos analógicas 0 e 1. (Joysticks são realmente apenas dois potenciômetros
ligados a um botão.) Quando você move o joystick todo o caminho na direção x, ele atinge o máximo do x
potenciômetro, eo mesmo vale
para a direção y.
O diagrama mostra um joystick SparkFun, mas qualquer vai fazer. (No vídeo descrito
após o anúncio, eu usei um joystick Parallax.) Dependendo da orientação do joystick, você pode precisar
de ajustar os limites da função de mapa ou trocar o X / Y no código abaixo.
// Faz um rato!
void setup ()
{
Mouse.begin ();
}
void loop ()
{
int xVal = readJoystick (X_AXIS); // Obter eixo x movementint yVal = readJoystick
(Y_AXIS); // Obter movimento do eixo y
{
int val = analogRead (eixo); // Leia analógico valueval = map (val, 0, 1023,
-10, 10); // Mapa da leitura
if (val <= 2 && val> = -2) // Criar zona morta para parar rato driftreturn 0;
{
// Se o botão for pressionado, clique se não tiver já sido clickedif (digitalRead
(pino) == HIGH)
{
if (! Mouse.isPressed (mouseCommand))
{
Mouse.press (mouseCommand);
}
}
// Solte o mouse se tiver sido clicked.else
{
Se (Mouse.isPressed (mouseCommand))
{
Mouse.release (mouseCommand);
}
}
}
UMA readJoystick () função foi criada para ler os valores do joystick e mapa
eles. Cada eixo possui um joystick gama de 1024 quando os valores lidos no conversor analógico-para-
digital (ADC). No entanto, os movimentos do mouse são relativos. Em outras palavras, a passagem de um
valor de 0 aMouse.move ()para cada eixo resultará em nenhum movimento nesse eixo. Passar um valor
positivo para o eixo-x irá mover o mouse para a
direita, e um valor negativo vai movê-lo para a esquerda. Quanto maior o valor,
mais o mouse se moverá. Assim, no readJoystick () função, um valor de
0-1023 é mapeado para um valor de -10para 10. Um valor tampão pequeno em torno0é
adicionada onde o mouse não se move. Isso ocorre porque, mesmo quando o joystick está na posição
média, o valor real pode flutuar em torno de
512. Definindo
a parte de trás distância desejada a 0 depois de ser mapeado em um determinado intervalo, você
garantir que o mouse não irá se mover por conta própria, enquanto o joystick não está sendo
accionado. Uma vez que os valores são determinados,
Mouse.move ()é dada a x e y
valores para mover o mouse. Um terceiro argumento para
Mouse.move ()determina o
movimento da roda de rolagem.
144 parte II ■ Controlar o Seu Ambiente
NOTA Towatchademovideoofthejoystickmousecontrollingacomputer
ponteiro, check-outwww.exploringarduino.com/content/ch6.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischa
Resumo
Arduinos diferentes facilitar uma conversão USB-to-serial usando tanto ICs dedi-cado ou built-in
■■
funcionalidade USB.
Seu Arduino pode imprimir dados para o seu computador através de seu número de série USB
■■
conexão.
Você pode usar caracteres especiais em série para formatar a sua impressão em série com
■■
Todos os dados em série são transmitidos como caracteres que podem ser convertidos em números
■■
Você pode enviar listas de números inteiros separados por vírgulas e usar funções integradas
■■
Você pode enviar dados do seu Arduino para um aplicativo de desktop Processing.
■■
Você pode receber dados de um aplicativo de processamento em seu desktop para controlar
■■
registos de deslocamen
downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch7.
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no capítulo 07 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
145
146 parte II ■ Controlar o Seu Ambiente
Como você engole longe construção de novas e excitantes projectos com seu Arduino, você
pode já estar pensando: "O que acontece quando eu ficar sem pinos?" De fato, um dos projetos mais
comuns com o Arduino está usando a plataforma para colocar um enorme número de LEDs piscantes
sobre praticamente qualquer coisa. Ilumine o seu
quarto! Ilumine o seu computador! Acender seu cão! Ok, talvez não esse último.
Mas há um problema. O que acontece quando você quer começar a piscar 50 LEDs
(Ou controlar outras saídas digitais), mas você já usou de todos os seus pinos de I / O? Isso é
onde registos de deslocamento pode vir a calhar. Com registos de deslocamento, você pode expandir
os recursos de E / S do seu Arduino sem ter que pagar muito mais por um microcontrolador mais caro
com pinos de E / S adicionais. Neste capítulo, você aprenderá como registos de deslocamento
trabalhar, e você vai implementar o software e hardware necessários para fazer a interface seu Arduino
com registos de deslocamento com a finalidade de expandir as capacidades saída digital do seu
Arduino. Completando os exercícios deste capítulo irá familiarizá-lo com registos de deslocamento, e irá
ajudá-lo a tomar uma decisão design mais informado quando você está desenvolvendo um projeto com
um grande número de saídas digitais.
UnderstandingShiftRegisters
UMA registro de deslocamentoé um dispositivo que aceita um fluxo de bits em série e, simultaneamente,
envia os valores desses bits sobre os pinos de I / O em paralelo. Na maioria das vezes, estes são utilizados
para controlar um grande número de LED, tais como as configurações encontradas
Capítulo 7 ■ Registadores de deslocamento 147
SendingParallelandSerialData
Existem essencialmente dois caminhos para enviar vários bits de dados. Recorde-se que o
Arduino, como todos os microcontroladores, é digital; ele só entende 1s e 0s.
Então, se você quiser dados suficientes para controlar oito LEDs digitalmente (cada um ligado ou
off), você precisa encontrar uma maneira de transmitir 8 bits totais de informações. em ante-
capítulos ous, você fez isso de forma paralela, usando o digitalWrite ()
eanalogWrite ()comandos para exercer o controle sobre vários pinos de I / O. Para um exemplo de
transmissão de informação paralelo, suponhamos que você fosse para ligar oito LEDs com oito saídas
digitais; todos os bits devem ser transmitidos em pinos de E / S, independentemente mais ou menos
ao mesmo tempo. No Capítulo 6 ", USB e Serial
148 parte II ■ Controlar o Seu Ambiente
Comunicação, "você aprendeu sobre a transmissão em série, que transmite 1 bit de dados em tempo.
registos de deslocamento permitem converter facilmente entre técnicas de transmissão de dados seriais
e paralelas. Este capítulo concentra-se em série-paralelo
registradores de deslocamento, às vezes chamados de série em, paralelo out (SIPO) registos de deslocamento.
Com estes dispositivos acessíveis, você pode "relógio em" múltiplos bytes de dados em série, e enviá-
las a partir do registo de deslocamento de forma paralela. Você também pode encadear registos de
deslocamento e, assim, controlar centenas de saídas digitais de apenas três Arduino I / O pins.
Workingwiththe74HC595ShiftRegister
A mudança específica registrar, você estará usando é o registro 74HC595 turno. Levar
um olhar para o diagrama de pin-out da folha de dados mostrado na Figura 7-2.
A seguir está uma repartição das funções dos pinos de registo de deslocamento:
O pino SER é representado pela entrada de dados na Figura 7-1. Este é o pino onde você vai
■■
alimentar em 8 bit valores sequenciais para definir os valores das saídas paralelas.
tempo este pino vai alto, os valores na mudança de registo de deslocamento de 1 bit. isto
será pulsado oito vezes para puxar todos os dados que você está enviando no pino de dados.
O pino RCLK é representada pelo pino de bloqueio na Figura 7-1. Também conhecido
■■
como o registar pin relógio, O pino de trava é usado para "cometer" o seu recentemente trocou
valores de série para as saídas paralelas tudo de uma vez. Este pino permite sequencialmente
os dados de deslocamento para o chip e ter todos os valores aparecem nas saídas paralelas ao
mesmo tempo.
Você não vai estar usando os SRCLR ou OE pinos nestes exemplos, mas você
pode querer usá-los para o seu projeto, então vale a pena entender o que eles fazem. OE significa
habilitar a saída. O bar com o nome de pino indica que ele está ativo baixo. Em outras palavras, quando
o pino é mantido baixo, a saída será ativada. Quando é erguida, a saída será desativada. Nestes
exemplos, este pino estará ligado directamente ao solo, de modo que as saídas paralelas estão sempre
activados. Você poderia, alternativamente, ligue a um pino de I / O do Arduino para ligar
simultaneamente todos os LEDs ligado ou desligado. O pino SRCLR é o pino clara serial. Quando puxado
baixo, ele esvazia o conteúdo do registrador de deslocamento. Para seus propósitos deste capítulo, você
amarrá-lo diretamente para 5V para impedir que os valores de registo de deslocamento de ser apagada.
o fluxo do programa. Suponha, por exemplo, que você deseja definir todos os outros LED
para o estado ON (Q ,Q ,Q ,Q ). Representada em binário, você quer a saída
UMA C E G
dos pinos paralelos sobre o registo de deslocamento para ficar assim: 10101010.
Agora, siga os passos para escrever para o registo de deslocamento acima. Em primeiro lugar, o trinco
pino é definido como baixo para que os estados do LED actuais não são alteradas, enquanto os novos
valores são deslocados. Em seguida, os estados do LED são deslocados para os registradores em ordem
sobre a borda do relógio a partir da linha DATA. Depois de todos os valores foram deslocados dentro, o
pino de bloqueio está situado no alto de novo, e os valores são emitidas pelo registo de deslocamento.
ShiftingSerialDatafromtheArduino
Agora que você entende o que está acontecendo nos bastidores, você pode escrever o código Arduino
para controlar o registo de deslocamento desta forma. Tal como acontece com todas as suas
experiências anteriores, você usa uma função conveniente que está construído para o Arduino
IDE para transferir dados para o registo IC. Você pode usar o shiftOut () a função
facilmente mudar a 8 bits de dados em um pino de I / O arbitrária. Ele aceita quatro parâmetros:
A ordem bit
■■
o DADOSe RELÓGIOfunções são definidas para os números de pinos para essas linhas.
MSBFIRSTindica que o bit mais significativo irá ser enviado primeiro (o mais à esquerda
bit quando se olha para o número binário para enviar). Você pode alternativamente enviar os dados
com oLSBFIRSTdefinindo, que começaria por transmitir os bits a partir do lado direito dos dados binários.
O último parâmetro é o número a ser enviada. Ao colocar um capital
Em seguida, você criar uma versão física do sistema que você acabou de aprender sobre
nas seções anteriores. Primeiro, você precisa para obter o registo de deslocamento com fio até o
Arduino:
Não se esqueça de usar resistores limitadores de corrente com os seus LEDs. referência do
diagrama mostrado na Figura 7-4 para configurar o circuito.
152 parte II ■ Controlar o Seu Ambiente
Agora, usando sua compreensão de como registos de deslocamento trabalhar, e sua compreensão
pé do shiftOut ()função, você pode usar o código na Listagem 7-1 para escrever o padrão de
alternância de LED para os LEDs anexados.
void setup ()
Capítulo 7 ■ Registadores de deslocamento 153
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
//Fazer nada
}
Recallfromthepin-outinFigure7-2thatthereisanunusedpincalled
Q '.Whentheoldestvalueisshiftedoutoftheshiftregister, Itisn'tdis-cardado; it'sactuallysentoutonthatpin.ByconnectingtheQ
H
'totheDATA
H
pinofanothershiftregister, andsharingtheLATCHandCLOCKpinswiththefirstshiftregister, youcancreatea16-bitshiftregistertha
ConvertingBetweenBinaryandDecimalFormats
Na listagem 7-1, as informações de estado LED foi escrito como uma cadeia binária de dígitos. Esta string
ajuda a visualizar quais LEDs será ligado e desligado. No entanto, você também pode escrever o padrão
como um valor decimal, convertendo entre os sistemas de base2 (binário) e Base10 (decimal). Cada bit
em um número binário (a partir da extremidade direita ou menos significativo, bit) representa um poder
cada vez maior de 2. Conversão de representações binárias para decimal representações é muito simples.
Considere o número binário de mais cedo exibido na Figura 7-5 com
Você deverá ver o mesmo resultado que quando você usou a notação binária.
ControllingLightAnimationswithaShiftRegister
No exemplo anterior, você construiu uma exposição estática com um registo de deslocamento. No
entanto, você provavelmente vai querer exibir informações mais dinâmica em seus LEDs. Nos próximos
dois exemplos, você usar um registrador de deslocamento para controlar um efeito de iluminação e um
gráfico de barras física.
Buildinga "LightRider"
O piloto da luz é um efeito puro que faz com que ele se parece com os LEDs estão perseguindo um ao
outro e para trás. Continuar a usar o mesmo circuito que usou anteriormente.
o shiftOut () função é muito rápido, e você pode usá-lo para atualizar a mudança
Capítulo 7 ■ Registadores de deslocamento 155
cadastre-se vários milhares de vezes por segundo. Devido a isso, você pode rapidamente atualizar as
saídas de registo de deslocamento para fazer animações de iluminação dinâmica. Aqui,
você ilumina cada LED, por sua vez, da esquerda para a direita, em seguida, da direita para a esquerda. Veja o
vídeo de demonstração ligados no final desta seção para ver este circuito acabado em ação.
Primeiro você quer descobrir cada estado de animação de modo que você pode facilmente ciclo
por eles. Para cada passo de tempo, o LED atualmente iluminado desliga, ea próxima luz acende.
Quando as luzes chegar ao fim, a mesma coisa acontece em sentido inverso. O diagrama de
temporização na Figura 7-6 mostra como as luzes vão olhar
para cada passo de tempo eo valor decimal necessário para transformar esse LED específico.
void setup ()
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
for (int i = 0; i <14; i ++)
{
digitalWrite (TRINCO, LOW); // Trava baixo - começar sendingshiftOut (SER, CLK,
MSBFIRST, seq [i]); // Mudança mais sig. bit firstdigitalWrite (TRINCO, HIGH); // Trava
alta - parar sendingdelay (100); //Velocidade da animação
}
}
RespondingtoInputswithanLEDBarGraph
Utilizando o mesmo circuito, mas a adição de um sensor de distância IR, você pode fazer um gráfico
de barras que responde a quão perto você começa. Para misturar-se um pouco mais, tente usar
várias cores LED. O diagrama do circuito na Figura 7-7 mostra o circuito modi-
Figura 7-7: gráfico de barras Distância de resposta Imagem criada com o Fritzing.
const int SER = 8; // Saída de série para mudar registerconst int TRAVA
= 9; // Mudança registar trava pinconst int CLK = 10; // Mudança
registar relógio pinconst int DIST = 0; // O sensor de distância no pino
analógico 0
void setup ()
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
distância int = analogRead (DIST); distância = map (distância,
minval, MAXVAL, 0, 8); distância = constranger (distância, 0,8);
digitalWrite (TRINCO, LOW); // Trava baixo - começar sendingshiftOut (SER, CLK, MSBFIRST,
vals [distância]); // Enviar dados, MSB firstdigitalWrite (trinco, HIGH); // Trava alta - parar
sendingdelay (10); //Velocidade da animação
Carregar o programa acima para o Arduino, e mover sua mão para trás e
outro na frente do sensor de distância, você deve ver a responder gráfico de barras, indo para cima
e para baixo, em paralelo com a mão. Se você achar que o gráfico paira muito em "all on" ou "tudo
fora", tente ajustar a
MAXVALe minval
valores para melhor atender as leituras do seu sensor de distância. Para testar os valores que você
está recebendo em várias distâncias, você pode inicializar uma conexão serial naconfiguração()e
chamada Serial.println (distância);
direito depois de executar a
analogRead (DIST);passo.
160 parte II ■ Controlar o Seu Ambiente
Resumo
III
Interfaces de comunicação
InThisPart
2
Capítulo 8: a I C Bus
Capítulo 9: O Bus SPICapítulo 10: Interface com ecrãs de cristais
líquidosCapítulo 11: Comunicação sem fio com XBee rádios
Capítulo
a I2C Bus
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch8 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no capítulo 08 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
163
164 parte III ■ Interfaces de comunicação
2
bus C (pronuncia-se "olho quadrado ver" ou "olho Two Veja").
a I2bus C permite robusta de alta velocidade, comunicação de duas vias, entre
dispositivos enquanto usando um número mínimo de E / S pinos de I para facilitar a comunicação.
uma I2barramento C é controlada por um dispositivo principal (normalmente um microcontrolador), e
contém um ou mais dispositivos escravos que recebem informação do mestre. Neste capítulo, você
aprenderá sobre o I 2
protocolo C, e implementá-lo a com-
2
nicam com um digital I sensor de temperatura C capaz de retornar medição
mentos como valores de grau em vez de valores analógicos como arbitrária. Você constrói sobre o
conhecimento dos capítulos anteriores, combinando o que você aprende neste capítulo para expandir
projetos anteriores.
NOTA Followthestepsofthischapterwiththistutorialvideo:www.jeremyblum
.com / 2011/02/13 / arduino-tutorial-7-i2c-and-processamento /.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthi
2
HistoryoftheI Cbus
Eu2CHardwareDesign
2
Figura 8-1 mostra uma configuração de referência comum para
C sistema
um I de comunicação.
2
Ao contrário de comunicação digital anterior que você viu neste livro, eu Cé
único em que múltiplos dispositivos todos compartilham as mesmas linhas de comunicação: um relógio
Capítulo 8 ■ O I2C Bus 165
sinal (SCL) e uma linha de dados bidirecional usado para o envio de informações e para trás entre o
mestre e os escravos (SDA). Observe, também, que a I 2
C
bus requer pull-up resistores em ambas as linhas de dados.
CommunicationSchemeandIDNumbers
a I2bus C permite que múltiplos dispositivos escravos para compartilhar as linhas de comunicação com
um único dispositivo mestre. Neste capítulo, o Arduino atua como o dispositivo mestre. O mestre de
rede é responsável por iniciar todas as comunicações. dispositivos escravos
Não é possível iniciar comunicações; eles só podem responder a pedidos que são
enviado pelo dispositivo mestre. Como vários dispositivos escravos compartilham as mesmas linhas com-
comunica-, é muito importante que somente o dispositivo mestre pode iniciar a comunicação. Caso
contrário, vários dispositivos podem tentar falar ao mesmo tempo e os dados iria ficar ilegível.
166 parte III ■ Interfaces de comunicação
Todos os comandos e pedidos enviados a partir do mestre são recebidas por todos os dispositivos
2
no ônibus. cada I dispositivo escravo C tem um endereço de 7 bits único, ou número de identificação. Quando
2
comunicação é iniciada pelo dispositivo mestre, um ID do dispositivo é transmitido. Eu C
dispositivos escravos reagir aos dados no ônibus somente quando ela é dirigida pelo seu número de identificação.
Porque todos os dispositivos estão recebendo todas as mensagens, cada dispositivo na I2C
2
barramento deve ter um endereço exclusivo. alguns
dispositivos
eu C têm endereços selecionáveis,
enquanto outros vêm do fabricante com um endereço fixo. Se você quiser ter vários números do
mesmo dispositivo em um ônibus, você precisa para identificar os componentes que estão disponíveis
com diferentes IDs.
Os sensores de temperatura, por exemplo, estão vulgarmente disponíveis com vários pré-
Eu programei2C aborda porque é comum a querer mais de um em um único I2bus C. Neste capítulo,
você usa o sensor de temperatura TC74. Uma espiada
o TC74 folha de dados revela que ele está disponível com uma variedade de diferentes endereços.
Figura 8-2 mostra um trecho da folha de dados. Neste capítulo, você usa TC74A0-
5.0VAT, que é a 5V, T0-220 versão do IC com um endereço de 1.001.000.
Você pode comprar este IC especial com oito números de identificação diferentes; conseqüentemente,
2
você pode colocar até oito deles em um I C ônibus e ler cada um deles inde-
dentemente. Enquanto você estiver escrevendo programas para fazer a interface com este sensor de
temperatura mais adiante neste capítulo, certifique-se de estar ciente do ID do dispositivo que você
pediu para que você enviar os comandos certos!
Como se mostra na Figura 8-3, o AD7414 disponível em quatro versões, com dois
um pino de AS e dois sem. As versões com como pinos cada um pode ter três
possíveis números de identificação, dependendo se o pino como é deixado desconectado, está ligada
à VCC, ou está ligada a GND.
HardwareRequirementsandPull-UpResistors
2
Você deve ter notado na Figura 8-1 que a I padrão configuração do barramento C
requer resistores pull-up em ambos o relógio e linhas de dados. O valor para essas resistências depende
dos dispositivos escravos e quantos deles estão ligados. Neste capítulo, você usa resistores 4.7kΩ para
ambos os pull-ups; este é um valor bastante normal que será especificado por muitas fichas.
2
CommunicatingwithanI CTemperatureProbe
2
Os passos para se comunicar com diferentes I C dispositivos variam de acordo com o
2
requisitos do dispositivo específico. Felizmente, você pode usar o Arduino I C
biblioteca para abstrair a maioria do trabalho momento difícil. Nesta seção do capítulo, você conversar
com o I 2
C sensor de temperatura descrito anteriormente. Você aprende como
para interpretar as informações folha de dados à medida que avança de modo que você pode aplicar
esses conceitos para outros 2I dispositivos C com relativa facilidade.
3. mestre envia ler (1) ou escrever (0) bit, dependendo se ele quer escrever dados em um
I2registo do dispositivo de C ou se quer ler a partir de um do Grupo I2registros do dispositivo C.
SettingUptheHardware
Para confirmar que o seu primeiro programa funciona como esperado, você pode usar o monitor
serial para imprimir as leituras de temperatura a partir de um2C
I sensor de temperatura para
Note que o SDA e SCL pinos são conectados aos pinos A4 e A5, respectivamente.
Lembre-se de mais cedo no capítulo que a SDA e SCL são os dois pinos utilizados
2
para se comunicar com I dispositivos de eles C transportar dados e sinais de relógio, res-
pectivamente. Você já aprendeu sobre pinos multiplexados em capítulos anteriores. No Arduino, pinos
A4 e A5 são multiplexados entre o conversor analógico-para-digital (ADC) e o hardware I
2
Interface C. Quando você inicializar o fio
2
biblioteca em seu código, os pinos conectar a I do ATmega C controlador, permitindo
-lo a se comunicar com o Fioobjeto a I2dispositivos C via os pinos. Ao usar a biblioteca Wire, você não
pode usar pinos A4 e A5 como entradas analógicas, porque eles são reservados para comunicação com I
2
dispositivos C.
ReferencingtheDatasheet
Em seguida, você precisa escrever o software que instrui o Arduino para solicitar dados do I 2C sensor
de temperatura. A biblioteca Arduino fio faz com que este
razoavelmente fácil. Para usá-lo corretamente, você precisa saber como ler a folha de dados
para determinar o esquema de comunicação que este chip em particular usa. Vamos dissecar o
esquema de comunicação apresentada na folha de dados usando o que você já sabe sobre como eu
2
C funciona. Considere os diagramas de folha de dados
mostrado nas Figuras 8-5 e 8-6.
Você pode ler e escrever para esta IC, como mostrado na folha de dados em
Figura 8-5. O TC74 tem dois registos, um que contém a temperatura actual no
Celsius e que contém informações de configuração sobre o chip (incluindo o estado de espera e estado de
dados pronto). Tabela 4-1 da folha de dados mostra isso. Você não fazer
Capítulo 8 ■ O I2C Bus 171
precisa mexer com a informação de configuração; você só quer ler a temperatura do dispositivo. As
tabelas 4-3 e 4-4 dentro Figura 8-6 mostram a forma como a informação sobre a temperatura é
armazenada dentro do registo de dados de 8 bits.
WritingtheSoftware
void setup ()
{
// Iniciar comunicação serial em 9600 baudSerial.begin
(9600);
// Criar um fio
objectWire.begin ();
void loop ()
172 parte III ■ Interfaces de comunicação
{
// Enviar um pedido // Comece a falar com o dispositivo na
addressWire.beginTransmission especificado (temp_address); // Enviar
um pouco pedindo para registo zero, o registerWire.write dados (0); //
Wire.endTransmission transmissão completa ();
atraso (500);
}
ler()comando.
O programa na Listagem 8-1 também lida com a conversão da temperatura Celsius para
Fahrenheit, para aqueles que não são metricamente inclinado. Você pode encontrar a fórmula
Capítulo 8 ■ O I2C Bus 173
para esta conversão com uma simples pesquisa na web. Eu escolhi para arredondar o resultado para o
número inteiro.
Agora que você tem uma simples I 2esquema de comunicação C configurado com série
impressão, você pode aplicar um pouco do seu conhecimento a partir de capítulos anteriores para
fazer algo mais interessante. Você usa o circuito gráfico de registo de deslocamento do capítulo 7, "Shift
Registers", juntamente com um esboço de desktop Processing para visualizar a temperatura no mundo
real e na tela do computador.
BuildingtheHardwareforaTemperatureMonitoringSystem
As primeiras coisas primeiro, obter o sistema de fios para cima. Você está essencialmente apenas
combinando o circuito de registo de deslocamento do capítulo anterior
2 com o I desta
C circuito
capítulo. Sua configuração deve ser semelhante a Figura 8-8.
174 parte III ■ Interfaces de comunicação
Figura 8-8: Eu2 sensor de temperatura C com gráfico de barras registo de deslocamento (parte do TC74 tem
sido feita transparente para que você possa ver os fios que conectam por trás dele)
ModifyingtheEmbeddedProgram
Você precisa fazer dois ajustes ao programa Arduino anterior para fazer
comunicação serial com o processamento mais fácil, e para a implementação do registo de deslocamento
funcionalidade. Em primeiro lugar, modificar as instruções de impressão no programa que você
escreveu apenas para se parecer com isto:
Serial.print (c);
Serial.print ( "C");
Capítulo 8 ■ O I2C Bus 175
Serial.print (f);
Serial.print ( "F".);
reutilizado aqui, com alguns pequenos ajustes. Para começar, alterar o número total de
variáveis de luz de nove para oito. Com esta mudança, você sempre deixar um LED na como uma
indicação de que o sistema está a funcionar (o
0valor é eliminado
a matriz). Você precisa acomodar para que a mudança no valor da variável mapa-ping, e você precisa
mapear uma gama de temperaturas para os estados de LED. Confira o exemplo de código completo na
Listagem 8-2 para ver como isso é feito. Eu escolhi fazer o meu variam entre 24°C a 31°C (75°F a 88°F),
mas você pode escolher qualquer faixa.
2
Listagem 8-2: EuSensores C Código de temperatura com registo de deslocamento LEDs e Serial
Comunicação-temp_unit.ino
void setup ()
{
// Criar uma instância de comunicação serial em 9600
bpsSerial.begin (9600);
// Criar um fio
ObjectWire.begin ();
void loop ()
{
// Enviar um pedido // Comece a falar com o dispositivo na
addressWire.beginTransmission especificado (temp_address); // Enviar
um pouco pedindo para registo zero, o registerWire.write dados (0); //
Wire.endTransmission transmissão completa ();
digitalWrite (TRINCO, LOW); // Trava baixo - começar a enviar datashiftOut (SER, CLK,
MSBFIRST, vals [gráfico]); // Enviar dados, a maioria // pouco significativa
firstdigitalWrite (TRINCO, HIGH); // Trava alta - parar de enviar dados
Serial.print (c);
Serial.print ( "C");
Serial.print (f); ( ". F")
Serial.print;
atraso (500);
}
Depois de carregar isso para o Arduino, você pode ver os LEDs mudando de cor
com a temperatura. Tentar apertar o sensor de temperatura com você pontas dos dedos para fazer a
temperatura subir. Você deverá ver uma resposta nos LEDs. Em seguida, você escrever um esboço de
processamento que exibe o valor da temperatura no computador em um formato fácil de ler.
Capítulo 8 ■ O I2C Bus 177
WritingtheProcessingSketch
Neste ponto, o seu Arduino já está transmitindo dados de fácil análise para o seu computador. Tudo
que você precisa fazer é escrever um programa de processamento que podem interpretá-lo e exibi-lo
de uma forma atraente.
Porque você vai estar atualizando texto em tempo real, você precisa primeiro aprender a
carregar fontes em Processamento. Abrir processamento para criar um novo esboço, em branco. Salvar o
esboço antes de continuar. Em seguida, navegue até Ferramentas> Criar Font. Você terá
Escolha sua pia batismal favorita e escolha um tamanho. (Eu recomendo um tamanho de cerca de 200 par
este exercício.) Após fazer isso, clique em OK. A fonte é, então, automaticamente Gener-ated e
adicionado ao "dados" subpasta da sua pasta esboço Processing. O esboço de processamento precisa
realizar algumas coisas:
Leia os dados de entrada da porta serial, analisá-lo e salvar os valores para as variáveis locais que
■■
processing.serial importação. *;
porta serial; Cordas temp_c = "";
Cordas temp_f = ""; cadeia de
dados = ""; int index = 0; font
PFont;
void setup ()
{
tamanho (400.400); // Change "COM9" para o nome da porta serial em seu
computerport = new Serial (this, "COM9", 9600); port.bufferUntil ( '.'); // Altere o nome
da fonte para refletir o nome da fonte que você createdfont = LoadFont ( "AgencyFB-
Bold-200.vlw"); TEXTFONT (fonte, 200);
draw void ()
{
fundo (0,0,0); preencher (46,
209, 2); texto (temp_c, 70,
175); preencher (0, 102, 153);
texto (temp_f, 70, 370);
}
Capítulo 8 ■ O I2C Bus 179
Como nos exemplos de processamento anteriores que você correr, o esboço começa por
importar a biblioteca de série e configurar a porta serial. Dentro configuração(), tu es
definir o tamanho da janela do visor, carregando a fonte que você acabou de criar e
configurar a porta serial para o buffer até que ele recebe um ponto. desenhar()enche o
fundo em preto e imprime os valores graus Celsius e Fahrenheit em duas cores. Com o preencher()
comando, você está dizendo Processamento para fazer o próximo
elemento que contribui para o ecrã que a cor (em valores RGB).serialEvent () é chamado
sempre que o bufferUntil () evento é acionado. Ele lê o buffer em uma string,
e depois divide-se com base na localização da vírgula. Os dois valores de temperatura são armazenados
em variáveis que são impressos na janela do aplicativo.
Quando você executar o programa, a saída deve ser semelhante os resultados mostrados
na Figura 8-10.
NOTA Towatchademovideoofthetemperaturemonitoringhardwareand
Processingsystem, check-outwww.exploringarduino.com/content/ch8.YoucanalsofindthisvideoontheWileywebsiteshownattheb
180 parte III ■ Interfaces de comunicação
Resumo
Eu C usa duas linhas de dados para permitir a comunicação digital entre o Arduino
■■ 2
exibições na tela.
2
O processamento pode ser usada para exibir os dados de série processadas que são
■■ C obtidos a partir de I
dispositivos conectados ao Arduino.
Capítulo
O Bus SPI
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch9 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no capítulo 09 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
181
182 parte III ■ Interfaces de comunicação
Ao contrário do Eu2bus C, o barramento SPI usa linhas separadas para enviar e receber
de dados, e emprega uma linha adicional para selecionar qual dispositivo escravo que você está falando.
Isso adiciona fios adicionais, mas também elimina o problema de precisar de diferentes endereços de
dispositivo escravo. SPI é geralmente mais fácil de se correr do que eu
2
C
e pode correr a uma velocidade mais rápida. Neste capítulo, você usa built-in SPI do Arduino
biblioteca e hardware para comunicar com um potenciómetro digitalmente controlável.
Você usa o potenciômetro para controlar tanto brilho e alto-falante volume de LED, permitindo que você
faça um / display de áudio visual simples.
NOTA Followthestepsofthischapterwiththistutorialvideo,www.jeremyblum
.com / 2011/02/20 / arduino-tutorial-8-SPI-interfaces.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
OverviewoftheSPIBus
Originalmente criado pela Motorola, o barramento SPI é uma comunicação de série full-duplex
padrão ção que permite a comunicação bidirecional simultânea entre um
dispositivo mestre e um ou mais dispositivos escravos. Como o protocolo SPI não segue um padrão formal,
é comum encontrar dispositivos de SPI que operam ligeiramente
diferente (o número de bits transmitidos podem ser diferentes, ou a linha de selecção escravo
pode ser omitida, entre outras coisas). Este capítulo centra-se na implementação dos comandos SPI
mais comumente aceitas (que são os que estão SUP-portados no Arduino IDE).
SPI pode atuar de quatro maneiras principais, que dependem dos requisitos do seu
dispositivo. SPI dispositivos são muitas vezes referidos comodispositivos escravos. dispositivos de SPI é sincronizada
nous, o que significa que os dados são transmitidos em sincronia com um sinal de relógio comum (SCLK).
Os dados podem ser deslocado para o dispositivo escravo em cada borda de subida ou de descida do sinal
de clock (o chamado fase do relógio), E o estado SCLK padrão pode ser definido como
alta ou baixa (a chamada polaridade relógio). Uma vez que existem duas opções para cada um,
você pode configurar o barramento SPI em um total de quatro maneiras. Tabela 9-1 mostra cada uma das
possibilidades e os modos que correspondem a na biblioteca Arduino SPI.
Capítulo 9 ■ O SPI Bus 183
modo 0 Baixa em marcha lenta Captura de Dados no pulso de disparo Borda de Subida
modo 1 Baixa em marcha lenta Captura de dados sobre Relógio borda de descida
modo 2 Alta em marcha lenta Captura de dados sobre Relógio borda de descida
modo 3 Alta em marcha lenta Captura de Dados no pulso de disparo Borda de Subida
SPIHardwareandCommunicationDesign
A configuração do sistema SPI é relativamente simples. Três pinos são utilizados para communicat-ing
entre um mestre e todos os dispositivos escravos:
Cada dispositivo escravo também requer um seleto pin (SS) escravo adicional. Assim, o
número total de pinos de I / O necessários no dispositivo principal será sempre 3 + n, Onde n é o número
de dispositivos escravos. A Figura 9-1 mostra um exemplo do sistema SPI
HardwareConfiguration
Quatro linhas de dados, pelo menos, estão presentes em qualquer sistema de SPI. SS linhas adicionais são
adicionados para cada dispositivo slave anexada à rede. Antes de saber como realmente enviar e receber
dados de e para um dispositivo SPI, você precisa entender o que esses / O linhas que faço e como eles
devem ser ligados. Tabela 9-2 descreve essas linhas.
Ao contrário do que eu2C ônibus, resistores pull-up não são necessários, e comunicação
ção é completamente bidireccional. Para conectar um dispositivo SPI ao Arduino, tudo que você tem a
fazer é conectar os pinos MOSI, miso, SCLK e SS e você estará pronto para usar a biblioteca de
comunicação SPI.
convenções de nomenclatura
BecauseSPIisnotauniversalstandard,
somedevicesandmanufacturersmayusedifferentnamesfortheSPIcommunicationlines.Slaveselectissometimesreferredtoaschipselec
serialclockissometimesjustcalledclock (CLK), MOSIandMISOpinsonslavedevicesaresometimesabbreviatedtoserialdatain (SDI), ands
CommunicationScheme
2. Comutar o relógio linha cima e para baixo a uma velocidade menor ou igual à velocidade de
transmissão suportado pelo dispositivo escravo.
3. Para cada ciclo de clock, envie um pouco na linha MOSI, e receber um pouco na linha MISO.
Note-se que em cada ciclo de clock um pouco devem ser enviados e recebidos, mas que pouco faz
não precisa necessariamente significar qualquer coisa. Por exemplo, mais adiante neste capítulo,
usar um potenciômetro digital em um cenário em que o Arduino irá enviar dados, mas não precisa
receber nada de volta do escravo. Então, ele vai dados do relógio para fora no pino MOSI e irá
simplesmente ignorar qualquer coisa que vem de volta no pino MISO.
2
ComparingSPItoI C
Pode operar em velocidades mais altas Requer apenas duas linhas de comunicação
CommunicatingwithanSPIDigitalPotentiometer
Agora que você tem todos os elementos básicos para baixo, é hora de aplicar na prática o que aprendeu.
Você vai começar por controlar o brilho de LED usando um poten-tiometer digitais (a DigiPot para o
short). Especificamente, você vai usar o Microchip MCP4231 103E potenciômetros digitais IC. (Várias
versões deste chip estão disponíveis, cada um com diferentes valores de resistência do potenciômetro.)
Ao procurar um sistema integrado
186 parte III ■ Interfaces de comunicação
circuit (IC) como este para usar em sua placa de ensaio, você quer olhar para a versão dual in-line
pacote (DIP) do chip. Apenas um como um potenciômetro regular, uma
GatheringInformationfromtheDatasheet
Primeiro de tudo, você sempre precisa consultar a folha de dados. Uma rápida no Google
procurar "MCP4231" irá transformar-se a folha de dados. Você também pode encontrar um link para a
folha de dados do site Arduino o Explorando:
www.exploringarduino.com/
■■Quais comandos SPI devem ser enviados para controlar os dois limpadores digitais?
Para ajudar você a referência a esta informação, as Figuras 9-2 através de 9-4 mostram alguma
das peças-chave desta folha de dados. Primeiro, dê uma olhada no pin-out apresentado em
a primeira página da folha de dados.
Crédito: © 2013 Microchip Technology, Inc.
A pin-out geralmente deve ser o primeiro passo quando se preparando para trabalhar
com um novo dispositivo. Segue-se uma discriminação de todos os pinos e as suas funções:
Pinos P0A, P0W e P0B: Estes são os pinos para o primeiro potenciômetro digitalmente con-
■■
trolada.
Pinos P1A, P1W e P1B: Estes são os pinos para o segundo digitalmente
■■
potenciómetro controlada.
CS:CS é o pino SS para a interface SPI, eo bar acima indica que ele está ativo baixo. (0V significa que o
■■
SDI e SDO: Estes pinos correspondem aos dados de série dentro e fora, respec-tivamente
■■
SCK: Esta é a linha de relógio SPI que foi explicado anteriormente neste capítulo.
■■
Para este chip, é revelado mais tarde na folha de dados que o pino WP é realmente
NC (não ligado). Você pode ignorar este pino. O pino SHDN ativo é baixo, como o pino CS.
Quando em nível baixo, o hardware "desconecta" o limpador
a partir da rede de resistências internas. Você sempre quer que seu potenciômetro para
ser ativo, então nestes exemplos o pino SHDN é conectado diretamente a 5V.
Você também precisa entender os comandos de SPI que você deve emitir ao
dispositivo para controlá-lo. No caso do MCP4231, você emitir dois comandos para o dispositivo: O
primeiro especifica o registo de controlo (há um registro para cada
Você pode ver a partir do diagrama que dois tipos de comando estão disponíveis: um 8-bit
comando e um comando de 16 bits. O comando de 8 bits permite incrementar o potenciômetro com um
único byte de comunicação, enquanto o de 16 bits com-mand permite definir o estado do potenciômetro
de forma arbitrária. Para manter as coisas simples, se concentrar em usar o comando de 16 bits, porque
oferece mais flexibilidade.
Sobre o barramento SPI, você transmitir um endereço de memória, um comando (leitura, escrita,
incremento ou decremento), e um valor de dados (0-128).
A folha de dados indica também os endereços de memória associados a cada
potenciômetro. O valor do potenciômetro 0 está localizado no endereço de memória 0, e
potenciômetro 1 está localizado no endereço de memória 1. Usando essas informações, você pode
construir os bytes de comando necessárias para escrever a cada um dos potes. Para gravar
potenciômetro 0, você transmita
00000000em binário, seguido por um valor
de 0 a 128. Para gravar potenciômetro 1, você transmita 00010000em binário
seguido por um valor de 0 a 128. consultando a Figura 9-4, os quatro primeiros dígitos são o endereço
de memória, as duas seguintes são o comando (
00significa escrever), e
Capítulo 9 ■ O SPI Bus 189
os próximos 2 bits são os primeiros bits de dados 2, que deve ser sempre 0 porque o potenciómetro só
pode ser tão elevada quanto 128.
Esta é toda a informação que você precisa para conectar o DigiPot corretamente e para
enviar comandos SPI a partir do seu Arduino. Agora, você fio-lo para controlar o brilho de alguns
LEDs.
SettingUptheHardware
Para concretizar plenamente o seu conhecimento da comunicação SPI, você vai usar dois MCP44231
DigiPot ICs, para um total de quatro canais potenciômetro controláveis. Cada um é utilizado para
controlar o brilho de dois LEDs através da variação da resistência em série
em linha com o LED. Quando usado desta forma, você precisará usar apenas dois
terminais de cada potenciômetro. Uma extremidade de cada potenciómetro conecta ao carril 5V
(através de uma resistência), e o pino do limpador conecta ao ânodo do
CONDUZIU. Considere o esquema Figura 9-5, que mostra este esquema de conexão.
Agora, fio até os dois potenciômetros digitais para o barramento SPI e os LEDs,
como mostrado no esquema anterior, utilizando a informação da folha de dados sobre a extremidade
do pino para fora. No Arduino Uno, o pino 13 é SCK, o pino 12 é MISO, e o pino 11 é MOSI. Pin 10 é
comumente utilizado para SS, então use isso para um dos chips.
Por outro lado, a utilização de PIN 9. Depois de ter prendido acima de tudo, deve olhar
algo como a Figura 9-6. Lembre-se que as linhas SCK, miso, e MOSI são partilhadas entre ambos os
dispositivos.
WritingtheSoftware
Para confirmar que a fiação está trabalhando e que você pode usar com sucesso a biblioteca SPI,
você vai escrever um programa simples de ajustar, simultaneamente, o brilhante-ness de todos os
quatro LEDs usando os quatro potenciômetros sobre os dois ICs.
Tal como acontece com Eu2C, uma biblioteca conveniente é construído na direita para o IDE Arduino que
torna a comunicação SPI muito fácil. Tudo que você precisa fazer é importar a biblioteca e os dados
"Write" para o barramento SPI usando os comandos integrados. Claro, você também tem que alternar os
pinos SS para qualquer dispositivo que você está controlando. Então, puxe-ing junto todo o
conhecimento de mais cedo neste capítulo, aqui estão os passos que você precisa para completar para
enviar um comando para alterar o brilho de um LED em um dos potenciômetros digitais SPI:
2. Enviar o byte de registo / comando apropriado para escolher qual potenti-ometer você está
indo para gravar.
O código na Listagem 9-1 executa todas estas etapas e inclui uma função para
passando o pino SS, cadastre-byte, e de comando para um determinado chip de via SPI.
SPIo
void setup ()
{
// Definir as direções pinos para
SSpinMode (SS1, OUTPUT);
pinMode (SS2, OUTPUT);
// Inicializar
SPISPI.begin ();
{
digitalWrite (SS, LOW); // Definir o dado SS pino lowSPI.transfer (reg); //
Escolha o registo para escrever toSPI.transfer (nível); // Definir o nível de
LED (0-128) digitalWrite (SS, HIGH); // Definir o dado pin alta SS novamente
void loop ()
{
for (int i = 0; i <= 128; i ++)
{
setled (SS1, REG0, i); setled
(SS1, REG1, i); setled (SS2,
REG0, i); setled (SS2, REG1, i);
delay (10);
}
delay (300); for (int i = 128; i> =
0; i--)
Capítulo 9 ■ O SPI Bus 193
{
setled (SS1, REG0, i); setled
(SS1, REG1, i); setled (SS2,
REG0, i); setled (SS2, REG1, i);
delay (10);
}
atraso (300);
}
Na Listagem 9-1, SS para o chip 1 está conectada ao pino 10, e SS para o chip 2 é
conectada ao pino 9. Você pode cruzar referência deste com o hardware Con-ções feitas durante a
fiação do sistema na seção anterior. Os valores byte registrar-se na parte superior do arquivo são as
mesmas sequências binárias que você determinados a partir da folha de dados, anteriormente neste
capítulo. Quando você coloca um
B
antes de uma série de 0s e 1s ao criar uma bytevariável, você está dizendo a
compilador Arduino que o que se segue é em formato binário, e não o formato decimal padrão
que você usa em outros lugares em seu programa. o
setled ()função
ção aceita um número SS pino, um byte de registo e valor do nível de potenciômetro. Esta função utiliza
a informação a transmitir os dados para o adequado
lasca. Dentroloop (), Todos os LEDs são de ramp up, em seguida, voltar para baixo novamente, com
atrasos curtos para que a transição não ocorre tão rápido que você não pode vê-lo. Quando você
carregar este para o seu Arduino, você deve observar todas as quatro luzes que mudam de
intensidade em conjunto como os potenciômetros são todos ajustados.
NOTA TowatchademovideooftheSPIdigitalpotentiometercoloradjuster,
visitawww.exploringarduino.com/content/ch9.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Agora que você tem esse exemplo simples de trabalho, você pode passar para a
próxima seção, onde você aumenta a complexidade do sistema transformando-o em uma exibição
audiovisual.
CreatinganAudiovisualDisplayUsingSPIDigitalPotentiometers
Alterar o brilho de LED é um bom teste para confirmar a sua compreensão da comunicação SPI, mas
também é algo que você pode fazer com PWM. Em seguida, você
integrar alguma tecnologia que você não pode replicar com uma interface PWM:
som. Como você aprendeu no Capítulo 5, "fazendo sons", o Arduino IDE tem uma biblioteca tom que lhe
permite produzir facilmente ondas quadradas a partir de qualquer pino do Arduino para dirigir um alto-
falante. Embora isso permite criar facilmente uma gama de frequências, ele não permite que você altere
o volume do áudio, porque essa é uma função da amplitude da forma de onda. Você já aprendeu como
194 parte III ■ Interfaces de comunicação
para colocar um potenciômetro comum em série com um alto-falante para ajustar o volume. Agora,
você usa o SPI DigiPot para ajustar o volume do altifalante digitalmente.
SettingUptheHardware
A configuração aqui é semelhante ao que você usou para ajustar o brilho LED. Na verdade, para manter
as coisas interessantes, você mantém três dos LEDs no lugar e substituir um deles com um alto-falante.
No entanto, para o alto-falante, uma extremidade do potenti-ometer digitais conecta através de um
resistor para um pino de I / O do Arduino que irá ajustar a freqüência do alto-falante. A onda quadrada
gerada passa através do DigiPot, que então adiciona uma resistência em série, caindo, assim, a tensão
para o alto-falante, alterando a sua amplitude. Remova um dos LEDs, colocar uma coluna em seu lugar,
e se conectar que DigiPot para um pino de I / O no Arduino, como mostrado na
Você também pode querer considerar a adição de alguns sensores analógicos para isso mais tarde para
experiência com o uso de luz, movimento e som para controlar a saída de seu sistema de exibição
audiovisual.
ModifyingtheSoftware
Para começar com esta configuração, fazer algumas modificações simples para o seu programa PREVI-
ous para controlar os LEDs. Adicione uma variável de pinos para o alto-falante, bem como uma variável
para definir a freqüência do alto-falante. (Você vai ter que mudar todo o programa para manter as
coisas interessantes.) Dentro
loop (), Você pode Option
aliado adicionar alguns iteradores que aumentam a frequência de alto-falante na cada rodada
o laço. Você pode usar a mesma exata setled ()função como anteriormente, para definir o
o volume das colunas, mas o nome é agora um pouco enganador, então você pode querer mudar o
nome da função para maior clareza. No código completo mostrado na Listagem 9-2, foi renomeado
parasetreg ().
void setup ()
{
// Definir as direções pinos para
SSpinMode (SS1, OUTPUT);
pinMode (SS2, OUTPUT);
// Inicializar
SPISPI.begin ();
{
digitalWrite (SS, LOW); // Definir o dado SS pino lowSPI.transfer (reg); //
Escolha o registo para escrever toSPI.transfer (nível); // Definir o nível de
LED (0-128) digitalWrite (SS, HIGH); // Definir o dado pin alta SS novamente
void loop ()
{
tom (ALTO-FALANTE, freq); // Conjunto de alto-falante para determinado
frequencyfor (int i = 0; i <= 128; i ++)
{
setreg (SS1, REG0, i); setreg
(SS1, REG1, i); setreg (SS2,
REG0, i); setreg (SS2, REG1, i);
delay (10);
}
delay (300); for (int i = 128; i> =
0; i--)
{
setreg (SS1, REG0, i); setreg
(SS1, REG1, i); setreg (SS2,
REG0, i); setreg (SS2, REG1, i);
delay (10);
}
delay (300); if (freq> 2000) freq =
100; freq = freq + 100;
Carregar este programa em seu Arduino, e para além das luzes alte-
ing intensidade, o orador vai mudar volume. Em cada ciclo, a frequência
é incrementado de 100 Hz até atingir 2000Hz. Isso é controlado pela E se
declaração no final de loop (). O loops que estão controlando o brilho LED
eo volume não precisa mudar nada do que você escreveu na Listagem 9-1, porque o volume das
colunas está sendo controlada pela mesma ação potenciômetro que está controlando os LEDs.
Capítulo 9 ■ O SPI Bus 197
Este é apenas um ponto de partida. Agora você tem conhecimento suficiente para realmente fazer
esta plataforma multimídia em algo emocionante. Aqui estão algumas sugestões:
Correlacionar freqüência de som e volume com entradas de sensores (por exemplo, um sensor
■■
ou frequência do alto-falante.
NOTA Towatchademovideooftheaudiovisualplatforminaction:
www.exploringarduino.com/content/ch9.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Resumo
O barramento SPI utiliza duas linhas de dados, uma linha de relógio, e uma linha de selecção
■■
escravo. Um selecione a linha escravo adicional é adicionado para cada dispositivo escravo,
mas as outras três linhas são compartilhadas no ônibus.
A biblioteca Arduino SPI pode ser utilizado para facilitar a comunicação fácil
■■
Você pode conversar com vários dispositivos de SPI ao longo das mesmas linhas de ônibus usando
■■
dados.
10
interface com
Telas de cristal líquido
199
200 parte III ■ Interfaces de comunicação
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch10 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no download do capítulo 10 e individualmente
nomeados de acordo com os nomes em todo o capítulo.
Uma das melhores coisas sobre a concepção de sistemas embarcados é o fato de que eles
pode funcionar independentemente de um computador. Até agora, você foi amarrado ao computador se
você deseja exibir qualquer tipo de informação mais complicado
do que um LED aceso. Ao adicionar uma tela de cristal líquido (LCD) para o seu
Arduino, você pode mais facilmente exibir informações complexas (valores dos sensores, tim-ing
informação, aos ajustes, barras de progresso, etc.) diretamente em seu projeto Arduino sem ter que
interagir com o monitor serial através do computador.
Neste capítulo, você aprenderá como ligar um LCD para o seu Arduino, e você
aprender a usar o Arduino Cristal líquido biblioteca para escrever um texto e arbitrária
personagens personalizadas para o seu LCD. Depois de ter o básico para baixo, você adicionar alguns
componentes dos capítulos anteriores para fazer um simples termostato capaz de obter dados de
temperatura locais, reportando-lo para você, e controlar um ventilador para
compensar calor. Um LCD vai lhe dar informações ao vivo, um alto-falante vai
alertá-lo quando a temperatura está a ficar demasiado quente, e o ventilador irá ligar para refrigerá-
lo automaticamente.
SettingUptheLCD
Para concluir os exemplos neste capítulo, você usa uma tela LCD paralelo. Estes são extremamente comuns
e vêm em todos os tipos de formas e tamanhos. O mais comum é um 16n2 de exibição de caracteres com
uma única linha de 16 pinos (14, se ele não tem uma luz de fundo). Neste capítulo, você usa um monitor
LCD de 16 pinos que pode mostrar um total de 32 caracteres (16 colunas e 2 linhas).
Em seguida, você ligar o seu LCD a uma placa de ensaio e seu Arduino. Todos esses
módulos LCD paralelas têm o mesmo pin-out e pode ser ligado em um dos dois
modos: 4 pinos ou modo de 8 pinos. Você pode conseguir tudo o que você pode querer fazer usando apenas
4 pinos para comunicação; é assim que você vai conectar-se. Há também
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 201
pinos para permitir a exibição, definindo o modo de exibição ou caractere para comandar
modo, e para defini-la como modo de leitura / gravação. Tabela 10-1 descreve todos estes pinos.
2 VDD + Conexão 5V
5 RW Ler escrever
6 PT Habilitar
11 D4 linha de dados 4
12 D5 linha de dados 3
13 D6 linha de dados 6
14 D7 linha de dados 7
16 K cátodo Backlight
202 parte III ■ Interfaces de comunicação
O pino de ajuste de contraste muda a forma como escuro da tela é. Ele se conecta ao pino
■■
central de um potenciômetro.
O pino de selecção registo define o LCD para comandar ou modo de caracteres, para que ele saiba
■■
como interpretar o próximo conjunto de dados que são transmitidos através das linhas de dados.
Com base no estado deste pino, os dados enviados para o visor LCD ou é interpretado como um
comando (por exemplo, mover o cursor) ou caracteres (por exemplo, a letrauma).
O pino RW está sempre ligada à terra nesta implementação, o que significa que você só
■■
pinos de dados 4-7 são usadas para dados, na verdade, transmitindo, e pinos de dados 0-3 são
■■
deixados desligados.
Você pode iluminar a luz de fundo, ligando o pino ânodo para 5V e o pino do cátodo para a
■■
terra, se você estiver usando um LCD com um resistor embutido para a luz de fundo. Se você
não for, você deve colocar um resistor limitador de corrente em linha com o pino ânodo ou
cátodo. A folha de dados para o dispositivo geralmente vai dizer se você precisa fazer isso.
RS Pin 2
PT Pin 3
D4 Pin 4
D5 Pin 5
D6 Pin 6
D7 pino 7
Agora, o seu LCD está pronto para a ação! Depois de obter o código carregado na próxima
seção, você pode começar a exibir texto na tela. O potenciômetro vai
ajustar o contraste entre o texto ea cor de fundo do ecrã.
UsingtheLiquidCrystalLibrarytoWritetotheLCD
com o visor usando as funções mais importantes. Você pode encontrar descrições
das funções de biblioteca e exemplos que ilustram o seu uso no Arduino
site: http://arduino.cc/en/Reference/LiquidCrystal (Também ligado a partir de
www.exploringarduino.com/content/ch10 ).
AddingTexttotheDisplay
Neste primeiro exemplo, você adicionar algum texto e um número de incremento para a exibição.
Este exercício demonstra como inicializar a exibição, como escrever um texto, e como mover o cursor.
Em primeiro lugar, incluir o
Cristal líquido biblioteca:
#include <LiquidCrystal.h>
Após fazer isso, você pode chamar a biblioteca de impressão()e setCursor ()com-
mandos para imprimir o texto para um determinado local no ecrã. Por exemplo, se você quiser imprimir
o meu nome na segunda linha, você emitir estes comandos:
As posições na tela são indexados começando com (0,0) no canto superior esquerdo
posição. O primeiro argumento de setCursor ()especifica qual número de coluna,
eo segundo especifica o número da linha. Por padrão, o local de partida é (0,0). Então, se você chamar
impressão()sem primeiro mudar a posição do cursor, o texto
começa no canto superior esquerdo.
Usando este conhecimento, agora você pode escrever um programa simples que exibe
algum texto na primeira linha e que imprime um contador que aumente a cada segundo na segunda
linha. Listagem 10-1 mostra o programa completo a aloja-realizar isto. Carregá-lo no seu Arduino e
confirmar que ele funciona como esperado. Se você não vê nada, ajuste o contraste com o
potenciômetro.
// Iniciar o tempo no
momento 0int = 0;
void setup ()
{
// Configurar o número do LCD de colunas e linhas: lcd.begin (16,
2); // Imprimir uma mensagem para o LCD.lcd.print ( "Display de
Jeremy");
void loop ()
{
// Mover o cursor para a segunda linha, primeira
positionlcd.setCursor (0,1); // Imprimir Timelcd.print
atual (tempo); // Espere 1 seconddelay (1000); //
Incrementa o timetime ++;
porque você quer o texto a ser impresso para posicionar (0,0), Que já é
o padrão local de partida. No loop, o cursor é sempre definido de volta à posi-ção(0,1)para que o
número de imprimir cada segundo substitui o anterior
CreatingSpecialCharactersandAnimations
E se você deseja exibir informações que não podem ser expressas utilizando texto normal? Talvez você
deseja adicionar uma letra grega, um sinal de grau, ou algumas barras de progresso. Felizmente, a
biblioteca LiquidCrystal apoia a definição de personagens personalizados que podem ser escritos para a
exibição. No próximo exemplo, você usar esta
Criando um personagem personalizado é bastante simples. Se você tomar um olhar mais atento
em seu LCD, você verá que cada bloco personagem é na verdade composta de a 5n8 grade de pixels.
Para criar um personagem personalizado, você simplesmente tem que definir o valor de cada um desses
pixels e enviar essa informação para o visor. Para tentar fazer isso, você faz uma série de personagens
que irão preencher a segunda fila do ecrã com uma barra de progresso animada. Dado que cada espaço
de caracteres é de 5 pixels de largura, vai haver um total de cinco caracteres mercadorias: uma com uma
coluna cheia, um com duas colunas enchido, e assim por diante.
Na parte superior do seu esboço onde você quer usar os caracteres personalizados, cria-
comeu um array de bytes com 1s que representam pixels que será ligado e com 0s
representando pixels que será desligado. A matriz de bytes que representa o char-
Acter que preenche a primeira coluna (ou o primeiro 20% do personagem) se parece com isso:
};
você pode ter um total de oito caracteres personalizados. Para mapear a matriz de caracteres de bytes de
20% a personagem costume 0, digite o seguinte dentro do seu
configuração()função:
Quando você está pronto para escrever um personagem personalizado para a exibição, coloque o cursor
no local certo e usar a biblioteca de Escreva()funcionar com o número de ID:
lcd.write (1);
Colocando tudo isso junto, você pode adicionar o resto dos personagens e colocar dois
aninhado para()laços em sua rotina do programa para lidar com atualizar a barra de progresso.
O código completo se parece com o código mostrado na Listagem 10-2.
};
208 parte III ■ Interfaces de comunicação
};
byte p60 [8] =
{B11100, B11100,
B11100, B11100,
B11100, B11100,
B11100, B11100,
};
byte p80 [8] =
{B11110, B11110,
B11110, B11110,
B11110, B11110,
B11110, B11110,
};
p100 byte [8] =
{B11111, B11111,
B11111, B11111,
B11111, B11111,
B11111, B11111,
};
void setup ()
{
// Configure o número de LCDs de colunas e linhas: lcd.begin (16,
2); // Imprimir uma mensagem para o LCD.lcd.print ( "Display de
Jeremy");
// Faça o progresso
characterslcd.createChar (0, p20);
lcd.createChar (1, p40);
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 209
void loop ()
{
// Mover o cursor para a segunda linelcd.setCursor (0,1); //
Limpar a linha de cada vez que ele chega ao fim // com 16
"" (espaços) lcd.print ( "");
{
// Iterar através de cada valor de progresso para cada characterfor (int j = 0;
j <5; j ++)
{
lcd.setCursor (i, 1); // Move o cursor para este locationlcd.write (j); //
Atualiza bardelay andamento (100); //Esperar
}
}
}
BuildingaPersonalThermostat
Agora, vamos fazer esta exposição um pouco mais útil. Para fazer isso, você adiciona a temperatura
2
sensor do Capítulo 8, "A I C Bus ", um ventilador, e o alto-falante a partir do capítulo 5,
"Fazendo Sounds". A tela mostra a temperatura eo estado do ventilador atual. Quando fica muito quente,
o orador faz um barulho para alertá-lo, e o ventilador se transforma
em. Quando fica suficientemente frio novamente, o ventilador desliga-se. Usando dois botões de premir
eo código de estabilização na Listagem 2-5 no Capítulo 2, "Entradas, saídas digitais, e por largura de
pulso modulação," você adiciona a capacidade de aumentar ou diminuir a temperatura desejada.
210 parte III ■ Interfaces de comunicação
SettingUptheHardware
uma fonte de alimentação externa (como o motor de corrente contínua a partir do capítulo 4, "DC Motors,
Transistores, e Servos "). Um ventilador de baixo consumo de energia DC ligado diretamente a um / O
pino de 5V I serão suficientes para mostrar que ele gira quando deveria. Será acelerando devagar o
suficiente para que você não precisa se preocupar muito com picos indutivos. Se você realmente
quer que ele faça uma brisa, use o mesmo esquema que você usou para a condução de um motor DC
no capítulo 4 (veja a Figura 4-1).
DisplayingDataontheLCD
Tendo alguns parâmetros no lugar de antemão torna a escrita de informações para a tela LCD mais fácil.
Primeiro, use graus Celsius para a exibição e, segundo, suponha que você sempre vai estar mostrando dois
dígitos para a temperatura. Uma vez que o software
está em execução, o visor LCD será algo parecido com a Figura 10.4.
O símbolo de grau, o indicador de ventilador desligado e ventilador no indicador não fazem parte do
caracteres LCD definido. Antes de usá-los em seu esboço, você precisa criá-los como
matrizes de bytes no início do seu programa, como mostrado no seguinte trecho.
};
212 parte III ■ Interfaces de comunicação
};
};
Escrevendo essas personagens será feito em configuração(). Mova o cursor para a direita
locais, e com a biblioteca de LCD Escreva()e impressão()funções, atualização
o ecrã, como mostrado no seguinte fragmento.
// Faça o costume
characterslcd.createChar (0,
grau); lcd.createChar (1, fan_off);
lcd.createChar (2, fan_on);
Você também atualizar os valores dos indicadores de temperatura e ventilador de cada vez através
loop (). Você precisa mover o cursor para o local correto de cada vez antes de
atualizar esses personagens.
AdjustingtheSetPointwithaButton
No Capítulo 2, você usou um de estabilização ()função. Aqui, você modificá-lo um pouco para usá-lo
com vários botões. Um botão irá aumentar o set point, eo
outro vai diminuir. Você precisa definir variáveis para a realização do anterior
e estados de botão atuais:
Você pode modificar o de estabilização ()função para suportar vários botões. Para
fazer isso, adicione um segundo argumento que especifica qual botão que deseja Debounce:
// Uma função debouncing que pode ser usada tanto por ressalto
buttonsboolean (booleano último, o pino int)
{
boolean atual = digitalRead (pino); if (! durar =
atual)
{
delay (5); current = digitalRead (pino);
}
voltar corrente;
}
Dentro loop (), Que pretende verificar os dois botões usando o de estabilização ()função,
mudar o set_tempvariável conforme a necessidade, e atualizar o valor conjunto que é dis-jogado no
LCD:
{
set_temp--;
}
214 parte III ■ Interfaces de comunicação
{
set_temp ++;
}
// Imprimir o templcd.setCursor set (8,1); lcd.print (set_temp); //
actualizar o estado do botão com o currentlastDownTempButton
= currentDownTempButton; lastUpTempButton =
currentUpTempButton;
O trecho de código anterior primeiro corre o de estabilização ()função para cada mas-
tonelada, e em seguida ajusta a variável de temperatura ajustada, se um dos botões ter sido premido.
Depois, a temperatura exibida no LCD é atualizado, assim como as variáveis de estado de botão.
AddinganAudibleWarningandaFan
Nesta seção, você adiciona o código para controlar o ventilador e o alto-falante. Embora o LCD que
mostra que você vive informação é agradável, muitas vezes você vai encontrá-lo útil ter uma forma
adicional de feedback para dizer-lhe quando algo está acontecendo. Por exemplo, o alto-falante emite
um sinal sonoro quando o ventilador é ligado. Neste exemplo, você usa
Usando uma variável de estado, você pode detectar quando o falante tem buzinou e, assim,
mantê-lo de apitar novamente até após a temperatura cai abaixo do set TEM-ratura e redefine a
variável de estado.
// Se ele é muito
quente! If (c> =
set_temp)
{
// Verifique se o alto-falante tem já beepedif (! One_time)
{
tom (ALTO-FALANTE, 400);
atraso (500); one_time = true;
}
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 215
{
noTone (altifalante);
}
// Ligue o ventilador e atualizar
displaydigitalWrite (FAN, HIGH); lcd.setCursor
(15,1); lcd.write (2);
}
// Se não é demasiado
quente! Else
{
// Verifique se o alto-falante está desligado //
redefinir a variável "um sinal sonoro" // atualizar o
estado do ventilador e LCD displaynoTone
(altifalante); one_time = false; digitalWrite (FAN,
LOW); lcd.setCursor (15,1); lcd.write (1);
o um tempovariável é usado para se certificar de que o sinal sonoro desempenha apenas uma vez
em vez de continuamente. Uma vez que o orador apitou para 500ms em 400Hz, a variável é definida
comoverdadee é reposto para falsoapenas quando a temperatura cai abaixo do limiar de temperatura
desejada.
BringingItAllTogether: TheCompleteProgram
É hora de trazer todas as partes juntas em um todo coeso. Você precisa ter certeza de que você incluir as
bibliotecas adequadas, definir os pinos, e inicializar as variáveis de estado no topo do esboço. Listagem
10-3 mostra o pro-grama completo. Carregá-lo no seu Arduino e comparar seus resultados para o vídeo de
demonstração mostra o sistema em ação.
};
};
};
int set_temp = 23; // O padrão desejado one_time temperatureboolean = false; // Usado para
fazer o sinal sonoro alto-falante apenas 1 vez
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 217
void setup ()
{
pinMode (FAN, OUTPUT);
// Faça o costume
characterslcd.createChar (0, grau);
lcd.createChar (1, fan_off);
lcd.createChar (2, fan_on);
// Uma função debouncing que pode ser utilizado por vários debounce
buttonsboolean (boolean passado, pin int)
{
boolean atual = digitalRead (pino); if (! durar =
atual)
{
delay (5); current = digitalRead (pino);
}
voltar corrente;
}
void loop ()
{
// Obter o TemperatureWire.beginTransmission (TEMP_ADDR); // Iniciar
talkingWire.write (0); // Peça zeroWire.endTransmission register (); //
TransmissionWire.requestFrom completa (TEMP_ADDR, 1); // Pedido de 1
byte
218 parte III ■ Interfaces de comunicação
{
set_temp--;
}
// Ligue-se o conjunto tempelse if (lastUpTempButton == LOW && currentUpTempButton ==
HIGH)
{
set_temp ++;
}
// Imprimir o templcd.setCursor set (8,1); lcd.print (set_temp);
lastDownTempButton = currentDownTempButton;
lastUpTempButton = currentUpTempButton;
{
// Assim que o alto-falante só emitirá um sinal sonoro uma vez ... if
(! One_time)
{
tom (ALTO-FALANTE, 400);
atraso (500); one_time = true;
}
// Desligue o orador se é doneelse
{
noTone (altifalante);
}
// Ligue o ventilador e atualizar displaydigitalWrite
(FAN, HIGH); lcd.setCursor (15,1); lcd.write (2);
}
// It't não quente!
Else
{
// Verifique se o alto-falante estiver desligado, redefinir a variável "um sinal
sonoro" // atualizar o estado do ventilador e LCD displaynoTone (altifalante);
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 219
}
}
TakingThisProjecttotheNextLevel
Você pode expandir a funcionalidade do programa em todos os tipos de formas. Aqui estão algumas
sugestões para melhorias que você pode fazer:
Adicionar um transistor para o ventilador para que ele possa chamar mais atual e mover
■■
mais ar.
Use modulação por largura de pulso (PWM) para controlar a velocidade do ventilador para que ele muda
■■
Adicione um sensor de luz e ajustar automaticamente o brilho da luz de fundo da tela usando
■■
um potenciômetro SPI do capítulo 9, "The Bus SPI," com base na luminosidade da sala.
Resumo
esquema de fiação.
Você pode criar personagens personalizadas para o seu LCD, gerando mapas de bits
■■
arbitrários.
vários botões.
Você pode combinar vários sensores, motores, botões, e exibe em um projecto coerente.
■■
Capítulo
11
221
222 parte III ■ Interfaces de comunicação
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch11 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no download do capítulo 11 e individualmente
nomeados de acordo com os nomes em todo o capítulo.
UnderstandingXBeeWirelessCommunication
O nome diz tudo: A comunicação sem fio permite que dois ou mais dispositivos para falar uns com os
outros sem fios amarrar-los juntos. transmissores sem fio
operar através da transmissão de dados sob a forma de ondas de rádio através do espaço livre
por um processo de radiação electromagnética com uma frequência particular. Frequências diferentes são
utilizados por diferentes tecnologias de transmissão para evitar a "multidão-ing" de certas partes do
espectro electromagnético disponível. agências governamentais, tais como a Comissão Federal de
Comunicações (FCC) dos EUA, regular este espectro e publica regras especificando quais frequências pode
ser usado para o que. O rádio XBee transmite 2.4GHz dados. Você pode reconhecer esta frequência porque
muitos dispositivos em sua casa usá-lo. Ela cai dentro da banda (Industrial, Científica e Médica), um
conjunto de frequências reservadas para o uso de comunicações sem fios não licenciada ISM. O roteador
WiFi provavelmente opera nesta freqüência também. Os módulos XBee usar o padrão IEEE 802.15.4, que
especifica um conjunto de regras operacionais para redes de área pessoal sem fio (PANs).
XBeeRadios
XBees tem 20 pinos e são, na sua maior parte, pino compatível com cada
de outros. Este capítulo utiliza Série 1 XBees, que usam o padrão 802.15.4. Eles são capazes de ponto-a-
ponto e de comunicação ponto-a-multiponto, mas eles não implementar o padrão ZigBee, um padrão de
rede mesh encontrado em Série 2 / rádios ZB XBee. Se você não tem certeza que tipo de XBees você
tem, você
NOTA Series1andSeries2modulesarenãocompatiblewitheachother.You
canuseeitherone (aslongasbothradiosarethesameseries), butIstronglyrec-ommendusingSeries1ifyouarejuststartingout.Series1module
Este capítulo usa não-Pro, Série 1, XBees de 2,4 GHz com antenas de chips em
série modo pass-through. Familiarize-se com o módulo de pin-out da folha de dados mostrado na
Figura 11-3.
A maioria dos detalhes irá ser abstraída pelo escudo XBee (explicado em
a próxima seção), mas você deve estar ciente do fato de que o XBee é um módulo de 3.3V; ele precisa
de uma fonte de 3.3V de alimentação.
TheXBeeRadioShieldandSerialConnections
Neste capítulo, você aprenderá a usar o rádio XBee em conjunto com um escudo que faz com que seja
fácil de conectar o módulo ao seu Arduino. Uma série de escudos XBee Arduino estão disponíveis, assim
minhas descrições aqui são gerais para que eles se aplicam a qualquer escudo que você pode usar. Todos
os escudos, essencialmente, fazer a mesma coisa, mas com algumas pequenas diferenças, como
explicado nesta seção. Figura 11-4 mostra exemplos dos escudos XBee mais comuns.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 225
www.digi.com
Crédito: Digi International, Inc.,
Figura 11-3: série XBee 1 pin-out
Figura 11-4: Vários escudos XBee Créditos: Arduino, www.arduino.cc; SparkFun [fotógrafo Juan
Peña],www.sparkfun.com;
Hacks cozinha, www.cooking-hacks.com
A maioria dos escudos XBee implementar uma série de características-chave, como explicado em detalhe
nas seções seguintes.
226 parte III ■ Interfaces de comunicação
Regulator 3.3V
A maioria dos Arduinos (excluindo o Due) operam em níveis lógicos 5V; 0V indica um baixo lógico e 5V
indica um alto lógico. O XBee, no entanto, opera em 3.3V
nível lógico, e deve ser alimentado com energia 3.3V. Embora o Arduino faz
tem um pequeno regulador de 3.3V a bordo, não fornecer corrente suficiente para o XBee, por isso a
maioria dos escudos implementar um regulador linear LDO (Low Dropout) que cai a fonte de 5V para
baixo a 3.3V para a alimentação no pino VCC do XBee.
Os pinos UART TX e RX do Arduino ea XBee precisa estar conectado; também aqui, no entanto, é preciso
considerar o fato de que o XBee é uma parte 3.3V. se os dados transmitidos a partir do XBee com o
Arduino não precisa ser deslocado nível (embora alguns escudos irá fazê-lo de qualquer maneira). Isso
ocorre porque 3.3V ainda está acima do limiar para ser lido como uma alta lógica pela / O pin Arduino RX I.
Os dados transmitidos a partir do Arduino para o XBee, no entanto, deve ser deslocado para baixo para
3.3V antes de poder ser alimentado na / O pino DI I do XBee. Protetores diferentes usam métodos
diferentes para alcançar este objetivo.
A maioria dos escudos possuem um LED "associado" que pisca sempre que o XBee está ligado e em uso
como uma simples passagem, embora serial. Ele é geralmente usado ao executar o XBee no modo de API,
o que você não faz neste capítulo.
O LED RSSI, também presente na maioria dos escudos XBee, acende-se brevemente quando os dados
está sendo recebido.
Observe o texto explicativo de colisão na Figura 11-5. Considere o que aconteceria se ambos
o XBee e seu computador tentou transmitir dados para o Arduino. Como é que o Arduino sabe onde os
dados estão vindo? Mais importante ainda, o que acontece
Se ambos tentam transmitir ao Arduino, ao mesmo tempo? Os dados serão "colidem", fazendo com que
dados truncado que não podem ser adequadamente interpretado pelo Arduino.
Você pode desconectar o XBee proteger toda vez que você deseja programar o Arduino.
■■
Você pode usar um jumper ou interruptor no escudo XBee para mudar ou não o XBee é
■■
Neste capítulo, você usa apenas o "hardware" porta UART do seu Arduino se comunicar com seu
XBee (pinos 0 e 1 no seu Arduino). Como explicado na secção anterior, estes pinos são também
utilizadas para a ligação USB para
228 parte III ■ Interfaces de comunicação
seu computador. A maioria dos escudos só permitem uma conexão entre o XBee e
Arduino na porta UART de série do hardware. Se o seu escudo suportar, você
pode evitar desligar o XBee para programar para o seu Arduino usando a
SoftwareSerialbiblioteca. A biblioteca permite que você defina duas digitais arbitrária
pinos no seu Arduino para atuar como RX / TX pinos para falar com o seu XBee. Para
que isso funcione, o seu escudo XBee deve ter jumpers que permitem que você escolha quais os
pinos do Arduino as linhas de RX / TX de distância das ligações XBee. O escudo SparkFun XBee tem
um interruptor que permite a você conectar os pinos RX / TX para pinos 2 e 3, em vez de pinos 0 e 1.
Se o seu escudo suporta isso, você pode usar o
ConfiguringYourXBees
Antes que você possa realmente usar seus XBees, você precisará configurá-los para falar uns com os
outros. Fora da caixa, XBees já podem conversar entre si; eles são definidos como um canal padrão e
estão em modo de transmissão. Em outras palavras, que eles enviam e recebem, com qualquer outra
configuração semelhante XBee dentro do alcance. Embora isso é bom, em algum momento você pode
querer usar várias configurações de XBee dentro do alcance de cada velocidade de comunicação outra,
alterar ou de outra forma configurá-los de uma forma única para a sua configuração. Aqui, você
aprenderá a configurar seus XBees para falar especificamente para o outro.
ConfiguringviaaShieldoraUSBAdapter
Pode programar XBees, assim como você pode programar o seu Arduino, através de uma conexão
serial USB. Você pode programar um XBee de duas maneiras. A primeira opção é usar o conversor USB-
serial que é construído em sua Arduino (via o chip FTDI ou chip 8U2 / 16U2 Atmel que foi explicado no
Capítulo 6, "USB e Comunicação Serial"). A segunda opção é usar um adaptador USB XBee dedicado.
Eu recomendo fortemente recebendo um adaptador USB XBee; ele irá torná-lo mais fácil de manipular
a comunicação entre um Arduino eo computador mais adiante neste capítulo. Neste capítulo, eu uso do
popular SparkFun XBee USB Explorer (veja a Figura 11-6) para programar os XBees.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 229
Eu não recomendo usar um Arduino Uno como o programador para o seu XBee; isso pode danificar o
Arduino se você não for cuidadoso. Se você quiser programar o seu XBee usando o Arduino, você
precisa lidar com o problema de colisão de dados em série que foi explicado na seção anterior. Você
precisará (cuidados totalmente) remover fisicamente o chip ATmega do Arduino. Isto é possível com a
Uno, mas não é possível com a versão Uno SMD ou qualquer outra placa que tem o chip ATmega
soldada na placa, em vez de em um soquete.
Usando um adaptador XBee-USB é fácil: Conecte o XBee no soquete no adaptador, conecte-o seu
computador com o cabo USB, e você está pronto para programar. o
SparkFun placa usa o mesmo chip FTDI que Arduinos mais velhas usado para serial-USB
comunicação. Mais tarde, no capítulo, este adaptador é usado para facilitar a comunicação sem fios
entre o computador e um Arduino com um escudo XBee.
ChoosingYourXBeeSettingsandConnectingYourXBeetoYourHostComputer
Você tem um número enorme de opções de configuração para os seus XBees, e cobrindo todas elas
poderiam constituir o seu próprio livro. Aqui, nós cobrir os valores mais importantes que você
precisa para configurar:
IDENTIDADE:rede de área pessoal (PAN) ID. Todos os XBees que pretende conversar entre
■■
MEU: Meu endereço. Este é um endereço único que identifica cada XBee dentro de uma
■■
DL:endereço de destino. Este é o endereço exclusivo do XBee que deseja que esse XBee para
■■
falar / ouvir.
Estes valores estão apresentados na Figura 11-7 para um sistema de dois XBee usando os valores
que irá configurar no passo seguinte.
Note-se que os valores MINHAS e DL para cada XBee são trocados uns com os outros
porque o endereço de destino de um XBee é endereço de origem do outro. (O ID que eu uso nestes
exemplos para o PAN é 1234, mas você pode escolher outro quatro dígitos hex PAN ID, se desejar.) A BD
está definido para 3, o valor padrão. Em vez de defini-lo como a taxa de transmissão real, você configurá-
lo para um número que representa a taxa de transmissão. Os valores de transmissão estão relacionados
com valores de densidade segue:
0: 1200 baud
■■
1: 2400 de transmissão
■■
2: 4800 baud
■■
3: 9600 (padrão)
■■
4: 19200 baud
■■
5: 38400 baud
■■
6: 57600 baud
■■
7: 115200 transmissão
■■
Ligue o seu XBee para o seu computador utilizando um dos dois métodos descritos
anterior. Certifique-se de inserir o XBee na direção certa. Depois de conectar-lo, você precisa
identificar a porta serial que está conectado. Você pode fazer isso da mesma maneira que fez para o
Arduino no Capítulo 1, "Getting Up e piscando com o Arduino." Note-se que a porta serial do XBee
conectado.
ConfiguringYourXBeewithX-CTU
Em seguida, você programar suas XBees com os valores especificados na Figura 11-7. Se você estiver
usando o Windows, você pode usar um aplicativo chamado X-CTU de fazer isso usando uma interface
gráfica. Eu recomendo este método se você tiver acesso a um Windows
computador. Se você não tiver um computador com Windows, pule para a próxima seção, onde
você aprenderá a configurar seus XBees usando um terminal serial no Linux ou OS X.
Uma rápida pesquisa no Google por "X-CTU" retornará o download mais up-to-date
ligação para a aplicação no site da Digi. O instalador também está ligada a partir da página web para
o capítulo: . Encontrar
www.exploringarduino.com/content/ch11
um link para download, em seguida, execute os seguintes passos:
1. Faça o download do instalador, instalar o X-CTU e iniciar a aplicação. Uma vez iniciado, você
deverá ver uma janela como a da Figura 11-8. Uma lista de portas COM disponíveis aparece no
lado esquerdo da janela.
232 parte III ■ Interfaces de comunicação
2. Selecione a porta COM que seu explorador XBee está conectado e clique no botão de teste /
consulta em destaque na Figura 11-8. Se este é um novo XBee que é configurado usando as
configurações padrão (uma taxa de transmissão de 9600), a janela mostrada
identidade
1234
DL 1001
MEU 1000
5. Clique no botão Gravar no topo da janela para escrever esses valores em seu XBee. Quando você
fizer isso, esses valores devem ficar azul. Figura 11-11 destaca esses valores.
234 parte III ■ Interfaces de comunicação
Agora você configurou o seu primeiro XBee! Agora, remova cuidadosamente este XBee
a partir do gerenciador USB e instalar o outro XBee. Siga as mesmas etapas PREVI-amente listados com
seu segundo XBee, mas mudar o DL e MEUS valores para que as XBees falar uns com os outros. A Figura
11-12 mostra a configuração concluída
as rádios, você pode pular para a seção "falar com o seu computador sem fios."
ConfiguringYourXBeewithaSerialTerminal
Se você não tiver o Windows, você precisa fazer a sua configuração XBee através de um terminal série,
porque X-CTU é somente para Windows. Este processo é o mesmo para ambas as máquinas Linux e
Mac. Você usar o aplicativo "tela" que vem com o sistema de acesso. Como no primeiro capítulo, usar o
Arduino ambiente de desenvolvimento integrado (IDE) para descobrir o que o nome do dispositivo é
para o adaptador USB-serial quando ele é conectado-lo. Você pode encontrar o nome procurando no
menu Ferramentas, em " Porta serial."
Depois de identificar o nome do dispositivo, abra um terminal (você pode encontrar o terminal
procurando por ele na caixa de pesquisa do seu sistema) e execute os seguintes passos:
Uma vez que você entrar no modo de programação, o lançamento dos outros comandos é
sensível ao tempo. Se você esperar muito tempo entre a introdução de comandos, você vai sair
do modo de programação e ter de digitá-la. Este tempo limite ocorre após apenas alguns
segundos, por isso tente ser rápido. Lembre-se que enquanto você digita seus comandos não são
mostrados. Além disso, após cada comando, um retorno de carro não é adicionado ao terminal,
assim você vai estar digitando "no topo do" seus comandos anteriores. Passos 2-7 descrevem os
comandos que você realmente precisa para entrar no terminal para programar o seu XBee.
236 parte III ■ Interfaces de comunicação
2. Digite +++e espere; não pressione Enter. O terminal irá responder com um "Está
bem"Indicando que o XBee entrou no modo de programação.
4. Digite ATMY1000e pressione Enter. Isso define o endereço de origem para 1000.
5. Digite ATDL1001e pressione Enter. Isso define o endereço de destino para 1001.
6. Tipo ATWRe pressione Enter. Isto compromete as configurações que você acabou de inserir na
memória não volátil. memória não volátil não é eliminado quando a energia é removida do XBee.
7. Se desejar, você pode confirmar que os valores foram escritos por introduzir-ing ATID, EM
MINHAou ATDLsem números depois e pressionando Enter. Isto imprime os valores atuais para a
exibição.
Suas XBees agora estão configurados, e você está pronto para tê-los falar uns com os
de outros! Se você está tendo problemas com a configuração, ver o vídeo mencionado no início deste
capítulo; ele percorre as etapas de configuração visual.
TalkingwithYourComputerWirelessly
Agora que você sabe como configurar as XBees, é hora de começar a usá-los. Primeiro, você usá-los
para substituir o cabo USB entre o computador eo Arduino. Você não pode baixar programas para o
Arduino através de uma ligação XBee
ção, sem modificações de hardware, assim você ainda carregar e testar seus programas
através de uma conexão USB. Então, você untether e substituir a conexão USB com uma conexão XBee
sem fio.
PoweringYourRemoteArduino
Seu Arduino remoto não será conectado ao computador via USB, então você precisa para ligá-lo de
alguma forma. Você tem algumas opções para fazer isso, como descrito nesta seção.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 237
Este método de conexão derrota o ponto de ir sem fio, mas você pode deixar o Arduino conectado ao
computador via USB. O cabo USB fornecerá energia 5V para o seu Arduino, eo XBee irá se comunicar com
um USB separado XBee Explorador conectado a uma porta USB diferente em seu computador. Isso é bom
para testar a sua comunicação sem fio, mas é um bocado parvo para qualquer apli-cação prática. Se você
percorrer esse caminho, certifique-se de escolher a porta serial conectada ao Explorador USB para receber
comunicação no monitor serial ou no processamento.
Você também pode usar a conexão USB de 5V com um adaptador de parede. Isso faz com que um
pouco mais sentido porque você já não estão amarrados a mesma computador que você está
programando a partir. Se você tem um smartphone, você provavelmente já tem um desses adaptadores;
eles são comumente usados para iPhones carregamento, dispositivos Android e outros smartphones e
tablets. A Figura 11-13 mostra um padrão USB
www.adafruit.com
Crédito: Indústrias Adafruit,
baterias
Você também pode alimentar o Arduino usando baterias. Um dos meth-ODS mais populares é a
utilização de uma bateria de 9V enganchado na corrente contínua (DC) conector de alimentação direta
ou o "Vin" pino de entrada. Ambas estas entradas alimentar regulador de 5V linear de bordo do Arduino,
que gera um sinal de 5V limpa para o seu microcontrolador e outra lógica. A Figura 11-14 mostra um
exemplo de uma bateria de 9V, com uma chave integrada e tomada de energia DC de adafruit.com.
238 parte III ■ Interfaces de comunicação
www.adafruit.com
Crédito: Indústrias Adafruit,
Figura 11-14: 9V bateria
baterias 9V são caros, por isso algumas pessoas preferem usar uma bateria AA.
Uma bateria AA média tem uma tensão nominal de 1.5V. Por isso, é bastante comum para colocar quatro
deles em série para gerar cerca de 6V total. Conectando quatro BAT- AA
erias para o pino Vin ou a entrada barril jack do Arduino envia energia através
o regulador de tensão, que tem uma pequena tensão "abandono". (A tensão de abandono é a tensão
mínima que deve existir entre as tensões de entrada e saída). No Arduino, o regulador 5V tem uma saída
de aproximadamente 1V (embora isso varia com a temperatura e consumo actual). A entrada de uma
bateria AA (com quatro baterias) é geralmente em torno de 5.5V. Com uma queda de 1V, você pode
geralmente esperar que a lógica Arduino estará operando em torno de 4.5V. O ATmega está classificado
para executar neste tensão (ele pode realmente executar todo o caminho para baixo para
1.8V), mas você deve estar ciente de que toda a sua lógica estará operando com uma tensão
ligeiramente menor do que quando você está em USB.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 239
Uma terceira opção para alimentar o Arduino remoto é usar um adaptador de parede. Esses plug em uma
tomada comum e ter um conector de barril jack na outra extremidade para
a conexão com o Arduino. Existem três especificações importantes que você precisa verificar ao escolher
um adaptador de parede: as características físicas do jack, a tensão fornecida e as capacidades máximas
de saída de corrente.
Porque o Arduino tem um regulador de voltagem embutido, você pode usar qualquer DC
tensão entre 7V e 12V. Esta tensão também estará disponível no pino Vin, o que pode revelar-se útil
para alimentação de dispositivos de potência mais elevada tais como motores.
Todos os adaptadores de parede DC também são classificados para a corrente máxima que apoiar
ply. Quanto maior a corrente, mais coisas você vai ser capaz de alimentar com ele. A alimentação 1-
amp é bastante comum e fornece potência mais do que suficiente para a sua lógica 5V regulado do
Arduino e alguns componentes adicionais.
RevisitingtheSerialExamples: ControllingProcessingwithaPotentiometer
Neste ponto, você está finalmente pronto para começar a fazer algum tipo de comunicação sem fio.
Porque XBee é nada mais do que uma passagem de série, você pode começar por teste-ing sua
configuração com os exemplos que já tenha criado no Capítulo 6. Você precisa completar os seguintes
passos:
Se o seu escudo tem um jumper ou alternar para seleccionar ou não o XBee está ligado ao UART,
você pode usar isso durante a programação. (Verifique a documentação para o seu escudo
especial se não tiver certeza.) O esboço que lê o pote e transmite-o ao computador é repetido na
Listagem 11-1 para sua referência.
Listagem 11-1: Código Arduino para enviar dados para o computador-pot_to_processing / arduino_read_pot
void setup ()
{
Serial.begin (9600); // Inicie série
}
void loop ()
{
val = map (analogRead (POT), 0, 1023, 0, 255); // Leia e mapear POTSerial.println (val); //
Enviar valuedelay (50); // Atraso de modo que não // inundar o computador
3. Alimentação desta Arduino usando um dos métodos descritos na secção anterior. Eu escolhi
usar um cabo USB com um adaptador de parede, mas qualquer um dos métodos descritos iria
funcionar bem.
Figura 11-16: esquema de ligações com Arduino com escudo XBee e potenciômetro
5. Antes de usar este para controlar o esboço de processamento, você pode abrir uma série
monitorar janela do Arduino IDE para ver a entrada entrando pela
seu XBee. Selecione a porta serial que o Explorer está ligado e abra o monitor serial para ver os
valores em streaming (veja a Figura 11-17).
242 parte III ■ Interfaces de comunicação
Figura 11-17: dados de entrada sem fio mostrados com o monitor serial
6. Depois de ter confirmado que os dados estão chegando, feche o monitor serial e executar o
esboço de processamento para ajustar a cor da janela com base nos dados de entrada. Antes de
iniciar o esboço, garantir que você tenha a porta serial adequada
Listagem 11-2: Código de processamento para ler dados e mudam a cor na Screen- pot_to_processing /
processing_display_color
void setup ()
{
tamanho (500.500); // Janela sizeport = new Serial (this, "COM3",
9600); // Configurar serialport.bufferUntil ( '\ n'); // Configurar porta
para ler // até nova linha
draw void ()
{
Capítulo 11 ■ Comunicação sem fio com XBee rádios 243
Quando você executa o esboço, que deve funcionar da mesma maneira que fez quando foram con-
conectado diretamente ao Arduino com um cabo USB. Correr ao redor de sua casa ou do escritório
(se você estiver usando uma bateria) e controlar as cores na tela.
RevisitingtheSerialExamples: ControllinganRGBLED
Você já confirmou que você pode enviar dados sem fio de seu Arduino ao computador. Em seguida,
você usa o RGB esboço de controle do capítulo 6 LED para confirmar que você pode enviar comandos
sem fios a partir do seu computador para o Arduino. Depois de confirmar que você pode enviar com
êxito dados entre o Arduino eo computador sem fio, você pode criar qualquer número de aplicações
emocionantes; você encontrará algumas idéias listadas na página da Web para este capítulo.
Mais uma vez, o primeiro passo é o de carregar o programa apropriado (ver Listagem 11-3) sobre
no seu Arduino. Usar o mesmo programa que você usou no capítulo seis. Ele aceita uma cadeia de
valores RGB e define um LED RGB em conformidade.
void setup ()
{
Serial.begin (9600); // Porta serial em 9600
void loop ()
{
// Continue trabalhando enquanto dados estão no bufferwhile
(Serial.available ()> 0)
{
rval Serial.parseInt = (); // Integergval Primeira válido =
Serial.parseInt (); // Integerbval Segundo válido = Serial.parseInt
(); // Inteiro válido Terceira
}
}
}
Listagem 11-4: Esboço de processamento para definir Arduino cores RGB -processing_control_RGB /
processing_control_RGB
void setup ()
{
tamanho (640.256); // Tamanho do HSV imageimg = loadImage
( "hsv.jpg"); // Carregar no fundo imageport = new Serial (this, "COM9",
9600); // Porta serial Aberto
draw void ()
{
fundo (0); // Preto BackgroundImage (img, 0,0); //
Imagem Overlay
}
Capítulo 11 ■ Comunicação sem fio com XBee rádios 245
anular mousePressed ()
{
cor c = get (mouseX, mouseY); // Obter a cor RGB, em que o mouse // foi pressedString
cores = int (vermelho (c)) + "," + int (verde (c)) + "," + int (azul (c)) + "\ n" ; // Extrair
valores de Colorprint (cores); cores // impressão para debuggingport.write (cores); // Envia
valores ao Arduino
Figura 11-18: Arduino com fios para XBee escudo e LED RGB
246 parte III ■ Interfaces de comunicação
Quando você executar este esboço, o seletor de cores deve aparecer apenas como o fez em
Capítulo 6. Clique em uma cor. Ele será transmitido ao Arduino remoto, eo LED RGB se tornará a cor que
você escolheu. Os valores transmitidos deve aparecer no terminal de processamento também. Neste
ponto, você já completamente testada que seus XBees pode se comunicar e para trás com um
computador. Na próxima seção, você usa as técnicas que você desenvolveu aqui para se comunicar
diretamente entre dois Arduinos.
TalkingwithAnotherArduino: BuildingaWirelessDoorbell
Facilitar a comunicação sem fio entre Arduinos é extremamente útil. Você pode usar vários nós
Arduino para criar redes de sensores, transmitir con-
Comandos de controle (por um carro controlado por rádio [RC], por exemplo), ou para facilitar
monitoramento remoto de um sistema elétrico. Nesta seção, você usa dois Arduinos
equipado com XBees para fazer uma campainha para sua casa, apartamento ou escritório. A Arduino
remoto à sua porta irá responder à pressão dos botões de um visitante. Quando um visitante "anéis" a
campainha da porta, seu outro Arduino acende-se e fazer sons para indicar que você tem uma visita.
Você pode querer ver o vídeo
Projeto de sistema
O sistema você vai construir consiste em duas Arduinos. Cada um terá um escudo XBee e rádio. Um
Arduino pode ser colocado fora de sua casa ou apartamento para pessoas que pressionar o botão, e o
outro pode ser colocado em qualquer lugar dentro para alertá-lo quando alguém toca a campainha. O
intervalo das duas unidades depende do tipo de XBees, quantas paredes estão entre as duas unidades, e
outros factores ambientais.
TransmitterHardware
Em primeiro lugar, construir o hardware para o componente de campainha, o qual será referido como
o transmissor. Você precisa de um botão com um resistor pull-down, ligado a
uma entrada digital em um Arduino com um escudo XBee montada (veja a Figura 11-20).
Não importa que tipo de Arduino você usa em seu sistema, mas é
importante notar que a comunicação serial em quadros como o Leonardo funciona de forma diferente do
que no Uno. O Leonardo e Micro tem um único MCU para controlar a comunicação de série e execução do
programa, enquanto o Uno ea Mega têm processadores separados. Para demonstrar essas diferenças, optei
por usar um Leonardo para o transmissor. O circuito para qualquer tipo de placa é a mesma; diferenças de
software são abordados em seguida.
ReceiverHardware
Em seguida, construir o componente que irá notificá-lo quando o botão do transmissor é pressionado.
Este será o seu receptor. O hardware para este circuito é composto por um Arduino com um escudo XBee
e rádio, um LED RGB, resistores e um pequeno alto-falante Piezo. Siga o diagrama de fiação na Figura 11-
21. Note que apenas os LEDs vermelhos e verdes são usados no desenho, de modo que a adição de uma
resistência para a resistência diodo emissor de luz azul não é necessário. Você também pode instalar um
potenciômetro em linha com o
Você precisa escolher um Arduino e fonte de alimentação. Embora qualquer tipo de placa
vai funcionar, eu estou usando um Uno. Eu escolhi um cabo USB conectado a um adaptador de parede
para o poder. Você poderia facilmente usar uma bateria ou uma conexão USB para o seu
TransmitterSoftware
Uma vez que seu hardware está tudo configurado, você precisa escrever o software para ambas as
extremidades do sistema. Tenha em mente que há uma miríade de formas de configurar este esquema
de comunicação, de e apenas uma metodologia é descrito aqui.
Para esta configuração, você tem o transmissor enviar um valor a cada 50ms. Será
estar '0'quando o botão não está pressionado e '1'quando o botão é pressionado. Está
não é necessário Debounce o botão, porque você não está procurando cliques de botão; o receptor irá
tocar enquanto o botão do transmissor é pressionado.
As alterações de código ligeiramente dependendo do que tipo de Arduino você está usando.
No caso do Arduino Uno (ou qualquer outro Arduino que tem um chip Atmel ou FTDI separada para lidar
com a comunicação serial), o principal MCU UART con-ligação é partilhada entre a porta USB e os pinos
RX / TX (pinos 0 e 1 ) sobre o Arduino. Se estiver usando um Uno ou Mega (ou qualquer outro Arduino
com um chip USB-serial separado), você precisa remover o escudo XBee para programar o Arduino,
Serial1com Serial.
void setup ()
{
// NOTA: Por Leonardo, os pinos de série RX / TX são // não multiplexado com USB como
eles estão no esboço Uno.//This é escrito para o Leonardo (Serial1 = RX / TX pinos) // Se
você estiver usando o Uno, mudar Serial1 para Serial, aqui e belowSerial1.begin (9600); //
Inicie série
}
250 parte III ■ Interfaces de comunicação
void loop ()
{
Serial1.println (digitalRead (BOTÃO)); // Enviar statedelay do botão (50); // Pequeno
atraso para que não inundar o receptor
ReceiverSoftware
const int RED = 11; LED // Red no pino int 11const VERDE =
10; LED // verde no pino 10const int COLUNA = 8; // Speaker
no pino 8
de dados char; // Char para segurar de entrada int dados seriais onLED = verde; //
Inicialmente on LEDint offLED = RED; // Inicialmente off LEDint freq = 131; // Orador inicial
frequencyunsigned longo prev_time = 0; // Temporizador para alternar o LED e alto-falante
void setup ()
{
Serial.begin (9600); // Inicie série
}
void loop ()
{
{
// Alterna a stateif LED (onLED
== VERDE)
{
onLED = RED; offLED =
verde;
}
outro
{
onLED = verde; offLED =
RED;
}
// Alterna a frequencyif (freq ==
261) {freq = 131;} else {freq =
261;
}
// Definir o tempo atual em ms à // tempo anterior para a próxima
viagem através da loopprev_time = millis ();
{
252 parte III ■ Interfaces de comunicação
{
digitalWrite (onLED, HIGH); digitalWrite
(offLED, LOW); tom (ALTO-FALANTE,
freq);
}
// Se o botão não for pressionado, ligue o som e luz offelse if (dados == '0')
{
digitalWrite (onLED, LOW); digitalWrite
(offLED, LOW); noTone (altifalante);
}
}
}
O primeiro E se()declaração em loop ()verifica o tempo decorrido desde sua última execução.
Se ele foi, pelo menos, 100 ms, é hora de mudar as luzes e frequência. Ao verificar os estados atuais, você
pode alternar os valores para a luz e frequência. Você define o
NOTA WatchademovideoofthewirelessArduinodoorbellatwww.explorin-
garduino.com/content/ch11.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Resumo
■■Você deve converter entre 5V e níveis lógicos 3.3V usar um XBee com a maioria dos Arduinos.
■■Você pode configurar XBee usando X-CTU no Windows, ou o terminal no Linux e Mac.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 253
Há uma variedade de opções para alimentar o seu Arduino que não o fazem
■■
usando XBees.
Você pode comunicar sem fios entre dois Arduinos usando XBees.
■■
o
■■millis () função pode ser usada com variáveis de estado para criar "não-
código de bloqueio "que implementa atrasos.
par t
IV
Tópicos Avançados e Projetos
InThisPart
12
257
258 Parte IV ■ Tópicos Avançados e Projetos
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada
www em
.exploringarduino.com / content / CH12 .
Além disso, todos os códigos podem ser encontradas em www.wiley.com/remtitle
.cgi? isbn = 1118549368na guia de transferência de código. O código está no capítulo 12
baixar e individualmente nomeados de acordo com os nomes de todo o capítulo.
Até este ponto, todos os programas Arduino você escreveu foi sin-
nous. Isso apresenta alguns problemas, ou seja, que o uso de demora()pode obstar
o Arduino de fazer outras coisas. No capítulo anterior, você criou um temporizador software
usandomillis () para evitar a natureza de bloqueio síncrono
demora(). Neste capítulo, você leva essa idéia um passo mais longe, acrescentando tanto temporizador
e interrupções de hardware. Interrupções permitem executar código asynchro-nously por desencadear
certos eventos (tempo decorrido, mudança de estado de entrada, e assim por diante). Interrupções, como o
nome sugere, permite que você parar o seu Arduino está fazendo atualmente, completar uma tarefa
diferente, e depois voltar para o que o Arduino estava executando anteriormente. Neste capítulo, você
aprende como executar interrupções quando os eventos cronometrados ocorrer ou quando pinos de entrada
mudar de estado. Você vai usar esse conhecimento para construir um sistema "sem bloqueio" interrupção
de hardware, bem como uma máquina de som usando interrupções do timer.
NOTA Followavideotutorialaboutinterruptsandhardwaredebouncing:
www.jeremyblum.com/2011/03/07/arduino-tutorial-10-interrupts-and-hardware-
debouncing.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
UsingHardwareInterrupts
interrupções de hardware são trigged dependendo do estado (ou mudança de estado), de uma entrada I /
O pin. Interrupções de hardware pode ser particularmente útil se você quer mudar alguma variável de
estado dentro de seu código sem ter que consultar constantemente o estado de um botão. Em alguns
capítulos anteriores, você usou uma rotina debounce software juntamente com um cheque para o estado
do botão cada vez através do loop. este
funciona muito bem se a outros conteúdos em seu loop não leva muito tempo para executar.
Suponhamos, porém, que você deseja executar um procedimento em seu loop que leva
Um tempo. Por exemplo, talvez você queira rampa lentamente para cima o brilho de um LED ou a
velocidade de um motor com um
para()loop com alguns demora()declarações.
Se você quiser pressiona o botão para ajustar a cor ou a velocidade de tal desbotamento LED, você vai
perder qualquer pressionamento do botão que ocorrem enquanto o
demora()está acontecendo.
Normalmente, o tempo de reação humana é lenta o suficiente para que você pode executar várias
funções dentro do loop ()de um programa de Arduino, e pode consultar um botão uma vez a cada vez que
você vá através do laço sem perder o botão de imprensa. No entanto, quando há "lento" componentes ao
seu código dentro do
loop (), Corre o risco
faltando entradas externas.
Capítulo 12 ■ Hardware e interrupções timer 259
É aí que as interrupções entrar. Selecione pinos no seu Arduino (ou todos os pinos
Devido a) pode funcionar como interrupções de hardware externo. Hardware dentro do ATmega
conhece o estado destes pinos e pode relatar seus valores ao seu código de forma assíncrona. Assim,
você pode executar o seu programa principal, e tê-lo "interrompido" para executar uma função especial
sempre que um evento interrupção externa é detectada. Esta interrupção pode acontecer em qualquer
lugar na execução do programa.
Figura 12-1 mostra o que este processo poderia ser semelhante na prática.
KnowingtheTradeoffsBetweenPollingandInterrupting
interrupções de hardware são uma alternativa para repetidamente entradas externas de votação em loop
(). Eles não são melhores ou piores; em vez disso, há vantagens e desvantagens entre usar os dois. Ao
projetar um sistema, você deve considerar todas as suas opções e escolher o mais adequado para sua
aplicação. Esta seção descreve o
260 Parte IV ■ Tópicos Avançados e Projetos
principais diferenças entre as entradas de votação e usando interrupções para que você possa decidir
por si mesmo qual a melhor opção para o seu projeto particular.
Graças à excelente linguagem de programação que foi construído para o Arduino, anexando
interrupções externas em software é realmente muito simples. Usando pesquisa para detectar
entradas para o Arduino é ainda mais fácil porque
tudo que você tem a fazer é chamar digitalRead (). Se você não precisar usar hardware
interrompe, não se preocupam em usá-los ao longo de votação, porque exige que você escrever um
pouco mais de código.
Para a maioria das entradas digitais, o hardware para uma entrada que dispara através de votação ou
interrupção é exatamente o mesmo, porque você está apenas à procura de uma mudança de estado na
entrada. No entanto, em uma situação que você precisa ajustar seu hardware se você
está usando uma interrupção disparado por borda: entradas insufláveis. Como discutido no Capítulo 2,
"Entradas digitais, saídas e Pulse-Width Modulation," muitos botões (alguns, coisa que você vai
comumente deseja usar para acionar uma entrada) de rejeição quando você pressioná-los. Isso pode ser
um problema significativo porque fará com que a rotina de interrupção para disparar várias vezes quando
você quer que ele para disparar apenas uma vez. O que é pior, não é possível usar a função debouncing
software que havia escrito anteriormente porque você não pode usar uma
multitarefa
demora()enquanto
aparecendo para responder simultaneamente a uma entrada de botão que ajusta a velocidade de fade
ou cor. Quando as perguntas de uma entrada externa, só é possível ler a entrada uma vez que você
chegar a umdigitalRead () em sua rotina do programa, o que significa que ter "mais lento"
funções em seu programa poderia torná-lo difícil de ouvir efetivamente para uma entrada.
Capítulo 12 ■ Hardware e interrupções timer 261
aquisição Precisão
Para certas tarefas de aquisição rápidas, interrompendo é uma necessidade absoluta. Para
exemplo, suponha que você está usando um codificador rotativo. rotativos são comumente
montados em motores de corrente contínua (DC) e enviar um pulso para o
microcontrolador toda vez que alguma percentagem de uma revolução é concluída. Você pode usá-los para
criar um sistema de feedback para motores de corrente contínua que lhe permite manter o controle de sua
posição, em vez de apenas a sua velocidade. Isso permite que você ajustar dinamicamente a velocidade
com base em requisitos de torque ou para manter o controle de quanto um motor DC mudou. No entanto,
você precisa estar absolutamente certo de que cada pulso é capturado pelo Arduino. Estes pulsos são
bastante curtos (muito menor do que um pulso criado por você empurrando manualmente um botão) e
pode, potencialmente, ser dispensada se você verificá-los por polling dentro
UnderstandingtheArduino'sHardwareInterruptCapabilities
Com a maioria das placas Arduino, você pode usar apenas determinados pinos como interrupções. interrupções
são referidas por um número de identificação que corresponde a um pino específico. A excep-ção é o
Due, em que todos os pinos podem atuar como interrupções, e você faz referência
-los por número de pinos. Se você não estiver usando o Due, consulte a Tabela 12-1 para determinar
o que pinos no seu Arduino pode atuar como interrupções e que o número ID que são.
anular toggleLed ()
{
var = var!;
}
Quando esta função é chamado, o booleano varé alternado para a frente do seu
estado anterior, e o resto do seu programa continua a correr de onde parou.
O argumento final passado para attachInterrupt () é o modo de disparo. Arduino
interrupções podem ser desencadeados
BAIXOem
, ALTERAR, AUMENTARou CAINDO. (A lata Devido
também ser desencadeado na ALTO.) ALTERAR, AUMENTARe CAINDOsão as coisas mais comuns que provocam,
porque eles causam uma interrupção para executar exatamente uma vez
quando uma entrada externa muda de estado, como um botão que vai de BAIXOpara ALTO.
A transição a partir de BAIXOpara ALTOé AUMENTAR, e de ALTOpara BAIXOé CAINDO. É menos comum para
acionar emBAIXOou ALTOporque estes causam a interrupção para disparar continuamente enquanto que o
estado é verdade, efetivamente bloqueando o resto do programa seja executado.
BuildingandTestingaHardware-DebouncedButtonInterruptCircuit
Para testar o seu novo conhecimento, você construir um circuito com um RGB
LED e um botão de pressão filtrada por-hardware. O LED desvanece-se e para baixo em uma cor
selecionada. Quando o botão é pressionado, o LED muda imediatamente a cor desvanece-se a outro, ao
usar
demora()para realizar o desvanecimento.
Como você aprendeu no Capítulo 2, a maioria dos botões realmente "saltar" para cima e para baixo
quando você pressioná-los. Esta ação representa um problema sério quando você está
usando hardware interrompe porque isso pode causar uma ação a ser desencadeada mais
vezes do que se pretendia. Felizmente, você pode Debounce um botão no hardware de modo que
você sempre obter um sinal limpo entrando em seu microcontrolador.
Você usa um circuito de pull-up em vez de um pull-down neste exemplo e inverter a saída mais tarde.
Figura 12-2 mostra o sinal do botão que está sendo sondada com um Oscillo-scope. Ao pressionar o
botão, ele salta para cima e para baixo antes de finalmente se decidir
em um estado de baixo.
Se você disparar uma interrupção off este sinal, ele executa a função de interrupção
três vezes em uma fileira. Mas, usando algo chamado uma rede resistor-capacitor (comumente
chamado de um circuito RC), você pode evitar isso.
salta para cima e para baixo por alguns milésimos de segundo, as resistências de recarregar o condensador
enquanto abre momentaneamente o interruptor, permitindo-lhe manter o nível de tensão na saída.
Através deste processo, você recebe um sinal de que as transições entre alta e baixa apenas uma vez
em um período determinado pelos valores da resis-tor e capacitor. Tal circuito seria parecido com o
mostrado na Figura 12-3.
264 Parte IV ■ Tópicos Avançados e Projetos
Ao aumentar a resistência em série com o interruptor (R2 na Figura 12-3) não está com-
pletamente necessário; sem ele, o capacitor iria descarregar (quase) instantaneamente e ainda seria
recarregada com rapidez suficiente por R1. No entanto, este rápido dis-carga sobre a chave pode
danificar botões baratos. Incluindo o resistor 100Ω
tor diminui o tempo de descarga e mantém todos os seus componentes de segurança. Este,
No entanto, acrescenta uma curva de descarga para a sua saída. Você pode ver este efeito no
osciloscópio na Figura 12-4.
O circuito RC que acabou de criar vai fazer um sinal de entrada "curva" para
/ O pino do Arduino I. Nossa interrupção está à procura de uma vantagem, que é detectado quando uma
mudança de alto a baixo ou de baixo para alto ocorre a uma determinada velocidade. O "nitidez" deste
borda é chamado dehistereseda aresta do sinal, e não pode ser afiada o suficiente com o alisamento
causada pelo condensador. Você pode aumentar a nitidez deste sinal caindo com um gatilho
Schmitt.Schmitt
gatilhos são circuitos integrados (ICs) que criam uma borda afiada quando a entrada
sinal ultrapassa um determinado limiar. A saída do gatilho pode então ser alimentado à direita na / O
pin I do Arduino. Neste caso, você usa um gatilho Schmitt invertendo, o 74HC14 IC. Este chip tem seis
inversão separada Schmitt dispara na
-lo, mas você usa apenas um. Inspeccionar a imagem folha de dados do IC na Figura 12-5.
.
www.st.com
Crédito: Cortesia de imagens de STMicroelectronics. Usado com permissão,
Porque este é um gatilho de inversão, o sinal também será invertido. Então quando
o botão é pressionado, o sinal final será uma alta lógico, e vice-versa. Assim, na próxima etapa, quando
você escrever o código, você quer olhar para uma borda de subida para detectar quando o botão é
pressionado pela primeira vez. O sinal de saída final se parece com um
Agora você tem um sinal limpo bom que você pode alimentar em seu hardware
função de interrupção!
Figura 12-8: hardware completa diagrama de fiação de interrupção Imagem criada com o Fritzing.
Escrevendo o Software
É chegado o momento de escrever um programa simples para testar tanto o seu debouncing e as
capacidades de interrupção de hardware do Arduino. A aplicação mais óbvia e útil de interrupções de
hardware no Arduino é permitir que você ouça
lentamente a partir de 0para 255e vice-versa. Cada vez que você pressiona o botão, a cor
que está a ser desbotada muda imediatamente. Isto não seria possível usar
polling porque você só seria verificar o estado do botão depois de completar um ciclo de fade; você
quase certamente perca o botão de imprensa.
Em primeiro lugar, você precisa entender volátilvariáveis. Sempre que uma variável será
mudando dentro de uma interrupção, ele deve ser declarado como volátil. Isto é necessário para
assegurar que o compilador manipula a variável correctamente. Para declarar uma variável como volátil,
basta adicionarvolátilantes da declaração:
Para garantir que o Arduino está escutando uma interrupção, você usa attachIn-
terrupt () dentro configuração(). As entradas para a função são o ID da interrupção (ou
o número PIN para o Due), a função que deve ser executado quando ocorre uma interrupção, e o modo
de disparo (
AUMENTAR, CAINDO, e assim por diante). Neste programa,
o botão está ligado para interromper 0 (pino 2 no Uno), corre o troca()
funcionar quando acionado, e ele dispara na borda de subida:
disparado, o resto das pausas do programa, a função de interrupção é executado, e então sua
programa é retomado de onde parou. Como as interrupções interromper seu programa, eles são
geralmente muito curto e não contêm atrasos de qualquer tipo. De fato,
demora()
não mesmo trabalhar dentro de uma função acionada por interrupção. Compreender tudo isso,
agora você pode escrever o seguinte programa para percorrer todas as cores de LED e trocá-las com
base no seu toque de botão.
void setup ()
{
pinMode (RED, OUTPUT); pinMode (VERDE, OUTPUT); pinMode (AZUL,
OUTPUT); // O pino é invertida, por isso queremos olhar para o nascente
edgeattachInterrupt (BUTTON_INT, troca, RISING);
void swap ()
{
// Desligue o LEDanalogWrite atual
(selectedLED, 0); // Em seguida, escolha
um novo one.if (selectedLED == VERDE)
selectedLED = RED; else if (selectedLED
== RED) selectedLED = azul; else if
(selectedLED = = AZUL) selectedLED =
verde;
void loop ()
{
for (int i = 0; i <256; i ++)
{
analogWrite (selectedLED, i); atraso
(10);
}
for (int i = 255; i> = 0; i--)
{
analogWrite (selectedLED, i); atraso
(10);
}
}
Quando você carrega isso, o seu LED RGB deve começar a desvanecer e para trás em
uma cor. Cada vez que você pressiona o botão, uma nova cor vai assumir, com o mesmo brilho como a
cor anterior.
NOTA YoucanwatchademovideooftheHardwareInterruptedArduinowith
buttondebouncingatwww.exploringarduino.com/content/ch12.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginnin
270 Parte IV ■ Tópicos Avançados e Projetos
UsingTimerInterrupts
ERS para incrementar millis () , operar demora()E activar a saída de PWM com
analogWrite (). Apesar de não ser oficialmente suportado pela programação Arduino
língua (ainda), você também pode tomar o controle manual de um destes temporizadores para funções
initi-comeu cronometrados, gerar sinais PWM arbitrárias em qualquer pino, e muito mais. Nesta seção,
você aprenderá a usar uma biblioteca de terceiros (a biblioteca TimerOne) para assumir o controle
manual da 16-bit Timer1 nas Arduinos baseados ATMega328-. bibliotecas similares estão disponíveis
para fazer estes truques sobre o Leonardo, e outras placas Arduino, mas esta seção concentra-se no
Uno.
UnderstandingTimerInterrupts
Assim como um temporizador no seu relógio, temporizadores no Arduino contam-se a partir de zero,
incrementado a cada ciclo de relógio do cristal oscilante que acciona o
16
Arduino. Timer1 é um temporizador de 16 bits, o que significa que pode contar-se a partir-1,
de zero a 2
ou 65.535. Uma vez que esse número é atingido, ele redefine volta a zero e começa a contar novamente. A
rapidez com que ele atinja esse número depende do divisor de relógio. Sem divisor, o relógio iria passar por
16 milhões de ciclos por segundo (16MHz), e iria transbordar e reiniciar este contador muitas vezes por
segundo. No entanto, você pode "dividir" o relógio, uma abordagem tomada por muitas funções Arduino
subjacentes e bibliotecas. Os resumos biblioteca TimerOne afastado muito do com-complexidade de lidar
com o temporizador, permitindo que você simplesmente definir um período de gatilho. Usando o
temporizador, uma função pode ser acionado a cada número definido de microssegundos.
GettingtheLibrary
ExecutingTwoTasksSimultaneously (ish)
É importante ter em mente que não existe tal coisa como "true" execução simultânea em um Arduino.
Interrupções apenas fazer parecer que várias coisas estão acontecendo ao mesmo tempo, permitindo-lhe
alternar entre várias
tarefas de forma extremamente rápida. Usando a biblioteca TimerOne você acabou de instalar, você
fazer um piscar LED usando o timer enquanto você executar outras funções dentro
loop (). No final do capítulo, você vai executar instruções de impressão em série na
o loop principal com atrasos, enquanto estiver usando interrupções timer para controlar luzes e sons
simultaneamente. Para confirmar que a biblioteca está instalada corretamente, você pode carregar o
programa mostrado na Listagem 12-2 para um Uno Arduino (sem outros componentes ligados). Ele deve
piscar a bordo LED conectado ao pino 13.
void setup ()
{
pinMode (LED, OUTPUT); Timer1.initialize (1.000.000); // Definir um
temporizador de comprimento 1000000 // microssegundos (1 segundo)
Timer1.attachInterrupt (blinky); // Executa "Blinky" em cada // timmer
interrupção
void loop ()
{
// Coloque qualquer outro código aqui.
}
// Temporizador de interrupção
blinky functionvoid ()
{
digitalWrite (LED, digitalRead (LED)!); // Alterna Estado LED
}
272 Parte IV ■ Tópicos Avançados e Projetos
Agora que você pode implementar ambas as interrupções do timer e hardware, você pode
desenvolver hardware que tira proveito de ambos. Você vai fazer isso na próxima seção.
BuildinganInterrupt-DrivenSoundMachine
Para finalizar e confirmar a sua compreensão do hardware e do temporizador interrupções, você construir
uma "máquina de som" que lhe permite percorrer e ouvir várias oitavas de cada nota em uma escala
grande musical. O sistema utiliza uma interrupção botão duro-ware-filtrada por para selecionar a nota
tocada (C, A, B, e assim por diante). Um temporizador interromper passos através de todas as oitavas da
nota em ordem até a próxima nota é selecionado com o botão. Dentro
2. Para obter C4, multiplique por 2 novamente, para 260Hz. A frequência de cada etapa pode ser
calculado como uma potência de 2 relacionada com a frequência inicial. Sabendo disso, você pode
construir uma interrupção do timer que aumenta pelo poder do 2 com cada vez step.You pode alternar
entre as notas da mesma forma que você alternado entre cores de LED no exemplo anterior com o botão.
Atribuir frequências de base para cada nota, e mudar o que frequência base é usado para
SoundMachineHardware
A configuração de hardware aqui é muito simples. Mantenha o botão filtrada por fio como você teve no
RGB exemplo LED, e adicionar um alto-falante para o pino 12 através de um resistor 150Ω. Eu usei um
alto-falante piezo, mas você pode usar um alto-falante maior também. O circuito deve ser o mostrado na
Figura 12-9.
Capítulo 12 ■ Hardware e interrupções timer 273
SoundMachineSoftware
O software para a máquina de som utiliza software e hardware interrupções, além de comunicação
serial e
tom()para controlar um alto-falante. carregar o
código da Listagem 12-3 no seu Arduino e pressione o botão sobre o pão-board para percorrer as
frequências de base. Você pode abrir o monitor serial para ver a freqüência atualmente sendo
reproduzido.
// Teclas de música
#define NOTE_C 65
#define NOTE_D 73
NOTE_E #define 82
#define NOTE_F 87
274 Parte IV ■ Tópicos Avançados e Projetos
#define NOTE_G 98
#define NOTE_A 110
#define NOTE_B 123
void setup ()
{
// Configurar
serialSerial.begin (9600);
anular CHANGEKEY ()
{
octave_multiplier = 1; chave if
(key == NOTE_C) = NOTE_D;
outra chave se (key == NOTE_D)
= NOTE_E; outra chave se (key
== NOTE_E) = NOTE_F; else if
(tecla NOTE_F ==) = NOTE_G ;
else if (tecla == NOTE_G) =
NOTE_A; outra chave se (key ==
NOTE_A) = NOTE_B; outra chave
se (key == NOTE_B) = NOTE_C;
// Temporizador interromper
changePitch functionvoid ()
{
octave_multiplier = octave_multiplier * 2; if (octave_multiplier>
16) octave_multiplier = 1; tom (ALTO-FALANTE, tecla *
octave_multiplier);
void loop ()
Capítulo 12 ■ Hardware e interrupções timer 275
{
Serial.print ( "Key:"); Serial.print (chave);
Serial.print ( "Multiplicador:"); Serial.print
(octave_multiplier); Serial.print ( "Frequência:");
Serial.println (tecla * octave_multiplier); atraso
(100);
Você pode encontrar facilmente as teclas de música definidas no início com uma pesquisa sobre
a Internet. Eles são as freqüências da segunda oitava dessas notas. Nota
que o chavee octave_multiplier deve ser declarado como inteiros voláteis porque
eles estão indo para ser mudado dentro de rotinas de interrupção.CHANGEKEY ()é chamado
cada vez que o botão de interrupção é disparada. Ele muda o valor base da oitava ao passar de chave
para a chave.
changePitch ()chamadas tom()para definir a frequência para
o alto-falante. Ela é acionada a cada .5 segundos pela interrupção do timer. Cada vez que é acionado,
ele dobra a frequência da nota original até que ele atinja 16 vezes a sua frequência original. Em
seguida, laços de volta e começa novamente na frequência de base para a nota atual. Dentro
Resumo
■■Os botões podem ser filtrada por em hardware usando um circuito RC e um gatilho Schmitt.
■■O Arduino pode ser feito para responder às entradas de forma assíncrona por funções de
interrupção prendem-ing.
13
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch13 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no capítulo 13 download e individualmente nomeados de
acordo com os nomes de todo o capítulo.
277
278 Parte IV ■ Tópicos Avançados e Projetos
Há inúmeros exemplos de Arduinos sendo usadas para fazer logon condições meteorológicas,
condições atmosféricas de balões meteorológicos, dados de entrada de construção, elétrica
cargas em edifícios, e muito mais. Dado seu pequeno tamanho, o mínimo de energia
consumo e facilidade de interface com uma vasta gama de sensores, Arduinos são uma escolha óbvia
para a construção de coletores de dados, que são dispositivos que gravam e armazenamento de
informações durante um período de tempo. registradores de dados são frequentemente implantado em
todos os tipos de ambientes para coletar dados ambientais ou de usuário e armazená-lo em algum tipo
de memória não-volátil, como um cartão SD. Neste capítulo, você aprende tudo que você poderia querer
saber sobre a interface com um cartão SD de um Arduino. Você aprende como tanto gravar dados em
um arquivo e como ler as informações existentes fora de um cartão SD. Você usar um relógio em tempo
real para adicionar carimbos de hora precisos aos seus dados. Você também aprender um pouco sobre
como exibir os dados em seu computador depois de tê-lo recuperado.
NOTA TofollowamoreadvancedtutorialaboutlogginglocationfromaGPS
receptor, check-outwww.jeremyblum.com/2012/07/16/tutorial-15-for- arduino-gps-tracking
/.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
GettingReadyforDataLogging
sistemas de registro de dados são muito simples. Eles consistem geralmente em algum tipo de aqui-
sição do sistema, tais como sensores analógicos, para obter dados. Eles também conter algum tipo de
memória para o armazenamento de quantidades substanciais de que os dados ao longo de um longo período
de tempo.
Este capítulo destaca algumas maneiras comuns que você pode usar um cartão SD
com o Arduino para gravar dados úteis. No entanto, existem muitos usos para registro de dados. Aqui
está uma breve lista de projectos em que você poderia usá-lo:
■■ Um rastreador GPS e madeireiro que mantém um registro de onde você esteve ao longo de um
dia
■■ Um monitor de temperatura para o seu computador desktop para relatar dados sobre quais
componentes estão ficando mais quentes
■■ Um coletor de luz que mantém o controle de quando e por quanto tempo, as luzes são
deixados em sua casa ou no escritório
Mais adiante neste capítulo, você cria um sistema de registro de dados que usa um infravermelho
(IR) sensor de distância para criar um registro de quando as pessoas entrar e sair de uma sala.
Capítulo 13 ■ Registro de dados com cartões SD 279
FormattingDatawithCSVFiles
CSV, ou valores separados por vírgulas, arquivos será o formato de escolha para o armazenamento de
dados com o seu cartão SD. Os arquivos CSV são fáceis de implementar com uma plataforma de
microcontrolador e pode ser facilmente lido e analisado por uma ampla gama de área de trabalho rente
catiões, tornando-os adequados para este tipo de tarefas. Um arquivo CSV padrão
geralmente é algo como isto:
As linhas são delimitadas por novas linhas e colunas são delimitados por vírgulas.
Porque as vírgulas são usadas para distinguir colunas de dados, o principal exigem-ment é que seus
dados não podem ter vírgulas dentro dele. Além disso, cada linha geralmente deve ter sempre o
mesmo número de entradas. Quando aberto com um programa de planilhas no seu computador, o
arquivo CSV anterior seria algo parecido com isso.
Como os arquivos CSV são apenas texto simples, o Arduino pode facilmente escrever para eles
usando familiarizados impressão()e println () comandos -estilo. Por outro lado, Arduinos
Também é possível analisar arquivos CSV com relativa facilidade, procurando por uma nova linha
e delimitadores COM-mand para encontrar a informação certa.
PreparinganSDCardforDataLogging
Antes de iniciar o registo de dados com o Arduino, preparar o cartão SD que você pretende usar. Que tipo
de cartão SD que você usar vai depender do tipo de escudo que você está usando. Alguns vão usar full-
size cartões SD, outros irão usar cartões micro SD. A maioria micro navio cartões SD com um adaptador
que permite ligá-los em leitores de cartões SD de tamanho padrão. Para completar os exercícios neste
capítulo, é necessário um leitor de cartão SD para o seu computador (seja construído em ou externo).
280 Parte IV ■ Tópicos Avançados e Projetos
A maioria dos novos cartões SD já estará devidamente formatado e pronto para uso com
um Arduino. Se o seu cartão não é novo, ou já tem coisas sobre ele, primeiro formato
o cartão em qualquer FAT16 (por vezes chamado apenas FAT) ou FAT32. Cartões inferior ou igual 2GB
deve ser formatada como FAT16 e cartões maiores devem ser formatado como FAT32. Neste capítulo, os
exemplos usam um cartão micro SD de 2 GB formatado como FAT16. Note que a formatação do cartão
remove tudo sobre ele, mas isso garante que ele está pronto para uso com o Arduino. Se o seu cartão
SD é novo, você pode ignorar essas etapas e voltar para concluí-las somente se você tiver problemas ao
acessar o cartão do Arduino quando você executar o esboço mais adiante neste capítulo.
2. Clique com o cartão (que provavelmente terá um nome diferente), e selecione a opção Format
(veja a Figura 13-2). Aparecerá uma janela com opções para formatar o cartão.
Capítulo 13 ■ Registro de dados com cartões SD 281
3. Escolha o tipo de sistema de arquivos (FAT para cartões de 2GB e sob, FAT32 para
cartões maiores), use o tamanho de alocação padrão, e escolher um nome de volume. (Eu
escolhi LOG, mas você pode escolher o que quiser.) Figura 13-3 mostra
2. Clique no cartão SD no painel esquerdo, e clique na aba Apagar. Escolha MS-DOS (FAT) para o
formato.
3. Clique em Apagar. Isso irá formatar o cartão como FAT16, independentemente da sua
capacidade. (Macs pode formatar cartões não nativamente como FAT32.)
No Linux, você pode formatar o cartão a partir do terminal. A maioria das distribuições Linux
irá montar o cartão automaticamente quando você inseri-lo:
2. Abra um terminal e digite dfpara obter uma lista dos meios de comunicação montado. O
resultado deve ser semelhante à Figura 13-4.The última entrada deve ser o seu cartão SD. No
meu sistema, foi montado como
Seu cartão SD agora deve ser formatado e pronto para ir! Agora você está pronto para
iniciar a interface com o cartão SD através de um escudo cartão SD.
InterfacingtheArduinowithanSDCard
Os cartões SD, como as rádios XBee que você usou no capítulo 11, "Comunicação sem fio
com XBee rádios ", são 3.3V dispositivos. Portanto, é importante para se conectar a cartões SD através de
um escudo que controla adequadamente a mudança de nível lógico e alimentação de tensão para o cartão
SD. Além disso, a comunicação SD pode ser conseguida utilizando a interface de periférico série (SPI)
autocarro, algo que já deve
estar familiarizado com depois de ter lido o capítulo 9, "A SPI Bus." A linguagem Arduino
vem com uma biblioteca acessível (a biblioteca SD) que abstrai a comunicação SPI de nível inferior e
permite-lhe ler e escrever arquivos armazenados no cartão SD facilmente. Você usar esta biblioteca em
todo o capítulo.
SDCardShields
Você tem um número enorme de opções para adicionar recursos de registro de dados
no seu Arduino. É impossível fornecer a documentação para cada escudo disponível, então esta
discussão mantém os exemplos gerais suficiente para aplicar a
a maioria dos escudos com capacidades de conexão do cartão SD. Esta seção identifica alguns dos
escudos mais populares e os prós e contras do uso de cada um.
■■ Eles se conectam ao SPI pinos via o cabeçalho de programação de 6 pinos ou através de pinos
digitais multiplexados. Estes são os pinos 11, 12 e 13 sobre o Uno, e pinos 50, 51, e 52 em
placas de Mega. SPI pinos do Leonardo estão localizados no apenas o cabeçalho no circuito de
programação de série (ICSP).
■■ Eles designar um pino chip select (CS), que pode ou não pode ser o padrão
pin CS (10 em placas não-mega, 53 em placas de mega).
www.cooking-hacks.com
Crédito: Cozinhar Hacks,
Figura 13-7: Cozinhar escudo Hacks MicroSD
www.arduino.cc
Crédito: Arduino,
Figura 13-9: escudo Arduino Ethernet SD
www.arduino.cc
Crédito: Arduino,
Figura 13-10: escudo SD Arduino Wi-Fi
2
bus C (veja a Figura 13-11).
www.adafruit.com
Crédito: Indústrias Adafruit,
isso quando usando a biblioteca cartão SD com este escudo (veja a Figura 13-12).
www.sparkfun.com
Crédito: SparkFun [fotógrafo Juan Peña],
Figura 13-12: SparkFun MicroSD escudo
SDCardSPIInterface
Como mencionado anteriormente, o Arduino se comunica com o cartão SD através de uma interface SPI.
Isto requer a utilização de um MOSI (saída principal, a entrada de escravos), MISO (entrada principal,
saída slave), SCLK (relógio de série) e CS (chip select) pin. Você usar o cartão SD biblioteca Arduino para
completar os seguintes exemplos. Ele assume que você está usando o hardware SPI pinos no seu Arduino
e quer um padrão ou personalizado pino CS. A biblioteca cartão SD deve ter o CS pin padrão definido
como uma saída para funcionar corretamente, mesmo se você estiver usando um pino CS diferente. No
caso do Uno, este é o pino 10; no caso dos mega, isto é pinos 53. Os exemplos seguintes usam o Uno
com o pino 10 CS padrão.
Capítulo 13 ■ Registro de dados com cartões SD 289
WritingtoanSDCard
Primeiro, você usar a biblioteca cartão SD para gravar alguns dados de exemplo para o cartão SD. Mais
tarde, no capítulo, você capturar alguns dados do sensor e escrever que diretamente para o cartão SD. Os
dados são armazenados em um arquivo chamado log.csv que mais tarde você pode abrir no seu
computador. Importante, se você formatou seu cartão de FAT16, os nomes de arquivos
você usa deve estar no formato 8.3. Isto significa que a extensão deve ser três
caracteres, eo nome do arquivo deve ter oito caracteres ou menos.
Garantir que o seu escudo SD é montado corretamente ao seu Arduino e que
você tem um cartão SD inserido. Quando montado, o Cozinhar escudo Hacks SD parece com a Figura
13-13. (Os pinos são inseridos pinos 8-13, e o jumper é
Por uma questão de depuração, você vai tirar proveito dos relatórios funcionalismo
dade de muitas das funções do cartão SD. Por exemplo, para iniciar a comunicação com um cartão SD,
você chamar a seguinte função na sua configuração:
if (! SD.begin (CS_pin))
{
Serial.println ( "Cartão Failure");
290 Parte IV ■ Tópicos Avançados e Projetos
Retorna;
}
Serial.println ( "Cartão Ready");
{
dataFile.println ( "Olá"); dataFile.close (); // Dados não está escrito até que fechar a
conexão!
}
outro
{
Serial.println ( "Não foi possível abrir arquivo de log");
}
Esta primeira linha cria um novo arquivo (ou abre o arquivo se ele existir) chamou log.csv
no cartão SD. Se o arquivo é aberto / criado com êxito, a dATAFILEvariável
será verdade, E o processo de gravação será iniciada. Se for falso, é um erro
relatado para o monitor de série. Escrever novas linhas para um arquivo é fácil: basta executar
dataFile.println () e passar o que você quer escrever para uma nova linha. Você pode
também usar impressão()para evitar anexando um caractere de nova linha ao fim. Isto é
enviado para um buffer, e só realmente adicionada ao arquivo uma vez que
fechar o
comando é
chamada na mesma Arquivo.
Agora, você pode trazer todo esse conhecimento em conjunto em um programa simples que irá
criar um arquivo log.csv no seu cartão SD e escrever um timestamp separados por vírgulas e frase a cada
5 segundos. Em cada linha do arquivo CSV, você registrar o tempo atualmillis ()
e uma frase simples. Isso pode não parecer muito útil, mas
é um passo importante para testar antes de começar a adicionar as medições reais nos exemplos
vindos. O código deve ser algo como Listagem 13-1.
#include <SD.h>
Capítulo 13 ■ Registro de dados com cartões SD 291
void setup ()
{
Serial.begin (9600); Serial.println
( "Inicialização Cartão"); // CS pin é uma
outputpinMode (CS_PIN, OUTPUT);
if (! SD.begin (CS_PIN))
{
Serial.println ( "Cartão Failure"); return;
}
Serial.println ( "Cartão Ready");
}
void loop ()
{
longa timeStamp = millis (); Cordas dataString
= "Olá lá!";
{
dataFile.print (timestamp); dataFile.print ( ","); dataFile.println
(dataString); dataFile.close (); // Os dados não são realmente escrito até
que // fechar a conexão!
}
outro
292 Parte IV ■ Tópicos Avançados e Projetos
{
Serial.println ( "Não foi possível abrir arquivo de log");
}
atraso (5000);
}
Você quer observar algumas coisas importantes aqui, especialmente se você não estiver usando
o mesmo Cooking Hacks escudo cartão MicroSD:
CS_PIN
■■ deve ser definido como qualquer pino que você tem o seu cartão SD CS viciado
até. Se não for 10, você também deve adicionarpinMode (10, OUTPUT)dentro
configuração(); caso contrário, a biblioteca SD não vai funcionar.
■■Este escudo especial tira poder do pino 8 (ao contrário de ser con-
conectado diretamente a uma fonte de 5V). Portanto,POW_PINdeve ser definido como um
produção e set ALTOna função de configuração para ligar o escudo cartão SD.
Como você viu anteriormente, o nome do arquivo é aberto para escrita e dados são acrescentados
em um formato separado por vírgulas. Os mesmos dados também é impresso no terminal de série para
fins de depuração. Este não é explicitamente necessário, e você não vai usá-lo depois de ter o logger "no
campo" obtenção de dados. No entanto, é uso-ful para confirmar que tudo está funcionando. Se você
abrir o terminal serial,
Se você receber erros, certifique-se de que o seu escudo está ligado à corrente, que o SD
cartão é inserido totalmente, e que o cartão foi correctamente formatada. Você pode confirmar que os
dados estão sendo escritas corretamente removendo o cartão SD, insira-ing-lo em seu computador, e
abrindo-se com um programa de planilha (veja a Figura 13-15). Note como os dados separados por
vírgula é automaticamente colocado em
ReadingfromanSDCard
Agora é hora de aprender sobre a leitura de cartões SD. Isto não é usado tão comumente para registro
de dados, mas pode ser útil para a criação do programa tro
tros. Por exemplo, você pode especificar a frequência com que deseja que os dados a serem registrados.
Isso é o que você faz em seguida.
294 Parte IV ■ Tópicos Avançados e Projetos
Insira o cartão SD no seu computador e criar um novo arquivo TXT chamada velocidade
.TXTno cartão SD. Neste arquivo, basta digitar o tempo de atualização em milissegundos que
que pretende utilizar. Na Figura 13-16, você pode ver que eu defini-lo para 1000ms, ou 1 segundo.
Depois de escolher uma velocidade de atualização desejada, salve o arquivo no cartão SD e colocar
-lo de volta em seu escudo Arduino. Agora você modificar seu programa para ler esse arquivo, extrair
o campo desejado, e usá-lo para definir a velocidade de atualização para o registro de dados.
{
Serial.println ( "Reading comando Arquivo");
Capítulo 13 ■ Registro de dados com cartões SD 295
}
outro
{
Serial.println ( "Não foi possível ler o arquivo de comando.");
Retornar;
Isso abre o arquivo para leitura e analisa quaisquer inteiros ler. Porque
você definiu apenas uma variável, ele pega aquele e salva-lo para a variável taxa de atualização, que
teria de ser definida no início do programa. Você pode ter apenas um arquivo aberto ao mesmo tempo, e
é uma boa prática para fechar um arquivo quando você terminar de ler a partir de, ou escrever para um
cartão.
Agora você pode integrar isso em seu programa de escrita de mais cedo para ajustar
a velocidade de gravação com base no seu
speed.txtarquivo, como mostrado na Listagem 13-2.
// SD ler e escrever
#include <SD.h>
void setup ()
{
Serial.begin (9600); Serial.println
( "Inicialização Cartão"); // CS pin é uma
outputpinMode (CS_PIN, OUTPUT);
if (! SD.begin (CS_PIN))
{
Serial.println ( "Cartão Failure"); return;
}
Serial.println ( "Cartão Ready");
{
Serial.println ( "Reading comando Arquivo");
}
outro
{
Serial.println ( "Não foi possível ler o arquivo de comando.");
Retornar;
}
}
void loop ()
{
longa timeStamp = millis (); Cordas dataString
= "Olá lá!";
{
dataFile.print (timestamp); dataFile.print ( ","); dataFile.println
(dataString); dataFile.close (); // Os dados não são realmente escrito até
que // fechar a conexão!
}
outro
{
Serial.println ( "Não foi possível abrir arquivo de log");
}
atraso (refresh_rate);
}
Quando você agora executar este programa, os dados devem ser escritos na taxa que você
especificamos. Olhando para o terminal serial confirma esta (veja a Figura 13-17).
Figura 13-17: registro de dados a uma taxa especificada pelo arquivo de comando
UsingaReal-TimeClock
Quase todos os registro de dados aplicativo irá beneficiar com a utilização de um tempo real
relógio. Usando um relógio de tempo real dentro do seu sistema lhe permite timestamp
medidas para que você possa mais facilmente manter o controle de quando certos eventos ocorreram.
Na seção anterior, você usou simplesmente a a função
millis ()
manter o controle do tempo decorrido desde a Arduino ligado. Nesta seção, você usa um circuito de relógio
integrado em tempo real dedicada a manter o tempo exato para que quando você salvar os dados para o
cartão SD que corresponde ao tempo que os dados foram tomadas.
298 Parte IV ■ Tópicos Avançados e Projetos
UnderstandingReal-TimeClocks
relógios em tempo real fazer exatamente o que seu nome sugere. Você definir o tempo de uma vez, e
eles manter o tempo muito preciso, mesmo tendo em conta os anos bissextos e coisas dessa natureza.
Este exemplo usa o relógio de tempo real circuito integrado DS1307 popular.
2
O relógio de tempo real se comunica com o Arduino ao longo de um I ligação C
e se conecta a uma bateria de célula que lhe permitirá manter o tempo por vários anos. Um cristal
oscilador ligado ao relógio de tempo real permite precisão de cronometragem. Para facilitar as coisas, eu
sugiro usar a placa adafruit DS1307 break-out (www.exploringarduino.com/parts/adafruit-DS1307-breakout
); isto
combina o IC, o oscilador, uma bateria de célula, um capacitor de desacoplamento, ea I2resistores C
pull-up em um belo pacote que pode ser facilmente montado em seu
O restante das instruções assumem que você está usando este bordo de fuga.
No entanto, você pode facilmente montar esses componentes em uma placa de ensaio e conectá-los
diretamente para o seu Arduino. O cristal é uma unidade 32.768kHz, e o I2C resistores pull-up são
2.2kilohms. A bateria é uma célula tipo moeda 3.0V padrão. Se você optar por montá-lo, você pode
comprar todos esses componentes e colocá-los em uma placa de ensaio como mostrado na Figura 13-19.
Figura 13-20:
circuito de relógio de tempo real montado na placa de ensaioUsando a Biblioteca RTC Arduino Third-Party
Como no capítulo anterior, mais uma vez usar uma biblioteca de terceiros para estender as capacid
RTClib. A bibliotecafoi originalmente desenvolvido pela JeeLabs, e foi atualizado por Adafruit Industries. Um link p
www.exploringarduino.com/content/ch13
. Baixe a biblioteca e adicioná-lo àsua pasta de biblioteca do usuário Arduino, assim como fez no capítulo anterior.
A biblioteca é fácil de usar. A primeira vez que executar o código de exemplo, você usar
a
RTC.adjustfunção para agarrar automaticamente a corrente de data / hora a partir do computador no momento da
compilação e usá-lo para configurar o relógio. Deste ponto em diante, o RTC é executado de forma autônoma, e você pode
obter o atual data / hora a partir dele, executando oRTC.now ()
biblioteca RTC que você acabou de baixar, para habilitar o registro usando tempo- real
selos. Você atualizar o seu esboço, mais uma vez de usar os valores RTC em vez do
millis
valores.Instalando os Módulos de cartão de RTC e SD
Em primeiro lugar, garantir que tanto o seu escudo cartão SD e RTC está conectado ao seu
onda gerada pela RTC que você não vai usar. No código, você precisa
puxe A2 para a terra e A3 para 5V para garantir que a fuga RTC é alimentado. Se montou o seu próprio circui
Atualização do software
Agora, você adiciona a funcionalidade RTC no software. Você precisa adicionar algumas coisas a seu
■■
■■
Incluir as bibliotecas RTC
■■
Alimentar o módulo RTC
■■
Inicializar o objeto RTC
■■
Defina o tempo RTC usando o tempo de computador, se ele não estiver definida
Além disso, nesta revisão de código, eu adicionei um cabeçalho de coluna que é impresso
Escrever a data e hora reais no arquivo de log
cada vez que o código começa. Desta forma, mesmo se você está anexando a um arquivo CSV existente, é
ATENÇÃO
eSerial.printlnstatements.Youcanresolvethisproblembyremovingserialprintingstatements,
orbytellingtheArduinotostorethesestringsinflashmemoryinsteadofinRAM.Youcanstorestringsinflashmemorybywrap-pingtheseri
ThismethodwasusedListing13-3.O programa actualizado é mostrado na Listagem 13-3, usando o RTC como um relógio para
registro de dados. Ela se move a maioria das cordas em memória flash para salvar RAM
utilizando a técnica explicado na secção de aviso anterior.
Listagem 13-3:
SD Leitura e Escrita com uma sd_read_write_rtc.ino RTC-// SD ler e escrever com RTC
// Definir um RTC
objectRTC_DS1307 RTC;
// Inicializar stringsString
ano, mês, dia, hora, minuto,
segundo, hora, data;
void setup ()
{
Serial.begin (9600); Serial.println (F ( "Inicialização Cartão"));
// Pino CS e pwr / GND pinos são outputspinMode (CS_PIN, OUTPUT); pinMode (SD_POW_PIN, OUTPUT); pinMode (RTC_POW_PIN, OUTPUT); pinMode (RTC
// Poder Setup e terrestres pinos para ambos os módulos digitalWrite (SD_POW_PIN, HIGH); digitalWrite (RTC_POW_PIN, HIGH); digitalWrite (RTC_GND_PIN
// Se RTC não está em execução, configurá-lo para timeif compilação do computador (! RTC.isrunning ())
{
Serial.println (F ( "RTC não está em execução!")); RTC.adjust (DateTime (__ DATE__, __TIME__));
}
{
Serial.println (F ( "File Reading Command"));
}
outro
{
Serial.println (F ( "Não foi possível ler o arquivo de comando."));
Retornar;
{
dataFile.println (F ( "nNova Log \ começado!")); dataFile.println (F
( "Data, Hora, Frase")); dataFile.close (); // Os dados não são realmente
escrito até que // fechar a conexão!
}
outro
{
Serial.println (F ( "Não foi possível abrir arquivo de log"));
}
void loop ()
{
// Obter a data atual e informações de tempo e armazenar em
stringsDateTime datetime = RTC.now (); year = String (datetime.year (),
DEC); month = String (datetime.month (), DEC); dia = Cadeia
(datetime.day (), DEC); hora = string (datetime.hour (), DEC); minuto =
string (datetime.minute (), DEC);
304 Parte IV ■ Tópicos Avançados e Projetos
{
dataFile.print (data); dataFile.print (F ( ",")); dataFile.print (hora);
dataFile.print (F ( ",")); dataFile.println (dataString); dataFile.close () ; //
Os dados não são realmente escrito até que // fechar a conexão!
}
outro
{
Serial.println (F ( "Não foi possível abrir arquivo de log"));
}
atraso (refresh_rate);
}
tempo não será redefinir enquanto a bateria permanece conectado ao RTC. Tambémconfiguração(), Um
cabeçalho de coluna é inserida no arquivo de log, acrescentando uma nota que o registro foi reiniciado.
Isso é útil para acrescentar ao arquivo de log cada vez que você reiniciar o sistema.
BuildinganEntranceLogger
Agora que você tem todas as habilidades básicas para baixo, você pode colocá-los para usar para
construir um registrador de entrada para seu quarto. Você usa o sensor de distância de alguns dos seus
projectos anteriores para criar um sensor de movimento básico que pode manter o controle de quando as
pessoas entrar ou sair por uma porta. O logger irá acompanhar os tempos destes eventos no cartão SD
para que possa rever mais tarde.
306 Parte IV ■ Tópicos Avançados e Projetos
LoggerHardware
Tudo que você precisa fazer é adicionar um sensor de distância analógico para sua configuração
existente. Se você estiver usando a mesma configuração como eu, você não precisa mesmo de uma placa
de ensaio; basta ligar os fios adequados ao poder, chão, e A0 (para a saída de sinal analógico
a partir do sensor). Com tudo em anexo, que deve ser semelhante a Figura 13-22.
Para que isso realmente funcionar bem, você quer montar o sensor de distância IR e
Arduino sobre uma parede de modo a que os cortes de feixe de infravermelhos na horizontal através da
porta. Desta forma, qualquer pessoa caminhar através da porta deve passar na frente do sensor de
distância IR. Não cole nada a sua parede até que você tenha escrito o software na próxima etapa e
carregou-o. Eu sugiro usar facilmente removíveis pintores fita para mantê-lo à sua parede, para que você
não danificar nada. Uma vez configurado, o sistema deverá ser semelhante à Figura 13-23.
Capítulo 13 ■ Registro de dados com cartões SD 307
LoggerSoftware
Para o logger de entrada, ler variáveis de configuração a partir do cartão SD não é particularmente útil, para
que possa remover essas partes do código. Você quer adicionar algum código para verificar o estado da
distância e ver se as suas leituras mudaram drasticamente entre pollings. Se eles têm, você pode assumir
que algo se moveu na frente do sensor de distância e que alguém deve ter entrado ou saído da sala.
Você também precisa escolher um "limiar de mudança." Para a minha configuração, eu descobri que um
mudança de leitura analógica de mais de 75 entre pollings foi uma boa indicação de movimento. (A
configuração provavelmente será diferente. É uma boa idéia para verificar os valores de seu sistema uma
vez que você tem a configuração física fixo.) Você quer ter certeza de que você está verificando o sensor
de distância com frequência suficiente para que você capturar o movimento de cada vez. No entanto, não
faz sentido para executá-lo tantas vezes que você acabar com milhões de leituras para um dia inteiro de
exploração madeireira.
Eu recomendo que você escrever para o cartão SD cada movimento do tempo é detectado,
mas que você apenas periodicamente escrever para o cartão SD quando não há movimento. Esta
metodologia estabelece um bom equilíbrio entre o espaço de armazenamento necessário e precisão.
Porque você se importa mais sobre ter timing exacto para quando alguém passa o sensor, que a
detecção é gravado com um temporal, maior
resolução do que quando nada está acontecendo na frente do sensor. esta técnica
308 Parte IV ■ Tópicos Avançados e Projetos
// Definir um RTC
objectRTC_DS1307 RTC;
// Inicializar stringsString ano, mês, dia, hora, minuto, segundo, hora, data;
void setup ()
{
Serial.begin (9600); Serial.println (F
( "Inicialização Cartão"));
{
Serial.println (F ( "RTC não está em execução!")); RTC.adjust
(DateTime (__ DATE__, __TIME__));
// Inicializar Cardif SD (!
SD.begin (CS_PIN))
{
Serial.println (F ( "Cartão Failure")); return;
}
Serial.println (F ( "Cartão Pronto"));
{
dataFile.println (F ( "nNova Log \ começado!")); dataFile.println (F
( "Data, Hora, Raw, o Active")); dataFile.close (); // Os dados não são
realmente escrito até que // fechar a conexão!
}
outro
{
Serial.println (F ( "Não foi possível abrir arquivo de log"));
}
void loop ()
{
// Obter a data atual e informações de tempo e armazenar em
stringsDateTime datetime = RTC.now (); year = String (datetime.year (),
DEC); month = String (datetime.month (), DEC); dia = Cadeia
(datetime.day (), DEC); hora = string (datetime.hour (), DEC);
310 Parte IV ■ Tópicos Avançados e Projetos
{
Arquivos de dados = SD.open ( "log.csv", file_write); if (DATAFILE)
{
dataFile.print (data); dataFile.print (F ( "")); dataFile.print (tempo);
dataFile.print (F ( "")); dataFile.print (bruto); dataFile.print (F ( ""));
dataFile.println (ativo); dataFile.close (); // Os dados não são realmente
escrito até que // fechar a conexão!
}
outro
{
Serial.println (F ( "Não foi possível abrir arquivo de log"));
}
UPDATE_TIME = 0;
}
atraso (50);
UPDATE_TIME ++;
}
Capítulo 13 ■ Registro de dados com cartões SD 311
Análise de dados
Depois de colocar este código no seu Arduino, configurá-lo à sua porta e deixá-lo correr por um tempo.
Quando estiver satisfeito com a quantidade de dados que você coletou, colocar o cartão SD no seu
computador e carregar o arquivo CSV com o seu programa de planilha favorito. Supondo que você só
registrado ao longo de um dia, agora você pode traçar a coluna tempo contra a coluna de atividade.
Sempre que não há atividade, o gráfico de linha atividade permanece em zero. Sempre que alguém
entra ou sai do quarto, ele salta para um, e você pode ver exatamente quando isso aconteceu.
O procedimento para criar uma trama irá variar de acordo com gráficos diferente aplicação
ções. Para tornar mais fácil para você, criei uma planilha on-line pré-formatado
que vai fazer a plotagem para você. É necessário ter uma conta do Google para usá-lo.
Visite a página web para este capítulo ( www.exploringarduino.com/content/ch13)
e siga o link para a planilha de gráfico-geração. Ele irá pedir-lhe para criar uma nova planilha em sua
conta do Google Drive. Uma vez que isso for concluído, basta copiar seus dados no lugar de onde os
dados modelo é, eo gráfico será atualizado automaticamente para você. Figura 13-24 mostra o que um
gráfico de dados através de uma
Resumo
■■ arquivos CSV utilizar novas linhas e vírgulas como delimitadores facilmente armazenar dados
em um formato de texto simples.
■■ Você pode usar a Biblioteca SD para gravar e ler a partir de um arquivo em um cartão SD.
■■ Você pode construir um software RTC e escrita que utiliza-lo para inserir marcas de tempo.
■■ Você pode superar as limitações de memória RAM, armazenando cadeias de caracteres na memória flash.
■■ Você pode detectar o movimento, procurando por mudança de valores analógicos produzidos
por um sensor de distância.
■■ Você pode representar graficamente os dados de um registrador de dados usando uma planilha em seu
computador.
Capítulo
14
Ligar o Arduino
à Internet
313
314 parte III ■ Interfaces de comunicação
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada
www em
.exploringarduino.com / content / CH14 .
Além disso, todos os códigos podem ser encontradas em
www.wiley.com/go/exploringarduino em
a guia de transferência de código. O código está no download do capítulo 14 e individualmente
nomeados de acordo com os nomes em todo o capítulo.
Explicando todos os trabalhos da web é um pouco ambicioso para um capítulo de um livro, por este
capítulo, você pode essencialmente pensar em relação do seu Arduino à Internet utilizando o
diagrama mostrado na Figura 14-1.
Em primeiro lugar, você trabalha só no âmbito da sua rede local. Ao trabalhar dentro
sua rede local, você pode conversar com seu Arduino através de um navegador web somente se ambos
estão na mesma rede local. Então, você vai explorar formas em que você pode atravessar o roteador
para acessar a funcionalidade do seu Arduino qualquer lugar do mundo (ou pelo menos em qualquer
lugar você pode obter uma conexão com a Internet).
NetworkingLingo
Antes de começar seus pés molhados com a rede o Arduino, vamos obter algum
jargão reta. A seguir, são palavras, conceitos e abreviaturas que você precisa para entender como
você trabalha através deste capítulo.
Endereço de IP
Um endereço IP (Internet Protocol) é um endereço único que identifica cada dispositivo que se conecta à
Internet. No caso da sua rede doméstica, há actu-aliado dois tipos de endereços IP que você precisa se
preocupar: o endereço IP local eo endereço IP global. Se a sua casa ou escritório tem um roteador (como
a de
Capítulo 14 ■ Ligar o Arduino à Internet 315
Figura 14-1), tudo dentro de sua rede local tem um endereço IP local que só é visível para outros
dispositivos dentro de sua rede. O seu router / modem tem um endereços IP globais voltados para o
público que é visível para o resto da Internet. Se você deseja obter dados entre outro lugar na Internet e
um dispositivo atrás
Não existem endereços IP suficientes para ter um para cada dispositivo no mundo. Além disso, os
utilizadores muitas vezes não querem que os seus computadores e outros dispositivos de rede visível para
o resto do mundo. Por esta razão, os roteadores são usados para criar redes isoladas de computadores com
endereços IP locais. No entanto, quando você faz
quer uma dessas máquinas para ser acessível a partir do resto da Internet, você precisa
para usar o NAT através do roteador. Isso permite que um dispositivo remoto para enviar um pedido para
o seu roteador pedindo para falar com um dispositivo em sua rede local. Quando você conecta o Arduino
ao maior web mais adiante neste capítulo, você usa uma forma de NAT.
316 parte III ■ Interfaces de comunicação
Endereço MAC
endereços MAC, ao contrário de endereços IP, são globalmente únicos. (Bem, eles são sup-posou para
ser, mas, na prática, muitas vezes eles não são.) Endereços MAC são atribuídos a cada interface de rede
física e não mudam. Por exemplo, quando você compra um computador, o módulo Wi-Fi dentro tem um
endereço MAC único, eo
adaptador Ethernet tem um endereço MAC único. Isso faz com que endereços MAC útil
para a identificação de sistemas físicos em uma rede.
HTML
HTML, ou Hypertext Markup Language, é a linguagem da web. Para exibir uma página web a partir do
seu Arduino, você vai escrever algum HTML simples que cria botões e controles deslizantes para o
envio de dados.
HTTP
HTTP ou Hypertext Transfer Protocol, define o protocolo para a comunicação através da World Wide Web, e é
mais comumente usado em navegadores. HTTP define um conjunto de informações de cabeçalho que deve
ser enviado como parte de uma mensagem
a teia. Este cabeçalho define como uma página da web irá exibir, além de se
o pedido foi recebido com sucesso e reconhecido.
GET / POST
GET e POST definir duas maneiras para transferir informações para um web remoto
servidor. Se você já viu um URL que se parece www.jeremyblum.com/?s=arduino,
você já viu um pedido GET. GET define uma série de variáveis na sequência de uma marca de ques-
ção na URL. Neste caso, a variável
sestá sendo definido para Arduino. Quando
a página recebe este URL, identifica essa variável, executa a pesquisa e retorna a página de resultados.
DHCP
DHCP ou Dynamic Host Configuration Protocol, faz com que a conexão de dispositivos para
sua rede local uma brisa. As probabilidades são de que sempre que você tiver conectado a uma rede Wi-Fi
(Com fio) não tiveram que definir manualmente um endereço IP em que o roteador pode se conectar a
você. Então, como é o roteador saber para rotear pacotes para você?
Capítulo 14 ■ Ligar o Arduino à Internet 317
Quando você se conectar à rede, um pedido DHCP é iniciado com o roteador que permite que o roteador
para atribuir-lhe dinamicamente um endereço IP disponível. Isto torna a configuração de rede muito
mais fácil porque você não tem que saber sobre a sua configuração de rede para conectar a ele. No
entanto, ele pode fazer a falar com o seu Arduino um pouco mais difícil, porque você precisa descobrir o
que o IP que lhe foi atribuído.
DNS
DNS significa Domain Name System. Cada site que você acessa na internet tem um endereço IP único,
que é a localização do servidor na web. Quando você digitawww.google.com, Um servidor DNS olha para
uma tabela que informa
-lo do endereço IP associado a essa URL "amigável". Em seguida, ele relata que IP
volta para o navegador do seu computador, o que pode, por sua vez, fale com o servidor do Google. DNS
permite que você digite nomes amigáveis em vez de lembrar os endereços IP de todos os seus sites
favoritos. DNS é a sites como lista de contatos do seu telefone está a números de telefone.
ClientsandServers
Neste capítulo, você aprenderá sobre como usar o escudo Ethernet para fazer a
ato Arduino como um cliente ou um servidor. Todos os dispositivos conectados à Internet são clientes ou
servidores, embora alguns realmente preencher ambos os papéis. UMAservidorfaz o que o nome indica:
Quando a informação é solicitada a partir dele, ele serve-se para o computador solicitante através da rede.
Esta informação pode vir de várias formas; que poderia ser uma página da web, informações de banco de
dados, e-mail, ou uma infinidade de outras coisas. UMAclienteé o dispositivo que solicita dados, e obtém
uma resposta. Ao navegar na Internet a partir do seu computador, o navegador web do seu computador
está agindo como um cliente.
NetworkingYourArduino
Para todos os exemplos neste capítulo, você usa seu Arduino emparelhado com o
protetor oficial Arduino Ethernet. Há várias revisões deste escudo, mas estes exemplos são testados para
trabalhar com a versão mais recente do escudo com o chip controlador WIZnet Ethernet. versões
significativamente mais velhos do escudo usado um chip diferente, e não são garantidos para trabalhar
com esses exemplos. Você também pode usar a Ethernet Arduino, um Arduino de placa única que
combina a conectividade Ethernet para a placa Arduino.
DICA IhavefoundthattheEthernetshieldworksmorereliablythantheArduino
Ethernet.
318 parte III ■ Interfaces de comunicação
mostrado através do monitor serial. Se você quiser que o seu sistema a funcionar sem uma
conexão serial, você pode querer ligá-lo a um LCD para exibir o endereço IP, o que você vai de outra
maneira ser visualizadas através do terminal de série no final do capítulo. Você pode usar seu
conhecimento a partir do capítulo 10, "ecrãs de cristais líquidos", para imprimir informações para o
LCD em vez do terminal serial, se quiser; que não está coberto neste capítulo.
ControllingYourArduinofromtheWeb
Primeiro, você configurar o Arduino para agir como um servidor web. Usando alguns formulários HTML, e as
bibliotecas Ethernet integrados, você tem seus automatica-mente Arduino se conectar à rede e servir uma
página web que você pode acessar para controlar alguns dos seus pinos de E / S. Você expor botões na
interface web para alternar as cores de uma LED RGB e controlar a frequência de um orador. O programa
que
você escreve para este efeito é extensível, permitindo que você adicione o controle de adicional
dispositivos como você se tornar mais confortável trabalhando com o Arduino.
SettingUptheI / OControlHardware
Em primeiro lugar, estabelecer algum hardware de teste conectado ao seu servidor Arduino para que
você possa controlá-lo a partir da web. Para este exemplo, você conectar um LED RGB e uma piezo ou
alto-falante comum. Fio-lo para cima como mostrado na Figura 14-2. Lembre-se que Pinos
4, 10, 11, 12 e 13 são usados para comunicação com o chip Ethernet e um cartão SD, para que você não
pode usar os pinos de E / S geral. Você conectar o LED RGB para os pinos 5, 6 e 7. O alto-falante conecta
ao pino 3.
DesigningaSimpleWebPage
É útil para criar uma página web simples separadamente do Arduino antes de tentar-ing para obter o
Arduino para servir-lo para que você pode garantir que ele fique do jeito que você quer. Sua página web
terá simples botões para alternar cada LED, e terá um controle deslizante para ajustar a frequência com
que um alto-falante está jogando. Ele vai usar HTMLFormatoelementos para tornar esses componentes, e
ele usará o
protocolo HTTP GET para enviar comandos a partir do navegador para o servidor. Como você projetar
o site, ele não vai realmente ser ligado a um servidor, de modo a interagir com ele não vai provocar
qualquer ação do Arduino, ou qualquer outra coisa.
Capítulo 14 ■ Ligar o Arduino à Internet 319
Abra o seu editor de texto favorito (eu recomendo Notepad ++ para Windows
porque destaca e códigos de cores HTML quando você salva como um arquivo HTML) e criar um
novo arquivo com um
.htmlextensão. Não importa o que você
o nome do arquivo; test.htmlirá funcionar bem. Este será um muito bare-ossos website, portanto,
não se preocupar em fazer isso totalmente "compatível com" website HTML; ele vai estar faltando
algumas marcas que são normalmente utilizados, tais como
<Body>e <Head>. Estes
etiquetas em falta não irá afectar a forma como a página é processada no navegador. Em seu novo
arquivo HTML, introduzir a marcação Listing 14-1.
<Form action = '' method = "get"> <input type = '' name = 'range' min = 'S 0' max = '1000' passo
= '100' = valor '0' /> <input type = "enviar" value = 'Definir Frequência' /> </ form>
entradaelemento chamado alcance. Isso fará com que um controle deslizante intervalo. Você pode mover o
deslizante (em incrementos de 100) para seleccionar uma frequência que será transmitido como o
valor de uma variável chamada
S. Em navegadores mais antigos, este controle deslizante pode processar como
uma caixa de entrada, em vez de uma barra, se eles não ainda apoiar a alcanceelemento.
Para ver o que a página será semelhante, abri-lo com o seu navegador favorito (eu recomendo Google
Chrome). No Chrome, você precisa pressionar Ctrl + O (Windows) ou Cmd + O (OSX) para obter uma
caixa de diálogo Abrir. Abra o arquivo HTML que você acabou de fazer
Se você pressionar qualquer um dos botões, você deve ver uma declaração GET variável
anexado ao endereço na barra de endereços do seu navegador.
WritinganArduinoServerSketch
Agora, você precisa ter o HTML que você desenvolveu, e integrá-lo em um maior
esboço servidor que irá lidar com a ligação à rede, respondendo às solicitações do cliente com a página
que você projetou, e respondendo a GET declarações das formas de página.
Capítulo 14 ■ Ligar o Arduino à Internet 321
O ciclo principal é responsável por um número de acções. Para lidar com movendo-se através de todos estes
vários estados de ação, uma série de "variáveis de estado" são utilizados ao longo
o loop para manter o controle de quais ações foram executadas eo que ainda precisa acontecer para o
sucesso da comunicação com o cliente a ter lugar.
Este cabeçalho deve ser seguido por uma linha em branco, em seguida, o conteúdo do seu HTML
A página que você escreveu anteriormente. Este mesmo programa também é usado para responder a
solicitações GET. Para identificar solicitações GET, você precisa olhar para o ponto de interrogação Char-
Acter na URL que especifica quais parâmetros foram selecionados e enviados. Se o?for encontrado, o
programa espera até que ele recebe um nome de variável. No caso
Tendo em conta todos os requisitos listados nas seções anteriores, você pode agora construir
um programa de servidor para o Arduino. Esses programas tendem a ser bastante trivial porque eles
exigem o uso de várias variáveis de estado que acompanham o interac-ção entre o cliente eo
servidor. O esboço na Listagem 14-2 funciona muito bem para realizar as tarefas de controlar um LED
RGB e alto-falante. Se você quiser
para adicionar funcionalidade adicional com mais variáveis GET, que deve ser bastante
simples de o fazer. As áreas onde você pode inserir este funcional-dade extras são chamados nos
comentários de código.
#include <Ethernet.h>
#include <SPI.h>
// Definir para o seu endereço MAC! // Deve ser em sua etiqueta. Se você
não consegue encontrá-lo, // fazer um up, ou use este one.byte mac [] =
{0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0};
void setup ()
{
Serial.begin (9600);
Capítulo 14 ■ Ligar o Arduino à Internet 323
{
Serial.println ( "Não foi possível configurar Ethernet com DHCP."); Retornar;
}
outro
{
Serial.println ( "Configurado Ethernet!");
}
void loop ()
{
cliente EthernetClient server.available = ();
Se (cliente)
{
{
// Um comando LED é especificado com um Lif (c == 'L')
{
Serial.print ( "Alternando Pin"); pin =
client.parseInt (); Serial.println (pino);
324 parte III ■ Interfaces de comunicação
}
// Um comando de alto-falante é especificado com um Selse if (c
== 'S')
{
Serial.print ( "Definir Frequência para"); freq =
client.parseInt (); Serial.println (freq); if (freq == 0)
noTone (altifalante); elsetone (ALTO-FALANTE, freq);
break;
}
// Adiciona semelhante formatado else if aqui // controlar as coisas
ADICIONAIS
{
// Enviar headerclient.println padrão de resposta HTTP ( "HTTP /
1.1 200 OK"); client.println ( "Content-Type: text / html \ n");
// Buttonclient.println alternância Red ( "<form action = '' method =" get ">");
client.println ( "<input type = '' name = 'L' value = 'escondidas 7' />") ; client.println
( "<input type =" enviar "value =" Alternar Red '/> "); client.println (" </ form> ");
// Verde buttonclient.println alternância ( "<form action = '' method =" get ">");
client.println ( "<input type = '' name = 'L' value = 'escondidas 6' />") ; client.println
( "<input type =" enviar "value =" Alternar verde "/>"); client.println ( "</ form>");
// Buttonclient.println alternância Blue ( "<form action = '' method =" get ">");
client.println ( "<input type = '' name = 'L' value = 'escondidas 5' />") ; client.println
( "<input type =" enviar "value =" Alternar azul "/>"); client.println ( "</ form>");
// Speaker sliderclient.println frequência ( "<form action = '' method =" get ">"); client.print (
"<input type = '' name = 'gama S' min = '0' max = '1000 '= valor' 'step =' 100 0 '/> ");
client.println (" <input type = "enviar" value = "Frequency Definir' />"); client.println ( "</
form>") ;
Capítulo 14 ■ Ligar o Arduino à Internet 325
sentHeader = true;
}
if (c == '\ n')
{
currentLineIsBlank = true;
}
else if (c! = '\ r')
{
currentLineIsBlank = false;
}
}
}
atraso (5); // Dê o tempo de navegador para receber o dataclient.stop (); //
Fecha a conexão:
}
}
ControllingYourArduinoviatheNetwork
Agora que o código do servidor está em execução e seu Arduino está conectado à rede de trabalho com
um IP válido, você pode acessá-lo com um navegador e controlá-lo. Primeiro, você fazê-lo através da sua
rede local, e então você saber como você pode tirar proveito de encaminhamento de porta em seu
roteador para acessá-lo de fora da sua rede local.
Para confirmar que a interface web está funcionando corretamente, garantir que o computador
está ligado à mesma rede que o Arduino (via Wi-Fi ou Ethernet). Abra seu navegador favorito e digite o
endereço IP da secção anterior na barra de URL. Isso deve abrir uma interface que se parece com a
página HTML que criou anteriormente. Tente pressionar os botões para alternar as várias cores de LED
ligado e desligado. Mova o controle deslizante e aperte o botão de ajuste de freqüência para ajustar a
freqüência do alto-falante. Você deve ver e ouvir o Arduino responder. Se você deixou o monitor serial
aberta, você também vai vê-lo exibindo informações de depuração, uma vez que recebe comandos.
Observe os comandos GET sendo passado para o Arduino
Depois que você está satisfeito com controlando as luzes e sons sobre o local,
rede, você pode seguir os passos na próxima seção para ativar o controle de
em qualquer parte do mundo.
NOTA TowatchademovideooftheArduinobeingcontrolledoveralocalnet-
trabalho, check-outwww.exploringarduino.com/content/ch14.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginning
para tirar proveito de tecnologias avançadas que lhe permitirão túnel para
o dispositivo através de seu roteador do mundo exterior. Para fazer isso, você precisa implementar
três etapas:
2. Encaminhar uma porta externa do roteador para uma porta interna apontando para o
Arduino.
Primeiro, faça login no painel de administração do seu roteador. O URL painel de administração é o
endereço IP do gateway para sua rede. Em quase todos os rede doméstica Configura-ções, este é os três
primeiros valores decimais separados do seu IP local do Arduino, seguido por um 1. Se, por exemplo, o IP
do seu Arduino foi 192.168.0.9, o endereço do gateway é provavelmente (mas não necessariamente)
192.168.0.1. Tente digitar esse endereço em seu navegador para ver se você receber uma tela de login.
Digite o login CREDEN-ciais para a sua página de administração do roteador; estes não são o mesmo que o
seu login wireless
328 parte III ■ Interfaces de comunicação
credenciais. (Se você nunca mudou-los dos valores padrão, você pode ser capaz de encontrá-los no
manual de configuração do roteador.)
é diferente de zero.
Uma vez no console de administração do roteador, procure uma opção para reservar endereços DHCP.
Ao reservar um endereço DHCP, você está garantindo que cada vez que um dispositivo com um
endereço MAC particular, se conecta ao roteador será atribuído o mesmo IP local. endereços IP
reservados nunca são dadas aos clientes com um endereço MAC diferente do endereço especificado,
mesmo se esse cliente reservado não está atualmente conectado ao roteador. Ao reservar endereço IP
DHCP do seu Arduino, você garante que você sempre será capaz de encaminhar o tráfego da web
para que na próxima etapa.
Você também pode realizar o mesmo efeito, dando o seu Arduino um IP estático
(Sem uso de DHCP) no esboço. O site Arduino descreve como fazer isso:
http://arduino.cc/en/Reference/EthernetIPAddress .
Agora que você tem um endereço IP local imutável para o seu Arduino, você precisa tubo de tráfego
web de entrada para esse endereço IP interno. encaminhamento de porta é a
ato de ouvir para o tráfego em uma determinada porta de router e sempre encaminhando
que o tráfego para um endereço IP interno específico. A porta 80 é a porta padrão para a comunicação
HTTP, de modo que é o que você vai usar. Localize a opção certa em seu painel de administração do
roteador e encaminhar a porta externa de 80 a porta interna 80 no IP que você acabou de atribuir ao
seu Arduino. Se o roteador especifica um intervalo para as portas, basta fazer a faixa de 80-80. Agora,
todo o tráfego para seu router na porta 80 vai para o seu Arduino.
O último passo é descobrir como acessar o roteador de outras partes do mundo. Se você estiver
trabalhando em uma rede comercial (ou você paga muito para o seu
ligação à Internet de casa), você pode ter um endereço de IP global estática. este
Capítulo 14 ■ Ligar o Arduino à Internet 329
É raro para conexões de Internet residenciais, mas ainda é possível; verifique com seu provedor de
serviços de Internet (ISP). Se for esse o caso, basta digitarqual é o meu IPno Google, e ele vai dizer
qual é o seu IP global. Se você sabe que tem um IP estático, você pode acessar o IP de qualquer lugar
do mundo e do tráfego, deve reencaminhar para o seu Arduino. Se você quiser, você pode até comprar
um nome de domínio e configurar servidores DNS do seu nome de domínio para apontar para esse
endereço IP.
No entanto, as chances são boas que você tem um endereço de IP global dinâmico. Seu
ISP provavelmente muda o seu IP uma vez a cada poucos dias ou semanas. Assim, mesmo se você
descobrir o que seu IP global é hoje, e acessar seu Arduino através deste IP, pode parar de trabalhar
amanhã. Existe uma maneira inteligente em torno desta, que é a utilização de serviços IP dinâmicos.
Estes serviços rodar um pequeno programa no seu roteador que verifica periodicamente o seu endereço
de IP global e informa-lo de volta para um servidor web remoto. Este servidor web remoto, em seguida,
atualiza um subdomínio que você possui (comomyarduino.dyndns.org) Para apontar sempre para o seu IP
global, mesmo quando ela muda. DynDNS é um serviço que tem software embutido para a maioria dos
roteadores modernos. Pesquisar sua página de administração do roteador para ver quais os serviços de
DNS dinâmico que ele suporta. Alguns são gratuitos; Alguns cobram uma taxa anual nominal. Você pode
seguir as instruções de instalação no painel de administração do seu roteador para criar uma conta com
um desses serviços e conectá-lo ao seu roteador. Após fazer isso, você pode acessar o seu Arduino
remotamente, mesmo com um endereço de IP global que muda dinamicamente. No caso do seu router
não suportar todos os serviços de DNS dinâmico, lembre-se que alguns também oferecem aos clientes
que serão executados em computadores dentro da sua rede, em vez de no roteador diretamente.
SendingLiveDatatoaGraphingService
Esta seção usa uma interface gráfica on-line chamado Xively (Anteriormente chamado
Cosm) Para facilitar a criação de gráficos em tempo real com o seu Arduino.
330 parte III ■ Interfaces de comunicação
BuildingaLiveDataFeedonXively
Para este exemplo, você usar o serviço web Xively para facilitar a representação gráfica de alguns
sensores ligado ao seu Arduino habilitados para Internet. Ao ligar para a
local Xively, você elimina grande parte do trabalho duro que você normalmente precisa fazer para
exibir seus dados na web.
Para começar, visita www.xively.come se inscrever para uma conta gratuita. Siga o link
a confirmação de e-mail que você recebe e fazer login no site.
Uma vez que sua conta está configurada, clique no botão Criar na parte superior da página para criar
um feed. Pressione o botão "+ Add Device". Uma tela como a mostrada na Figura 14-6 irá pedir-lhe para
nomear seu feed e adicionar uma descrição. Você pode
Digite os detalhes solicitados e clique em Adicionar dispositivo. Uma nova página irá aparecer
com informações de conexão relevante para seu novo feed. Deixar esta página aberta,
Capítulo 14 ■ Ligar o Arduino à Internet 331
porque você vai precisar as informações desta página quando você configurar o seu esboço Arduino
mais adiante nesta seção.
Xively fornece uma biblioteca Arduino conveniente que torna mais fácil para obter o seu Arduino falar
com a web através do seu serviço. A biblioteca Xively depende da biblioteca HttpClient, então você
precisará baixar isso também. Ambos os librar-s estão disponíveis no GitHub, um código popular site de
hospedagem. Visite os dois links a seguir e clique no botão ZIP de download para baixar os repositórios
de código:
https://github.com/xively/xively-arduino e https://github.com/amcewen/
HttpClient. (Esses links de download também pode ser encontrado na página web para este
capítulo: www.exploringarduino.com/content/ch14 .) Por agora, salvar estes ZIP
arquivos em seu desktop. Em seguida, execute os seguintes passos:
1. Descompacte os arquivos e renomear as pastas da biblioteca de modo que eles não contêm
traços (GitHub acrescenta traços para os nomes de pasta automaticamente). Eu reco-Mend
renomear a pasta "HttpClient-master" para "HttpClient" eo
2. Mova essas pastas para o seu diretório bibliotecas Arduino, como você fez no
a seção "Obtendo a Biblioteca" do capítulo 12, "Hardware e interrupções timer".
Para sua primeira experiência com Xively, você vai usar o seu exemplo esboço acessível,
que transmite o estado de um sensor analógico para web. No exemplo do menu do seu Arduino IDE,
abra o exemplo DatastreamUpload sob o "xively" título. Isso deve abrir um novo esboço. (Este esboço é
também incluído no
pacote de download de código para este capítulo.) Porque você estará modificando o
exemplo esboço, usar a opção Arquivo> Salvar como para salvar este esboço para o seu próprio
diretório antes de continuar. Um rápido olhar sobre o arquivo de exemplo revela que estará
transmitindo o valor analógico que é lido por entrada analógica pino 2:
// Analog pino que nós estamos monitorando (0 e 1 são utilizados pelo // escudo
Ethernet) int sensorPin = 2;
Sabendo disso, você vai ligar o seu Arduino em conformidade na próxima seção,
com o escudo equipada Ethernet. Você vai voltar a este esboço uma vez que você fio o seu Arduino.
332 parte III ■ Interfaces de comunicação
Em seguida, fio de um sensor analógico para o pino analógico 2 do seu Arduino. O esboço exemplo
que você acabou de baixar está configurado para ler uma entrada analógica no pino analógico 2 e
transmiti-lo até a sua conta Xively. Para manter as coisas simples, pegue um pho-toresistor e 10k resistor
e conectá-los à entrada analógica 2 como um divisor de tensão, assim como fez no capítulo 3, "Leitura
Sensores analógicos" (veja a Figura 14-7). Uma vez
Você precisa mudar apenas três valores no esboço para fazê-lo funcionar com o seu
Arduino e seu feed Xively: o endereço MAC do seu Arduino Ethernet Shield,
seu Xively chave de API, e seu ID de alimentação. O endereço MAC será o mesmo MAC
endereço que você usou para exemplos anteriores. (Como antes, se você não pode encontrar o seu
Capítulo 14 ■ Ligar o Arduino à Internet 333
endereço MAC, é só usar o padrão que vem no exemplo de esboço.) A sua chave API e ID de
alimentação pode ser encontrada na página web Xively que você mantidas abertas
Substitua o ID de alimentação (15552 no exemplo) com seus próprios (o seu pode ter
um número diferente de dígitos):
#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>
// Sua chave Xively para deixá-lo fazer o upload datachar xivelyKey [] = "qkjXS1oUKqbCG-
hqh3fw4WIsdvOSAKx4ZXZYSWhGUWdxcz0g";
// Analog pino que nós estamos monitorando (0 e 1 são utilizados pelo // escudo
Ethernet) int sensorPin = 2;
};
// Finalmente, envolva os fluxos de dados em um feed feedXivelyFeed (1242622121, fluxos de dados,
1 / * número de fluxos de dados * /);
}
}
Faça o upload do código para o Arduino, e você estará pronto para transmitir. Quando seu
Arduino se conecta pela primeira vez, o servidor Xively adiciona automaticamente a alimentação
para a página da web que você tinha aberto anteriormente.
No código, você está criando um objeto que contém todas as informações do seu
alimentação. Isto aparece como uma matriz,datastreams
com o nome
[]. Este contém o sensor
nome e tipo (neste caso, um flutuador). A alimentação é embrulhado em um XivelyFeed
objeto, que tem o ID de alimentação, o fluxo de dados de informação, e o número de fluxos de dados
que estão na matriz.
Uma vez que você começar a correr o esboço sobre o Arduino, os dados serão transmitidos
imediatamente. Abra o monitor serial para observar o estado das suas transmissões.
Se você não ver um status de retorno "200" no monitor serial, você provavelmente copiou o errado
chave de API ou Alimentação ID. Verifique esses valores e tente novamente. Depois de saber que os
dados estão a ser devidamente transmitida, voltar ao site da Xively; asensor_readingfluxo de dados deve
ser agora atualizar automaticamente a cada 15 segundos. Clique nosensor_readingconectar-se a ver um
gráfico ao vivo dos dados provenientes de seu photoresistor. Após o gráfico foi executado por um tempo,
pode parecer algo como a Figura 14-9. (O monitor de série também é mostrado para que você possa ver
como eles combinam.) Isso é tudo que existe para ela. Seu Arduino vai continuar
AddingFeedComponents
Tendo alimentar um sensor para Xively é grande, mas o que se você quiser adicionar mais sensores?
Felizmente, acrescentando dados adicionais é muito fácil! Você adiciona um sensor de temperatura
analógico para o Arduino para complementar as leituras do seu
sensor de luz. Você também pode adicionar qualquer outro tipo de sensor de mesmo eu2digitais
C
e sensores SPI.
Usando o sensor de temperatura TMP36 que utilizou no Capítulo 3, adicione um sensor de temperatura
analógico simples para o circuito, como na Figura 14-10. Este sensor será
Agora você precisa inserir os dados deste sensor no fluxo de dados que são enviados
para o servidor Xively. Basicamente, você só precisa adicionar um fluxo de dados adicional para
Capítulo 14 ■ Ligar o Arduino à Internet 337
o código em todos os lugares que você vê o primeiro fluxo de dados. Você também pode optar por mudar o nom
para os IDs fluxo de dados para algo mais compreensível, como light_reading
e temp_reading. O código na Listagem 14-4 deve se parecer com o código usado antes, mas agora está
escrevendo dois fluxos de dados. Note que você ainda precisa para entrar na sua chave API,
alimentação ID, e endereço MAC de seu programa anterior para este código; caso contrário, ele não
vai funcionar.
Listagem 14-4: Xively Datastream Carregar código atualizado para ler sensores múltiplos-xively2.ino
#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>
// Sua chave Xively para deixá-lo fazer o upload datachar xivelyKey [] = "qkjXS1oUKqbCG-
hqh3fw4WIsdvOSAKx4ZXZYSWhGUWdxcz0g";
// Analog pino que nós estamos monitorando (0 e 1 são utilizados pelo // escudo
Ethernet) int lightPin = 2; // Temperatura sensorint tempPin = 3; //Sensor de luz
};
// Finalmente, envolva os fluxos de dados em um feed feedXivelyFeed (1242622121, fluxos de dados,
2 / * número de fluxos de dados * /);
{
Serial.println ( "Erro ao obter endereço IP via DHCP, de tentar novamente ..."); delay
(15000);
}
}
Você já utilizado com sucesso o seu Arduino tanto como um servidor web e uma
o cliente para um serviço web remoto. Tente adicionar sensores digitais, feedback visual, e muito mais
para tornar o sistema verdadeiramente interativa.
Resumo
Você aprendeu o suficiente HTML básico para escrever um formulário para controlar o seu
■■
Decifrar os ATmega
Folha de Dados e Arduino
Schematics
ReadingDatasheets
Uma das habilidades mais importantes que você pode desenvolver como engenheiro é o
capacidade de ler folhas de dados. Apenas sobre qualquer componente eletrônico que você pode comprar
tem uma folha de dados associado que contém informações sobre os limites técnicos da peça, instruções
sobre como usar as suas capacidades, e assim por diante.
BreakingDownaDatasheet
Considere a folha de dados para os 328p Atmel ATmega, por exemplo. Recorde-se que o ATmega 328p
é a unidade microcontrolador (MCU) utilizado no Arduino Uno e muitos clones Arduino. Encontrar uma
folha de dados muitas vezes pode ser a parte mais complicada.
Eu recomendo apenas fazer uma busca no Google por "ATmega 328p folha de dados" e
procurando o primeiro elo PDF a partir de Atmel. As fichas técnicas para o MCU utilizado nas Arduinos
também podem ser encontrados na página de hardware para cada bordo na
341
342 Apêndice ■ Decifrar o ATmega folha de dados e Arduino Schematics
A partir de uma rápida olhada na folha de dados, você pode aprender uma quantidade considerável
sobre o microcontrolador. Pode assegurar que possui 32KB de memória flash programável, que pode ser
reprogramado cerca de 10.000 vezes, e que pode operar a partir de 1,8V a 5.5V (5V no caso de o
Arduino). Você também pode saber quantas entradas / saídas (I / Os) que tem, quais as funções especiais
que foi construído em (como o hardware de interface periférica de série [SPI] e eu
2
interfaces C), e que
Resolução seu conversor analógico-digital (ADC) é.
Folhas de dados, desde que este geralmente têm marcadores PDF construído em que
torná-lo mais fácil de encontrar o que você está procurando. De particular interesse para as suas
aventuras Arduino pode ser informações sobre portas I / O, os temporizadores e as interfaces seriais
diferentes de hardware. Como mais um exemplo, considere a Figura 13-1 da seção de E / S da folha de
dados I no PDF, o que é mostrado aqui como Figura A-2 para sua conveniência.
R pu
PXn Lógica
Diagramas como este podem ser encontrados em toda a folha de dados, e pode dar
-lhe uma visão mais profunda de como o seu Arduino está realmente trabalhando. Neste exemplo,
você pode ver que os O pinos de I / todos têm diodos de proteção para protegê-los a partir de tensões
excessivamente altas ou negativos. Também é importante observar que há uma capacitância pino
conhecido, o que poderia ter implicações significativas quando se tenta determinar a ascensão e queda
vezes quando se muda o valor de um alfinete.
344 Apêndice ■ Decifrar o ATmega folha de dados e Arduino Schematics
UnderstandingComponentPin-outs
Todas as folhas de dados irá incluir o pino de saída para o dispositivo em questão, que ilustra claramente
as funções de cada pino. Particularmente para microcontroladores, os pinos podem ter múltiplas funções,
de modo a compreensão da pin-out pode ser crítico para o aperto-ing o que cada pino pode e não pode
fazer. Considere o pin-out do 328p ATmega (veja a Figura A-3). Compreender o pin-out do
microcontrolador em seu coração irá torná-lo mais fácil de entender o esquema Arduino Uno, que você
vai olhar
na na próxima seção.
Note-se que o pino-out indica como você pode encontrar o número de pinos na real
lasca. A semi-círculo no topo do pino de saída corresponde a um semi-círculo semelhante no circuito real
integrado. Olhe para o chip no seu Arduino e você vai ver isso semi-círculo; agora você sabe que o pino
imediatamente à sua esquerda é o pino 1.
Você também provavelmente vai notar algumas abreviaturas que você pode não estar familiarizado
com. Eles são aqui definidos:
■■VCC refere-se a alimentação de tensão para o chip. No caso de o Arduino, VCC é 5V.
■■AVCC é uma tensão de alimentação separada para o ADC. Para o Arduino, é também 5V.
■■AREF é dividida a um pino. Assim, você pode escolher uma tensão arbitrária abaixo
5V para atuar como referência para a ADC se você desejar.
O resto dos pinos são todos de propósito geral I / O. Cada é mapeado para uma única
número de pinos no software Arduino para que você não precisa se preocupar com a letra porto e
número.
Os rótulos entre parênteses representam funções alternativas para cada pino. Para
exemplo, pinos PD0 e PD1 também são os Universal Synchronous / Asynchronous Receiver /
Transmitter (USART) Receber (RX) e de transmissão (TX), pinos, tratam, respectivamente. Pinos PB6 e
PB7 são os pinos de conexão cristal (Xtal). No caso do Arduino Uno, um de 16 MHz ressonador
cerâmico externo está ligado a estes
pinos, então você não pode usá-los para uso geral I / O. Se você tiver problemas
decifrar os rótulos pinos, normalmente você pode aprender mais sobre o que eles significam
pesquisando o resto da folha de dados para esses termos. O site Arduino
tem um diagrama que ilustra como os pinos ATMEGA estão ligados aos pinos numerados na placa
Arduino. Você pode encontrá-lo em
http://arduino.cc/en/Hacking/
PinMapping168 , E que é mostrada na Figura A-4.
www.arduino.cc
Crédito: Arduino,
UnderstandingtheArduinoSchematic
Talvez uma das melhores maneiras de aprender sobre o projeto elétrico é analisar a
esquemas dos produtos existentes, tais como o Arduino. Figura A-4 mostra o
esquema para o Arduino Uno.
VIN
818410K RN1B
+ 5V
X1PWERSUPPLY_DC21MMX
RN1A 10K
346 Apêndice
NCP1117ST50T3G + 5V
+ 13CMP
3PWRIN 3U1
27GATE_CMD
C1100n + 5V
+ 3V3 2U5A INOUT
8111
2123
LMV358IDGKR SCK 56-GND U5B D1M7
713
1KRN2A
■
LYELLOW
GND GND GND GND
+ 5V GND
U2 GND
USBVCC + 5V 132LP2985-33DBVR + 5V
INOUT
PODER
T1FDN340P
LIGADO DESLIGADO C3 + 5V ON42
453RN4D 1K
1U-1
GND
45 + 3V3
GND NC / FB REINICIAR 3215 6GREEN
+ 3V3
RN4C 1K
GND GND
Arduino (TM) UNO Rev3
7654
VIN
+ 5V GND 8 x 1F-H8.5
GND
3412
ICSP1
2X2 H - NM
JP2
135MISO2246GND GND + 5V
21RN1D 10K
SCK2 MoSi2 ICSP C4100n
RESET2
REINICIAR
3264 10X1F-H8.5
3X2 M AD5 / SCL 1098
SCL
1RESET-PT + 5V AD4 / SDA SDA
6332
GND U3 3X2 M GND AREF
10K RN1C
2120 GND
5435
(/ OC0A / OC1C PCINT7) PB7
C5100n
PB6 SCK 68910
CD1206-S01575
(PCINT6) PB6 1378
RESET2 1918 PB5 MISSÔ
D2
110
C11
22p
(PD0 / MISO / PCINT3) PB3 REINICIAR (SCK) PB5
2R1 MoSi2 1817 2345
12AREF
22R RN2A
Y1D3
XTAL2 (PC0) (/ MOSI / PCINT2 PDI) PB2 (MISO) PB4
1X2 XUSB 8154 15PB7SCK2 GND XTAL2
(/ PCINT1 SCLK) PB1 (MOSI) PB3
234D + RD- 1615
C922P
1MXT1 R21M
GND
XTAL1 (/ PCINT0 SS) PB0 XTAL2 (SS) PB2
TS42031-160R-TR-7260
16MHz2
22R RN3A io9 IOH
(OC1) PB1
RD + XTAL1 9SS PD7
14 (AIN1)IO8 6X1F-H8.5
P$2
P $ 1 USB
XTAL1 (ICP) PB04
2223 CSTCE16M0V53-R0 16 MHz 6123
AVCC (INT4 / ICP1 / CLK0) PC7
+ 5V AREF 2120 2827 AD5 / SCL
(/ PCINT8 OC1A) PC6 (ADC5) PC5
2526 AD4 / SDA 45
(/ OC1B PCINT9) PC5 AVCC (ADC4) PC4
P$2
P$1
424 2278 2625 AD3
VCC (PCINT10) PC4 AGND (ADC3) PC3
Z2Z1
54 + 5V
327 + 5V
1K RN2D
513 AD2
GND (/ PCINT11 AIN2) PC2 (ADC2) PC2
UGND
inicialização USB En
2423 AD1
VCC (ADC1) PC1
GND AD0
(CTS / HWB / AIN6 / TO / INT7) PD7 C6100n GND (ADC0) PC0
CG0603MLC-05E
CG0603MLC-05E
TP_VUCAP 1211 DE ANÚNCIOS
USHIELD UCAP (RTS / AIN5 / INT6) PD6 8X1F-H8.5
USBVCC 3130 1312
UVCC (XCK / AIn4 / PCINT12) PD5
RD- 1098TXLED
RXLED IO6
D-D + (INT5 / AIN3) PD4 (AIN1) PD7
RD + 2928 M8RXD 1K RN2C 1165 IO5
100n (TXD1 / INT3) PD3 (T1) PD5
UGND M8TXD IO4 6770
C7GND UGND (RXD1 / AIN1 / INT2) PD2 (T0) PD4 5618
7614 IO3 527RN3B
(AIN0 / INT1) PD1 TXYELLOW (INT1) PD3
L1BLM21
21C8 331XT1 432IO7 IO2
ALMOFADA (OC0B / INT0) PD0 (INT0) PD2
Decifrar o ATmega folha de dados e Arduino Schematics
IO1
1uD- (TXD) PD1
GROUND ATMEGA16U2-MU (R) IO0
(RXD) PD0 1234
GND 7224 1234
ATMEGA328P-PU
RXYELLOW 1K63RN2B 1K RN4B IOL
M8RXD 721K RN4A
81M8TXD
22R
36RN3B
22R
você pode combinar todas as peças para as peças que você pode ver no seu Arduino
Uno? Comece com o MCU principal (Parte ZU4 no esquema), a ATmega328P, e todos os pinos de fuga.
Aqui, você pode facilmente identificar quais portas ATMEGA / pinos mapear para os pinos que estão
disponíveis para você no ambiente de desenvolvimento integrado (IDE). Mais cedo neste apêndice,
você observou que PD0 e PD1 foram conectados aos pinos USART TX e RX. No esquema Arduino,
pode efectivamente confirmar que estes pinos ligar aos pinos correspondentes do
16U2 (8U2 em revisões 1 e 2) chip conversor USB-to-Serial. Você também sabe que
há um LED ligado (através de um resistor) ao pino 13 do Arduino. No esquema, você pode ver que o pino
13 está conectada ao pino PB5 no ATmega. Mas onde está o LED? Usando nomes de líquidos, você pode
indicar uma connec-ção eléctrica entre dois pontos em um esquema sem realmente desenhando todas as
linhas. Tendo cada fio mostrado em um esquema pode ficar confuso muito rapidamente. No caso de PB5,
você pode ver que o fio que sai da MCU é rotuladoSCK, E que existe um fio de designação semelhante no
topo da alimentação esquemática através de um tampão para uma resistência e de depuração
familiarizados LED.
A maioria dos esquemas que você vai encontrar são feitas em um estilo similar a este, com
lotes de redes rotulados que se conectam sem fios diretos. Continuar a analisar o esquema Arduino até
você entender onde todos os sinais estão indo. Veja quantos componentes que você pode
corresponder à placa real.
Índice
349
350 Index ■ Um C-
componentes, 16-
Veja também conectividade com a Internet 18loading, 15-16
Arduino Leonardo
interrupções de hardware, 261keyboards, fiação
emulando, 135-140microcontroller, 6, motores DC, 68-
9mouse, emulando, 140-144 69LCDs, 200-203
C
C (coletor) pin, NPN BJT, 67capacitors,
escudo SD Arduino Wi-Fi, escudo SD 286- dissociação, 83cathodes, 22, 36chars,
287Arduino sem fio, 285ArduPilot, 121-122clients, 317, linha 321-
12arguments, 17assignment (=) Operador, 322clock
LED 34associate, 226ATMega
microcontrolador, 5, 6, 8
I2C
B comunicando com a temperatura
B (base) pinos, NPN BJT, estaduais sensor, 167-173
67backward (H-ponte), 73bar gráficos, controle de dispositivos I2C, design 167-
LED 168hardware, requisitos 164-167hardware,
167history de, números 164ID, as
monitoramento de temperaturas, 173- temperaturas 165-167monitoring, 173-179vs.
179responding às entradas, 157-160 SPI, 185
bargraph.inoarquivo, 159
base (B) pin, NPN BJT, a taxa de 67baud, 48, tipo de
dados 49binary, formato 119binary, convertendo para
decimal, 154bipolar-junction transistor (BJT), 66-68
SPI
ajustar o volume do altifalante, 193-
197communication esquema, 183, 184
Índice ■ C-D 351
echo.inoarquivo, 121
HttpClient bibliotecas, instalação, 331
ecoando os dados de entrada, 120-121emitter hw_multitask.inoarquivo, 268-269
(E) pin, NPN BJT, 67entrance exemplo logger, Hypertext Markup Language (HTML),
305-311
316, 318-320
entrance_logger.ino arquivo, 308-310 histerese, 265
F Eu
fade.inoarquivo, 27-28
I / O pins. Vejo ônibus
pinsI2C
configuração de firmware, limitações de memória
8flash, e RAM, 301fonts, carregando no esboço combinining com registos de deslocamento, 173-
Processing, 179communicating com a temperatura
paraloops, 25-27
esquema de comunicação, 165-167controlling
dispositivos I2C, design 167-168hardware,
estado para a frente (H-ponte), 73frequencies, requisitos 164-167hardware, 167history de,
mapeamento notar nomes, números 164ID, temperaturas 165-
95-96 167monitoring, 173-179vs. barramento SPI,
biblioteca 185Wire, 169, 171
URLs amigáveis, chip de
317FTDI, 110-112
fun_with_sound.inoarquivo, 273-275
funções, 17, 33. Veja também funções específicas
banda, 222
314-315, 328-329
sensores de distância infravermelhos, 50
variáveis globais,
38graphs logger entrada, sensores 305-
311sweeping, 86-89
gráficos de barras de LED
inicializar LCDs (cristal líquido
monitoramento de temperaturas, 173-
179responding às entradas, 157-160 monitores), 204
conectividade com a Internet
gráficos em tempo real, 329
controlar o Arduino a partir da web,
adicionando componentes da ração, 336-
339building feeds de dados, 330-335 318-329
acesso através da rede, 326-329designing uma
giroscópios, eixo duplo, 51 simples página web, 318-320setting-se I / O
hardware de controle, 318writing um esboço
servidor, 320-326
H
Pontes H, interrupções 72-79hardware,
gráficos em tempo real, criando, 329
258-259
adicionando componentes da ração, 336-
capacidades Arduino, 261-262building botão 339building feeds de dados, 330-335
filtrada por-hardware
visão geral, 314-318
circuito de interrupção, 262-269
Internet das coisas, 314. Veja também Internet
interromper-driven máquina de som,
conectividade
construção, 272-275
interrupções
compensações com polling, 259-261
interrupções de hardware, 258-259
hbridge.inoarquivo, 78-79 capacidades Arduino, interrupção botão 261-
cabeçalhos, LCDs, tipo de dados 262hardware-filtrada por
200-201hexadecimal, 119
circuitos, 262-269
hsv.jpgarquivo, 132, 133 compensações com polling, 259-261
Índice ■ I-M 353
interromper-driven máquina de som, interrupções 272- modulação por largura de pulso, 27-29RGB
275timer, 270-272 exemplo nightlight LED, 35-39RSSI,
226sweeping exemplo sensor de distância,
execução de tarefas em simultâneo, biblioteca
271-272TimerOne, descarga,
270-271 86-89
ints, 121-122IP (Internet Protocol) endereços, 314-315 fiação, 22
bibliotecas
determinar manualmente, HttpClient, 331LiquidCrystal,
328global, 314-315, 328- 203-209RTClib, 299-305SD,
329reserved, 328retrieving via 284TimerOne, 270-272Wire,
DHCP, 321static, 328-329 169, 171Xively, 331
ipconfigcomando, 328
ISM (Industrial, Científica e Médica)
banda, 222 animações de luz, controlando com mudança
registradores, 154-160
k lightrider.ino arquivo, 156
teclados, emulando, 135-140 Arduino Lilypad, os
reguladores 11-12linear
circuitos, 262-269
354 Index ■ H-P
motor.inoarquivo,
70motor_pot.inoarquivo, 71-72
rato, emulando, 140-144
mouse.inoarquivo, 142
comentários de várias linhas, pinos ponto-a-multiponto comunicação,
16multiplexed, 109multitasking, 222-223
interrupções e, 260
ponto-a-ponto de comunicação,
music.inoarquivo, 101 222-223, 230
entradas de votação, vs. interrupções de hardware,
N 259-261
P
LCDs paralelas (telas de cristal líquido) comunicando, 185-193creating áudio display /
cursor, movendo-se, personagens 204-206custom, visual, 193-197
acrescentando: 206-209initializing, termostato
204personal, criando, 209-219setting-se, 200- equação de poder, 23-24,
203text, acrescentando: 204-206 suprimentos 31power, 7
limites de, 84
actuadores de precisão, ondas 80-
86pressure, 92-93
pentatônica micro piano, 102-105
Índice ■ P-S 355
RTC.adjustfunção,
processing_control_RGB / list_control , 299RTC.isrunning () função, 304
243-244 RTC.now ()comando, 299
processing_control_RGB / processing_ biblioteca RTClib, 299-305
control_RGB, 133, 244-245
programação S
saídas digitais, 27- Schmitt triggers, linha 265-266SCL, I2C,
29interfaces, 6-7 165, 169SD cartões. Veja também
registro de dados
barras de progresso, animado, 206-
209protection diodos, sensores 67proximity,
afiado, 50pulldown resistores, resistores 32- formatação, de 279-
35pull-up, 30, 31, 165, 167PWM (modulação 284reading, 293-297shields,
por largura de pulso) 284-288SPI interface, para
288writing, 289-293
Serial Bus Interface Periférica. Vejo terminal de busserial audio / display visual, 193-197including
SPI arquivos de definição, 95-96playing volta
canções, alto-falantes 99-102wiring, 96-
impressão para, rádios 115-119XBee, 99
configuração, 235-236
formatos, 154
funções dos pinos, 148-149shifting escudo MicroSD SparkFun, 288SparkFun Pro placa
de dados de série, 151-153workings Mini Arduino, 12SparkFun XBee USB Explorer, 228-
de, 149-151 230speakers
server_form.htmlarquivo, 319-320
servidores, 317 propriedades de som, processo 92-
esboço servidor, 320-326 94sound-produção, 94wiring, 96-99
servo.inoarquivo, 85-86
servos (servo motores), 80-86 caracteres especiais
controlar com Arduino IDE, 85-86timing adição de LCDs, 206-209printing ao
diagrama, 82wiring, 80-84 terminal, 117-118
barramento SPI
setCursor ()função, 204- comunicando com DigiPot
206configuração()função, 16, 24 ajustar o volume do altifalante, 193-
sensor de distância infravermelho afiada, 197controlling brilho LED, 185-193
50shields esquema de comunicação, 183, configuração
Arduino Ethernet escudo, 317-318, 321, 184hardware, 183-184vs. barramento I2C,
185overview, 182-183SD placa de interface
332 SPI, 288
escudos cartão SD, escudos de rádio
284-288XBee, 224-228
173-179
a conversão entre binário e decimal 328-329
formatos, 154 pulldowns fortes,
daisy encadeamento, animações 153light, 30SudoGlove, 103, 132
controlar funções 154-160pin, dados seriais 148-
sweep.inoarquivo, 88-89
149serial-se paralelamente, 147-148shifting, 151-
153workings de, 149-151 sensor de distância varrer, 86-89switches
saltando, 32transistors
como, 66-67
terminal W
impressão para, rádios 115-119XBee, pulldowns fracos, 30, páginas 32web,
configuração, 235-236 concepção, biblioteca 318-320Wire, 169,
171
texto, acrescentando que LCDs, 204-
206thermostat, criando, 209-219
Wire.available () comando, 172
aviso sonoro, acrescentando: programa 214- Wire.beginTransmission () comando, 172
215complete, os dados 215-219displaying,
211-213fan, controlando, 214- Wire.endTransmission () comando, 172
215functionality, expandindo, 219hardware Wire.read ()comando, 172Wire.requestFrom
configuração, ponto 210set, ajustando, 213- ()comando, 172Wire.write ()comando, 172
214
conversores ATmega MCU, conversores 112- visão geral, 222-224Pro vs. não-Pro
114FTDI, 110-112vs. comunicação serial, 109- versões, 224remote Arduinos, 236-
110single MCUs USB-capaz, capacidades 112- 246
114USB-hospedeiro, 114-115
controlar o processamento, 239-
243controlling LEDs RGB, 243-
246powering, 236-239
~StormRG~