0% acharam este documento útil (0 voto)
205 visualizações385 páginas

Ilovepdf Merged

Enviado por

manuelfpmga
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
205 visualizações385 páginas

Ilovepdf Merged

Enviado por

manuelfpmga
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

explorando Arduino ®

Técnicas e Ferramentas para


Engenharia Wizardry

Jeremy Blum
explorando Arduino®: Técnicas e Ferramentas para Engenharia Wizardry

Publicado por John Wiley & Sons, Inc.


10475 Crosspoint Boulevard
Indianapolis, IN 46256

www.wiley.com

Copyright © 2013 por John Wiley & Sons, Inc., Indianapolis, Indiana

Publicado simultaneamente no Canadá

ISBN: 978-1-118-54936-0ISBN: 978-1-


118-54948-3 (EBK) ISBN: 978-1-118-
78616-1 (EBK)

Fabricado nos Estados Unidos da América

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.

Biblioteca de controlo do número Congresso: 2013937652

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 de aquisições Vice-Presidente e Grupo Executivo Publisher


Mary James
Richard Swadley
editor de projeto
Jennifer Lynn Vice-Presidente e Editor Executivo

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

Jeremy Blum recentemente recebeu seu mestrado em Electrotécnica e de Computadores


Engenharia da Universidade de Cornell, onde anteriormente recebeu seu Bacharel
grau no mesmo campo. Em Cornell, ele supervisionou a concepção e criação de
vários edifícios sustentáveis em todo o mundo e internamente através de sua fundação e liderança da
Cornell University Projeto Sustentável, uma organização de design sustentável nacionalmente
reconhecido que tenha sido especificamente elogiado pelo CEO dos EUA e Green World Building
Council. Nesse sentido, Jeremy aplicou sua paixão pela engenharia elétrica para projetar sistemas
solares de energia em casa de monitoramento, sistemas de iluminação LED de fibra óptica
revolucionários, e painéis solares inteligentes de rastreamento de sol. Ele também é responsável por
ajudar a iniciar um primeiro de seu tipo de espaço de co-working empresarial que contribui para o
desenvolvimento de dezenas de estudantes em fase de arranque (incluindo alguns de sua própria
criação) a cada ano.

Jeremy projetou premiado métodos de controle de próteses, gesture-


sistemas de reconhecimento e sistemas de edifício de automação, entre muitas outras coisas. Ele
projetou o sistema eletrônico para as impressoras MakerBot Replicator 3D

(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.

Jeremy produz vídeos do YouTube que introduziram milhões de pessoas


engenharia e estão entre os tutoriais Arduino mais populares na Internet. Ele é bem conhecido dentro
do código aberto internacional e "criador" comuni-dades para o desenvolvimento de projetos de
hardware de código aberto e tutoriais que

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.

Sobre o Editor Técnico

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

Universidade desde 2005, a introdução de artistas e designers para microcontroladores. Scott


trabalha para a equipe Arduino, documentando novos produtos e criar tutoriais para introduzir as pessoas
à plataforma. Ele foi editor técnico da segunda edi-ção deFazer as coisas Discussão em 2011, e ele foi o
autor do livro que acompanha o Kit oficial Arduino Iniciado em 2012.
Agradecimentos

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

parte I Arduino Engenharia Basics 1

Capítulo 1 Obtendo-se e piscando com o Arduino 3

Capítulo 2 entradas digitais, saídas e Pulse-Width Modulation 19Chapter 3 Leitura


Sensores analógicos
41

parte II Controlar o Seu Ambiente 61

Capítulo 4 Uso de transistores e de condução Motors 63

Sons Capítulo 5, que faz 91

Capítulo 6 USB e Comunicação Serial 107

Registros Capítulo 7 Turno 145

parte III Interfaces de comunicação 161

Capítulo 8 A I2C Bus 163

Capítulo 9 A SPI Bus 181

Capítulo 10 Interface com ecrãs de cristais líquidos 199

Capítulo 11 Comunicação sem fio com XBee rádios 221

parte IV Tópicos Avançados e Projetos 255

Capítulo 12 Hardware e interrupções timer 257

Capítulo 13 Registro de dados com cartões SD 277

Capítulo 14 Como conectar o Arduino à Internet 313

Apêndice Decifrando o ATmega folha de dados e Arduino Schematics 341

Índice 349

ix
Conteúdo

Introdução xix

parte I Arduino Engenharia Basics 1

Capítulo 1 Obtendo-se e piscando com o Arduino 3


Explorando o Arduino Ecossistema 4
Arduino Funcionalidade 4
Atmel microcontroladores 6
Interfaces de programação 6
Geral I / O e ADCs 7
Suprimentos de energia 7
Arduino Boards 8
Criando seu primeiro programa 13
Baixar e instalar o Arduino IDE 13
Executando o IDE e conectando ao Arduino 14
Breaking Down Seu primeiro programa 16
Resumo 18

Capítulo 2 Entradas, saídas digitais, e Pulse-Width Modulation 19


Saídas digitais 20
Fiação até um LED e Usando Breadboards 20
Trabalhando com Breadboards 21
LEDs de fiação 22
Programação Saídas digitais 24
Usando os loops 25
Pulse-Width Modulation com analogWrite () 27
Leitura de entradas digitais 29
Lendo entradas digitais com PULLDOWN Resistências 29
Trabalhando com botões "saltitantes" 32
Construir uma controlável RGB LED Nightlight 35
Resumo 39

XI
xii Conteúdo

Capítulo 3 Leitura Sensores analógicos 41


Compreender analógica e digital Signals 42
Comparando analógica e digital Signals 43
Converter um sinal analógico para um digital 44
Leitura Sensores analógicos com o Arduino: analogRead () 45
Lendo um potenciômetro 45
Usando Sensores analógicos 50
Trabalhando com Sensores analógicos para detectar a temperatura 52
Usando Resistores Variáveis fazer seus próprios sensores analógicos 54
Usando divisores de tensão resistiva 55
Usando entradas analógicas para controlar saídas analógicas 56
Resumo 59

parte II Controlar o Seu Ambiente 61

Capítulo 4 Uso de transistores e de condução Motors 63


Condução DC Motors 65
Movimentação de cargas de alta corrente indutiva 65
Uso de transistores como interruptores 66
Usando diodos de proteção 67
Usando um secundário fonte de alimentação 68
Fiação do Motor 68
Controlando Motor velocidade com PWM 70
Usando um H-Bridge para controlar DC Direcção Motor 72
Construir um circuito de ponte H 73
A operação de um circuito de ponte H 76
Condução servomotores 80
Compreender a diferença entre Rotação Contínua
e Servos Padrão 80
Entendendo Controle Servo 80
Controlar um Servo 85
A construção de uma varredora Distância Sensor 86
Resumo 90

Sons Capítulo 5, que faz 91


Entendendo como funciona Speakers 92
As propriedades do Som 92
Como um alto-falante produz um som 94
Usando tom () para fazer sons 95
Incluindo um arquivo de definição 95
Ligação do alto-falante 96
Fazendo sequências sonoras 99
usando Arrays 99
Fazendo a anotação e Duração Arrays 100
Completando o Programa 101
Compreender as limitações do tom () função 102
A construção de uma Micro Piano 102
Resumo 105
Índice xiii

Capítulo 6 USB e Comunicação Serial 107


Entender Comunicação Serial do Arduino
capacidades 108
Placas Arduino com um interno ou externo FTDI
USB-to-Serial Converter 110
Placas Arduino com um secundário com capacidade USB
ATmega MCU Emulando um conversor Serial 112
Placas Arduino com um MCU Único USB-Capable 114
Arduino Placas com capacidades USB host 114
Ouvindo o Arduino 115
Usando instruções de impressão 115
Usando caracteres especiais 117
Alterar Tipo de Dados Representações 119
Conversando com o Arduino 119
Lendo informações de um computador ou outro dispositivo serial 120
Dizer a Arduino para eco dos dados de entrada 120
Entender as diferenças entre CHAR e Ints 121Sending Individual Characters
para controlar um LED
122
Envio de listas de valores para controlar um LED RGB 125
Conversando com um desktop App 127
Falando ao Tratamento 127
Processamento de instalar 128
Controlar um esboço de processamento do seu Arduino 129
Envio de dados de processamento à sua Arduino 132
Aprender Truques Especiais com o Arduino Leonardo
(E outras Arduinos Baseado-32U4) 134
Emulando um teclado 135
Digitando dados no computador 135
Comandando o computador a fazer o seu lance 139
Emulando um mouse 140
Resumo 144

Registros Capítulo 7 Turno 145


Compreender registos de deslocamento 146
Envio de dados seriais e paralelas 147
Trabalhando com o 74HC595 Shift Register 148
Compreender a mudança Funções Register Pin 148
Entender como o registo de deslocamento Works 149
Mudando de Dados Serial do Arduino 151
Converter entre formatos binários e decimais 154
Controlando animações de luz com um Shift Register 154
Construir um "Rider Luz" 154
Respondendo a entradas com um gráfico de barras de LED 157
Resumo 160
xiv Conteúdo

parte III Interfaces de comunicação 161

Capítulo 8 A I2C Bus 163


História da I2C Bus 164
Eu2Design C Hardware 164
Esquema de Comunicação e números de identificação 165
Requisitos de hardware e resistores pull-up 167
Comunicando-se com um I 2Sonda de temperatura C 167
Configurar o hardware 168
Referenciando a Folha de dados 169
Escrevendo o Software 171
Combinando registos de deslocamento, Comunicação Serial,
e eu2C Communications 173
Construir o hardware para um sistema de monitorização de temperatura
173Modifying do Programa integrado
174
Escrever o esboço de Processamento 177
Resumo 180

Capítulo 9 A SPI Bus 181


Visão geral do Bus SPI 182
SPI hardware e Design de Comunicação 183
Configuração de hardware 184
Esquema de comunicação 184
Comparando SPI para I 2C 185
Comunicação com um SPI de potenciômetros digitais 185
A coleta de informações a partir da Folha de dados 186
Configurar o hardware 189
Escrevendo o Software 190
Criando um monitor Audiovisual Usando
SPI Digital Potentiometers 193
Configurar o hardware 194
Modificação do Software 195
Resumo 197

Capítulo 10 Interface com ecrãs de cristais líquidos 199


Configurando o LCD 200
Usando a Biblioteca LiquidCrystal para escrever para o LCD 203
Adicionando texto para a Tela 204
Criação de personagens e animações especiais 206
Construindo um termostato pessoal 209
Configurar o hardware 210
Exibindo dados no LCD 211
Ajustar o Set Point com um botão 213
Adicionando um aviso sonoro e um ventilador 214
Juntando tudo: o programa completo 215
Tomando esse projeto para o Próximo Nível 219
Resumo 219
conteúdo xv

Capítulo 11 Comunicação sem fio com XBee rádios 221


Comunicação compreensão XBee sem fio 222
XBee rádios 223
The Shield Radio XBee e conexões seriais 224
Regulator 3.3V 226
Nível de lógica Shifting 226
Associar LED e LED RSSI 226
UART Seleção jumper ou interruptor 226
Hardware vs. Software UART de série Connection Option 227
Configurando seus XBees 228
Configuração com um escudo ou um adaptador USB 228
Opção de programação 1: Usando o Uno como um programador
(Não recomendado) 229
Opção de programação 2: Usando o SparkFun USB Explorador
(Recomendado) 230
Escolhendo as configurações de XBee e ligar o XBee
para seu computador host 230
Configurar o XBee com X-CTU 231
Configurar o XBee com um Terminal Serial 235
Conversando com seu sem fio do computador 236
Como ligar o Arduino remoto 236
USB com um computador ou um adaptador de parede 5V 237
baterias 237
Adaptadores de parede de energia 239
Revisitando os exemplos de série: Controlling Processing
com um potenciômetro 239
Revisitando os exemplos de série: Controlando um LED RGB 243
Falando com outro Arduino: Construindo uma campainha sem fio 246
Projeto de sistema 246
transmissor Hardware 247
receptor Hardware 248
Software transmissor 249
receiver Software 250
Resumo 252

parte IV Tópicos Avançados e Projetos 255

Capítulo 12 Hardware e interrupções timer 257


Usando interrupções de hardware 258
Sabendo as compensações entre Polling e Interrompendo 259
Facilidade de Implementação (Software) 260
Facilidade de Implementação (Hardware) 260
multitarefa 260
aquisição Precisão 261
Compreender o hardware do Arduino
Capacidades de interrupção 261
xvi Conteúdo

Construir e testar um Hardware-filtrada por


Botão Circuito de Interrupção 262
Criando um Hardware Debouncing-Circuit 262
Montagem do Circuito Teste completo 267
Escrevendo o Software 267
Usando interrupções timer 270
Compreender interrupções timer 270
Obtendo a Biblioteca 270
Executar duas tarefas simultaneamente (ish) 271
Construir uma máquina de som baseada em interrupções 272
Máquina de hardware de som 272
Software Sound Machine 273
Resumo 275

Capítulo 13 Registro de dados com cartões SD 277


Preparando-se para Registro de Dados 278
Formatação de dados com arquivos CSV 279
Preparar um cartão SD de Registro de Dados 279
A interface do Arduino com um cartão SD 284
SD Card Shields 284
Cartão SD de interface SPI 288
Escrevendo para um cartão SD 289
Lendo a partir de um cartão SD 293
Usando um relógio de tempo real 297
Compreender Clocks em Tempo Real 298
Usando o DS1307-Real Time Clock 298
Usando a Biblioteca RTC Arduino Third-Party 299
Usando o relógio em tempo real 300
Instalando os Módulos de cartão de RTC e SD 300
Atualização do software 301
Construir uma Logger Entrance 305
logger Hardware 306
Software logger 307
Análise de dados 311
Resumo 312

Capítulo 14 Como conectar o Arduino à Internet 313


A Web, o Arduino, e Você 314
Networking Lingo 314
Endereço de IP 314
Tradução do Endereço da Rede 315
Endereço MAC 316
HTML 316
HTTP 316
GET / POST 316
DHCP 316
DNS 317
Índice xvii

Clientes e servidores 317


Networking Seu Arduino 317
Controlando a sua Arduino a partir da Web 318
Configuração do I / Hardware O Control 318
Projetando uma simples página da Web 318
Escrevendo um esboço Arduino Servidor 320
Conexão à rede e recuperando um IP via DHCP 321Replying para uma
resposta do cliente
321
Putting It Together: Esboço Web Server 322
Controlando a sua Arduino através da Rede 326
Controlando a sua Arduino através da rede local 326
Usando Port Forwarding Controle seu Arduino
de qualquer lugar 327
Envio de dados ao vivo a um Serviço de Gráficos 329
Construindo um Live Feed de Dados sobre Xively 330
Criando uma conta Xively 330
Criando um feed de dados 330
Instalando as Bibliotecas Xively e HttpClient 331
Fiação Up Your Arduino 332
Configurando o esboço Xively e executar o código 332
Exibindo dados na Web 335
Adicionando componentes de alimentação 336
Adicionando um sensor de temperatura analógico 336
Adicionando Leituras adicionais sensor ao Datastream 336
Resumo 339

Apêndice Decifrando o ATmega Folha de dados


e esquemas Arduino 341
Fichas de leitura 341
Quebrando uma folha de dados 341
Entender Componente Pin-outs 344
Compreender o Arduino Schematic 345

Í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.

Se você é completamente novo para qualquer tipo de engenharia ou são um experiente


veterano olhando para começar com o projeto de sistemas embarcados, o Arduino é
ótimo lugar para começar. Você está procurando uma referência geral para Arduino desenvolvimento
mento? Este livro é perfeito para você também. Este livro orienta você através de uma série de
projectos específicos, mas você também vai encontrá-lo fácil para voltar ao livro para trechos de código,
melhores práticas, esquemas do sistema, e muito mais. As práticas engenheiro-ing elétrico, projeto de
sistemas e programação que você vai aprender ao ler este livro são amplamente aplicáveis para além da
plataforma Arduino e irá prepará-lo para assumir uma variedade de projetos de engenharia, quer usar o
Arduino ou alguma outra plataforma .

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.

Quando a construção de componentes dos projectos Arduino demonstrado hardware


Neste livro, você vai aprender não só como ligar as coisas em conjunto, mas como ler esquemas, por
que determinadas partes são usados para funções específicas, e como ler folhas de dados que
permitirá que você escolher peças adequadas para construir seus próprios projetos. Ao escrever
software, eu fornecer o código do programa completo, mas você vai primeiro ser reforçada através de
vários processos iterativos para criar o programa final. Isso vai ajudar a reforçar as funções específicas
do programa, as boas práticas de formatação de código e compreensão algorítmica.

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.

NOTA DidyoualreadybuythisbookasabundlefromNewark? IFSO, você está


bom para ir.
xxii Introdução

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
■■

reservar, mas não é explicitamente necessário.)

Um conjunto de chaves de fenda


■■

A pistola de cola quente


■■

SourceCodeandDigitalContent

O local do companheiro primário para este livro é www.exploringarduino.com, e isso


é mantida pelo autor. Você vai encontrar downloads de código para cada capítulo neste site
(juntamente com vídeos, links e outros materiais úteis). Wiley também principais-tém um repositório
de conteúdo digital que acompanha este livro na
www.wiley.com.
Especificamente para este livro, o download do código está na guia de transferência de código em
www.wiley.com/go/exploringarduino.
Você também pode procurar o livro www.wiley.compor ISBN (o ISBN para este
livro é 978-1-118-54936-0) para localizar o código.
No início de cada capítulo, você pode encontrar a localização do código principal
arquivos para o capítulo. Ao longo de cada capítulo, você também pode encontrar referências aos
nomes dos arquivos de código conforme necessário na listagem de títulos e texto.

O código disponíveis no www.exploringarduino.com e www.wiley.comé


fornecida em arquivos ZIP compactados. Depois de baixar o código, basta descompactá-lo com
uma ferramenta de compressão apropriada.

NOTA Becausemanybookshavesimilartitles, youmayfinditeasiesttosearch


byISBN; thisbook'sISBNis978-1-118-54936-0.
introdução XXIII

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.

Para encontrar a página errata para este livro,www.wiley.com/go/exploringarduino


ir para
e clique no link Errata. Nesta página você pode ver todos errata que foi enviada para este livro e
publicado pelos editores Wiley.

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:

Referência Oficial Arduino


■■

www.arduino.cc/en/Reference/HomePage

Minha série Tutorial Arduino


■■

www.jeremyblum.com/category/arduino-tutorials

Série Tutorial Arduino adafruit Industries '


■■

learn.adafruit.com/category/learn-arduino

Eletrônica Tutoriais de SparkFun


■■

learn.sparkfun.com/tutorials

O Fórum Oficial Arduino


■■

www.arduino.cc/forum

A Comunidade Arduino element14


■■

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.

O Arduino é uma plataforma de desenvolvimento microcontrolador emparelhado com um intuições


linguagem de programação tiva que você desenvolve usando o Arduino integrado
ambiente de desenvolvimento (IDE). Ao equipar o Arduino com sensores, actuadores
ToRs, luzes, alto-falantes, módulos adicionais (chamados escudos), E outro integrado
circuitos, você pode transformar o Arduino em um "cérebro" programável para praticamente
qualquer sistema de controle.

É impossível cobrir tudo que o Arduino é capaz, porque o


possibilidades são limitadas somente por sua imaginação. Assim, este livro serve como um guia para
você se familiarizar com a funcionalidade do Arduino através da execução de uma série de projectos
que lhe dará as habilidades que você precisa para desenvolver seus próprios projetos.

Você vai aprender mais sobre o Arduino e as variações disponíveis do conselho


no Capítulo 1, "Getting Up e piscando com o Arduino." Se você está ansioso para
Conhecemos todos os funcionamentos internos do Arduino, você está com sorte: É completamente
código aberto, e todos os esquemas e documentação estão disponíveis gratuitamente no site do
Arduino. Apêndice A, "Decifrando o ATmega folha de dados e Arduino esquema," abrange algumas das
especificações técnicas do Arduino.

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).

Certifique-se de respeitar as licenças de código-fonte e hardware que você usa


ao longo deste livro. Algumas licenças exigem que você fornecer atribuição para
o autor original quando você publicar um projeto baseado em seu trabalho anterior. Outros exigem que
você sempre compartilhar as melhorias feitas sob uma licença equivalente. Esta partilha ajuda a
comunidade crescer, e leva a toda a documentação on-line incrível e apoio que você vai, sem dúvida,
referem-se muitas vezes durante suas aventuras Arduino. Todos os exemplos de código que eu escrevi
para este livro (salvo indicação em contrário) são licenciados sob a GNU General Public License (GPL),
permitindo que você usá-los para o que quiser.

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

Capítulo 1: Obtendo-se e piscando com o ArduinoCapítulo 2: Entradas digitais,


saídas e Pulse-Width ModulationCapítulo 3: Leitura Sensores analógicos
Capítulo

Obtendo-se e piscando
com o Arduino

Peças que você vai precisar para este capítulo:

cabo Arduino
UnoUSB

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser
encontrada em www.exploringarduino.com/content/ch1 .

Além disso, todos os códigos podem ser encontradas em www.wiley.com/go/exploringarduino


na guia de transferência de código. O código está no download do capítulo 01 e indi-vidualmente
nomeado de acordo com os nomes de todo o capítulo.

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

NOTA TofollowalongwithavideothatintroducestheArduinoplatform, visita


www.jeremyblum.com/2011/01/02/arduino-tutorial-series-it-begins/.
YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

ExploringtheArduinoEcosystem

Em suas aventuras com o Arduino, você vai depender de três componentes principais para seus
projetos:

A placa Arduino em si
■■

hardware externo (incluindo ambos os escudos e circuitos feitos à mão, o que


■■

você vai explorar ao longo deste livro)

O ambiente de desenvolvimento integrado Arduino, ou Arduino IDE


■■

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
■■

Interface (s) USB de programação / comunicação


■■

regulador de tensão e conexões de energia


■■

/ O pins Breakout I
■■

Depuração, poder e LEDs RX / TX


■■

Botão de reset
■■

Em circuito programador de série (ICSP) Conector (s)


■■
Geral I / O
Botão de reset

Debug LED

conector USB

programação MCU
conector (ICSP)
Serial-to-USB circuitos

ATmega 328 MCU

entrada de 7-12VDC

Poder e pinos auxiliares Analógico-digital (ADC) entradas dos conversores

Figura 1-1: componentes Arduino Uno


Crédito: Arduino, www.arduino.cc
6 parte I ■ Arduino Engenharia Basics

Atmel microcontroladores

No coração de cada Arduino é uma unidade de microcontrolador Atmel (MCU). A maioria


placas Arduino, incluindo o Arduino Uno, usar um microcontrolador AVR ATmega.
O Arduino Uno na Figura 1-1 utiliza um 328p ATmega. O Due é uma exceção; ele usa um
microcontrolador ARM Cortex. Este microcontrolador é responsável pela

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

ou escudos em. Um ressonador cerâmico 16 MHz é ligado ao relógio do ATmega


pinos, que serve de referência pelo qual todos os comandos de programa executar. Você pode usar o
botão Reset para reiniciar a execução do seu programa. A maioria das placas Arduino vêm com uma
depuração LED já ligada ao pino 13, que permite que você execute o seu primeiro programa (piscar
um LED), sem ligar qualquer circuitos adicionais.

Interfaces de programação

Normalmente, os programas de microcontroladores ATmega são escritos em C ou Assembly e


programado através da interface ICSP usando um programador específico (ver

Figura 1-2). Talvez a característica mais importante de um Arduino é que


você pode programá-lo facilmente através de USB, sem o uso de um programador separado. Esta
funcionalidade é possível graças ao bootloader Arduino. O bootloader é carregado no ATmega na fábrica
(usando o cabeçalho ICSP), que permite uma USART série (Universal Synchronous / Asynchronous
Receiver / Transmitter) para carregar o seu programa no Arduino sem o uso de um programador
separado. (Você pode aprender mais sobre como funciona o gerenciador de inicialização "O Arduino
Bootloader e Firmware Setup" barra lateral.)

No caso de o Arduino Uno e mega 2560, um microcontrolador secundário


(Um 16U2 ATmega ou 8U2 dependendo da sua revisão) serve como uma interface
entre um cabo USB e os pinos USART seriais no microcontrolador principal. o
Arduino Leonardo, que usa um ATmega 32U4 como o microcontrolador principal, tem USB cozido na
direita, assim que um microcontrolador secundário não é necessário. Em placas Arduino mais velhos,
um chip USB-to-serial marca FTDI foi usado como a interface entre o porto USART série do ATmega e
uma conexão USB.
Capítulo 1 ■ Obtendo-se e piscando com o Arduino 7

Crédito: © 2013 Atmel Corporation.


Todos os direitos reservados.
Figura 1-2: programador AVR ISP MKII

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

seus projetos. Estas funções especiais incluem vários interfaces de comunicação,


interfaces seriais, saídas de pulso de largura modulada, e interrupções externas.

Suprimentos de energia

Para a maioria de seus projetos, você simplesmente usar o poder 5V que é


fornecida ao longo do seu cabo USB. No entanto, quando você estiver pronto para untether seu projeto a
partir de um computador, você tem outras opções de energia. O Arduino pode aceitar entre 6V e 20V (7-
12V recomendo) através do (DC) conector de corrente contínua barril jack, ou para a V

pino. O Arduino foi construído com 5V e 3.3V reguladores:


dentro

5V é usado para toda a lógica no tabuleiro. Em outras palavras, quando você alternar um pino
■■

de E / S digital, você está alternando-o entre 5V e 0V.

3.3V é dividida a um pino para acomodar escudos 3.3V e externa


■■

circuitos.
8 parte I ■ Arduino Engenharia Basics

O bootloader ARDUINO E CONFIGURAÇÃO DE FIRMWARE

UMAbootloaderisachunkofcodethatlivesinareservedspaceintheprogrammemoryoftheArduino'smainMCU.Ingeneral, AVRmicrocontro
whichtalkstothemicrocontrollerviaaserialperipheralinterface (SPI) .Programmingviathismethodisfairlystraight-forward,
butnecessitatestheuserhavingahardwareprogrammersuchasanSTK500oranAVRISPMKIIprogrammer (seeFigure1-2).

WhenyoufirstboottheArduinoboard, itentersthebootloader, whichrunsforafewseconds.Ifitreceivesaprogrammingcommandfromt

IDEovertheMCU'sUART (serialinterface) inthattimeperiod, itloadstheprogramthatyouaresendingitintotherestoftheMCU'sprogramme


itstartsrunningyourmostrecentlyuploadedsketch, whichresidesintherestoftheprogrammemory.

Whenyousendan "upload" commandfromtheArduinoIDE, itinstructstheUSB-se serialchip (anATMega16U2or8U2inthecaseoftheA

Uno) toresetthemainMCU, henceforcingitintothebootloader.Then, yourcomputerimmediatelybeginstosendtheprogramcontents,


whichtheMCUisreadytoreceiveoveritsUARTconnection (facilitatedbytheUSB-to-serialconverter).

BootloadersaregreatbecausetheyenablesimpleprogrammingviaUSB
withnoexternalhardware.However, theydohavetwodownsides:

■ Em primeiro lugar, theytakeupvaluableprogramspace.Ifyouhavewrittenacom-plicatedsketch, theapproximately2KBofspacet


loadermightbereallyvaluable.

■ Em segundo lugar, usingabootloadermeansthatyourprogramwillalwaysbedelayedbyafewsecondsatbootasthebootloaderche

Ifyouhaveaprogrammer (oranotherArduinothatcanbeprogrammedtoactasaprogrammer), youcanremovethebootloaderfromyour

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

O Leonardo (veja a Figura 1-4) usa o 32U4 como o microcontrolador principal,


que tem uma interface USB integrado. Portanto, ele não precisa de um MCU secundário para realizar a
conversão serial-to-USB. Isso reduz o custo e permite que você faça coisas únicas, como emular um
joystick ou um teclado em vez de um dispositivo serial simples. Você vai aprender como usar esses
recursos no Capítulo 6 ", USB e

Comunicação Serial ".

www.arduino.cc
Crédito: Arduino,

Figura 1-4: O Arduino Leonardo


10 parte I ■ Arduino Engenharia Basics

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

(Ao contrário da interface serial encontrado no Uno).

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,

Figura 1-6: O Arduino Devido


Capítulo 1 ■ Obtendo-se e piscando com o Arduino 11

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,

Figura 1-8: O Arduino mega ADK

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

Como explicado na introdução deste livro, o Arduino é hardware livre.


Como resultado, você pode encontrar dezenas e dezenas de dispositivos "Arduino compatíveis"
disponíveis para venda que vai funcionar muito bem com o Arduino IDE e todos os proj-ECTS que você
vai fazer neste livro. Alguns dos populares placas de terceiros incluem o

Seeduino, a bordo de fuga adafruit 32U4, eo SparkFun Pro Mini Arduino


Pranchas. Muitas placas de terceiros são projetados para aplicações muito específicas, com
funcionalidade adicional já construído dentro para o conselho. Por exemplo, o ArduPilot é uma placa de
piloto automático para uso em Quadrotor DIY autónomos (ver a Figura 1-10). Você pode até achar
circuitos Arduino compatível cozido para dispositivos de consumo

como a MakerBot Replicator e impressoras 3D Replicator 2.


Crédito: 3D Robotics, Inc.,
www.3drobotics.com

Figura 1-10: Quadrotor e ArduPilot controlador de mega


Capítulo 1 ■ Obtendo-se e piscando com o Arduino 13

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

Acesse o site do Arduino em www.arduino.cce baixar a mais nova ver-


sion do IDE na página de download (veja a Figura 1-11).

Figura 1-11: A página de download Arduino.cc

Após completar o download, descompactá-lo. Dentro, você encontrará o Arduino IDE.


Novas versões do Windows IDE estão disponíveis como um instalador que você pode
baixar e executar, em vez de baixar um arquivo ZIP.
14 parte I ■ Arduino Engenharia Basics

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

de seguir as instruções apresentadas em seguida.

Figura 1-12: Arduino Uno conectado a um computador via USB


Capítulo 1 ■ Obtendo-se e piscando com o Arduino 15

No computador Windows, siga estes passos para instalar os drivers (instruções


ções adaptado a partir do site Arduino.cc):

1. Aguarde até que o processo de instalação automática falhar.

2. Abra o menu Iniciar, clique com botão direito em Meu computador e selecione Propriedades.

3. Escolha o Gerenciador de Dispositivos.

4. Procure em Portas (COM e LPT) para o Arduino que você conectado.

5. Botão direito do mouse e escolha Atualizar driver.

6. Escolha para procurar no computador para o software.

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).

8. O Windows vai agora terminar a instalação do driver.

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.

DICA Ifyouhavemultipleserialdevicesattachedtoyourcomputer, tryunplugging


yourboardtoseewhichCOMportdisappearsfromthemenu; thenplugitbackinandselectthatCOMport.

Em computadores Linux e Mac, a porta serial é algo como / Dev / tty

.usbmodem *ou /dev/tty.usbserial* , Onde *é uma cadeia de alfanumérico


personagens.
16 parte I ■ Arduino Engenharia Basics

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.

Aqui está como o código funciona, peça por peça:

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).

2. Este é um comentário de linha única. Quando você coloca


//em qualquer linha, o compilador
ignora todo o texto que após símbolo na mesma linha. Isso é ótimo para linhas específicas-
Tating anno de código ou de "comentando" uma determinada linha de código que você acredita
que pode estar causando problemas.

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

variável inteira chamada conduziuestá a ser ajustada para o valor


13, de
O pino que o
LED está ligado a no Arduino Uno. Durante o resto do pró-grama, que pode simplesmente usar
conduziusempre que queremos controlar pin 13. Ambiente
variáveis é útil porque você pode simplesmente mudar esta linha se você ligar o seu LED a um
O pino diferente I / mais tarde; o resto do código ainda funcionará como esperado.

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

Figura 1-13: Os componentes do programa Blink

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

6. A segunda função necessária em todos os programas Arduino é void loop () .


O conteúdo da função loop repetição sempre, enquanto o Arduino está ligado. Se você quiser
que o seu Arduino para fazer alguma coisa uma vez na inicialização somente, você ainda
precisa incluir a função loop, mas você pode deixá-lo vazio.

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.

8. O demora()função aceita um argumento: um tempo de atraso em milissegundos. ao


chamardemora(), O Arduino deixa de fazer qualquer coisa para a quantidade de tempo especificado.
Neste caso, você está atrasando o programa para 1000 ms,

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

Neste capítulo, você aprendeu sobre o seguinte:

Todos os componentes que compõem uma placa Arduino


■■

Como o bootloader Arduino permite programar Arduino firmware através de uma conexão
■■

USB

As diferenças entre as várias placas Arduino disponíveis


■■

Como se conectar e instalar o Arduino com o seu sistema


■■

Como carregar e executar o seu primeiro programa


■■
Capítulo

Entradas, saídas digitais e


Pulse-Width Modulation

Peças que você vai precisar para este capítulo:

Arduino UnoSmall breadboardJumper


wires1 10kohms resistor3 220Ω
resistorsUSB cablePushbutton5mm LED de
cor única LED5mm common-cátodo RGB

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch2 .

Além disso, todos os códigos podem ser encontradas em


www.wiley.com/go/exploringarduino
na guia de transferência de código. O código está no download do capítulo 02 e indi-vidualmente
nomeado de acordo com os nomes de todo o capítulo.

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:

Definindo pinos como saídas


■■

Fiação até componentes externos


■■

Novos conceitos de programação, incluindo


■■ paraloops e constantes

Digital versus saídas e modulação por largura de pulso analógico (PWM)


■■

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.

Trabalhando com Breadboards

É 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

linhas que representam furos conectados.

barramento de terra
área de prototipagem
barramento de energia

barramento de terra
barramento de energia

Figura 2-1: ligações eléctricas Breadboard


22 parte I ■ Arduino Engenharia Basics

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.

Figura 2-2: Arduino Uno ligado a um LED


Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 23

A LEI DE OHM ea equação PODER

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,

■ Resistência, Inthisanalogy, isrepresentativeofhoweasyitisforcur-renttoflow.Whenthewater (thecurrent) isflowingthro


lesscanpassthroughinthesameamountoftimeasthroughalargerpipe.Thenarrowpipeisequivalenttoahighresistancevalueb
ough.Thewiderpipeisequivalenttoalowresistancevalue (likeawire) becausecur-

rentcanflowfreelythroughit.

Ohm'slawisdefinedasfollows:

V = IR

WhereVisVoltagedifferenceinvolts, IisCurrentinamps, andRistheResistanceinohms.

Inacircuit, allvoltagegetsusedup, andeachcomponentoffersupsome


resistancethatlowersthevoltage.Knowingthis,
theaboveequationcomesinhandyforthingslikefiguringoutwhatresistorvaluetomatchupwithanLED.LEDshaveapredefinedvolta
urrentvalue.ThelargerthecurrentthroughtheLED, thebrightertheLEDglows, uptoalimit.ForthemostcommonLEDs, themaximu
liampis1 / 1000ofanampandistypicallyabbreviatedasmA) .ThevoltagedropacrossanLEDisdefinedinitsdatasheet.Acommonva

ConsidertheLEDcircuitshowninFigure2-3.
Imagem criada com o Águia.

Figura 2-3: circuito simples LED


Continuou
24 parte I ■ Arduino Engenharia Basics

contínuo

YoucanuseOhm'slawtodecideonaresistorvalueforthiscircuit.AssumethatthisisastandardLEDwith20mAforwardcurrentanda2V

dropacrossit.Becausethesourcevoltageis5Vanditendsatground, atotalof5Vmustdropacrossthiscircuit.SincetheLEDhasa2Vdrop,
theother3Vmustdropacrosstheresistor.Knowingthatyouwantapproxi-mately20mAtoflowthroughthesecomponents, youcanfindtheres

R = V / IWhereV = 3VandI = 20mA.SolvingforR, R = 3V / 0.02A = 150Ω.So, witharesistorvalueof150Ω,

20mAflowsthroughboththeresistorandLED.Asyouincreasetheresis-tancevalue, lesscurrentisallowedtoflowthrough.220Ωisabitmoreth
butstillallowstheLEDtoglowsufficientlybright, andisaverycom-monlyavailableresistorvalue.

Anotherusefulequationtokeepinmindisthepowerequation.Thepowerequationtellsyouhowmuchpower, inwatts, isdissipatedacross

resistivecomponent.Becauseincreasedpowerisassociatedwithincreasedheatdissipation,
componentsgenerallyhaveamaximumpowerrating.Youwanttoensurethatyoudonotexceedthemaximumpowerratingforresis-
torsbecauseotherwisetheymightoverheat.Acommonpowerratingforresistorsis1 / 8ofawatt (abbreviatedasW, milliwattsasmW) .Thep

P = IV

WherePispowerinwatts, andIandVarestilldefinedasthecurrentandvoltage.Fortheresistordefinedearlierwithavoltagedropof3Vandac

20 mA, P = 3Vn0.02A = 60mW, wellundertheresistor'sratingof1 / 8W, or125mW.So, youdonothavetoworryabouttheresistoroverhea

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

configuração()e a loop ().


Como você aprendeu no Capítulo 1, o configuração()função é executada uma vez no início
do programa, e o loop ()função é executada uma e outra vez. Porque você geralmente vai dedicar cada
pino para servir tanto como uma entrada ou uma saída, é
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 25

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.

Listagem 2-1: Ligando um-led.ino LED

const int LED = 9; // Define LED para a configuração do pin


9void ()

{
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 ()

comando para o loop e adicionando alguns atrasos.


Experimentar com os valores de atraso e criar diferentes taxas piscam.

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

Listagem 2-2: LED com mudança Blink Rate-blink.ino

const int LED = 9; // Define LED para configuração 9void


Pin ()

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

}
}

Compilar o código anterior e carregá-lo em seu Arduino. O que acontece?


Tome um momento para quebrar a paraloop para entender como ele funciona. o
paradeclaração de loop sempre contém três entradas separadas por ponto e vírgula:

■■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:

1.Eué igual a 100.

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.

5. 200é inferior ou igual a 1000, De modo que o ciclo repete novamente.

6. O LED está situado no alto, e permanece elevado para 200ms, o valor atual de Eu.

7. O LED é baixo, e permanece baixa para 200ms, o valor atual de Eu.


Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 27

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ê

pode diminuir a tensão a ser lançadas através do resistor, o LED deve


brilham mais vagamente, porque menos corrente fluirá. Isso é o que você vai tentar realizar
usando PWM viaanalogWrite ()comando. oanalogWrite ()

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).

Listagem 2-3: LED desvanece-se Sketch-fade.ino

const int LED = 9; // Define LED para configuração


9void Pin ()

{
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.

Imagem criada com o MATLAB.

Figura 2-4: sinais PWM com ciclos variados

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

o analogWrite ()comando define o ciclo de uma onda quadrada, dependendo


no valor que você passar para ele:

Escrevendo um valor de 0 com analogWrite ()indica uma onda quadrada com uma
■■

ciclo de trabalho de 0 por cento (sempre baixa).

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
■■

(Alta metade do tempo, de baixo metade do tempo).

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.

Antes de escrever o código para ler a partir do botão, é importante


compreender a importância do resistor suspenso usado com este circuito. Quase
30 parte I ■ Arduino Engenharia Basics

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.

Agora, a corrente tem duas opções:

Ele pode fluir através de um caminho quase zero, resistência ao carril de 5V.
■■

Ele pode fluir através de um caminho de alta resistência à barra de terra.


■■
Imagem criada com o Fritzing.

Figura 2-5: Fiação um Arduino para um botão e um LED


Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 31

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.

NOTA Thisexampleusesapulldownresistor, butyoucouldalsouseapullup


resistorbyconnectingtheresistorto5Vinsteadofgroundandbyconnectingtheothersideofthebuttontoground.Inthissetup, theinputp
logicvaluewhenthebuttonisunpressedandalow logicvaluewhenthebuttonisbeingpressed.

Suspenso e pullup resistências são importantes porque garantem que o


botão não criar um curto-circuito entre 5V e chão quando pressionado e que o pino de entrada nunca
é deixado em um estado flutuante.

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).

Listagem 2-4: Controle LED simples com um botão-led_button.ino

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

Note aqui que o código implementa alguns novos conceitos, incluindo


digitalReade E se/outrodeclarações. Um novoconst intdeclaração foi
acrescentado para o pino do botão. Além disso, este código define o pino do botão como entrada
no configuraçãofunção. Este não é explicitamente necessário, no entanto, porque os pinos
são entradas por padrão; ele é mostrado para ser completo. digitalRead () lê o
32 parte I ■ Arduino Engenharia Basics

valor de uma entrada. Neste caso, é a leitura do valor da BOTÃOpino. Se o


botão estiver sendo pressionado,
digitalRead () retorna um valor de ALTOou 1. Se não estiver
sendo pressionado, ele retorna BAIXOou 0. Quando colocado naE se()declaração, você está verificando o
estado do pino e avaliar se ele corresponde a condição de que você declarou. NissoE se()declaração,
você está verificando para ver se o valor retornado pelo

digitalRead () é BAIXO. o==é um operador de comparação que testa se o


primeiro item (digitalRead ()) É igual à segunda ( BAIXO). Se isso for verdadeiro (isto é, o
botão não está sendo pressionado), o código dentro dos parênteses executa, eo LED definido para BAIXO.
Se este não é verdadeira (o botão estiver premido), o
outrodeclaração é
executado, e o LED é ligado ALTO.
É isso aí! Programar o circuito com este código e confirmar que ele funciona como
esperado.

Workingwith "saltitantes" Botões

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

osciloscópio (embora este valor foi gerado usando um script de MATLAB):

Imagem criada com o MATLAB.

Figura 2-6: Saltando efeitos de botão.

O botão é pressionado fisicamente na marca de 25ms. Você esperaria que o


estado do botão ao ser imediatamente lido como um nível lógico alto como o gráfico do lado esquerdo
Capítulo 2 ■ Entradas digitais, saídas e Pulse-Width Modulation 33

mostra. No entanto, o botão realmente salta para cima e para baixo antes de se estabelecer, como o
gráfico à direita mostra.

Se você sabe que a chave vai fazer isso, é relativamente simples


para lidar com isso no software. Em seguida, você escrever software-switch debouncing que procura uma
mudança de estado de botão, aguarda a saltar ao fim, e, em seguida, lê o estado interruptor novamente.
Esta lógica do programa pode ser expressa como se segue:

1. Loja um estado botão anterior e um estado atual do botão (inicializado


para BAIXO).

2. Leia o estado atual do botão.

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.

6. Defina o estado do botão anterior para o estado atual do botão.

7. Volte para o passo 2.

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 ()

é uma função que aceita um pino e um estado, e escreve


esse estado ao pino de dado. Para simplificar o seu programa, você pode definir suas próprias funções
para encapsular as ações que você faz uma e outra vez.

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).

Listagem 2-5: Botão filtrada por Alternando-debounce.ino

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

boolean Ledon = false; // O atual estado do LED (on / off)

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

voltar corrente; // Retorna o valor atual


}

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

digitalWrite (LED, Ledon); // Alterar o estado de LED

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

Considere a definição da função no código anterior: boolean debounce (boolean

ú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

currentButtonvariável que foi definida na parte superior do


esboço. Uma vez que a função foi definida como debounce, Você pode chamar a função
por escrito currentButton = estabilização (lastButton) de dentro do configuraçãoou
laçofunções. currentButtonserá definido igual ao valor que é devolvido pelo
a debouncefunção.
Depois de chamar a função e preenchido o currentButtonvariável,
você pode facilmente compará-lo com o estado do botão anterior, utilizandoEosedeclaração
no código. o&&é um operador lógico que significa "E". Juntando-se dois ou
mais declarações de igualdade com um &&numa E sedeclaração, você está indicando
que o conteúdo do E sebloco de instrução deve ser executado somente se ambos do
igualdades avaliar a verdade. Se o botão foi anteriormente BAIXO, E é agora ALTO,
você pode assumir que o botão foi pressionado, e você pode inverter o valor
do Ledonvariável. Ao pôr!na frente do Ledonvariável, você redefinir a variável para o oposto do que é
atualmente. O ciclo é finalizado por atualizar a variável botão anterior e escrever o estado LED
atualizado.

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

como mostrado no diagrama de fiação na Figura 2-7.

Imagem criada com o Fritzing.

Limitador de corrente LED RGB Botão Puxar para baixo


resistores resistência

Figura 2-7: diagrama de fiação Nightlight

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

loop ()a partir do exemplo anterior é que


em vez de lançar um único estado LED, um contador de estado LED é incrementado cada vez que o
botão é pressionado, e é reposto a zero quando você percorrer todas as opções. Carregar este para o seu
Arduino conectado ao circuito que você acabou de construir e aproveitar a sua luz noturna. Modificar os
estados de cor, alterando os valores deanalogWrite ()para fazer suas próprias opções de cores.

Listagem 2-6: Alternando LED Nightlight-rgb_nightlight.ino

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

boolean lastButton = LOW; // Último botão Stateboolean


currentButton = LOW; // Botão atual Stateint ledMode = 0; // Ciclo
entre estados do LED

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

// OFF (mode = 0) else

{
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

Neste capítulo, você aprendeu sobre o seguinte:

■■Como a placa de ensaio funciona

■■Como escolher um resistor a corrente limite de um LED

■■Como fio um LED para o seu Arduino externa

■■Como usar PWM para escrever valores "analógicos" para LEDs

■■Como ler um botão

■■Como Debounce um botão

■■Como usar paralacetes

■■Como utilizar pullup e resistências suspensos


Capítulo

Leitura Sensores analógicos

Peças que você vai precisar para este capítulo

Arduino UnoSmall breadboardJumper wires10kΩ potentiometer10kΩ resistor


(n2) resistor 220Ω (n3) sensor de temperatura cablePhotoresistorTMP36 USB
(ou qualquer outro sensor analógico 5V) 5mm common-catodo LED RGB

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch3 .

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 03 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.

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.

Neste capítulo, você vai aprender sobre as diferenças entre analógico e


sinais digitais e como converter entre os dois, assim como um punhado de os sensores analógicos que
você pode interagir com o Arduino. Usando as habilidades que adquiriu no capítulo anterior, você irá
adicionar sensores de luz para ajustar automaticamente a sua luz noturna. Você também vai aprender
como enviar dados analógicos do seu Arduino ao computador através de uma conexão USB para serial,
o que abre enormes possibilidades para o desenvolvimento de sistemas mais complexos que podem
transmitir dados ambientais para o seu computador.

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.

O mundo ao seu redor, no entanto, raramente expressa informações em apenas dois


maneiras. Tome um olhar para fora da janela. O que você vê? Se é de dia, você prov-habilmente ver luz
solar, árvores que balançavam ao vento, e talvez carros que passavam ou pessoas caminhando ao redor.
Todas essas coisas que você percebe não podem ser facilmente classificados como dados binários. A luz
solar não está ligado ou desligado; seu brilho varia ao longo de um dia. Da mesma forma, o vento não tem
apenas dois estados; rajadas que em velocidades diferentes todo o tempo.
Capítulo 3 ■ Leitura Sensores analógicos 43

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

número de valores entre estas duas tensões.

Imagem criada com o MATLAB.


Figura 3-1: Sinais analógicos e digitais

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.

A precisão de um ADC é determinada pela resolução. No caso de o


Arduino Uno, não há um ADC de 10 bits para fazer as suas conversões analógicas. "10-bit" significa que
o ADC pode subdividir (ou quantizar) um sinal analógico em dois 10
dife-
valores rentes. Se você fizer as contas, você vai descobrir 10
que
= 1,024;
2 Assim, o Arduino
pode atribuir um valor de 0 a 1023 para qualquer valor analógico que você dá a ele. Apesar
é possível alterar a tensão de referência, você estará usando o padrão 5V
referência para o trabalho analógico que você faz neste livro. A tensão de referência determina a tensão
máxima que você está esperando, e, portanto, o valor que será mapeado para 1023. Assim, com uma
tensão de referência de 5V, colocando 0V em um pino ADC retorna um valor de 0, 2.5V retorna um valor
de 512 (metade do 1023) e 5V retorna um valor de 1023. Para entender melhor o que está acontecendo
aqui, considere

que um de 3 bits ADC faria, como mostrado na Figura 3-2.

Imagem criada com o MATLAB.

Figura 3-2: quantização analógico de 3 bits


Capítulo 3 ■ Leitura Sensores analógicos 45

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

Imagem criada com o Fritzing.

Figura 3-3: circuito potenciómetro

Antes de usar o potenciômetro para controlar outra peça de hardware, use o


funcionalidade de comunicação serial do Arduino para imprimir valor ADC do potenciômetro no seu
computador como ela muda. Use o
analogRead ()função
para ler o valor do pino analógico ligado ao Arduino eo Serial
.println () funcionam para imprimi-la no monitor serial Arduino IDE. Comece por ESCRITO
ing e carregar o programa na Listagem 3-1 no seu Arduino.
Capítulo 3 ■ Leitura Sensores analógicos 47

Figura 3-4: medição multímetro

Listagem 3-1: Potenciômetro de Reading Sketch-pot.ino

// Programa de Leitura de potenciômetros

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.

Em cada iteração através do loop, o valvariável é definida como o valor presente


que os relatórios ADC de pino analógico 0. O analogRead ()comando requer
o número do pino ADC a ser passado para ela. Neste caso, é 0, porque isso é
o que você enganchou o potenciômetro até. Você também pode passar A0, embora a
analogRead ()Função sabe você deve estar passando um número de pinos analógico, então
você pode passar 0como abreviação. Depois de o valor foi lido (um número entre
0e 1023), Serial.println () impressões que valor ao longo de série para o computador de
terminal série, seguido por uma "nova linha" que avança o cursor para a próxima linha. O loop, em
seguida, atrasos por meio segundo (de modo que os números não rolar mais rápido do que você pode lê-
los), eo processo se repete.

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.

Figura 3-5: botão de série do monitor


Capítulo 3 ■ Leitura Sensores analógicos 49

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.

Figura 3-6: serial de dados de entrada

NOTA Ifyou'regettingfunkycharacters, makesurethatyouhavethebaudrate


setcorrectly.Becauseyousetitto9600inthecode, youneedtosetitto9600inthiswindowaswell.

Você já conseguiu transformar com sucesso um mostrador e fazer alguns números


alterar; muito emocionante, não é? Não? Bem, esta é a apenas o primeiro passo. Em seguida, você
aprender sobre outros tipos de sensores analógicos e como você pode usar os dados de

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)
■■

Magnetômetros que detectam campos magnéticos (para fazer bússolas digitais)


■■

sensores infravermelhos que detectam a distância a um objeto


■■

Os sensores de temperatura que podem lhe dizer sobre o ambiente operacional do seu projeto
■■

Muitos destes sensores são concebidos para operar de um modo semelhante ao


potenciômetro você só experimentou com: você fornecê-los com uma potência (VCC)
e de terra (GND) de conexão, e eles uma tensão analógica de saída entre VCC
e GND no terceiro pino que você ligar para o ADC do seu Arduino.
Para esta próxima experiência, você começa a escolher que tipo de sensor analógico você
deseja usar. Eles toda a saída de um valor entre 0V e 5V quando conectado a um Arduino, por isso
todos eles vão trabalhar o mesmo para seus propósitos. Aqui estão alguns exemplos de sensores
que podem ser usados:

Afiada Infrared Sensor de proximidade


■■

www.exploringarduino.com/parts/IR-Distance-Sensor

Conector: www.exploringarduino.com/parts/JST-WireOs sensores de distância infravermelhos afiadas são


populares para medir a dis-tância entre seu projeto e outros objetos. Como você se move mais
longe do objeto que você está visando, a saída de tensão diminui. Figura 5 na folha de dados da
página da web parte ligada acima mostra a relação entre tensão e distância medida.

TMP36 sensor de temperatura


■■

www.exploringarduino.com/parts/TMP36

O sensor de temperatura TMP36 correlaciona facilmente leituras de temperatura em graus


Celsius, com níveis de tensão de saída. Uma vez que cada 10 mV corresponde a 1$C, você pode
facilmente criar uma correlação linear para converter a partir da tensão a medir volta para a
temperatura absoluta da Environ-ment ambiente: $C = [(Vout em mV) - 500] / 10. O
deslocamento de -500 é para lidar com temperaturas abaixo de 0$C. O gráfico da Figura 3-7
(extraído da folha de dados) mostra esta conversão.
Capítulo 3 ■ Leitura Sensores analógicos 51

.
www.analog.com
Crédito: Analog Devices, Inc.,
Figura 3-7: Tensão para Correlação de temperatura

Triplo Analog Acelerômetro Axis


■■

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

Movimento: X, Y, e Z (em cada um pino diferente). Usando um pouco de matemática inteligente


(Trigonometria e conhecimento da gravidade), você pode usar esses valores de tensão
para determinar a posição do seu projecto no espaço 3D! É importante ressaltar que muitos
desses sensores são 3.3V, assim que você vai precisar usar o
analogReference ()
comando emparelhado com o pino AREF para definir uma referência de tensão 3,3V a
permitir-lhe obter a resolução completa fora do sensor.

Dual analógico giroscópio Axis


■■

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

Trabalhando com Sensores analógicos para detectar a temperatura

Este exemplo simples utiliza o sensor de temperatura mencionada na TMP36


seção anterior. No entanto, sinta-se livre para usar qualquer sensor analógico, você pode chegar em
suas mãos. Experimentar com um dos exemplos listados anteriormente, ou encontrar o seu próprio.
(Deve ser 5V compatível se você estiver usando o Arduino Uno.) Os passos seguintes são basicamente
os mesmos para qualquer sensor analógico, você pode querer usar.

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.

Imagem criada com o Fritzing.

Figura 3-8: circuito sensor de temperatura


Capítulo 3 ■ Leitura Sensores analógicos 53

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):

Temperatura($C) n 10 = tensão (MT) - 500

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

E sedeclarações, o digitalWrite função, eo analogReadfunção que


você já aprendeu sobre, você pode facilmente ler a temperatura, determine o que variam ela cai, e
definir o LED em conformidade.

NOTA BeforeyoucopythecodeinListing3-2, trytowritethisyourselfandsee


whetheryoucanmakeitwork.Aftergivingitashot, compareitwiththecodehere.Howdidyoudo?

Listagem 3-2: Temperatura Alerta Sketch-tempalert.ino

! // Temperatura Alerta const int BLED = 9; LED // azul no pino


9const int GLED = 10; LED // verde no pino 10const int RLED = 11;
LED // Red no pino 11const int TEMP = 0; // Sensor Temp é no pino
A0

const int LOWER_BOUND = 139; // Lower Thresholdconst int


UPPER_BOUND = 147; // Limite superior

int val = 0; // Variável para manter a leitura analógica

void setup ()
{
pinMode (Bled, OUTPUT); LED // Set Azul como OutputpinMode (GLED,
OUTPUT); LED // Set Verde como saída
54 parte I ■ Arduino Engenharia Basics

pinMode (RLED, OUTPUT); LED // Set Vermelho como saída


}

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.

Figura 3-9: circuito divisor de tensão simples

A equação para um divisor de tensão é a seguinte:

Vout = Vin (R2 / (R1 + R2))

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:

Vout = 5V (10k / (10k + 10k)) = 5V n 0,5 = 2.5V


56 parte I ■ Arduino Engenharia Basics

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,

Figura 3-10: photoresistor

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

Lembre-se que você pode usar analogWrite


o ()comando para definir o brilho de uma
CONDUZIU. No entanto, é um valor de 8 bits; isto é, aceita valores entre 0 e apenas 255, enquanto que
o ADC é devolver valores tão elevados quanto 1023. Convenientemente, a linguagem de programação
Arduino tem duas funções que são úteis para o mapeamento entre os dois grupos de valores: a

mapa()e restringir ()funções. omapa()


função parecida com esta:
output = mapa (valor, fromLow, fromHigh, toLow, toHigh)
Capítulo 3 ■ Leitura Sensores analógicos 57

Imagem criada com o Fritzing.

Figura 3-11: circuito photoresistor

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

Convenientemente, o mapafunção pode lidar com isso automaticamente; simplesmente trocar


os valores altos e baixos de forma que o valor baixo é 255eo elevado valor é 0.
o mapa()função cria um mapeamento linear. Por exemplo, se o seu fromLowe
fromHighOs valores são 200e 900, Respectivamente, e sua muito baixoe toHighvalores
estamos 255e 0, Respectivamente, 550mapas para 127Porque 550é a meio caminho entre
200e 900e 127é a meio caminho entre 255e 0. É importante notar, no entanto, omapa()função não
restringe esses valores. Assim, se o fotoresistor faz
medir um valor inferior 200, Que é mapeado para um valor acima de 255(porque você é
invertendo o mapeamento). Obviamente, você não quer isso, porque você não pode passar um valor
maior que255ao analogWrite ()função. Você pode lidar com isso usando orestringir ()função. orestringir
()função parecida com esta:

output = constranger (valor, min, max)

Se você passar a saída do mapafunção dentro do constrangerfunção,


você pode definir o minpara 0e a maxpara 255, Garantindo que todos os números acima ou abaixo
desses valores são limitados a qualquer
0ou 255. Finalmente, você pode usar
esses valores para comandar o seu LED! Agora, dê uma olhada no que esse esboço final será
semelhante (ver Listagem 3-3).

Listagem 3-3: Automatic Nightlight Sketch-nightlight.ino

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

Neste capítulo, você aprendeu sobre o seguinte:

As diferenças entre sinais analógicos e digitais


■■

Como converter sinais analógicos em sinais digitais


■■

Como ler um sinal analógico de um potenciômetro


■■

Como exibir dados usando o monitor serial


■■

Como a interface com os sensores analógicos embalados


■■

Como criar seus próprios sensores analógicos


■■

Como mapear e restringir leituras analógicas de conduzir saídas analógicas


■■
par t

II
Controlar o Seu Ambiente

InThisPart

Capítulo 4: Usando transistores e condução MotorsCapítulo 5:


fazendo SoundsCapítulo 6: USB e Comunicação SerialCapítulo
7: registos de deslocamento
Capítulo

Usando transistores e
Motores de condução

Peças que você vai precisar para este capítulo:

Arduino UnoUSB cable9V battery9V


bateria clip5V L4940V5 linear
regulator22uF capacitor eletrolítico

.1uf Capacitor1uF LEDs capacitorBlue cerâmica eletrolíticos (n4)


resistências de 1k (n4) sensor de distância PN2222 NPN BJT
transistorJumper wiresSharp GP2Y0A41SK0F IR com cableHot cola
ou servo motor tapeStandard

63
64 parte II ■ Controlar o Seu Ambiente

DC
motorBreadboardPotentiome
terSN754410 H-Bridge IC

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada
em www.exploringarduino.com/content/ch4 .

Os downloads de código wiley.com deste capítulo foram encontrados emwww.wiley.com/


go / exploringarduinona guia de transferência de código. O código está no capítulo 04
baixar e individualmente nomeados de acordo com os nomes de todo o capítulo.

Você agora é um mestre da observando informações do mundo ao seu redor.


Mas como você pode ao controleque mundo? Piscando LEDs e ajustar automaticamente-ing nightlights
são um bom começo, mas você pode fazer muito mais. usando assorted

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!

NOTA Ifyouwanttolearnallaboutmotorsandtransistors, checkoutthisvideo:


transistores www.jeremyblum.com/2011/01/31/arduino-tutorial-5-motors-and-~~number=plural
/.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

ATENÇÃO Inthischapter, youusea9Vbatterysothatyoucanpowermotors


thatrequiremorepowerthanwhattheArduinocanprovide.Thesevoltagesarestillnothighenoughtoposeadangertoyou, butifhookedupimpro
thesebatteriescandamageyourelectronics.Asyoumakeyourwaythroughtheexer-cisesinthischapter, followthediagramsandinstructionsca
(connectingpowerdirectlytoground), andwhileyou'llbesharingthegroundlinebetweenpowersupplies, don'ttrytoconnecttwoseparatevolt
don'ttrytohookboththe9VsupplyandtheArduino's5Vsupplyintothesamesupplyrowonthebreadboard.
Capítulo 4 ■ Usando transistores e condução Motors 65

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.

Certifique-se de compreender todos esses conceitos antes de começar a fiação.


66 parte II ■ Controlar o Seu Ambiente

Imagem criada com o Águia.


Figura 4-1: esquemática de controle de motor DC

Antes de ligar o seu motor de corrente contínua, é importante compreender o que todos
esses componentes estão fazendo:

Q1 é um NPN bipolar-junction transistor (BJT) usado para ligar o


■■

9V separada para o motor. Existem dois tipos de BJTs, NPN e


PNP, que se referem às diferentes semicondutores técnicas de "doping"
utilizado para criar o transistor. Este livro vai se concentrar em usar BJTs NPN. Você pode
simplista pensar em um transistor NPN como um interruptor controlado por tensão que
permite inibir ou permitir que o fluxo de corrente.

Um resistor 1k é usado para separar o pino base do transistor do pino do Arduino controlo.
■■

U1 é o motor DC.
■■

C1 é para filtragem de ruído causado pelo motor.


■■

D1 é um diodo usado para proteger a fonte de alimentação de voltagem inversa


■■

causado pelo motor actua como um indutor.

Uso de transistores como interruptores

Transistores podem fazer um número excepcional de tarefas, de fazer amplificadores


tornando-se o CPU dentro do seu computador e smartphone. Você pode usar um único
Capítulo 4 ■ Usando transistores e condução Motors 67

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

A corrente passa através do colector e para fora do emissor. através da modulação


o pino de base, é possível controlar se atual é permitida a fluir. Quando uma voltagem suf-cientemente
alta for aplicada para a base, a corrente é deixada fluir através

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.

Usando diodos de proteção

É 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

o motor, a energia é dissipada sob a forma de um pico de tensão invertida,


o que poderia revelar-se prejudicial à fonte de alimentação. É aí que diodos de proteção
entrar. Ao colocar o diodo em todo o motor, você garante que a corrente
gerado pelo motor flui através do díodo e que a tensão inversa não pode exceder a tensão directa do
diodo (diodos porque permitem que a corrente flua em apenas um sentido). Isso também vai absorver
toda a corrente gerada pela força lhe girar o motor.
68 parte II ■ Controlar o Seu Ambiente

Usando um secundário fonte de alimentação

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.

É importante ficar bom em leitura de esquemas elétricos sem ter que


olhar para um layout gráfico. Queria fio-lo corretamente? Lembre-se de verificar se há o seguinte como
você ligar o circuito:

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

para os mesmos pinos. Se eles não são, ajustar a sua fiação.


Capítulo 4 ■ Usando transistores e condução Motors 69

Capacitor

Transistor
Bateria

Imagem criada com o Fritzing.


motor DC Diodo

Figura 4-3: A fiação do motor DC

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

capacitor para este exercício, de modo que a polaridade não importa.

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.

Listagem 4-1: Automático de Velocidade Control-motor.ino

// Programa Motor Speed Control Simples

int MOTOR const = 9; // Motor on Digital Pin 9

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

Imagem criada com o Fritzing.


motor DC DiodePotentiometer

Figura 4-4: Adicionando um potenciômetro

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

milhares de vezes a cada segundo! Portanto, você pode simplesmente verificar o


velocidade potenciômetro de cada vez através do laço e ajustar a velocidade do motor depois de cada
cheque. Ele verifica muitas vezes o suficiente para que a velocidade do motor ajusta em tempo real

com o potenciômetro. O código na Listagem 4-2 faz o truque. Crie um novo


esboço (ou atualizar seu esboço anterior para corresponder a esse código) e enviá-lo para o seu Arduino a
partir do ambiente de desenvolvimento integrado (IDE).

Listagem 4-2: Velocidade ajustável Control-motor_pot.ino

// Controle de velocidade do motor com um potenciômetro

int MOTOR const = 9; // Motor on Digital Pin 9


72 parte II ■ Controlar o Seu Ambiente

const int POT = 0; // POT na Analog Pin 0

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

pode ser melhor explicada com um diagrama (veja a Figura 4-5).

Figura 4-5: operação de ponte-H


Capítulo 4 ■ Usando transistores e condução Motors 73

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

interruptores opostas são invertidas, corrente, em seguida, atravessa o motor no


sentido oposto, fazendo com que ele gire na direcção oposta. Se o H-ponte é colocada no estado de
travagem, todo o movimento residual causada por impulso é cessaram, e o motor pára.

Criação de circuitos curtos com pontes H

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.

Construir um circuito de ponte H

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

Imagem usada com permissão cortesia de


Instrumentos Texas.
Figura 4-6: H-ponte pin-out e mesa de lógica

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.

Vamos percorrer os pinos e como você vai usá-los:

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,
■■

então eles estão ligados à I / O pinos no Arduino para alternar.

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.

3Y e 4Y (pinos 11 e 14): Estas são as saídas do driver correto.


■■

Porque você está usando apenas o motorista esquerda, você pode deixá-los desligados.

3A e 4A (pinos 10 e 15): Os estados dos interruptores à direita são


■■

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

Potenciômetro Imagem criada com o Fritzing.

motor DC

Figura 4-7: esquema de ligações H-ponte

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

A operação de um circuito de ponte H

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:

// Motor vai para a frente em uma determinada taxa (0-255)


para a frente void (taxa int)

{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);

// Motor vai para trás em uma determinada taxa (0-255) vazio


reverso (taxa int)

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

Note-se que no início de cada função da PT pin é sempre definido baixo, e


então o MC1 e MC2(pinos de controle do motor) são ajustados. Quando isso é feito, o fluxo de corrente
pode ser reativado. Para variar a velocidade, é só usar a mesma técnica que você fez antes. Usando
PWM, você pode mudar o dever com o qual

a PTpin é alternado, controlando assim a velocidade. otaxa variável deve ser


entre 0 e 255. O circuito principal se encarrega de fazer a direita taxa a partir dos dados de entrada do
potenciômetro.

Em seguida, considerar o loop principal do programa:

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

No circuito principal, o valor de potenciômetro é lido, ea função apropriada


ção pode ser chamada com base no valor do potenciómetro. Lembre-se que as entradas analógicas
78 parte II ■ Controlar o Seu Ambiente

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.

Figura 4-8: plano de controle do motor.

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.

Listagem 4-3: H-Ponte Potenciómetro Motor Control-hbridge.ino

// Hbridge Motor Controlconst int PT = 9; // Meia


Ponte 1 Enableconst int MC1 = 3; // Controle Motor
1const int MC2 = 2; // Controle Motor 2const int POT
= 0; // POT na Analog Pin 0

int val = 0; // Para armazenar a leitura a partir da velocidade POTint = 0; // Para


armazenar a velocidade desejada (0-255)

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

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

// Motor vai para a frente em uma determinada taxa (0-255)


para a frente void (taxa int)

{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);

// Motor vai para trás em uma determinada taxa (0-255) vazio


reverso (taxa int)

{
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

armaduras para rotações específicas, e precisamente controlando a abertura de uma


abertura. Nesta seção, você aprenderá sobre os servos motores e como controlá-los a partir do seu
Arduino.

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.

Usado com permissão de Parallax Inc. Copyright © 2013 Parallax Inc.


Todos os direitos reservados.
Figura 4-9: servomotores

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

Imagem criada com o MATLAB.


Figura 4-10: Servo diagrama de tempo do motor

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.

A queda de tensão entre a entrada e a saída é queimado na forma de calor,


e o regulador cuida de assegurar que a saída permanece sempre a mesma, mesmo que a tensão da
entrada de gotas (no caso de um discharg-ing bateria ao longo do tempo). Para estas experiências, você
usa um regulador de tensão L4940V5 5V. É capaz de fornecer até 1,5 amps em 5V. Figura 4-11 mostra um
esquema de como ligar o regulador.
Capítulo 4 ■ Usando transistores e condução Motors 83

Imagem criada com o Águia.


Figura 4-11: 5V Linear esquema regulador

Observe os capacitores em cada lado do regulador. Estes são chamadosdissociação


capacitores; eles são usados para suavizar o sinal de tensão de cada oferta volt-idade com cargas e
descargas a opor-se ondulações na tensão. A maioria das folhas de regulador linear incluir um circuito
sugeriu que inclui valores ideais e tipos para esses capacitores baseados em seu cenário de caso de uso.
Também tenha em mente que o 5V criado por este regulador deve ser mantido separado do trilho de
alimentação 5V do Arduino. Suas terras, no entanto, devem ser amarrados juntos.

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

Imagem criada com o Fritizing.


servo
regulador de 5V Potenciômetro

Figura 4-12: Servo diagrama de fiação experimento

ENTENDENDO Reguladores lineares e os limites das fontes de alimentação


ARDUINO

Whyisitnecessarytouseanexternalpowersupplywhencertainitemsrequiremorecurrent? Therearefewreasons.TheI / Opinscannotsupp


each.BecauseaDCorservomotorcancon-sumehundredsofmilliamps, thei / Opinsarenotcapableofdrivingthemdirectly.Eveniftheywere
youwouldn'twanttobecauseofthedamagethatcanbecausedbyinductivevoltagespikes.

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

0move o servo para 0 graus,


e movê-lo para 1023move o servo para 180 graus. Criar um novo desenho com o código da Listagem 4-
4 e carregá-lo para o seu Arduino para ver este funcional-dade em ação.

Listagem 4-4: Servo Potentiometer Control-servo.ino

// Servo controle do potenciômetro

#include <Servo.h>

const int SERVO = 9; // Servo no Pino 9const int POT


= 0; // POT na Analog Pin 0

Servo myServo; int val = 0; // Para armazenar a leitura do POT

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

o incluirinstrução na parte superior do programa adiciona a funcionalidade de


a biblioteca servo ao seu esboço. servo myServofaz com que um objecto servo chamada
myServo. Em seu código, sempre que você quer dizer ao servo o que fazer, você vai
referir-se myServo. Dentroconfiguração(), Anexando o servo inicializa tudo o necessário
para controlar o servomecanismo. Você pode adicionar vários servos chamando os objetos diferentes
coisas e anexando um pino diferente para cada um. Dentro loop (), O pote é lido, escalado
para um valor apropriado para o servo-controlo, e é, em seguida, "escrita" para o servo pulsando o pino
apropriado. O atraso 15ms garante que o servo chega ao seu destino antes de tentar enviá-lo outro
comando.

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.

Porque a luz IR é uma parte do espectro electromagnético que os seres humanos


não pode ver, um sistema como este pode ser implementado para criar "visão noturna." As obras
sensor de distância IR brilhando um LED IR e utilizando alguns circuitos bastante complexo para
calcular o ângulo em que essa luz IR retorna a um sensor fotográfico montado ao lado LED de IR.
Usando voltagens analógicas criados pela

as leituras de sensor fotográfico de IV, a distância é calculada e convertida em


um sinal de tensão analógico que você pode ler no microcontrolador. Mesmo que a sala é escura e
você não pode ver o quão perto um objeto é, este sensor pode porque está usando um
comprimento de onda de luz que o olho humano não consegue detectar.

Diferentes modelos de telémetros IR pode ter interfaces diferentes. Se vocês são


usando um telêmetro que é diferente do que o utilizado neste exemplo, consulte a folha de dados
para certificar-se ele envia uma tensão variável como uma saída.
Capítulo 4 ■ Usando transistores e condução Motors 87

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

para começar o trabalho feito.

Figura 4-13: sensor de distância IR montado para o servo

Em seguida, ligar o seu servo até o Arduino, usando o regulador de 5V ao poder


-lo, assim como você fez antes. O sensor de distância IR substitui o potenciômetro e se conecta a pino
analógico 0. Quatro LEDs ligar para os pinos 3, 5, 6, e 11 por meio de resistências de 1k. O Arduino Uno
tem seis pinos PWM totais, mas pinos 9 e 10 não pode criar sinais PWM (usandoanalogWrite) Quando você
estiver usando a biblioteca servo. Isto é porque a biblioteca servo usa o mesmo temporizador de hardware
como a utilizada

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

Imagem criada com o Fritizing.


servo
regulador de 5V LEDs

Figura 4-14: distância de varrer diagrama de fiação do sensor

O último passo é programar o sensor. O sistema funciona da seguinte


forma: Girar a uma determinada posição, medir a distância, convertê-lo para um valor que pode ser
utilizado para o LED, que altere o brilho do diodo emissor de luz, mover-se para a posição seguinte, e
assim por diante, e assim por diante. Listagem 4-5 mostra o código para fazer isso. Copiá-lo para um
novo esboço e enviá-lo para o seu Arduino.

Listagem 4-5: Distância de varrer Sensor-sweep.ino

// Varrendo Distância Sensor


#include <Servo.h>

const int SERVO = 9; // Servo no Pino 9const int IR = 0; // IR Sensor de


Distância em Analog Pin 0const int LED1 = 3; // Output LED 1const int
LED2 = 5; // Output LED 2const int LED3 = 6; // Output LED 3const int
LED4 = 11; // Output LED 4

Servo myServo; // Servo Objectint dist1 = 0; //


Quadrante 1 Distanceint dist2 = 0; // Quadrante 2
Distanceint dist3 = 0; // Quadrante 3 Distância
Capítulo 4 ■ Usando transistores e condução Motors 89

int dist4 = 0; // Quadrante 4 Distância

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

dist2 = readDistance (65); // Medida Distância IR em 65 degreesanalogWrite (LED2,


dist2); // Ajuste Brightnessdelay LED (300); // Atraso antes próxima medição

dist3 = readDistance (115); // Medida Distância IR a 115 degreesanalogWrite (LED3,


dist3); // Ajuste Brightnessdelay LED (300); // Atraso antes próxima medição

dist4 = readDistance (165); // Medida Distância IR a 165 degreesanalogWrite (LED4,


dist4); // Ajuste Brightnessdelay LED (300); // Atraso antes próxima medição

int readDistance (int pos)


{
myServo.write (pos); // Move to dada positiondelay (600); // Espere por Servo
para moveint dist = analogRead (IR); // Leia IR Sensordist = map (dist, 50,
500, 0, 255); // Escala-lo para LED faixa de dist = constranger (dist, 0, 255); //
Restringir dist itreturn; // Retorna distância à escala

O programa emprega uma função simples que roda o servo ao solicitado


grau, toma a medida de distância, dimensiona-lo, e, em seguida, retorna para o
loop (). Mapa que você escolher para a faixa de LED depende da configuração do seu
sistema. Descobri que o objeto mais próximo que eu queria para detectar registrados 500
em,torno de
e o objecto mais distante era torno 50, então o mapa()foi criado em conformidade.
loop ()
executa esta função para cada um dos quatro LEDs, então repete. Quando completo,
o sistema deve funcionar de forma semelhante à mostrada na demonstração de vídeo
listados no início desta seção.
90 parte II ■ Controlar o Seu Ambiente

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

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
■■

energia para fazer a interface com segurança com o Arduino.

velocidade do motor de corrente contínua e a direcção pode ser controlada com PWM e uma ponte-H.
■■

servomotores permitem um posicionamento preciso e pode ser controlado usando a biblioteca


■■

Arduino Servo.

Um regulador linear pode ser utilizado para criar uma fonte de 5V secundário a partir de uma
■■

bateria de 9V.

sensores de distância IR retornar valores analógicos que representam distâncias detectadas


■■

saltando luz infravermelha fora objetos.

Código comentando é fundamental para facilitar a depuração e partilha.


■■
Capítulo

fazendo Sounds

Peças que você vai precisar para este capítulo

Arduino UnoUSB
cablePushbuttons (n5)
10kohms resistores (n5)
altifalante 150Ω
resistorJumper
wiresBreadboard10KΩ
potentiometer8Ω

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch5 .

Os downloads de código wiley.com deste capítulo foram encontrados em


www.wiley.com/

go / exploringarduinona guia de transferência de código. O código está no capítulo 05


baixar e individualmente nomeados de acordo com os nomes de todo o capítulo.

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.

É possível gerar som com um Arduino em um número de maneiras. O mais simples


método consiste em utilizar
tom()o
função, que este capítulo focaliza mais fortemente.
No entanto, você também pode usar vários escudos que agregam mais complexa, música-playing
capacidades ao Arduino com a ajuda de algum processamento externo. (Shields são add-on placas que
ligam a parte superior do seu Arduino para adicionar a função-ality específica. Você não vai usar
qualquer neste capítulo, mas você estará usando escudos variados em alguns dos capítulos
posteriores.) Se você possui o Arduino Due, você pode usar o seu verdadeiro conversor digital-
analógico (DAC) para produzir sons.

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

Imagem criada com o MATLAB.


Figura 5-1: As ondas sonoras de diferentes frequências e amplitudes

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.

Importante, o Arduino (excluindo verdadeira CAD da Due) não pode, na verdade,


fazer uma onda sinusoidal que você pode observar no mundo real. Um quadrado
onda é uma onda-lo periódica digital também oscila entre um alto e um valor baixo, mas ele muda
instantaneamente, em vez de lentamente como uma onda senoidal. Isso ainda cria uma onda de
pressão que resulta em som, mas não é tão "bonito" soando como uma onda sinusoidal.
94 parte II ■ Controlar o Seu Ambiente

Como para a amplitude, é possível controlar que, alterando o valor do


corrente permitida a fluir através do alto-falante. Usando um potenciômetro em linha com o alto-
falante, você pode ajustar dinamicamente o nível de volume do alto-falante.

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

mostra um corte transversal de um altifalante comum.

GNU Free Documentation License

Figura 5-2: seção transversal Speaker

O ímã permanente é montado atrás da bobina de voz e um pólo mostrado


na imagem. À medida que envia um sinal de tensão sinusoidal (ou uma onda quadrada, no caso de o
Arduino) para os fios da bobina, a actual mudança induz um campo magnético que faz com que a peça
polar e o diafragma a vibrar para cima e para baixo

como o ímã permanente é atraído e, em seguida, repelido pela magnética


campo que tem gerado. Esta vibração vai-e-vem, por sua vez, vibra o ar na frente do orador,
efetivamente criando uma onda sonora que pode viajar para o tímpano.
capítulo 5 ■ Fazendo sons 95

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 primeiro argumento define o pino para gerar o sinal em.


■■

O segundo argumento define a frequência do tom.


■■

O terceiro (opcional) argumento define a duração do tom. Se o terceiro argumento não for
■■

definida, o tom continua tocando até que você chamar


nenhum().

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.

Nas seções seguintes, você aprender a tocar sequências sonoras arbitrárias.


Uma vez que você tenha obtido esse trabalho, você pode
tom()usar
como resposta a várias
entradas (botões, sensores de distância, acelerômetros, etc.). No final do capítulo, você constrói um simples
de piano com cinco botões que você pode jogar.

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

Figura 5-3: IDE Arduino com um arquivo de cabeçalho secundário

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:

#include "pitches.h" // arquivo de cabeçalho com definições de pitch

Para o compilador, este é essencialmente a mesma coisa que copiar e colar o


conteúdo do arquivo de cabeçalho no topo de seu arquivo principal. No entanto, este mantém o mais puro
arquivo e mais fácil para você ler. Nas próximas seções, você escreve o código para o resto desse arquivo
para que você possa realmente usar as definições passo que acabou importados.

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.

Imagem criada com o Águia.

Figura 5-4: ligação do altifalante com o botão de ajuste de volume

Note-se que ao contrário de seus usos anteriores de potenciômetros esta configuração


usa apenas dois pinos: o Oriente (ou limpador) pino vai para o alto-falante, e qualquer um dos dois
98 parte II ■ Controlar o Seu Ambiente

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

sua fiação usando o diagrama na Figura 5-5.

Imagem criada com o Fritzing.

Figura 5-5: diagrama de fiação Speaker


capítulo 5 ■ Fazendo sons 99

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.

Para garantir que a memória do Arduino é adequadamente gerida, você precisa


declarar matrizes com um comprimento conhecido. Você pode fazer isso por especificar
explicitamente-ing o número de itens ou simplesmente preencher a matriz com todos os valores que
você está interessado. Por exemplo, se você quiser fazer uma matriz que contém quatro valores
inteiros, você pode criá-lo como esta:

números int [4];

Opcionalmente, é possível inicializar os valores quando você declará-lo. Se você inicializar


os valores, especificando o comprimento dos suportes é opcional. Se não for especificado, o
comprimento é assumido para igualar os elementos número que você inicializados:

// Ambos são números acceptableint [4] =


{-7, 0, 6, 234}; int números [] = {-7, 0, 6,
234};

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:

analogWrite (9, números [2]);


100 parte II ■ Controlar o Seu Ambiente

Observe que, como numeração começa em zero, o índice de 2representa o terceiro


valor na matriz. Se você quiser alterar um dos valores da matriz, você pode fazê-lo de forma semelhante:

números [2] = 10;

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.

Fazendo a anotação e Duração Arrays

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.

Usando as habilidades musicais magros que eu mantidos de minhas aulas de música


de volta na escola, eu montei uma melodia curta e cativante:

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

};

// A duração de cada nota (em ms) int vezes []


={

250, 250, 250, 250,


250, 250, 250, 250,
125, 125, 125, 125, 125, 125, 125, 125,
250, 250, 250, 250
};

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!

NOTA Listentoarecordingofthistune, playedbyanArduino:


www.exploringarduino.com/content/ch5.YoucanalsofindthisrecordingontheWileywebsiteshownatthebeginningofthischapter.
capítulo 5 ■ Fazendo sons 101

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.

Listagem 5-1: Arduino Music Player-music.ino

// Toca uma música em um orador

#include "pitches.h" // arquivo de cabeçalho com definições de pitch

int COLUNA const = 9; // Pin Speaker

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

};

// A duração de cada nota (em ms) int vezes []


={

250, 250, 250, 250,


250, 250, 250, 250,
125, 125, 125, 125, 125, 125, 125, 125,
250, 250, 250, 250
};

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

Escudo ou o escudo MP3 SparkFun), a implementação de um conversor DAC, ou usando o


built-in DAC disponível no Arduino Devido usando a biblioteca apenas de áudio Due.
A última limitação é que você pode usar o tom()função em apenas um pino
de cada vez, por isso não é o ideal para a condução de vários alto-falantes. Se você quiser dirigir
várias caixas acústicas ao mesmo tempo a partir de um Arduino padrão, você tem que usar o controle
temporizador de interrupção manual de, algo que se aprende mais sobre no Capítulo 12, "Hardware e
interrupções timer".

NOTA ToreadatutorialonadvancedmultispeakercontrolwithanArduino, visita


www.jeremyblum.com/2010/09/05/driving-5-speakers-simultaneously- com-um-arduino
/.YoucanalsofindthistutorialontheWileywebsiteshownatthebeginningofthischapter.

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

NOTA TheSudoGlove, amongothersthings, isacontrolglovethatcansynthesize


musicusingthepentatonicscale.Youcanlearnmoreaboutitatwww.sudoglove.com.

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.

Imagem criada com o Fritzing.

Figura 5-6: diagrama de fiação Micro de piano


104 parte II ■ Controlar o Seu Ambiente

O código para o piano é realmente muito simples. Em cada iteração através do


loop, cada botão está marcado. Enquanto um botão é pressionado, uma nota é tocada. Aqui,
tom()é utilizado sem uma duração porque a nota será reproduzido, desde que o botão
é mantido. Ao invés,nenhum()é chamado no final de loop ()para garantir que o falante
deixa de fazer barulho quando todos os botões foram liberados. Porque apenas algumas notas são necessários,
você pode copiar os valores do arquivo de cabeçalho que você se preocupa diretamente no arquivo principal
do programa. Em um novo esboço, carregar o código mostrado na Listagem 5-2 e enviá-lo para o seu Arduino.
Então, jam afastado em seu piano!

Listagem 5-2: Pentatonic Micro Piano-piano.ino

// Piano Pentatonic //
CDEGA

#define NOTE_C 262 // Hz


#define NOTE_D 294 // Hz
#define NOTE_E 330 // Hz
#define NOTE_G 392 // Hz
#define NOTE_A 440 // Hz

int COLUNA const = 9; // Speaker no pino 9

const int BUTTON_C = 7; // Int Botão pinconst


BUTTON_D = 6; // Botão pinconst int BUTTON_E
= 5; // Botão pinconst int BUTTON_G = 4; //
Botão pinconst int BUTTON_A = 3; // Pino do
botão

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

// Pare de jogar, se todos os botões foram releasednoTone


(altifalante);

}
capítulo 5 ■ Fazendo sons 105

Cada enquanto()loop continuamente chamar o tom()função no for caso


frequência disso durante o tempo que o botão é pressionado. O botão pode ser lido dentro
doenquanto()avaliação loop para evitar ter de primeiro salvar a leitura para um valor temporário. digitalRead
()
retorna um valor booleano "true" sempre que um botão
de entrada é alta; o valor pode ser avaliada directamente pela enquanto()loop. Para
manter o seu mais puro código, você não precisa usar parênteses para o conteúdo de um loop se o
conteúdo for apenas uma linha, como neste exemplo. Se você tiver várias linhas, você deve usar colchetes
como você tem nos exemplos anteriores.

NOTA Towatchademovideoofthemicropiano, visitawww.exploringarduino.com/


content / CH5.YoucanalsofindthisvideoontheWileywebsiteshownatthebegin-
ningofthischapter.

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

Alto-falantes criar uma onda de pressão que viaja através do ar e é por percebida como som
■■

por suas orelhas.

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.

A linguagem de programação Arduino suporta o uso de matrizes para iterat-ing através de


■■

seqüências de dados.

o volume das colunas pode ser ajustado usando um potenciômetro em série com um alto-
■■

falante.
Capítulo

USB e Comunicação Serial

Peças que você vai precisar para este capítulo

Arduino UnoArduino LeonardoUSB cabo (A a B para Uno) cabo USB (A a Micro B


para Leonardo) LED LEDRGB (cátodo comum) 150Ω resistor220Ω resistor (n3)
resistor 10k (n2) A temperatura PushbuttonPhotoresistorTMP36 sensorTwo eixo
joystick (SparkFun, Parallax, ou adafruit sugerido) Jumper
wiresBreadboardPotentiometer

107
108 parte II ■ Controlar o Seu Ambiente

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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

NOTA Tolearnallaboutserialcommunication, checkoutthistutorial:


comunicação e processamento de www.jeremyblum.com/2011/02/07/arduino-tutorial-6-serial-
/.YoucanalsofindthistutorialontheWileywebsiteshownatthebeginningofthischapter.

Para começar, você precisa entender as diferenças entre série e USB.


Dependendo de como você está velho, você pode até não se lembrar de série (ou téc-
camente, RS-232) portas, porque eles foram substituídas principalmente por USB. Figura 6-1
mostra o que uma porta serial padrão parece.

Figura 6-1: Porta serial

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

utiliza um chip FTDI integrada.

FTDI chip

Figura 6-2: Arduino Nano com o chip FTDI integrada mostrado


Capítulo 6 ■ USB e Serial Comunicação 111

NOTA ForyourcomputertocommunicatewithaFTDIserial-to-USBadapter, você


needtoinstalldrivers.YoucanfindthemostrecentversionsforWindows, OSX, andLinuxatwww.ftdichip.com/Drivers/VCP.htm.Thisisa

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,

Figura 6-3: cabo FTDI

Figura 6-4: placa de adaptador de SparkFun FTDI


112 parte II ■ Controlar o Seu Ambiente

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
■■

Arduino Mega (original)


■■

A seguir está uma lista de placas Arduino que usam um programador FTDI externo:

Arduino Pro
■■

Arduino Pro Mini


■■

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).

Segue-se uma breve lista das diferenças:

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-
■■

sion permitido um costume Arduino identificação do fornecedor e ID do produto a ser relatado


para o computador host quando a placa está conectada. Quando uma base-FTDI

placa foi conectada a um computador, ele só mostrou-se como USB-serial genérico


dispositivo. Quando um Arduino usando um conversor não-FTDI IC (a ATmega 8U2 no caso
de início Arduino Unos, agora um 16U2) está ligado, é

identificados para o computador como um Arduino.

Atmel 8U2 ou
chip 16U2

Figura 6-5: Vista do chip conversor de série 8U2 do Arduino Uno

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

firmware não iria ser carregado, e você teria que programar o


Arduino diretamente usando o programador de série no circuito com um dispositivo
como o AVR ISP MKII.
114 parte II ■ Controlar o Seu Ambiente

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
■■

Arduino mega 2560


■■

Arduino mega ADK (com base em 2560)


■■

Arduino Due (também pode ser programado diretamente)


■■

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

placas Arduino similares) emprega o microcontrolador ATmega 32U4, um chip


que tem comunicação direta USB embutido. resultados esse recurso em várias novas funcionalidades e
melhorias.

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 Due (também pode ser programado através de MCU secundária)


■■

LilyPad Arduino USB


■■

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

o Arduino e um dispositivo Android. Isto é usado principalmente para controlar


Arduino I / O de um aplicativo em execução no dispositivo Android.
Duas placas Arduino que têm capacidades USB host são o Arduino Devido
eo Arduino mega ADK (baseado em mega 2560).

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")

Onde taxa de transmissãoe "Mensagem"são variáveis que você especificar.

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

Imagem criada com o Fritzing.

Figura 6-6: Diagrama de Ligação do potenciómetro

Depois de fiação do potenciômetro, carga sobre o programa simples mostrado na


Listagem 6-1 que irá ler o valor do potenciômetro e imprimi-lo tanto como um valor bruto e um valor
percentual.
Capítulo 6 ■ USB e Serial Comunicação 117

Listagem 6-1: Potentiometer Serial impressão Teste Programa-pot.ino

// Teste simples impressão de série com um potenciômetro

const int POT = 0; // Pot no pino analógico 0

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

Usando uma combinação de Serial.print () e Serial.println () declarações,


Esse código imprime ambos os valores brutos e percentuais uma vez por segundo. Observe que, por
nosso usoSerial.println () apenas na última linha, cada transmissão anterior
sion permanece na mesma linha.
Abra o monitor serial do Arduino IDE e garantir que seus transmissão
taxa é definida para 9600 para coincidir com o valor definido no esboço Arduino. Você deve ver os
valores imprimindo uma vez por segundo como você girar o potenciômetro.

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

Listagem 6-2: Tabular Impressão usando caracteres especiais-pot_tabular.ino

teste de impressão serial // tabular com um potenciômetro

const int POT = 0; // Pot no pino analógico 0

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

Serial.print ( "A0 \ t \ t"); Serial.print (val); Serial.print ( "\ t \ t"); Serial.print


(per); // Percentagem impressão analógico valueSerial.println ( "%"); //
Impressão% sinal e newlinedelay (1000); // Espere um segundo, em
seguida, repita

}
}

Como você gira o potenciômetro, a saída deste programa deve olhar


algo parecido com os resultados mostrados na Figura 6-7.

Figura 6-7: Captura de tela do terminal serial com dados tabulares


Capítulo 6 ■ USB e Serial Comunicação 119

ChangingDataTypeRepresentations

o Serial.print () e Serial.println () funções são bastante inteligente quando


se trata de imprimir dados no formato que você está esperando. No entanto, você tem
opções para a saída de dados em vários formatos, incluindo hexadecimal, octal e binário. ASCII
Decimal codificados é o formato padrão. o
Serial.print ()
e Serial.println () funções têm um segundo argumento opcional que espe-
fies o formato de impressão. Tabela 6-1 inclui exemplos de como você iria imprimir os mesmos dados
em vários formatos e como ele iria aparecer no seu terminal serial.

Tabela 6-1: Opções de Tipo de dados Serial

TIPO DE DADOS exemplo de código SAÍDA SERIAL

Decimal Serial.println (23); 23

hexadecimal Serial.println (23, HEX); 17

octal Serial.println (23, OCT) 27

Binário Serial.println (23, BIN) 00010111

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 destaca ambos.

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

www.exploringarduino.com) Que enviar caracteres enquanto você digita-los.

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.

É importante lembrar que a porta serial do Arduino tem um buffer. em outra


palavras, você pode enviar vários bytes de dados ao mesmo tempo e o Arduino vai fila-los e processá-
los em ordem com base no conteúdo do seu esboço. Você não precisa se preocupar com o envio de
dados mais rápido do que o seu tempo de volta, mas você precisa se preocupar com o envio de tantos
dados que transborda o tampão e as informações são perdidas.

Dizer a Arduino para eco dos dados de entrada

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.

Note-se que cada chamada para ()


Serial.read só retornará 1 byte, então você precisa
executá-lo por tanto tempo quanto ()
Serial.available está a devolver um valor maior do que zero.
Cada vez Serial.read () agarra um byte, que byte é removido do tampão,
bem como, para o próximo byte está pronto para ser lido. Com este conhecimento, agora você pode
escrever e carregar o programa de eco na Listagem 6-3 no seu Arduino.
Capítulo 6 ■ USB e Serial Comunicação 121

Listagem 6-3: Arduino Serial Eco Test-echo.ino

// Eco cada personagem

de dados char; // Armazena caráter entrante

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

}
}

Inicie o monitor serial e escrever o que quiser na entrada de texto


campo. Assim que você pressionar Enviar, o que você digitou é ecoado volta e dis-jogado no monitor
serial. Você já selecionado para anexar uma "nova linha" ao final de cada comando, que irá garantir que
cada resposta é em uma nova linha. É por isso queSerial.print ()

é utilizado em vez de Serial.println () no


anterior esboço.

Entender as diferenças entre Chars e Ints

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.

Ao ler um valor que enviou a partir do computador, como você fez no


Listagem 6-3, os dados devem ser lidos como uma digitar. Mesmo que você só está esperando
carbonizar
para enviar os números do terminal serial, você precisa ler valores como um personagem em primeiro
lugar, e depois converter conforme necessário. Por exemplo, se você tivesse que modificar o código para
declarardadoscomo tipo int, Enviando um valor de 5retornaria 53para o monitor em série devido a
representação decimal do carácter 5 é o número

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.

Envio de caracteres simples para controlar um LED

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.

Imagem criada com o Fritzing.

Figura 6-10: Único LED ligado ao Arduino no pino 9

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

Listagem 6-4: Controle único LED usando caracteres de single_char_control.ino

// Controle único caractere de um LED

const int LED = 9;

de dados char; // Armazena caráter entrante

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

}
}

Note-se que um else if comunicado é utilizado em vez de um simples


outrodeclaração.
Porque o seu terminal também está definido para enviar um caractere de nova linha com cada trans-
missão, é fundamental para limpar estes a partir do buffer. vai ler na
Serial.read ()
o caractere de nova linha, ver que não é equivalente a uma '0'ou um '1', E será
substituídas na próxima vez Serial.read () é chamado. Se apenas uma
outro declaração foram
utilizado, tanto '0'e '\ N'desencadearia transformando o LED. Mesmo quando o envio de um'1', O
LED se desligue imediatamente novamente quando o
'\ N'foi recebido!
Capítulo 6 ■ USB e Serial Comunicação 125

Envio de listas de valores para controlar um LED RGB

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

LED RGB como mostrado na Figura 6-11.

Imagem criada com o Fritzing.

Figura 6-11: RGB LED conectado ao Arduino


126 parte II ■ Controlar o Seu Ambiente

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 diferenciar entre números e vírgulas.

■■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.

Listagem 6-5: Controle de LED RGB via Serial-list_control.ino

// Enviar várias variáveis de uma vez

const int VERDE = 10;; //


Definir pinsconst int RED =
11 LED const int AZUL = 9;

// Variáveis para RGB levelsint


rval = 0; int gval = 0; int bval =
0;

void setup ()
{
Serial.begin (9600); // Porta Serial em 9600

// configura pinos como


outputspinMode (RED, OUTPUT);
pinMode (VERDE, OUTPUT); pinMode
(azul, OUTPUT);

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

if (Serial.read () == '\ n') // Feito transmissão


{
// Configura LEDanalogWrite (RED, rval);
analogWrite (VERDE, gval); analogWrite
(azul, bval);

}
}
}

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

Processamento tem uma interface de programação bastante simples, e é semelhante ao


uma que já tenha vindo a utilizar para o Arduino. Nesta seção, você instala
Processamento e, em seguida, escrever uma interface gráfica simples para gerar um gráfico
128 parte II ■ Controlar o Seu Ambiente

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

Primeiro de tudo, você precisa instalar o processamento em sua máquina. Isto é o


mesmo processo que você seguiu no primeiro capítulo para obter o Arduino IDE
instalado. Visitahttp://processing.org/download/ (Ou encontrar o link para download
na página de conteúdo digital para este capítulo sobre
www.exploringarduino.com) e
fazer o download do pacote compactado para seu sistema operacional. Basta descompactá-lo para o
seu local preferido e você está pronto para ir! Execute o pedido de Processamento

ção, e você deve ver um IDE que se parece com o mostrado na Figura 6-12.

Figura 6-12:O IDE Processing. Será que ela parece familiar?


Capítulo 6 ■ USB e Serial Comunicação 129

Controlar um esboço de processamento do seu Arduino

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.

Referenciar o código na Listagem 6-6 e carregá-lo no seu Arduino. Ele envia um


valor atualizado do potenciômetro para a porta serial do computador a cada 50 mil-liseconds. Os 50ms é
importante; se você fosse para enviá-lo o mais rápido possível, o esboço de processamento não seria
capaz de lidar com isso tão rapidamente como você está enviando a ele, e você acabaria por estouro do
buffer de entrada serial no seu computador.

Listagem 6-6: Código Arduino para enviar dados para o computador-pot_to_processing / arduino_read_pot

// Enviando valor POT para o computador

const int POT = 0; // Pot no pino analógico 0

int val; // Para a realização de valor pot mapeada

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.

port = nova série (este, "COM3", 9600); // Série de configuração

Listagem 6-7: Código de processamento para ler dados e mudam a cor na tela-pot_to_processing /
processing_display_color

// Esboço de processamento para ler valor e muda de cor na tela

// Import e inicializar porta serial libraryimport


processing.serial. *; Porta serial;

flutuador brilho = 0; // Para a realização de valor a partir de pot

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
}

serialEvent void (porta serial)


{
luminosidade = float (port.readStringUntil ( '\ n')); // Obtém val
}

Depois de ter carregado o código em seu processamento IDE e definir a série


port corretamente, certifique-se de que o monitor serial Arduino não está aberta. Somente um
programa no seu computador pode ter acesso à porta serial de cada vez. Clique no botão Executar no
IDE Processing (o botão no canto superior esquerdo da janela com um triângulo); ao fazê-lo, uma
pequena janela pop-up (veja a Figura 6-13). Como você gira o potenciômetro, você deve ver a cor da
mudança janela do preto ao azul.

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

Figura 6-13: janelas exemplo de esboço Processing

Como o Arduino, Processing tem um configuração()função que é executada uma vez no


começando do esboço. Neste esboço, ele configura a porta serial e cria um
janela de tamanho 500n500 pixels com o comando tamanho (500.500). O comando
port = nova série (este, "COM3", 9600) diz Processamento de tudo o que precisa
saber sobre a criação da porta serial. A instância (referido como "port") será executado neste esboço e
comunicar em COM3 (ou qualquer que seja sua porta serial é) em 9600. O Arduino e do programa no seu
computador devem concordar com a velocidade com que eles se comunicam; caso contrário, você vai ter
caracteres de lixo.

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

SUDOGLOVE PROCESSAMENTO DEBUGGER

TheSudoGloveisacontrolglovethatdrivesRCcarsandcontrolsotherhardware.IdevelopedaProcessingdebuggingdisplaythatgraphicallys
ors.Youcanlearnmoreaboutithere:

www.sudoglove.com.
DownloadthesourcecodefortheProcessingdisplayhere:
www.jeremyblum.com/2011/03/25/processing-based-sudoglove- visual-depurador
/.YoucanalsofindthissourcecodeontheWileywebsiteshownatthebeginningofthischapter.

Envio de dados de processamento à sua Arduino

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.

Carregar e executar o código na Listagem 6-8 em Processamento, lembrando-se de ajustar o


número da porta serial de acordo como você fez com o esboço anterior. Em processamento
esboços carregar automaticamente arquivos de garantia de uma pasta chamada "dados" no
esboço pasta. O arquivo hsv.jpg está incluído no download do código deste capítulo. Baixá-lo e colocá-lo
em uma pasta chamada "dados" no mesmo diretório que o seu esboço. Processamento padrão para
salvar desenhos em sua pasta Documentos. o

estrutura será semelhante à mostrada na Figura 6-14.

Figura 6-14: estrutura de pastas

A imagem na pasta de dados servirá como o seletor de cores.


Capítulo 6 ■ USB e Serial Comunicação 133

Listagem 6-8: Processamento de esboço para definir Arduino RGB Colors- processing_control_RGB /
processing_control_RGB

importar processing.serial. *; // Import libraryPImage série


img; // Imagem Porta objectSerial; // Objeto de porta serial

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

Figura 6-15: tela de seleção de cores de processamento

Cada vez que o botão do mouse é pressionado, o mousePressed ()função é chamada.


A cor do pixel em que você clicou é salvo em um corobjeto nomeado c. o
obter()método conta a aplicação, onde para obter a cor a partir de (neste caso, o
localização do X do mouse e posição Y no esboço). O esboço converte o objetocem uma cadeia que pode
ser enviado para o Arduino, convertendo a inteiros

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.

Digitando dados no 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.

Comece abrindo o editor de texto de sua escolha e salvar um documento em branco


com uma extensão .csv. Para fazer isso, você pode geralmente escolher o tipo de arquivo na caixa de
diálogo Salvar, selecione "Todos os arquivos" e digite manualmente o nome do arquivo com a exten-
sion, como "data.csv." O vídeo de demonstração mostra também como criar um arquivo .csv.

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

Imagem criada com o Fritzing.

indicador LED Sensor de temperatura botão Ativar photoresistor

Figura 6-16: circuito de temperatura e sensor de luz

Usando a mesma função debouncing que você implementou no Capítulo 2,


"Entradas digitais, saídas e Pulse-Width Modulation," você usar o botão para alternar o modo de log on e
off. Enquanto no modo de registo, as pesquisas Arduino

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.

Listagem 6-9: Temperatura e luz Data Logger-csv_logger.ino

// Luz e Logger Temp

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

boolean lastButton = LOW; // Última botão stateboolean currentButton =


LOW; // Stateboolean atual running botão = false; // Não está em execução
por defaultint counter = 1; // Um índice para as entradas de dados
registrados

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

lastButton = currentButton; // Repor valor de botão

se (em execução) // Se logger está em execução


138 parte II ■ Controlar o Seu Ambiente

{
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

Keyboard.begin ()no configuração().


Cada vez através loop (), o Arduino verifica o estado do botão e é executado
a função debouncing que você já está familiarizado. Quando o botão é pressionado, o valor
docorrendovariável é invertida. Isso é conseguido definindo-o como o seu oposto com o

!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.

NOTA Towatchademovideoofthelivetemperatureandlightlogger, visita


www.exploringarduino.com/content/ch6.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

Comandando o computador a fazer o seu lance

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

Listagem 6-10: Light-Based Computer Lock-lock_computer.ino

// Bloqueia o computador quando você desligar as luzes

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 .)

NOTA Towatchademovideoofthelight-activatedcomputerlock, visita


www.exploringarduino.com/content/ch6.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

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.

Imagem criada com o Fritzing.

Controle de video game Botão do meio botão


esquerdo do direito do
do mouse mouse
mouse botão

Figura 6-17: circuito Joystick Leonardo rato


142 parte II ■ Controlar o Seu Ambiente

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.

Depois de ter ligado o circuito, é hora de carregar um código para o Leonardo.


Carregar o código na Listagem 6-11 e jogar com o joystick e botões; o ponteiro na tela devem
responder em conformidade.

Listagem 6-11: Código de controlo do rato para o Leonardo-mouse.ino

// Faz um rato!

const int LEFT_BUTTON = 4; // Pino de entrada para o int buttonconst esquerda


MIDDLE_BUTTON = 3; // Pino de entrada para o meio buttonconst int RIGHT_BUTTON
= 2; // Pino de entrada para o int buttonconst direito X_AXIS = 0; // Joystick eixo x
analógico pinconst int Y_AXIS = 1; // Pino analógico eixo y Joystick

void setup ()
{
Mouse.begin ();
}

void loop ()
{
int xVal = readJoystick (X_AXIS); // Obter eixo x movementint yVal = readJoystick
(Y_AXIS); // Obter movimento do eixo y

Mouse.move (xVal, yVal, 0); // Move o mouse

readButton (LEFT_BUTTON, MOUSE_LEFT); // Controle deixou buttonreadButton


(MIDDLE_BUTTON, MOUSE_MIDDLE); // Controle meio buttonreadButton (RIGHT_BUTTON,
MOUSE_RIGHT); // O controlo botão direito

atraso (5); // Isto controla a capacidade de resposta


}

// Lê valor joystick, dimensiona-lo, e acrescenta gama mortos em middleint


readJoystick (eixo int)

{
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;

else // Retorno escalado valuereturn val;


Capítulo 6 ■ USB e Serial Comunicação 143

// Leia um botão e emitir um rato commandvoid readButton


(pino int, char mouseCommand)

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

Este é definitivamente um dos desenhos mais complicados que foram cobertos


até agora, então vale a pena percorrendo-o para ambos entendem o recém-lançado
funções e o fluxo do programa utilizado para realizar o rato joystick.
Cada um dos botão e joystick pinos são definidos no topo do esboço, e
a biblioteca do mouse é iniciado na instalação. Cada vez através do loop, o joystick
Os valores são lidos e mapeadas para valores de movimento para o mouse. Os botões do mouse
também são monitoradas e o botão prensas são transmitidos, se necessário.

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

Para detectar os cliques de rato,readButton


os ()função foi criada para que ele possa
ser repetido para cada um dos três botões de detectar. A função detecta o estado cur-rent do mouse com o
Mouse.isPressed ()comando e controla a
rato de acordo com o Mouse.press ()e Mouse.release ()funções.

NOTA Towatchademovideoofthejoystickmousecontrollingacomputer
ponteiro, check-outwww.exploringarduino.com/content/ch6.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischa

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

Arduinos conectar ao seu computador através de um conversor USB-to-serial.


■■

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
■■

novas linhas e tabs.

Todos os dados em série são transmitidos como caracteres que podem ser convertidos em números
■■

inteiros em uma variedade de formas.

Você pode enviar listas de números inteiros separados por vírgulas e usar funções integradas
■■

para analisá-los em comandos para o seu esboço.

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
■■

periféricos conectados ao seu Arduino.

Um Arduino Leonardo pode ser usado para emular um teclado ou mouse.


■■
Capítulo

registos de deslocamen

Peças que você vai precisar para este capítulo

Arduino UnoUSB cabo (A a B para Uno) LEDs vermelhos (n8) (LEDs


amarelosn3) LEDs verdes (n5) 220Ω resistores (n8) mudança
SN74HC595N registo DIP sensor de distância ICSharp
GP2Y0A41SK0F IR com cableJumper wiresBreadboard

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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.

ESCOLHER O Arduino certa para o trabalho

Presente capítulo, likemostoftheearlierchapters, usestheArduinoUnoasthedevelopmentplatform.AnyotherArduinowillworkjustaswel


butit'sworthconsideringwhyyoumightwanttouseoneArduinooveranotherforaparticularprojectyoumaybepursu-ing.Forexample,
youmightalreadybewonderingwhyyouwouldn'tjustuseanArduinowithmoreI / Opins, suchastheMega2560ortheDue.Ofcourse,
thatisacompletelyreasonablewaytocompleteprojectsthatrequiremoreoutputs.However, asanengineer,
youshouldalwaysbemindfulofotherconsiderationswhendesigninganewproject.Ifyouonlyneedtheprocess-ingpowerofanUno, butyoun
addingafewshiftregisterswillbeconsiderablycheaperthanupgradingyourentireplatform, andwillalsobemorecompact.Asatradeoff, itw
anditmightnecessitatemoredebuggingtimetogetitworkingright.

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

em displays de sete segmentos ou matrizes de LED. Antes de mergulhar em usar um registrador de


deslocamento com o Arduino, considere o diagrama na Figura 7-1, que mostra as entradas e saídas
para um registrador de deslocamento série-paralelo. Variações a este

diagrama em todo o capítulo ilustram como entradas diferentes afetam as saídas.

Figura 7-1: entrada de registo de deslocamento diagrama / saída

Os oito círculos representam LEDs ligados aos oito saídas da mudança


Cadastre-se. As três entradas são as linhas de comunicação serial que ligam o registo de
deslocamento para o Arduino.

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.

Crédito: Imagem usada com permissão cortesia da Texas Instruments,


.
www.ti.com

Figura 7-2: Registo de deslocamento diagrama de pin-out

Compreender a mudança Funções Register Pin

A seguir está uma repartição das funções dos pinos de registo de deslocamento:

pinos Q através de Q representam as oito saídas paralelas do turno


■■
UMA H
register (ligada aos meios mostrados na Figura 7-1).
Capítulo 7 ■ Registadores de deslocamento 149

VCC irá se conectar a 5V.


■■

GND vai ligar para um terreno compartilhado com o Arduino.


■■

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.

O pino SRCLK é representada pelo pino CLOCK na Figura 7-1. Cada


■■

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.

Entender como o registo de deslocamento Works

O registrador de deslocamento é um dispositivo síncrono; ele só age sobre a borda de subida do


sinal de relógio. Toda vez que as transições de sinal de relógio de baixo para cima, todos os valores
atualmente armazenados nas oito registradores de saída são deslocados sobre uma posição. (O
último é descartado ou saída no Q
'Pin se você estiver
H
cascata registos.) Ao mesmo tempo, o valor actualmente na entrada de dados é deslocado para a
primeira posição. Ao fazer isso oito vezes, os valores presentes são deslocados para fora e os novos
valores são deslocados para o registro. O pino de bloqueio é estabelecido alto no final deste ciclo para
fazer os valores recém-deslocados aparecem

nas saídas. O fluxograma mostrado na Figura 7-3 ilustra melhor a presente


150 parte II ■ Controlar o Seu Ambiente

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.

Figura 7-3: Mudando um valor em um registrador de deslocamento


Capítulo 7 ■ Registadores de deslocamento 151

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:

O número de pinos de dados


■■

O número relógio pin


■■

A ordem bit
■■

O valor para deslocar para fora


■■

Se, por exemplo, você quer mudar o padrão alternado descrito na


seção anterior, você poderia usar o shiftOut () função como se segue:
shiftOut (DATA, relógio, MSBFIRST, B10101010);

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

Bantes do número, você está dizendo ao Arduino IDE


para interpretar os seguintes números como valor binário em vez de um inteiro decimal.

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:

O pino de dados irá se conectar ao pino 8.


■■

O pino de bloqueio irá se conectar ao pino 9.


■■

O pino de clock irá se conectar ao pino 10.


■■

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

Imagem criada com o Fritzing.

Figura 7-4: diagrama de circuito registo turno de oito LED

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.

Listagem 7-1: Padrão alternado LED em um Shift Register-alternate.ino

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 pin relógio registo

void setup ()
Capítulo 7 ■ Registadores de deslocamento 153

{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);

digitalWrite (TRINCO, LOW); // Trava lowshiftOut (SER, CLK, MSBFIRST, B10101010); //


Mudança mais sig. bit firstdigitalWrite (TRINCO, HIGH); // Alta trava - padrão show

void loop ()
{
//Fazer nada
}

Porque o registo de deslocamento travará os valores, você precisa enviar-lhes apenas


uma vez na configuração; Eles, então, ficar no esses valores até que você alterá-los para outra coisa.
Este programa segue os mesmos passos que foram mostrados grafica-

camente na Figura 7-3. oTRAVApino é estabelecido baixo, os 8 bits de dados deslocada na


utilização do shiftOut ()
função, e, em seguida, o TRAVApin está situado no alto novamente para que o
valores deslocados são emitidos nos pinos de saída paralelos do registo de deslocamento IC.

Registos de deslocamento encadeamento

GettingeightdigitaloutputsfromthreeI / Opinsisaprettygoodtradeoff, butwhatifyoucouldgetevenmore? Youcan! Bydaisychain


youcouldtheoreticallyaddhundredsofdigitaloutputstoyourArduinousingjustthreepins.Ifyoudothis,
you'llprobablywanttouseabeefierpowersupplythanjustUSB.ThecurrentrequirementsofafewdozenLEDscanaddupveryquickly.

Recallfromthepin-outinFigure7-2thatthereisanunusedpincalled
Q '.Whentheoldestvalueisshiftedoutoftheshiftregister, Itisn'tdis-cardado; it'sactuallysentoutonthatpin.ByconnectingtheQ
H
'totheDATA
H
pinofanothershiftregister, andsharingtheLATCHandCLOCKpinswiththefirstshiftregister, youcancreatea16-bitshiftregistertha

Youcankeepaddingmoreandmoreshiftregisters, eachconnectedtothelastone, toaddacrazyofnumberoutputstoyourArduin

outbyhookingupanothershiftregisterasdescribedandsimplyexecutingtheshiftOut () função inyourcodetwice. (Eachcalltoshif


()canhandleonly8bitsofinformation).
154 parte II ■ Controlar o Seu Ambiente

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

os passos de conversão apropriadas decimais.

Figura 7-5: Binário para decimal conversão

O valor binário de cada bit representa um incremento de energia 2. No


caso de esse número, os bits de 7, 5, 3 e 1 são elevados. Então, para encontrar o decimal emprestou-
equiva, você adiciona
7 23, E dois1. O valor decimal resultante é 170. Você pode provar
, 25, 2
para si mesmo que este valor é equivalente substituindo-o no código listado anteriormente.
Substitua oshiftOut () linha com esta versão:

shiftOut (SER, CLK, MSBFIRST, 170);

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.

Figura 7-6: etapas de animação cavaleiro Luz


156 parte II ■ Controlar o Seu Ambiente

Recordando o que você aprendeu no início do capítulo, converter os valores binários


para cada etapa de luz em valores decimais que podem ser facilmente reciclados através. Usando um
paraloop, você pode percorrer uma matriz de cada um desses valores e transferi-los
para o registo de deslocamento uma ao tempo. O código na Listagem 7-2 faz exatamente isso.

Listagem 7-2: Luz Rider Sequence Code-lightrider.ino

// Faz uma animação piloto luz

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 pin relógio registo

// Seqüência de LEDsint seguintes [14] = {}


1,2,4,8,16,32,64,128,64,32,16,8,4,2;

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

}
}

Ao ajustar o valor dentro do demorafunção, você pode alterar a velocidade


da animação. Tente alterar os valores da seqmatriz para fazer diferente
sequências padrão.

NOTA Towatchademovideoofthelightrider, check-outwww.exploringarduino


.com / content / CH7.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Capítulo 7 ■ Registadores de deslocamento 157

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-

cadas com diferentes LEDs coloridos e um sensor de distância IR.

Figura 7-7: gráfico de barras Distância de resposta Imagem criada com o Fritzing.

Usando o conhecimento que você já tem de trabalhar com sensores analógicos


eo registo de deslocamento, você deve ser capaz de fazer limiares e definir os LEDs em conformidade
com base na leitura à distância. Figura 7-8 mostra os valores decimais que correspondem a cada
representação binária de LEDs.
158 parte II ■ Controlar o Seu Ambiente

Figura 7-8: representações decimais gráfico de barras

Como você descobriu no capítulo 3, "Leitura Sensores analógicos", a gama de utilizável


Os valores para o sensor de distância IR não é na gama de 10-bit. (Eu achei que um valor máximo de
cerca de 500 funcionou para mim, mas sua configuração provavelmente será diferente.) O seu mínimo
pode não ser 0 ou. É melhor testar o alcance do seu sensor e preencha os valores apropriados. Você pode
colocar todas as representações decimais gráfico de barras em uma matriz de nove valores. Ao mapear o
sensor de distância IR (e restringindo-la) de 0 a 500 para baixo para 0-8, você pode rapidamente e
facilmente atribuir distâncias para barrar configurações gráficas. O código na Listagem 7-3 mostra esse
método em ação.
Capítulo 7 ■ Registadores de deslocamento 159

Listagem 7-3: Gráfico de Barras Controle de Distância-bargraph.ino

// Um gráfico de barras que responde a como você está perto

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

// Possíveis vals settingsint LED [9] = {}


0,1,3,7,15,31,63,127,255;

// Valor máximo previsto pelo sensorint MAXVAL


= 500;

// Valor mínimo previsto pela sensorint minval =


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

NOTA Towatchademovideoofthedistanceresponsivebargraph, visita


www.exploringarduino.com/content/ch7.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

Como funciona um registrador de deslocamento


■■

As diferenças entre a transmissão de dados serial e paralela


■■

As diferenças entre decimal e representações de dados binários


■■

Como criar animações usando um registrador de deslocamento


■■
par t

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

Peças que você vai precisar para este capítulo

cabo Arduino UnoUSB (A a B para


Uno) LEDs vermelhos LEDYellow
(n3) LEDs verdes (n4) 220Ω
resistores (n8)

4.7kΩ resistores (n2) mudança SN74HC595N


registo DIP ICTC74A0-5.0VAT temperatura I2C
sensorJumper wiresBreadboard

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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

Você já aprendeu como conectar analógica e entradas / saídas digitais,


mas o que sobre os dispositivos mais complicados? O Arduino pode expandir suas capacidades
por interface com uma variedade de componentes externos. Muitos circuitos integrados implementar
protocolos de comunicação digital com padronizados para facilitar a comuni-cação entre o
microcontrolador e uma grande variedade de possíveis módulos. Este capítulo explora a I

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

Quando se trata de protocolos de comunicação, a compreensão de como o protocolo evoluiu ao longo


do tempo faz com que seja muito mais fácil de entender por que ele funciona da maneira que ele faz.
a I2protocolo C foi inventado por Phillips no início de 1980 para permitir relativamente comunicação de
baixa velocidade entre vários ICs. O protocolo foi padronizado pela década de 1990, e de outras
empresas rapidamente começou a adotar a

protocolo, libertando os seus próprios chips compatíveis. Genericamente, o protocolo é conhecida


como o protocolo "de dois fios", porque duas linhas são utilizadas para a comunicação, um relógio e
linha de dados. Embora nem todos os dispositivos de protocolo de dois fios pagou a taxa de licença
para ser chamado I
2 2
dispositivos de C, que são vulgarmente referidos como todos
C. Eu
®
Esta é semelhante à forma como Kleenex
é muitas vezes utilizado para se referir a todos os tecidos, mesmo aqueles
®
que não são fabricados pela Kleenex . Se você encontrar um dispositivo que diz que usa o
"Two-wire" protocolo de comunicação, você pode estar certo de que ele vai trabalhar na forma
descrita neste capítulo.

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.

Imagem criada com o Águia.


Figura 8-1: Eu2 configuração de hardware de referência C

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.

Crédito: © 2013 Microchip Technology, Inc.

Figura 8-2: opções de endereço TC74

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!

Outros I2chips de C, como o AD7414 e AD7415, têm endereço de escolha (AS)


2
pinos que permitem configurar o I C endereço do dispositivo. Dê uma olhada
o trecho da AD7414 datasheet na Figura 8-3.
Capítulo 8 ■ O Bus I2C 167

Crédito: Analog Devices, Inc.,


www.analog.com.
Figura 8-3: AD7414 abordando

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.

Os passos básicos para controlar qualquer2CI dispositivo são os seguintes:

1. Mestre envia um bit de início.

2. Mestre envia endereço do escravo de 7 bits de dispositivo que quer falar.

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.

4. Slave responde com um "reconhecer" ou bit ACK (uma lógica baixa).


168 parte III ■ Interfaces de comunicação

5. No modo de gravação, mestre envia um byte de informação de cada vez, e o escravo


responde com ACK. No modo de leitura, mestre recebe 1 de informações byte de cada vez e
envia um ACK para o escravo após cada byte.

6. Quando a comunicação tenha sido concluída, o mestre envia um bit de parada.

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

seu computador. Porque este é um sensor digital, imprime a temperatura no


graus. Ao contrário dos sensores de temperatura que você usou nos capítulos anteriores,
você não precisa se preocupar com a conversão de uma leitura analógica para um real
temperatura. Quão conveniente! Agora, ligar um senor temperatura para o Arduino
como mostrado na Figura 8-4.

Imagem criada com o Fritzing.

Figura 8-4: Sensor de temperatura


Capítulo 8 ■ O I2C Bus 169

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.

Crédito: © 2013 Microchip Technology, Inc.

Figura 8-5: esquema de comunicação do sensor TC74


170 parte III ■ Interfaces de comunicação

Crédito: © 2013 Microchip Technology, Inc.

Figura 8-6: TC74 registrar informações

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.

A seção "Leia Format Byte" da figura 8-5 descreve o processo de leitura


a temperatura do TC74:

1. Enviar para o endereço do dispositivo no modo de gravação e escrever


0para um
indicar que
você quiser ler a partir do registo de dados.

2. Enviar para o endereço do dispositivo em modo de leitura e solicitar 8 bits (1 byte) de


informações do dispositivo.

3. Espere para receber todos os 8 bits de informação da temperatura.

Agora que você compreende os passos necessários para solicitar informações


este dispositivo, você deve ser capaz de entender melhor I quão semelhantes 2dispositivos C
também funcionaria. Quando se duvidar, pesquisar na web para exemplos de código que mostram
como conectar o Arduino para vários I 2
dispositivos C. Em seguida, você escreve o
código que executa as três etapas descritas anteriormente.

WritingtheSoftware

I do Arduino2biblioteca de comunicação C é chamado o Fiobiblioteca. Depois que você incluí-lo no


topo do seu esboço, você pode facilmente gravar e ler a partir de I 2
C
2
dispositivos. Como um primeiro passoCpara
de temperatura
o seu I sistema de sensores, carregar o código
na listagem 8-1, que tira proveito das funções embutidos no Fiobiblioteca.
Veja se você pode combinar-se vários Fiocomandos no código a seguir
com as etapas descritas na seção anterior.

Listagem 8-1: 2Eu


C Temperatura Impressão Sensor Code-read_temp.ino

// Lê Temp a partir de sensor de temperatura I2C // e


imprime-lo na porta serial

// Incluir biblioteca Wire I2C


#include <Wire.h> int temp_address = 72; // 1001000 escrita como número
decimal

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

// Leia a temperatura do dispositivo // Pedido de 1 byte do


addressWire.requestFrom especificado (temp_address, 1); //
Aguarde a resposta while (Wire.available () == 0); // Obter
a temperatura e lê-lo em um variableint c = Wire.read ();

// Fazer alguma matemática para converter a Celsius para


Fahrenheitint f = round (c * 9.0 / 5.0 32,0);

// Enviar a temperatura em graus C e F da monitorSerial.print série (C); Serial.print


( "C"); Serial.print (f); Serial.println ( "F");

atraso (500);
}

Considere como os comandos deste programa referem-se mencionado anteriormente


passos. Wire.beginTransmission () inicia a comunicação com um dispositivo escravo
com o ID fornecido. Em seguida, Wire.write
o () comando envia uma 0, indicando que
você quer ser a leitura do registo de temperatura. Você, então, enviar um bit de parada com
oWire.endTransmission () para indicar que você terminar de escrever a
2
o dispositivo. Com as próximas três etapas, o mestre lê a partir do escravo I C dispositivo.
Porque você emitir um Wire.requestFrom ()comando, o mestre vai esperar para receber um byte de
dados de volta do escravo. o comando
Wire.available ()
dentro do enquanto()ciclo irá bloquear o programa de executar o resto do código até que os dados
está disponível no I 2
linha C. Isto dá a hora do dispositivo escravo
responder. Finalmente, o valor de 8 bits é lido em uma variável inteira com um Fio.

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, execute o código anterior no seu Arduino e abrir o moni- de série


tor no seu computador. Você deverá ver uma saída que parece algo parecido
mostrado na Figura 8-7.

Figura 8-7: Eu2 saída série do sensor de temperatura C

CombiningShiftRegisters, SerialCommunication, andI 2CCommunications

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

Imagem criada com o Fritzing.

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".);

Processamento precisa analisar os dados de temperatura Fahrenheit Celsius e. De


substituindo os espaços e retornos de carro com vírgulas e pontos, você pode facilmente olhar para
esses caracteres que delimitam e usá-los para analisar os dados.

Em seguida, você precisa adicionar o código de registo de deslocamento do capítulo anterior, e


mapear os níveis de LED de forma adequada para a faixa de temperatura que você se preocupa. Se a
necessidade de uma reciclagem sobre o código de registo de deslocamento que você escreveu
anteriormente, ter um outro olhar Listing 7-3; grande parte do código a partir desse programa será

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

// Lê temperatura do sensor de temperatura I2C // Mostra-lo no gráfico de


barras LED, e mostrá-la em Processamento

// Incluir biblioteca Wire I2C


#include <Wire.h>

const int SER = 8; // Output de série para Shift Registerconst int


TRAVA = 9; // Shift Register Trava Pinconst int CLK = 10; // Shift
Register Relógio Pin

int temp_address = 72;

// vals settingsint LED Possíveis [8] = {}


1,3,7,15,31,63,127,255;

void setup ()
{
// Criar uma instância de comunicação serial em 9600
bpsSerial.begin (9600);

// Criar um fio
ObjectWire.begin ();

// Definir pinos de registo de deslocamento


como outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
176 parte III ■ Interfaces de comunicação

pinMode (CLK, OUTPUT);


}

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

// Leia a temperatura do dispositivo // Pedido de 1 byte do


addressWire.requestFrom especificado (temp_address, 1); //
Aguarde a resposta while (Wire.available () == 0); // Obter
a temperatura e lê-lo em um variableint c = Wire.read ();

// Mapa das temperaturas para LED settingsint


gráfico = map (c, 24, 31, 0, 7); gráfico = constranger
(gráfico, 0,7);

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

// Fazer alguma matemática para converter a Celsius para


Fahrenheitint f = round (c * 9.0 / 5.0 32,0);

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á

uma tela que se parece com a Figura 8-9.

Figura 8-9: criador da fonte de processamento

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:

Gerar uma janela gráfica em seu computador mostrando a temperatura


■■

em ambos os graus Celsius e Fahrenheit.

Leia os dados de entrada da porta serial, analisá-lo e salvar os valores para as variáveis locais que
■■

podem ser exibidos no computador.

Continuamente atualizar a tela com os novos valores recebidos ao longo serial.


■■
178 parte III ■ Interfaces de comunicação

Copie o código da Listagem 8-3 em seu esboço de processamento e ajuste o


nome da porta serial para o valor correto para o seu computador eo nome da fonte que você criou. Em
seguida, garantir que o seu Arduino está conectado e clique no ícone Executar para ver a mágica!

Listagem 8-3: Esboço de processamento para a indicação da temperatura Valores-display_temp.pde

// Mostra a temperatura registrada por um sensor de temperatura I2C

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

serialEvent void (porta serial)


{
data = port.readStringUntil ( '.'); dados = data.substring
(0, data.length () - 1);

// Procure a vírgula entre Celcius e Farenheitindex = data.indexOf ( ",");


// Buscar o C Temptemp_c = data.substring (0, index); // Buscar o F
temptemp_f = data.substring (índice + 1 , data.length ());

}
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.

Figura 8-10: indicador de temperatura de processamento

Quando você apertar o sensor, o display de Processamento deve atualizar, eo


luzes no seu conselho deve iluminar.

NOTA Towatchademovideoofthetemperaturemonitoringhardwareand
Processingsystem, check-outwww.exploringarduino.com/content/ch8.YoucanalsofindthisvideoontheWileywebsiteshownattheb
180 parte III ■ Interfaces de comunicação

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

Eu C usa duas linhas de dados para permitir a comunicação digital entre o Arduino
■■ 2

e múltiplos dispositivos escravos (contanto que eles têm endereços diferentes).


2
A biblioteca Arduino fio pode ser utilizado para facilitar a comunicar com Eu
■■ C
dispositivos conectados aos pinos A4 e A5.

Eu comunicação C pode ser empregada juntamente com registos de deslocamento e


■■ 2

comunicação serial para criar sistemas mais complexos.

Você pode criar fontes em Processamento de gerar dinamicamente atualização


■■

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

Peças que você vai precisar para este capítulo

cabo Arduino UnoUSB (A a B para Uno) resistências Red


LEDYellow LEDGreen LEDBlue LED100Ω (n4)
SpeakerJumper wiresBreadboardMCP4231 Digital SPI
Potentiometer IC (n2)

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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

Você aprendeu já cerca de dois importantes métodos de comunicação digital


2
disponível para você no Arduino: o I C ônibus eo ônibus UART serial. Nisso
capítulo, você aprenderá sobre o terceiro método de comunicação digital suportada pelo hardware
Arduino: O Serial bus Interface Periférica (ou barramento SPI para o short).

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).

ATENÇÃO BearinmindthatSPIimplementationscanvary, soreadingthe


datasheetisextremelyimportant.

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

Tabela 9-1: Modos de Comunicação SPI

SPI MODO POLARITY RELÓGIO fase do relógio

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:

Comum / Relógio Serial (SCLK)


■■

Master Out Slave In (MOSI)


■■

Mestre Em Slave Out (MISO)


■■

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

com dois dispositivos escravos.

Imagem criada com o Águia.

Figura 9-1: configuração de hardware de referência SPI


184 parte III ■ Interfaces de comunicação

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.

Tabela 9-2: Linhas de comunicação SPI

SPI LINEDESCRIPTION COMUNICAÇÃO

MOSI Usado para o envio de dados de série do dispositivo mestre para um


dispositivo escravo.

MISSÔ Usado para o envio de dados de série de um dispositivo escravo


para o dispositivo mestre.

SCLK O sinal através do qual os dados de série é sincronizada com o


dispositivo de recepção, para que ele saiba quando a ler a entrada.

SS A linha que indica a seleção do dispositivo escravo. Puxando-o para


baixo significa que você está falando com esse dispositivo escravo.

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

O esquema de comunicação SPI é sincronizado com o sinal de relógio e depende


o estado da linha SS. Porque todos os dispositivos no barramento compartilhar a MOSI, MISO, e
linhas SCLK, todos os comandos enviados do mestre chegar a cada escravo. O pino SS diz o escravo se
deve ignorar esses dados ou responder a ela. Importante, isso significa que você deve certificar-se só
para ter um pino SS definir baixo (modo activo) em um momento em qualquer programa que você
escreve.
Capítulo 9 ■ O SPI Bus 185

O processo básico para a comunicação com um dispositivo de SPI é como se segue:

1. Coloque o pino de baixo SS para o dispositivo que você deseja comunicar.

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.

4. Continue até que a transmissão ou recepção é completa, e parar de alternar a linha de


relógio.

5. Retorne o pino SS de alto estado.

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

Muitos tipos de dispositivos, incluindo acelerômetros, potenciômetros digitais, e


monitores, estão disponíveis em ambos SPI e eu2versões C. Então, como você decide?
2
Tabela 9-3 lista alguns dos trade-offs entre I C e SPI. Em última análise, o que
um que você escolher para usar vai depender do que você acredita que é mais fácil de implementar, e
mais adequado para sua situação. A maioria dos novatos acham que eles podem obter SPI trabalhar
com mais facilidade do que eu
2
C.

Tabela 9-3: SPI e I2C Comparação

VANTAGENS SPI Eu2VANTAGENS C

Pode operar em velocidades mais altas Requer apenas duas linhas de comunicação

Geralmente mais fácil de trabalhar com Built-in suporte de hardware Arduino

Não há resistências pull-up necessário

Built-in suporte de hardware Arduino

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

DigiPot tem um limpador ajustável que determina a resistência entre o limpador


terminal e um dos terminais de extremidade. O MCP4231 tem dois potenciômetros em um chip. Cada
pote tem uma resolução de 7 bits, resultando em 129 posições de limpador, (as posições resultados
extras de torneiras diretos do chip para poder ou solo) que variam a resistência entre 0 e 10k. Primeiro,
você vai usar o DigiPot para ajustar o brilho LED. Depois de fazê-lo funcionar com LEDs, você vai usá-lo
para controlar o volume do altifalante. Quando terminar, você terá uma plataforma que você pode usar
para desenvolver / projectos audiovisuais mais complicadas.

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/

content / CH9. A folha de dados responde às seguintes questões:

■■Qual é o pin-out do IC, e quais os pinos são os pinos de controle?

■■O que é a resistência do potenciómetro no meu chip?

■■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.

Figura 9-2: MCP4231 Pin-out diagrama


Capítulo 9 ■ O SPI Bus 187

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.

VDD: Conecta a sua fonte de 5V.


■■

VSS: Liga-se a solo.


■■

CS:CS é o pino SS para a interface SPI, eo bar acima indica que ele está ativo baixo. (0V significa que o
■■

chip é selecionado, e 5V significa que ele não está marcada.)

SDI e SDO: Estes pinos correspondem aos dados de série dentro e fora, respec-tivamente
■■

(aka MOSI e miso).

SCK: Esta é a linha de relógio SPI que foi explicado anteriormente neste capítulo.
■■

SHDN e WP: Estes representam desligar e proteção contra gravação, respectivamente.


■■

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.

A próxima coisa que vale a pena considerar é a resistência do potenciômetro e


limpador. Apenas como um potenciómetro normal, existe uma resistência fixa entre
os terminais A e B de cada potenciômetro digital. O limpador si também tem uma resistência que você
deve levar em conta. Considerar a informação a partir de

quinta página da folha de dados (veja a Figura 9-3).


Crédito: © 2013 Microchip Technology, Inc.

Figura 9-3: MCP4231 AC / DC Quadros de características


188 parte III ■ Interfaces de comunicação

Em primeiro lugar, observar a resistência do potenciómetro, representado


. quatro
por Rdisponíveis
AB
variantes deste chip estão disponíveis, cada um com um valor de resistência diferentes, variando
de 5kΩ para 100kΩ. Os próprios dispositivos estão marcados com a sua variação. Neste capítulo, você
usa a variante 103, que tem uma resistência de cerca de 10k. Importante, DigiPots geralmente não são
dispositivos muito precisos. Você pode ver a partir da folha de dados que a resistência real para o
dispositivo podem variar tanto quanto ± 20%! Também digno de nota é a resistência do limpador. O pino
do limpador real tem uma resistência em algum lugar entre 75 e 160Ω. Isto pode ser significativo,
especialmente quando condução de um alto-falante ou um LED.

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

DigiPot), e o segundo especifica o valor definido para o potenciómetro. Dê uma olhada


a especificação de comunicação SPI extraído da folha de dados na Figura 9-4.

Crédito: © 2013 Microchip Technology, Inc.


Figura 9-4: formatos de comandos MCP4231 SPI

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.

Imagem criada com o Águia.

Figura 9-5: configuração LED Potenciómetro


190 parte III ■ Interfaces de comunicação

O cátodo do diodo emissor de luz é ligado à terra. Quando o limpador para a


potenciómetro digital está ligado ao seu valor máximo, a corrente flui do 5V, através da resistência
100Ω, através do limpador (que tem uma resistência de

~ 75Ω), em seguida, através do LED. Em alternativa, quando é girado todo o caminho


para baixo, a corrente flui através da resistência de 100Ω, através de toda a resistência do potenciómetro
(10kilohms), através do limpador, e, em seguida, através do LED. Mesmo quando o potenciômetro está
ligado todo o caminho, a resistência mínima em série com o LED será 175Ω (o suficiente para atual
limite-lo com segurança). Como os DigiPots são ajustados, a resistência aumenta e diminui, mudando o
cur-rent através do diodo emissor de luz e, por conseguinte, o seu brilho. Este método de controle de
brilho pode ser muito útil se você tiver esgotado todas as suas modulação (PWM) pins -capable por
largura de pulso.

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.

Verifique que a sua fiação corresponde ao esquema de ligações e mova


para a próxima seção, onde você escreve o software que vai controlar o brilho LED.

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:

1. Traga o pino SS para a baixa de chips.

2. Enviar o byte de registo / comando apropriado para escolher qual potenti-ometer você está
indo para gravar.

3. Enviar um valor entre 0e 128.

4. Traga o pino SS para este chip de alta.


Capítulo 9 ■ O Bus SPI 191

Imagem criada com o Fritzing.

Figura 9-6: configuração LED Potenciómetro

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

.início()comando permite inicializar a interface SPI no hardware


SPI pinos do Arduino, e você pode usar SPI.transfer () para enviar dados realmente
sobre o barramento SPI.
192 parte III ■ Interfaces de comunicação

Listagem 9-1: Controle SPI de Múltiplos Digital Potentiometers-SPI_led.ino

// Mudanças brilho LED usando entrada de tensão, em vez de PWM

// Incluir biblioteca SPI


#include <SPI.h>

// Ao usar a biblioteca SPI, você só tem que se preocupar // sobre a


escolha de seu escravo seleciona // Por padrão, 11 = MOSI, 12 =
MISO, 13 = CLKconst int SS1 = 10; // Slave Select Chip 1const int
SS2 = 9; // Slave Select Chip 2

byte REG0 const = B00000000; // Registra 0 Write commandconst byte REG1


= B00010000; // Registra um comando Write

void setup ()
{
// Definir as direções pinos para
SSpinMode (SS1, OUTPUT);
pinMode (SS2, OUTPUT);

// Inicializar
SPISPI.begin ();

// Isto irá definir um LED para o nível specififed // Chip


1 (SS 10) Cadastre-se 0 é Red // Chip 1 (SS 10) Resiter
1 é amarelo // Chip 2 (SS 9) Cadastre 0 é verde // Chip
2 (SS 9) Registo 1 é Bluevoid setled (SS int, reg int, int
level)

{
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.

NOTA Intencionalmente, thisprojectisdesignedasajumping-offpoint; YouMake


asimpleaudiovisualdisplaythatyoucanexpandoninsoftwaretocreatemuchmoreinspiredprojects.Getthisexampleworkingfirst; então,
seehowyoucanbuilduponittomakesomethingtrulypersonal.ThisexerciseoffersanidealopportunitytogetcreativewithyourArduino.

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

diagrama de fiação na Figura 9-7.

Imagem criada com o Fritzing.

Figura 9-7: configuração LED Potenciómetro


Capítulo 9 ■ O SPI Bus 195

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 ().

Listagem 9-2: LED e alto-falante Volume SPI potenciômetros digitais Control-LED_speaker.ino

// Muda o brilho de LED usando entrada de tensão, em vez de PWM // controla o


volume alto-falante e tom

// Incluir biblioteca SPI


#include <SPI.h>

int COLUNA const = 8; // Speaker Pinint freq =


100;

// Ao usar a biblioteca SPI, você só tem que se preocupar // sobre a


escolha de seu escravo seleciona // Por padrão, 11 = MOSI, 12 =
MISO, 13 = CLKconst int SS1 = 10; // Slave Select Chip 1const int
SS2 = 9; // Slave Select Chip 2

byte REG0 const = B00000000; // Registra 0 Write commandconst byte REG1


= B00010000; // Registra um comando Write

void setup ()
{
// Definir as direções pinos para
SSpinMode (SS1, OUTPUT);
pinMode (SS2, OUTPUT);

// Inicializar
SPISPI.begin ();

// Isto irá definir um pote para o nível specififed // Chip 1


(SS 10) Cadastre-se 0 é Vermelho
196 parte III ■ Interfaces de comunicação

// Chip 1 (SS 10) Resiter 1 é amarelo // Chip 2 (SS 9)


Cadastre 0 é verde // Chip 2 (SS 9) Registo 1 é o
Speakervoid setreg (int SS, reg int, int level)

{
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
■■

de distância infravermelho [IR] pode controlar a frequência do alto-falante com base no


movimento na frente da unidade).

Correlacionar a intensidade LED com uma métrica diferente, como a temperatura.


■■

Adicionar um botão de pressão filtrada por permitir-lhe escolher dinamicamente o volume


■■

ou frequência do alto-falante.

Seqüências de luzes programa que correspondem-se com a música simples.


■■

NOTA Towatchademovideooftheaudiovisualplatforminaction:
www.exploringarduino.com/content/ch9.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

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
■■

entre o Arduino e dispositivos escravos.

Você pode conversar com vários dispositivos de SPI ao longo das mesmas linhas de ônibus usando
■■

múltiplos pinos SS.

Você pode controlar potenciômetros SPI usando a Biblioteca Arduino.


■■

Você aprendeu a mergulhar mais profundamente compreender e trabalhar com folhas de


■■

dados.

Você aprendeu a ajustar simultaneamente o volume do altifalante e frequência usando a


■■

biblioteca tom emparelhado com um potenciômetro digital SPI.


Capítulo

10

interface com
Telas de cristal líquido

Peças que você vai precisar para este capítulo

Arduino UnoUSB cabo (A a B para


a ONU) SpeakerPushbuttons (n2)
LCD pequeno DC caráter fan16x2

4.7kΩ resistores (n2) 10kohms resistores (n2) 150Ω


resistor10kΩ potentiometerTC74A0-5.0VAT I2C
temperatura sensorJumper wiresBreadboard

199
200 parte III ■ Interfaces de comunicação

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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.

NOTA TowatchavideotutorialaboutinterfacingtoanLCD, check-out


crystal-monitores www.jeremyblum.com/2011/07/31/tutorial-13-for-arduino-liquid-
~~number=plural.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

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).

Se o monitor não veio com um cabeçalho de 16 pinos já soldadas na, você


precisa soldar um no de modo que você pode facilmente instalá-lo em sua placa de ensaio. Com o
cabeçalho soldadas com sucesso, o seu LCD deve se parecer com o mostrado na Figura 10-1, e você
pode inseri-lo em sua placa de ensaio.

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.

Figura 10-1: LCD com cabeçalhos soldadas na

Tabela 10-1: Pinos LCD paralelas

NÚMERO DO PIN NOME PIN PIN PROPÓSITO

1 VSS ligação à terra

2 VDD + Conexão 5V

3 V0 ajuste de contraste (para potenciômetro)

4 RS Registre-selecção (Personagem vs. Command)

5 RW Ler escrever

6 PT Habilitar

7 D0 linha de dados 0 (não utilizado)

8 D1 linha de dados 1 (não utilizado)

9 D2 linha de dados 2 (não utilizado)

10 D3 linha de dados 3 (não utilizado)

11 D4 linha de dados 4

12 D5 linha de dados 3

13 D6 linha de dados 6

14 D7 linha de dados 7

15 UMA ânodo Backlight

16 K cátodo Backlight
202 parte III ■ Interfaces de comunicação

Aqui está uma repartição das conexões de pinos:

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ó
■■

está escrevendo para a exibição e nunca ler a partir dele.

O pino PT é usado para dizer o LCD quando os dados está pronto.


■■

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.

Você pode conectar os pinos de comunicação do LCD para os pinos de I / O no


Arduino. Neste capítulo, eles são ligados como mostrado na Tabela 10-2.

Tabela 10-2: Conexões de comunicação Pinos

PIN LCD NÚMERO ARDUINO PIN

RS Pin 2

PT Pin 3

D4 Pin 4

D5 Pin 5

D6 Pin 6

D7 pino 7

Referenciar o esquema de ligações mostra a Figura 10-2 e ligar o seu LCD


em conformidade.
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 203

Imagem criada com o Fritzing.


Figura 10-2: LCD ligado a breadboard e Arduino

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

O Arduino IDE inclui o Cristal líquido biblioteca, um conjunto de funções que


faz com que seja muito fácil de interface com o LCD paralelo que você está usando. o
Cristal líquido biblioteca tem uma quantidade impressionante de funcionalidade, incluindo
piscando o cursor, a rolagem automaticamente o texto, criar personagens personalizadas e mudando a
direção da impressão de texto. Este capítulo não compreende todas as funções, mas em vez disso dá-
lhe as ferramentas que você precisa para entender a interface
204 parte III ■ Interfaces de comunicação

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>

Em seguida, inicializar um objecto LCD, como se segue:

lcd LiquidCrystal (2,3,4,5,6,7);

Os argumentos para a inicialização LCD representam os pinos do Arduino con-


RS conectado a, en, D4, D5, D6, D7 e, por essa ordem. Na configuração, você chamar a biblioteca
deinício()função para configurar o display LCD com o tamanho dos caracteres. (O que eu estou usando é
um 16n2 de exibição, mas você pode estar usando um outro tamanho, como um 20n4.) Os argumentos
para este comando representam o número de colunas e o número de linhas, respectivamente:

lcd.begin (16, 2);

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:

lcd.setCursor (0,1); lcd.print


( "Jeremy Blum");

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.

ATENÇÃO Thelibrarydoesnotcheckforstringsthataretoolong.So, ifyou


trytoprintastringstartingatposition0thatislongerthanthenumberofcharac-tersintherowyouareaddressing,
youmightnoticestrangebehavior.Makesuretocheckthatwhateveryouareprintingwillfitonthedisplay!
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 205

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.

Listagem 10-1: Texto LCD com um número-LCD_text.ino Incrementando

// Texto LCD com o número incrementando

// Incluir o código da biblioteca:


#include <LiquidCrystal.h>

// Iniciar o tempo no
momento 0int = 0;

// Inicializar a biblioteca com os números da interface pinsLiquidCrystal LCD (2,


3, 4, 5, 6, 7);

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 ++;

Este programa combina todos os passos que você aprendeu anteriormente. o


biblioteca é primeiro inserido no topo do programa. UMA Tempovariável é rubricam
zada a 0, De modo que possa ser incrementado uma vez por segundo durante o loop (). UMA
LiquidCrysalobjeto chamado lcdé criada com os pinos adequados atribuído com base
no circuito você já cablado. Na configuração, o LCD é configurado como
Tendo em 16 colunas e linhas 2, chamando lcd.begin (16,2) . Porque o primeiro
linha nunca muda, ele pode ser escrito na configuração. Isso é feito com uma chamada paralcd.print ()
. Note-se que a posição do cursor não necessita de ser definido em primeiro lugar,
206 parte III ■ Interfaces de comunicação

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

número. A visualização é atualizada uma vez por segundo com a incrementado


Tempovalor.

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

capacidade de fazer uma barra de progresso de animação que passa no visor.


Depois disso, você tirar proveito de personagens personalizados para adicionar um sinal grau ao medir e
exibir a temperatura.

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:

byte p20 [8] =


{B10000, B10000,
B10000, B10000,
B10000, B10000,
B10000, B10000,

};

Eu escolhi para chamar essa matrizp20de, Para


bytesrepresentar que ele está enchendo 20 por cento dos
uma quadra de caracteres (opsignifica por cento).
No configuração()função, chamar a createChar ()função para atribuir o seu byte
matriz para um ID de caráter personalizado. IDs de caracteres personalizada começam em 0 e vai até 7, de modo
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 207

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:

lcd.createChar (0, p20);

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 ((byte) 0);

Na linha anterior, (byte)lança, ou alterações, a 0a um valor de byte. Isto é


necessário só quando se escreve ID caráter 0directamente (sem uma variável que está
definido como 0), para impedir que o compilador Arduino jogando um erro causado pela
o tipo de variável sendo ambígua. Tente remover o "elenco byte" e observar
O erro que os monitores Arduino IDE. Você pode escrever outras IDs de caracteres
sem ele, como este:

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.

Listagem 10-2: Atualização LCD Progress Bar Code-LCD_progress_bar.ino

// LCD com Progress Bar

// Incluir o código da biblioteca:


#include <LiquidCrystal.h>

// Inicializar a biblioteca com os números da interface pinsLiquidCrystal LCD (2,


3, 4, 5, 6, 7);

// Criar a barra de progresso charactersbyte


p20 [8] = {B10000, B10000, B10000, B10000,
B10000, B10000, B10000, B10000,

};
208 parte III ■ Interfaces de comunicação

byte p40 [8] =


{B11000, B11000,
B11000, B11000,
B11000, B11000,
B11000, B11000,

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

lcd.createChar (2, p60);


lcd.createChar (3, p80);
lcd.createChar (4, p100);

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 personagem na segunda linefor (int i = 0; i


<16; i ++)

{
// 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

}
}
}

No início de cada passagem pelo loop, a 16 caracteres de comprimento de cadeia


de espaços é escrita para a tela, limpar a barra de progresso antes de começar novamente.
O exterior para()itera loop através de todos os 16 posições. Em cada personagem posi-ção, o
interiorpara()circuito mantém o cursor lá e escreve um caráter incrementando personalizado barra de
progresso para esse local. O elenco byte não é necessária aqui, pois o ID0é definida pela jna variável
para()laço.

NOTA Towatchademovideooftheupdatingprogressbar, visita


www.exploringarduino.com/content/ch10.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

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

A configuração de hardware para este projeto é um conglomerado de projectos anteriores. Se você


quer o ventilador para ter alguma potência, você pode dirigi-lo com um transistor e

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).

Para conectar o projeto, deixe o LCD e aparar potenciômetro no mesmo LOCA


ção que em para o exemplo anterior.
Os dois botões têm um lado conectado à alimentação; o outro lado está ligado
à terra através 10kohms resistores pull-down e ao Arduino.
O alto-falante está ligado a um pino de I / O por meio de um resistor 150Ω e à terra.
A frequência do som será definido no programa.
Você ligar o I2sensor de temperatura C exatamente como você fez no Capítulo 8.
Colocando-a na frente de potenciômetro de contraste do LCD permite que você para conservar algum
espaço placa de ensaio e encaixar tudo na mesma metade do tamanho do pão-board que você tem
usado até agora. O diagrama na Figura 10-3 mostra a configuração de fiação completa, com tudo o
que precisa para criar este projeto. O símbolo para o sensor de temperatura TC74 foi feita
parcialmente transparente

de modo que você pode ver o potenciômetro por trás dele.


Imagem criada com o Fritzing.

Figura 10-3: sistema de termostato LCD


Capítulo 10 ■ Interface com ecrãs de cristais líquidos 211

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.

Figura 10-4: tela de LCD

o "Atual:"e "Conjunto:"cordas são estáticos; eles podem ser gravados no


tela de uma vez no início e deixou lá. Do mesmo modo, porque as temperaturas são assumidos como
sendo dois dígitos, é possível colocar tanto estaticamente
"$C "cordas para o
locais corretos. A leitura atual será exibido na posição (8,0)e
será actualizado em cada corrida através do loop (). O desejado, ou definida, temperatura
tura será colocado em posição (8,1)e atualizada a cada vez que um botão é utilizado
para ajustar o seu valor. O indicador de fã no canto inferior direito da tela estará em posição (15,1). Ele
deve atualizar para refletir o estado do ventilador toda vez que ela muda.

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.

// Grau grau personalizado


characterbyte [8] = {B00110,
B01001, B01001, B00110, B00000,
B00000, B00000, B00000,

};
212 parte III ■ Interfaces de comunicação

// Personalizado "fã no" fan_on


indicatorbyte [8] = {B00100,
B10101, B01110, B11111, B01110,
B10101, B00100, B00000,

};

// Personalizado "fan off"


indicatorbyte fan_off [8] =
{B00100, B00100, B00100,
B11111, B00100, B00100, B00100,
B00000,

};

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

// Imprime uma mensagem estático para o


LCDlcd.setCursor (0,0); lcd.print ( "Current:");
lcd.setCursor (10,0); lcd.write ((byte) 0);
lcd.setCursor ( 11,0); lcd.print ( "C");
lcd.setCursor (0,1); lcd.print ( "Set:");
lcd.setCursor (10,1); lcd.write ((byte) 0 );
lcd.setCursor (11,1); lcd.print ( "C");
lcd.setCursor (15,1); lcd.write (1);
Capítulo 10 ■ Interface com ecrãs de cristais líquidos 213

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:

// Variáveis para debouncingboolean


lastDownTempButton = LOW; boolean
currentDownTempButton = LOW; boolean
lastUpTempButton = LOW; boolean
currentUpTempButton = LOW;

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:

// Debounce tanto buttonscurrentDownTempButton = estabilização (lastDownTempButton,


DOWN_BUTTON); currentUpTempButton = estabilização (lastUpTempButton, UP_BUTTON);

// Abaixe o tempif set (lastDownTempButton == LOW && currentDownTempButton == HIGH)

{
set_temp--;
}
214 parte III ■ Interfaces de comunicação

// Ligue-se o conjunto tempelse if (lastUpTempButton == LOW && currentUpTempButton ==


HIGH)

{
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

tom()emparelhado com demora()e um nenhum()comando. Você pode adicionar uma vez


argumento de duração para tom()para determinar a duração do som. Você quer ter certeza de que o
tom joga apenas uma vez por isso (e não um sinal sonoro sempre quando acima da temperatura
definida).

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.

Quando o ventilador é ligado, um indicador mudanças no LCD (representado pela


caractere personalizado definido na parte superior do programa). O seguinte trecho de código verifica a
temperatura e controla o alto-falante, o indicador de fã no LCD, eo ventilador:

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

// Desligue o altifalante quando é doneelse

{
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.

Listagem 10-3: Termostato pessoal Programa-LCD_thermostat.ino

// Mantenha-se fresco! Este é um thermostat.//This assume as


temperaturas são sempre dois dígitos

// Incluir biblioteca Wire I2C e definir o endereço


#include <Wire.h>
#define TEMP_ADDR 72

// Inclua a biblioteca de LCD e inicializar:


#include <LiquidCrystal.h>
216 parte III ■ Interfaces de comunicação

LiquidCrystal LCD (2, 3, 4, 5, 6, 7);

// Grau grau personalizado


characterbyte [8] = {B00110,
B01001, B01001, B00110, B00000,
B00000, B00000, B00000,

};

// Personalizado "fã no" fan_on


indicatorbyte [8] = {B00100,
B10101, B01110, B11111, B01110,
B10101, B00100, B00000,

};

// Personalizado "fan off"


indicatorbyte fan_off [8] =
{B00100, B00100, B00100,
B11111, B00100, B00100, B00100,
B00000,

};

// Pin Connectionsconst int COLUNA =


8; const int DOWN_BUTTON = 9; const
int UP_BUTTON = 10; const int FAN =
11;

// Variáveis para debouncingboolean


lastDownTempButton = LOW; boolean
currentDownTempButton = LOW; boolean
lastUpTempButton = LOW; boolean
currentUpTempButton = LOW;

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

// Criar um objeto de fio para a sensorWire.begin


temporário ();

// Configurar o número do LCD de colunas e rowslcd.begin (16,


2);

// Faça o costume
characterslcd.createChar (0, grau);
lcd.createChar (1, fan_off);
lcd.createChar (2, fan_on);

// Imprime uma mensagem estático para o


LCDlcd.setCursor (0,0); lcd.print ( "Current:");
lcd.setCursor (10,0); lcd.write ((byte) 0);
lcd.setCursor ( 11,0); lcd.print ( "C");
lcd.setCursor (0,1); lcd.print ( "Set:");
lcd.setCursor (10,1); lcd.write ((byte) 0 );
lcd.setCursor (11,1); lcd.print ( "C");
lcd.setCursor (15,1); lcd.write (1);

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

while (Wire.available () == 0); // Espera responseint c = Wire.read


(); // Obter a temperatura no Clcd.setCursor (8,0); // Move o
cursorlcd.print (c); // Imprimir este novo valor

// Debounce tanto buttonscurrentDownTempButton = estabilização (lastDownTempButton,


DOWN_BUTTON); currentUpTempButton = estabilização (lastUpTempButton, UP_BUTTON);

// Abaixe o tempif set (lastDownTempButton == LOW && currentDownTempButton == HIGH)

{
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;

// Está muito quente! If


(c> = set_temp)

{
// 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

one_time = false; digitalWrite


(FAN, LOW); lcd.setCursor (15,1);
lcd.write (1);

}
}

Você não precisa mais ter o Arduino e componentes amarrado ao


computador para ver qual é a temperatura. Se quiser, você pode conectar uma fonte de alimentação
da bateria ou na parede e colocá-lo em qualquer lugar no seu quarto.

NOTA Towatchademovideoofthispersonalthermostatinaction, check-out


www.exploringarduino.com/content/ch10.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

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
■■

de acordo com o quão longe sobre o conjunto de temperatura que você é.

Adicionar indicadores LED que exibem alertas visuais.


■■

Faça o alerta alto-falante em uma melodia em vez de um tom.


■■

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

Neste capítulo, você aprendeu sobre o seguinte:

LCDs paralelas pode ser conectado com o Arduino através de um padrão


■■

esquema de fiação.

Você pode criar personagens personalizadas para o seu LCD, gerando mapas de bits
■■

arbitrários.

Você pode modificar a sua função de estabilização do Capítulo 2 para debounce


■■

vários botões.

Você pode combinar vários sensores, motores, botões, e exibe em um projecto coerente.
■■
Capítulo

11

Comunicação sem fio com


XBee rádios

Peças que você vai precisar para este capítulo

Dois Arduinos (Unos e / ou Leonardos recomendado) cabos USB para o


abastecimento de programação ArduinosPower para cada Arduino
(opcionalmente de energia através de USB) XBee Series ExplorerXBee
SparkFun USB 1 rádio (n2) escudos XBee (n2) resistências PushbuttonPiezo
buzzerCommon cátodo RGB LED10KΩ resistor10KΩ potentiometer150Ω
resistor220Ω (n3) Jumper wiresBreadboards (n2)

221
222 parte III ■ Interfaces de comunicação

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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.

É hora de untether! Um requisito comum em muitos projetos de microcontroladores


é a conectividade sem fio. Há muitas maneiras de conseguir a conectividade sem fio, mas um dos
métodos mais fáceis com o Arduino é usar rádios XBee, que são produzidos por uma empresa
denominada Digi. XBees agir como um fio de passagem de série, permitindo que você use a impressão
em série e ler comandos que você já aprendeu sobre. Este capítulo se concentra apenas na comunicação
XBee, mas não cobrir algumas das advertências que você deve compreender quando se usa qualquer
forma de comunicação sem fio.

XBees facilitam a comunicação sem fio entre o Arduino e


seu computador ou entre vários Arduinos. Neste capítulo, você aprenderá como para facilitar ambos.

NOTA TofollowavideotutorialaboutusingXBeeradios, visitawww.jeremyblum


.com / 2011/02/27 / arduino-tutorial-9-wireless-comunicação /.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthisc

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).

XBees são geralmente usados em uma panela ponto-a-ponto ou multiponto um ponto-a-


configuração; A Figura 11-1 mostra exemplos de ambos. Ponto-a-ponto é útil quando
Você quer simplesmente substituir a comunicação serial com fio entre duas unidades remotas. Ponto-
a-multiponto é muitas vezes usado para redes de sensores distribuídos.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 223

Figura 11-1: configurações PAN

XBeeRadios

rádios XBee podem se comunicar em um modo de interface de programação de aplicações (API),


e pass-through uma série simples de modo. No modo de API, eles podem transmitir directamente estados
I / O pinos digitais ou analógicos. Isso permite que você tenha um transmissor de estação meteorológica
sem microcontrolador, por exemplo. Neste capítulo, você usa os XBees como uma simples passagem serial.
dados seriais enviada em uma rádio sai do outro e vice-versa. Usando este método, você pode usar as
XBees como um drop-in substituí-mento para uma conexão serial com fio (ou entre dois Arduinos ou entre
um Arduino eo computador).

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ê

provavelmente têm 1. Série Eles se parecem com os da Figura 11-2.


Crédito: SparkFun [fotógrafo Juan Peña],
.
www.sparkfun.com

Figura 11-2: XBee série 1 rádios


224 parte III ■ Interfaces de comunicação

NOTA Series1andSeries2modulesarenãocompatiblewitheachother.You
canuseeitherone (aslongasbothradiosarethesameseries), butIstronglyrec-ommendusingSeries1ifyouarejuststartingout.Series1module

Há outras diferenças em cada série de XBee bem. Há Pro e


não-Pro versões da maioria dos módulos XBee. As versões Pro são completamente com-patíveis com os
seus homólogos não-Pro, mas consomem mais energia, custam mais, são um pouco mais, e têm um
alcance significativamente mais longa (cerca de 1 milha contra

300 pés). Eu recomendo começar com a versão mais barata, não-Pro, e


atualizar mais tarde, se você achar que precisa de mais variedade.
Além disso, alguns rádios estão disponíveis em versões de 2,4 GHz e 900 MHz. 900MHz
cai em outra parte da banda ISM e é legal para uso pessoal, em alguns países, mas não em outros.
900MHz, porque é uma frequência mais baixa, alcança

maior alcance e é melhor em paredes penetrantes. Os módulos de 900MHz e 2.4GHz


módulos não podem se comunicar uns com os outros.
Finalmente, os módulos XBee vêm com várias opções de antena: built-in fio
antenas, antenas de rastreamento, antenas de chips e conectores antena externa. Escolha qualquer
opção se adapte às suas necessidades; geralmente você pode obter um melhor gama com uma antena
externa, mas ele vai ocupar mais espaço.

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.

ATENÇÃO IfyousupplyanXBeeradiowith5Vonthesupplypin, youwillruin


thecomponent.

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.

Nível de lógica Shifting

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.

Associar LED e LED RSSI

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.

UART Seleção jumper ou interruptor

O rádio XBee comunica com o Arduino via um serial universal


Asynchronous Receiver / Transmitter (UART) conexão (RX e TX). No caso dos Arduinos outros do que a
mega e Due, há apenas um UART disponível que é duplex para a conexão serial USB que você usa para
comu-nicar com o seu computador para programação e depuração. O Leonardo (e placas semelhantes)
tem apenas um UART, mas pode ser dedicada aos pinos RX / TX, porque a interface de programação USB
é conectado à unidade de microcontrolador (MCU) directamente. No caso do Uno, isso levanta uma
questão: Como pode o módulo XBee e interface de seu computador tanto ser conectado a única UART do
Arduino, ao mesmo tempo? Quando o escudo está ligado, a ligação dos pinos de RX e TX parece com o
diagrama mostrado na Figura 11-5.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 227

Figura 11-5: Colisão linhas de comunicação UART

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.

Devido a esta condição de colisão, e complexidades sobre os condutores


para essas portas I / O, você não pode programar o Arduino ou falar a partir do seu computador enquanto
o XBee está conectado à porta serial do Arduino. Você pode lidar com isso de duas maneiras:

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 é
■■

conectado por meio do Arduino.

Quando quiser programar o seu Arduino, você precisa remover a


XBee escudo, ou certifique-se de definir o seu escudo de jumper / interruptor de modo que o XBee é
desconectado.

Hardware vs. Software UART Opção serial Connection

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

SoftwareSerialcomandos ao longo deste capítulo no lugar do tradicional Serialcomandos durante a


comunicação com o rádio XBee.

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

Crédito: SparkFun [fotógrafo Juan Peña],


www.sparkfun.com
Figura 11-6: SparkFun Explorador USB

Opção de programação 1: Usando o Uno como programador (não


recomendado)

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.

Depois de retirar o chip ATmega, coloque o escudo XBee eo rádio XBee


e ligar o Arduino ao computador via USB. Agora, todos os comandos de série que você enviar irá para o
XBee ao invés de seu chip ATmega. (Verifique a documentação spe-espe- para a sua placa para ver se é
necessário definir um jumper ou interruptor para a comunicação acontecer.)
230 parte III ■ Interfaces de comunicação

Opção de programação 2: Usando o SparkFun USB Explorer (recomendado)

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
■■

si devem ser atribuídos à mesma ID PAN.

MEU: Meu endereço. Este é um endereço único que identifica cada XBee dentro de uma
■■

determinada rede de área pessoal.

DL:endereço de destino. Este é o endereço exclusivo do XBee que deseja que esse XBee para
■■

falar / ouvir.

BD:Taxa de transmissão. A taxa em que os rádios comunicar com. Usaremos 9600


■■

transmissão para este valor, que é o padrão.

Estes valores estão apresentados na Figura 11-7 para um sistema de dois XBee usando os valores
que irá configurar no passo seguinte.

XBee Crédito da foto: SparkFun


[Fotógrafo Juan Peña],
www.sparkfun.com

Figura 11-7: XBee ponto-a-ponto sistema


Capítulo 11 ■ Comunicação sem fio com XBee rádios 231

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

Figura 11-8: janela principal do X-CTU

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

na Figura 11-9 deve aparecer confirmando a corrente de informações de configuração


foi lido a partir do rádio.

Figura 11-9: confirmação de consulta X-CTU


Capítulo 11 ■ Comunicação sem fio com XBee rádios 233

3. Navegue até a tela de configuração do modem e clique no botão Ler para


exibir todas as opções de configuração disponíveis no seu XBee eo que eles
estão no. O resultado deve ser semelhante à Figura 11-10.

Figura 11-10: configuração do modem X-CTU

4. Agora, você define o ID PAN, endereço de origem e endereço de destino. Você


pode definir muitas outras opções de configuração, bem como, mas vamos nos concentrar em apenas est
configurações neste livro. Para alterar uma configuração, basta clicar nele para torná-lo editável.
Defina o seguinte:

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

Figura 11-11: Configurações escrito para XBee

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

para esta segunda XBee.

Figura 11-12: Configurações de escrita para a segunda XBee


Capítulo 11 ■ Comunicação sem fio com XBee rádios 235

Ambos os XBees estão agora configurado e pronto para a comunicação com


entre si. Ao atribuir-lhes um ID PAN não padrão, você reduz o risco de que eles vão interferir com
outras redes XBee. Se você configurou com sucesso

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:

1. No terminal, digite o comando tela / dev / ttyUSB6 9600(substituindo


/ Dev / yytUSB6com o nome de sua porta serial) e pressione Enter.

Ao pressionar Enter, uma conexão é iniciada para o terminal serial XBee,


ea tela fica em branco. Uma vez conectado ao rádio, enquanto você digita os comandos, eles
vãonãoaparece no terminal. O XBee não ecoar seu texto volta para você.

Em primeiro lugar, eu explico o processo de programação, e então eu fornecer uma lista de


Comandos para entrar no terminal. Para programar o XBee, você precisa para concluir estes
passos:

uma. Coloque o XBee no modo de programação.

b. Defina o ID PAN (ATID).

c. Defina o endereço de origem (ATMY).

d. Defina o endereço de destino (ATDL).

e. Faça os ajustes para a memória não volátil do XBee (ATWR).

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.

3. Digite ATID1234e pressione Enter. Isso define o PAN ID como 1234.

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.

NOTA Ifatanytimeyouareexitedfromtheprogrammingmode, youcanreen-


teritbytyping+++andpickingupwhereyouleftoff.

Depois de concluir todas as etapas anteriores, substitua cuidadosamente a XBee com


seu outro módulo. Em seguida, execute os mesmos passos, mas trocar os valores para ATMY e ATDL
para que os XBees são configurados para falar uns com os outros.

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

USB com um computador ou um adaptador de parede 5V

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

adaptador de parede para tomadas dos EUA.

www.adafruit.com
Crédito: Indústrias Adafruit,

Figura 11-13: adaptador de parede USB 5V

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

Adaptadores de parede de energia

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.

O Arduino requer um DC plugue barril jack 2,1 milímetros de centro-positivo. em outra


palavras, o interior da tomada deve estar a uma voltagem positiva, e o lado de fora con-tacto deve ser
ligada à terra. Esta é geralmente indicada no carregador

por um símbolo que se parece com o mostrado na Figura 11-15.

Figura 11-15: símbolo de centro-positivo

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:

1. Carregar o esboço que permite alterar a cor de uma Processing


janela usando um potenciômetro conectado ao Arduino. Faça isso antes de instalar o escudo
XBee no seu Arduino, por causa das complexidades UART compartilhados que foram discutidos
anteriormente no capítulo.
240 parte III ■ Interfaces de comunicação

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

// Enviando valor POT para o computador

const int POT = 0; // Pot no pino analógico 0

int val; // Para a realização de valor pot mapeada

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

2. Desligue o Arduino a partir do seu computador e instalar o escudo XBee junto


com a XBee. Conectar um potenciômetro para entrada analógica 0 como mostrado no diagrama
de fiação na Figura 11-16.

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.

4. Ligue o XBee USB Explorer com o outro XBee programada


rádio para o seu computador com um cabo USB. (Alternativamente, você pode usar
outra placa Arduino conectado a um escudo XBee com o chip ATmega removida.) Se as rádios
estão configurados corretamente, você deve ver a luz RX na XBee Explorador USB piscar
rapidamente à medida que recebe dados.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 241

Imagem criada com o Fritzing.

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

selecionado. Listagem 11-2 repete o código.

Listagem 11-2: Código de processamento para ler dados e mudam a cor na Screen- pot_to_processing /
processing_display_color

// Esboço de processamento para ler valor e muda de cor na tela

// Import e inicializar porta serial libraryimport


processing.serial. *; Porta serial;

flutuador brilho = 0; // Para a realização de valor a partir de pot

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

fundo (0,0, brilho); // Atualiza a janela


}

serialEvent void (porta serial)


{
luminosidade = float (port.readStringUntil ( '\ n')); // Obtém val
}

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.

Listagem 11-3: Controle de LED RGB via Serial- processing_control_RGB / list_control

// Enviar várias variáveis de uma vez

// Definir LED Pinsconst int


RED = 11; const int VERDE
= 10; const int AZUL = 9;

// Variáveis para RGB levelsint


rval = 0; int gval = 0; int bval =
0;

void setup ()
{
Serial.begin (9600); // Porta serial em 9600

// configura pinos como


outputspinMode (RED, OUTPUT);
pinMode (VERDE, OUTPUT);
244 parte III ■ Interfaces de comunicação

pinMode (AZUL, OUTPUT);


}

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

if (Serial.read () == '\ n') // Feito transmissão


{
// Configura LEDanalogWrite (RED, rval);
analogWrite (VERDE, gval); analogWrite
(azul, bval);

}
}
}

Em seguida, ligar o Arduino, tal como fez no Capítulo 6 (com a adição de


a blindagem de rádio sem fio e XBee), como mostrado na Figura 11-18.
Como na seção anterior, ligar o Explorador USB ao seu computador e
lançar o esboço de processamento, que é mostrado na Listagem 11-4. Certifique-se de colocar o arquivo
hsv.jpg para a pasta de dados do esboço, como você fez no Capítulo 6 (Ele está incluído no download de
código on-line). Antes de executar o esboço, não se esqueça de definir o nome da porta serial para o
valor correto.

Listagem 11-4: Esboço de processamento para definir Arduino cores RGB -processing_control_RGB /
processing_control_RGB

importar processing.serial. *; // Import libraryPImage série


img; // Imagem Porta objectSerial; // Objeto de porta serial

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

Imagem criada com o Fritzing.

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

demonstração do sistema em ação no www.exploringarduino.com/content/ch11


antes de construir o projeto.

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.

Porque apenas fazer uma campainha genérico é chato, o Arduino receptoras


de flash luzes multicoloridas e tons alternativos para obter a sua atenção. Você pode facilmente
personalizar o sistema para adicionar seus próprios efeitos sonoros. Enquanto o sistema exterior neste
exemplo será um botão simples, você poderia substituir o botão com um sensor de infravermelhos,
sensor de luz, ou sensor de ocupação para determinar automaticamente quando alguém se aproxima.

Ao projetar um sistema multifacetado, é uma boa prática de engenharia para conceber


um sistema de criação de alto nível, tal como o mostrado na Figura 11-19. O nível de
detalhe que você usa ao projetar um tal esquema é com você. desenho
um diagrama simples como o mostrado aqui vai ajudá-lo a elaborar um plano para a construção de
cada parte do sistema individual.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 247

Figura 11-19: diagrama do sistema campainha sem fio

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).

Imagem criada com o Fritzing.

Figura 11-20: transmissor de campainha sem fio


248 parte III ■ Interfaces de comunicação

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.

Porque o transmissor presumivelmente não será perto de um computador, escolha uma


das opções de energia de no início do capítulo, que não requer energia através de USB de um
computador. No vídeo de demonstração, eu usei uma bateria de 9V ligado ao conector de barril jack. Se
você quer que isso seja um pouco mais permanente, você pode querer alimentar o circuito usando um
adaptador de parede DC.

DICA Ifyouareinterestedinmakingsomethingabitmorepolished, youcouldbuya


grande, wiredpushbuttonandwireitthroughthewalltotheArduinoontheotherside.

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

alto-falante para fazer o volume ajustável. Imagem criada com o Fritzing.

Figura 11-21: receptor de campainha sem fio


Capítulo 11 ■ Comunicação sem fio com XBee rádios 249

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

computador. É possível alargar a funcionalidade do receptor pela adição de mais


luzes, motores ou controlar um esboço de processamento do seu computador.

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,

ou ajustar o jumpers / interruptor se o escudo tem essa funcionalidade. sobre estes


Pranchas, Serialrefere-se tanto a comunicação UART sobre os pinos 0 e 1 e USB.
Se você estiver usando o Leonardo, ou de outro Arduino que tem comunicação USB
ção integrada, você usa Serialpara falar sobre USB e Serial1para falar sobre os pinos RX / TX. Você não
precisa remover um escudo XBee para programar uma placa como o Leonardo, porque a UART não é
compartilhado. O código na Listagem 11-5 foi escrito para o Leonardo e outros Arduinos semelhantes.
Se você estiver usando uma plataforma baseada em Uno, substitua as referências a

Serial1com Serial.

Listagem 11-5: Doorbell Transmissor-campainha / transmitting_arduino

// Código em execução em um Arduino para transmitir o impulso campainha

const int BUTTON = 12; // Botão no pino 12

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

Na configuração, a porta serial conectada ao XBee começa a funcionar em 9600.


A cada 50 ms, o valor da entrada digital é lido e impresso para o rádio.
digitalRead () pode ser colocada directamente no interior da declaração porque
println
o valor de saída não precisa ser usado em qualquer outro lugar no programa.

ReceiverSoftware

O software do receptor é mais complicada do que o programa transmissor. O código de exemplo


fornecido na Listagem 11-6 foi escrito para um Arduino Uno. Se você estiver usando uma placa de
Leonardo tipo, substitua
Serialcom Serial1.
Este software precisa de ouvir a porta serial, determinar se o controle remoto
botão estiver sendo pressionado, e modulam a luz / som enquanto ainda ouvindo novos dados de
entrada. A última parte é o que torna este programa complicado; você precisa usar uma técnica "sem
bloqueio", de modo que o programa não tem que chamar
demora()
em qualquer ponto. A função de bloqueio é qualquer coisa que impede o sistema de execução de
outras tarefas.demora()é um exemplo de uma função de bloqueio. Quando ele é chamado, nada
mais acontece no programa até
demora()terminou. E se
você fosse usar um demora()declaração em um esquema de comunicação como este, você seria executado
em dois problemas: A resposta do receptor para o sinal do transmissor não seria instantâneo, eo buffer de
entrada poderia transbordar porque o transmissor pode ser o envio de dados a uma taxa mais rápida do
que o receptor pode lê-lo .

O objetivo é ter um piscar de luz e para trás entre vermelho e verde,


e para ter o tom da Piezo ir e voltar entre duas frequências. Você não pode usar umademora()pelas
razões mencionadas anteriormente. Em vez de um
demora(), tu
use o millis () função, que retorna o número de milissegundos desde
o Arduino começou a correr o esboço. O interruptor de luz e alto-falante a uma taxa de uma vez a cada
100 ms. Assim, você armazenar o momento em que o interruptor anterior foi feito e procurar um
novomillis ()
valor para ser, pelo menos, maior do que a 100ms
tempo de troca anterior. Quando isso acontece, você trocar os pinos para o LED e ajustar a
frequência. Tambémloop (), Você verificar o buffer serial para uma
'0'ou
'1'e ajustar as luzes e som em conformidade.
o configuração()inicializa valores do programa. Para facilitar a mudança, você mantém
rastreamento dos estados pinos dos LEDs. Você também manter o controle da frequência da corrente e o
tempo de alternância anterior retornou de .
millis ()
Considere o código na Listagem 11-6 e carregá-lo para o seu recebimento Arduino.
Antes de carregar o código, lembre-se de definir quaisquer jumpers necessários ou remover o escudo
XBee para programar a bordo.
Capítulo 11 ■ Comunicação sem fio com XBee rádios 251

Listagem 11-6: Doorbell Receiver-campainha / receiving_arduino

// Código em execução em um Arduino para receber o valor campainha

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 ()
{

// Luz Handle e alternância de som // Se


100ms ter passedif (millis ()> = prev_time +
100)

{
// 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 ();

// Verifique se os dados de série é availableif


(Serial.available ()> 0)

{
252 parte III ■ Interfaces de comunicação

// Leia byte de datadata =


Serial.read ();

// Se o botão for pressionado, jogar tom e transformar LED onif (dados


== '1')

{
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

offLEDquando a outra luz fica ligado. No final de E se()declaração, o


tempo anterior é definido como o tempo presente para que o processo pode ser repetido.
O segundo grande E se()declaração em loop ()verifica dados seriais de entrada. Quando
uma '0'é recebido, tudo fica desligado. Quando existe um '1', E a luz
falante ligar de acordo com os valores definidos no início loop ().

NOTA WatchademovideoofthewirelessArduinodoorbellatwww.explorin-
garduino.com/content/ch11.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

■■Há uma vasta gama de modelos XBee disponíveis.

■■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
■■

exigem que você fique conectado ao computador via USB.

Você pode comunicar sem fios entre o computador e um Arduino


■■

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

Capítulo 12: Hardware e interrupções timerCapítulo 13: Registro de


dados com cartões SDCapítulo 14: Ligar o Arduino à Internet
Capítulo

12

Hardware e interrupções timer

Peças que você vai precisar para este capítulo

Arduino (Uno recomendado) cabos USB para


programação ArduinoPushbuttonPiezo
buzzerCommon catódicos resistências RGB
LED10kΩ resistor100Ω resistor150Ω resistor220Ω
(n3) 10uF eletrolítico capacitor74HC14 hex inverter
gatilho Schmitt ICJumper wiresBreadboard

257
258 Parte IV ■ Tópicos Avançados e Projetos

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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.

Figura 12-1: Como uma interrupção externa afeta o fluxo do programa

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.

Facilidade de Implementação (Software)

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.

Facilidade de Implementação (Hardware)

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

demora()em uma rotina de interrupção.


Portanto, se você precisa usar uma entrada insuflável com uma interrupção de hardware, você precisa
primeiro Debounce com hardware. Se sua entrada não saltar (como um codificador rotativo) você não
precisa se preocupar, e seu hardware não será diferente do que era com a configuração de polling.

multitarefa

Uma das razões principais para a utilização de interrupções é permitir pseudo-multitarefa.


Você nunca pode alcançar a verdadeira multitarefa em um Arduino porque existe apenas uma unidade
microcontrolador (MCU), e porque pode executar apenas um comando de cada vez. No entanto, porque ele
executa comandos tão rapidamente, você pode usar inter-Rupts para "tecer" tarefas em conjunto para que
eles aparecem para executar simultaneamente. Por exemplo, usando interrupções, você pode ser
escurecimento LEDs com

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

loop (). No caso de um codificador rotativo


que dispara apenas uma vez por revolução, faltando um pulso faz com que o seu programa de acreditar
que o motor está se movendo a metade de sua velocidade real! Para garantir que você capturar tempo
para eventos importantes como este, usando uma entrada de hardware é uma obrigação. Se você
estiver usando uma entrada mudando lentamente (como um botão), a votação pode ser suficiente.

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.

Tabela 12-1: Hardware interrupções disponíveis em vários Arduinos

BORDA INT 0 INT 1 INT 2 INT 3 INT 4 INT 5

Uno, EthernetPin 2 Pin 3 - - - -

Mega2560 Pin 2 Pin 3 Pin 21 pino 20 Pin 19 Pin 18

Leonardo Pin 3 Pin 2 Pin 0 Pin 1 - -

Estas identificações são utilizados em conjuntoattachInterrupt


com () . O primeiro argumento
mento é o ID (no caso das placas na Tabela 12-1) ou o número de pinos (no caso do Devido). Se, pelo Uno,
que deseja anexar uma interrupção para pin física 2 na placa, o primeiro argumento de

attachInterrupt () seria 0Porque


pino 2 está ligado à interrupção 0 no Uno. O Uno (e outras placas baseadas ATMega328) suporte
apenas duas interrupções externas, enquanto o mega eo Leonardo apoiar mais interrupções externas.
262 Parte IV ■ Tópicos Avançados e Projetos

Hardware interrompe trabalho de "Conexão" pinos de interrupção para determinadas funções.


Assim, o segundo argumento doattachInterrupt () é um nome de função. Se você quiser
para alternar o estado de um booleano variável cada vez que uma interrupção é acionada, você pode
escrever uma função como este, que você passa para :
attachInterrupt ()

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.

Criando um Hardware Debouncing-Circuit

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.

Primeiro, dê uma olhada em um sinal de botão comum ligado usando um pull-up


resistor. Usando um resistor pull-up em vez de um pull-down é exatamente o que você esperaria: Por
padrão, o estado do botão é puxada alta pelo resistor; quando o botão é pressionado, ele se conecta
chão para o pino de I / O e entrada vai baixa.
Capítulo 12 ■ Hardware e interrupções timer 263

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.

Figura 12-2: botão ordinária saltando antes de se estabelecer

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.

Se você conectar um capacitor através do terminal do interruptor e um resistor em


série com o interruptor, ele cria uma rede resistor-capacitor. Enquanto o interruptor não for pressionado, o
capacitor se carrega através dos resistores. Quando você pressiona o botão, o capacitor começa a
descarregar, ea saída é alta. Se o botão

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

Imagem criada com o Águia.


Figura 12-3: Criando um circuito de estabilização: a adição de um capacitor e um resistor

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.

Figura 12-4: Solavancos sinal removido com um circuito RC


Capítulo 12 ■ Hardware e interrupções timer 265

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,

Figura 12-5: Invertendo Schmitt trigger pin-out


266 Parte IV ■ Tópicos Avançados e Projetos

A saída do seu circuito de debounce vai passar por um destes invertendo


Schmitt dispara antes de finalmente ser alimentado no Arduino. O circuito resultante
diagrama parece Figura 12-6.

Imagem criada com o Águia.


Figura 12-6: O passo final para a criação de um circuito de debounce: adicionando um gatilho Schmitt invertendo

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

bom,, sinal limpo saltar-free (veja a Figura 12-7).

Figura 12-7: saída final do circuito debounce


Capítulo 12 ■ Hardware e interrupções timer 267

Agora você tem um sinal limpo bom que você pode alimentar em seu hardware
função de interrupção!

Montagem do Circuito Teste completo

De um nível esquemático, agora você entender como conectar um debouncer botão.


Para os testes que você vai correr momentaneamente, você usa um LED RGB em conjunto com um
botão para testar o seu hardware-debouncing e interromper código. Conectar um com-

circuito pleta, como mostrado no diagrama de fiação na Figura 12-8.

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

para as entradas externas, mesmo durante a execução de operações programadas


demora(). que
Lá utilizem
muitos cenários em que isso pode acontecer, mas um simples ocorre quando desaparecendo um LED
utilizando modulação por largura de pulso (PWM) via analogWrite (). Neste esboço, você tem um dos
três LEDs RGB sempre desaparecendo cima e para baixo
268 Parte IV ■ Tópicos Avançados e Projetos

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:

int volátil selectedLED = 9;

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:

attachInterrupt (0, troca, RISING);

Você precisa escrever troca()e adicioná-lo ao seu programa; este é incluído na


código de programa completo mostrado na Listagem 12-1. Isso é tudo que você tem que fazer! Depois
de ter ligado a interrupção e escreveu sua função de interrupção, você pode escrever o resto do seu
programa para fazer o que quiser. Quando a interrupção é

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.

Listagem 12-1: Interrupções de hardware para multitarefa-hw_multitask.ino

// Uso interruptor filtrada por-hardware para Controle de Interrupção

// Botão pinsconst int BUTTON_INT = 0; // Interrupção 0 (pino 2 no Uno)


const int RED = 11; LED // Red no pino int 11const VERDE = 10; LED // verde
no pino 10const int AZUL = 9; LED // azul no pino 9
Capítulo 12 ■ Hardware e interrupções timer 269

// Variáveis voláteis pode mudar dentro interruptsvolatile int


selectedLED = RED;

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

interrupções de hardware não são o único tipo de interrupção pode acionar


um Arduino; também há interrupções baseadas em temporizador. O ATMega328 (o chip utilizado no
Uno) tem três temporizadores de hardware, que podem ser usados para todos os tipos de coisas
diferentes. Na verdade, a biblioteca Arduino padrão já utiliza estes deira

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.

NOTA Timer1isusedtoenablePWMoutputonpins9and10; sowhenyou


usethislibrary, youwillbeunabletorunanalogWrite ()onthosepins.

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

Para começar, faça o download da biblioteca TimerOne, a partir do Arduino Explorando


A página web para este capítulo ou directamente a partir
https://code.google.com/p/arduino-

timerone / downloads. Descompactá-lo (mas mantê-lo dentro de uma pasta chamada


TimerOne), E
copiá-lo para a pasta de bibliotecas Arduino. O local padrão da pasta será diferente com base em
seu sistema operacional:

■■ Janelas: Documentos / Arduino / bibliotecas

■■ Mac: Documentos / Arduino / bibliotecas

■■ Linux: / home / your_user_name / sketchbook / bibliotecas


Capítulo 12 ■ Hardware e interrupções timer 271

Se o ambiente de desenvolvimento integrado Arduino (IDE) foi aberto quando


copiou a pasta TimerOne, certifique-se que seja reiniciado para que a biblioteca é carregada. Agora
você está pronto para assumir o controle Timer1 com o Arduino.

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.

Este LED piscam a cada segundo e é controlado pelo temporizador.


Se você colocar qualquer outro código
loop (),em
Ele aparecerá para executar simultaneamente.

Listagem 12-2: Simples Temporizador de interrupção Blink Test-timer1.ino

// Usando interrupções do timer com o Arduino


#include <TimerOne.h> const
int LED = 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

Quando você chamar Timer1.initialize , Está a definir o período do temporizador no


microssegundos. Neste caso, tem sido definido como desencadear a cada 1 segundo. (Há um milhão de
microssegundos em 1 segundo.) Quando você executa ,
Timer1.attachInterrupt ()
você pode escolher uma função que será executado toda vez que o período especificado tiver decorrido.
Obviamente, a função que você chama deve levar menos tempo para executar do que o tempo entre
execuções.

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

loop (), Você pode executar um simples


interface de depuração de série que imprime a chave atual e passo para a tela do seu computador. As
notas começam na oitava 2 (não soa muito bom abaixo) e ir para cima em direção a oitava 6.

Calculando a frequência de cada oitava é fácil quando você sabe a inicial


freqüência. Considere C, por exemplo. C2, onde estaremos começando, tem uma fre-quência de
cerca de 65Hz. Para chegar à C3 (130Hz), multiplicar a frequência de C2 por

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

tom()cada vez que o


botão é pressionado.

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

Imagem criada com o Fritzing.


Figura 12-9: diagrama de fiação máquina de som

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.

Listagem 12-3: Sound Machine Code-fun_with_sound.ino

// Use hardware e interrupções timer for Fun com Som

// Incluir a biblioteca TimerOne


#include <TimerOne.h>

// Botão pinsconst int BUTTON_INT = 0; // Interrupção 0 (pino 2 no Uno)


const int COLUNA = 12; // Speaker no pino 12

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

// variáveis voláteis pode mudar dentro interruptsvolatile int


key = NOTE_C; int volátil octave_multiplier = 1;

void setup ()
{
// Configurar
serialSerial.begin (9600);

pinMode (ALTO-FALANTE, OUTPUT); // O pino é invertida, por isso queremos


olhar para o nascente edgeattachInterrupt (BUTTON_INT, CHANGEKEY,
subindo);

// Configurar interruptTimer1.initialize temporizador (500000); // (.5 segundos)


Timer1.attachInterrupt (changePitch); // Executa "changePitch" em cada // temporizador
interupt

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

loop (), A chave atual, multiplicador,


e frequência são impressos ao monitor serial cada .1 segundos.

NOTA Towatchademovideoofthesoundmachine, check-out


www.exploringarduino.com/content/ch12.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

■■Há vantagens e desvantagens entre as entradas de votação e usando interrupções.

■■Arduinos diferentes têm capacidades de interrupção diferentes. O vencimento pode


interromper em qualquer pino de I / O, mas outros Arduinos têm particulares pinos
habilitado para interrupção.

■■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.

■■Você pode instalar uma biblioteca temporizador de terceiros ao adicionador temporizador de


interrupção func-cionalidade ao Arduino.

■■Você pode combinar interrupções do timer, interrupções de hardware e de votação em um


programa para permitir a execução de código pseudo-simultânea.
Capítulo

13

Registro de dados com cartões SD

Peças que você vai precisar para este capítulo

Arduino (Uno recomendado) poder cableArduino USB de alimentação


(DC, USB, ou bateria) distância do IR em tempo sensorReal relógio de
fuga (ou circuito RTC auto-montados) Cartão SD shieldSD cardJumper
wiresBreadboardComputer com leitor de cartão SD

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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 Tofollowavideotutorialaboutdatalogging, check-outwww.jeremyblum


.com / 2011/04/05 / tutorial-11-for-arduino-SD-cards-e-registro de dados /.
YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.

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:

■■ A estação meteorológica para rastrear luz, temperatura e umidade ao longo do tempo

■■ 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:

Data, hora, Value1, Value22013-05-


15,12: 00,125,2552013-05-15,12:
30,100,2002013-05-15,13:
00110215

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.

Tabela 13-1: Um arquivo CSV importado

ENCONTRO TEMPO VALUE1 VALUE2

2013/05/15 00:00 125 255

2013/05/15 00:30 100 200

2013/05/15 13:00 110 215

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.

A formatação do cartão SD a partir do Windows é fácil:

1. Insira o cartão SD no seu leitor de cartão; ele deve aparecer no My


Computador (veja a Figura 13-1).

Figura 13-1: cartão SD mostrado em Meu computador

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

Figura 13-2: opção de formato selecionada

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

a configuração de um cartão de 2 GB.

Figura 13-3: janela opção de formato


282 Parte IV ■ Tópicos Avançados e Projetos

4. Clique no botão Iniciar para formatar o cartão SD.

Em um Mac, o processo é igualmente simples:

1. Utilize o localizador para localizar e abrir o aplicativo Utilitário de Disco.

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:

1. Insira o cartão, e uma janela deve aparecer mostrando o cartão.

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

/ Dev / mmcblk0p1 , Mas sobre o seu pode ser diferente.

Figura 13-4: de comando do Linux df

3. Desmonte o cartão antes de formatá-lo usando a umountcomando.


O argumento será o nome do seu cartão SD (veja a Figura 13-5).
Capítulo 13 ■ Registro de dados com cartões SD 283

Figura 13-5: Dissociar o cartão SD no Linux

4. Formate o cartão usando o mkdosfscomando. Pode ser necessário para executar o


comando como super utilizador (utilizando o
sudocomando). Você vai passar o
-Fbandeira, especificando a utilização de um sistema de arquivos FAT. Você pode
16ou
incluir qualquer
32como o argumento bandeira para escolher FAT16 ou FAT32. Para formatar um cartão que
foi montada como / dev / mmcblk0p1, você usa o comando sudo mkdosfs
-F 16 / dev / mmcblk0p1 (Veja a Figura 13-6).

Figura 13-6: Formatar o cartão SD no Linux


284 Parte IV ■ Tópicos Avançados e Projetos

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.

Todos os escudos têm as seguintes coisas em comum:

■■ 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).

■■ Eles fornecem 3.3V para o cartão SD e vai nivelar-deslocar os níveis lógicos.

Aqui está uma lista dos escudos mais comuns:

■■ Cozinhar escudo Hacks Micro SD ( www.exploringarduino.com/parts/


cozinha-hacks-SD-escudo ) : Este escudo é utilizado para ilustrar os exemplos
neste capítulo. Este é o menor escudo das listadas aqui (e não um escudo full-size), e pode ser
conectado a qualquer uma fila de pinos de cabeçalho (8-13 sobre o Uno), ou para o seu ICSP
cabeçalho 6 pinos do Arduino. Quando ligado a pinos de 8-13, o pino de padrão 10 é ligado ao CS.
Quando conectado ao cabeçalho ISP, o pino CS pode ser conectado a qualquer pino que você
deseja. Isso é útil se você estiver utilizando outro escudo que requer o uso de pino 10. Esta bordo
de navios com um cartão SD de 2 GB (veja a Figura 13-7).
Capítulo 13 ■ Registro de dados com cartões SD 285

www.cooking-hacks.com
Crédito: Cozinhar Hacks,
Figura 13-7: Cozinhar escudo Hacks MicroSD

protetor oficial SD Arduino sem fio (


■■ www.exploringarduino.com/parts/
arduino-wireless-escudo ) : Este é o primeiro de vários Arduino "oficial"
escudos com suporte a cartão SD. Este escudo inclui circuitos para adicionar tanto um rádio
XBee e um cartão SD no seu Arduino, tornando mais fácil para combinar lições deste capítulo
com aulas a partir do capítulo 11. Nesta escudo, o CS pin do cartão SD é conectado ao pino 4 do
Arduino . Você deve manter pino 10 como uma saída, e também especificar que o pino 4 é o seu
CS, quando de run

ning seu esboço com este escudo (veja a Figura 13-8).


www.arduino.cc
Crédito: Arduino,

Figura 13-8: escudo Arduino SD sem fio


286 Parte IV ■ Tópicos Avançados e Projetos

■■ protetor oficial SD Arduino Ethernet ( www.exploringarduino.com/parts/


arduino-ethernet-escudo ) : O escudo Arduino Ethernet permite que o seu
Arduino para se conectar a uma rede com fio. Ele implementa uma interface de cartão SD,
assim, embora a sua principal finalidade é permitir o armazenamento de arquivos a ser acessado
através da rede. Tanto o controlador Ethernet eo cartão SD são dispositivos de SPI nesta escudo; o
controlador Ethernet CS está conectado

ao pino 10, eo cartão SD CS é conectado ao pino 4 (veja a Figura 13-9).

www.arduino.cc
Crédito: Arduino,
Figura 13-9: escudo Arduino Ethernet SD

■■ protetor oficial SD Arduino Wi-Fi ( www.exploringarduino.com/parts/


arduino-wi-fi e de escudo ) : Este escudo também implementa a conectividade de rede,
mas leva vantagem de um rádio Wi-Fi para fazer isso. Pelas mesmas razões que o escudo
Ethernet, que também abriga um cartão SD leitor / gravador. Tal como acontece com o escudo
Ethernet, Wi-Fi controlador CS é o pino 10, eo cartão SD CS é o pino 4. Você deve tomar cuidado
para não tentar ativar simultaneamente os dois dispositivos; apenas uma linha CS pode estar
ativo de cada vez (baixo nível lógico), como acontece com todas as configurações de SPI (veja a
Figura 13-10).
Capítulo 13 ■ Registro de dados com cartões SD 287

www.arduino.cc
Crédito: Arduino,
Figura 13-10: escudo SD Arduino Wi-Fi

adafruit escudo de registro de dados


■■ (
www.exploringarduino.com/parts/
adafruit-data-logging e de escudo ): Este escudo é particularmente bem adequado
às experiências que você vai fazer mais tarde neste capítulo porque ele inclui um chip de relógio
em tempo real (RTC) e uma interface de cartão SD. Este escudo liga o cartão SD para o pino
padrão CS e conecta um chip de relógio em tempo real para o I

2
bus C (veja a Figura 13-11).

www.adafruit.com
Crédito: Indústrias Adafruit,

Figura 13-11: adafruit escudo de registro de dados


288 Parte IV ■ Tópicos Avançados e Projetos

■■ SparkFun MicroSD escudo ( www.exploringarduino.com/parts/spark-


fun-microSD de escudo ): Este escudo é, como o escudo de cozinha Hacks, é um
escudo minimalista que só tem um slot para cartão SD. No entanto, ele também tem uma área
de prototipagem para permitir que você solda em componentes adicionais. Ele con-NECTS pino
CS do cartão SD para o pino 8 no Arduino, então você deve especificar

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 é

no lado direito quando vista a partir desse ângulo.)

Figura 13-13: escudo cartão SD montado

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

Note-se que, em vez de apenas chamar


SD.begin (CS_pin), Ele é executado dentro de um
E sedeclaração. Este tenta inicializar o cartão SD e ele retorna um status. Se isso
retornos verdade, O programa desloca-se, e uma mensagem de sucesso é impressa no terminal serial.
Se ela retorna
falso, Uma mensagem de falha é relatado, ea Retorna
comando interrompe ainda mais a execução do programa.
Você usa uma abordagem semelhante quando você está pronto para escrever uma nova linha de dados para
um arquivo de log. Se você quer escrever "Olá" para uma nova linha no arquivo, o código ficaria
assim:

Arquivos de dados = SD.open ( "log.csv", file_write); if


(DATAFILE)

{
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.

Listagem 13-1: SD Card Write Test-write_to_sd.ino

// Escreve para o cartão SD

#include <SD.h>
Capítulo 13 ■ Registro de dados com cartões SD 291

// Definir como padrão para a biblioteca cartão SD


// MOSI = pino 11 // MISO = pino 12 // SCLK = pino
13 // Nós sempre necessário definir o int CS_PIN
CS Pinconst = 10;

// Nós definimos este alto para fornecer


powerconst int POW_PIN = 8;

void setup ()
{
Serial.begin (9600); Serial.println
( "Inicialização Cartão"); // CS pin é uma
outputpinMode (CS_PIN, OUTPUT);

// Cartão irá retirar energia de 8 pinos, então configurá-lo


highpinMode (POW_PIN, OUTPUT); digitalWrite (POW_PIN, HIGH);

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á!";

// Abre um arquivo e escrever nele. Arquivos de dados =


SD.open ( "log.csv", file_write); if (DATAFILE)

{
dataFile.print (timestamp); dataFile.print ( ","); dataFile.println
(dataString); dataFile.close (); // Os dados não são realmente escrito até
que // fechar a conexão!

// Imprimir mesma coisa para a tela para debuggingSerial.print


(timestamp); Serial.print ( ","); Serial.println (dataString);

}
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.

■■Cada vez através do loop, o timestampvariável é atualizado com o


tempo atual decorrido em milissegundos. Deve ser do tipo longoporque isso
irá gerar um número maior que 16 bits (o tamanho padrão de um Arduino
tipo inteiro).

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,

você deve ver algo como a Figura 13-14.

Figura 13-14: SD saída de cartão de depuração


Capítulo 13 ■ Registro de dados com cartões SD 293

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

linhas e colunas com base na localização da vírgulas delimitação e novas linhas.

Figura 13-15: Os dados registados numa folha de cálculo

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.

Figura 13-16: Criando o arquivo de comando de velocidade

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.

Para abrir um arquivo para leitura, você usar o mesmo


SD.opencomando que você usou
mais cedo, mas você não tem que especificar o file_writeparâmetro. Porque o
Arquivoclasse que você estiver usando herda da classe fluxo (assim como o Serial
classe), você pode usar muitos dos mesmos comandos úteis, como parseInt () ,
que você usou nos capítulos anteriores. Para abrir e ler a velocidade de atualização do arquivo, tudo que
você tem a fazer é esta:

Arquivo commandFile = SD.open ( "speed.txt"); if


(commandFile)

{
Serial.println ( "Reading comando Arquivo");
Capítulo 13 ■ Registro de dados com cartões SD 295

while (commandFile.available ())


{
refresh_rate commandFile.parseInt = ();
}
Serial.print ( "Refresh Rate =");
Serial.print (refresh_rate); Serial.println
( "ms");

}
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.

Listagem 13-2: SD Leitura e Escrita-sd_read_write.ino

// SD ler e escrever

#include <SD.h>

// Definir como padrão para a biblioteca cartão SD


// MOSI = pino 11 // MISO = pino 12 // SCLK = pino
13 // Nós sempre necessário definir o CS pinconst
int CS_PIN = 10; const int POW_PIN = 8;

// Taxa Padrão de 5 secondsint


refresh_rate = 5000;

void setup ()
{
Serial.begin (9600); Serial.println
( "Inicialização Cartão"); // CS pin é uma
outputpinMode (CS_PIN, OUTPUT);

// Cartão irá retirar energia de 8 pinos, então configurá-lo


highpinMode (POW_PIN, OUTPUT);
296 Parte IV ■ Tópicos Avançados e Projetos

digitalWrite (POW_PIN, HIGH);

if (! SD.begin (CS_PIN))
{
Serial.println ( "Cartão Failure"); return;

}
Serial.println ( "Cartão Ready");

// Leia as informações de configuração (speed.txt) Arquivo


commandFile = SD.open ( "speed.txt"); if (commandFile)

{
Serial.println ( "Reading comando Arquivo");

while (commandFile.available ())


{
refresh_rate commandFile.parseInt = ();
}
Serial.print ( "Refresh Rate ="); Serial.print (refresh_rate); Serial.println
( "ms"); commandFile.close (); // Fecha o arquivo quando terminar

}
outro
{
Serial.println ( "Não foi possível ler o arquivo de comando.");
Retornar;

}
}

void loop ()
{
longa timeStamp = millis (); Cordas dataString
= "Olá lá!";

// Abre um arquivo e gravar em it.File DATAFILE = SD.open


( "log.csv", file_write); if (DATAFILE)

{
dataFile.print (timestamp); dataFile.print ( ","); dataFile.println
(dataString); dataFile.close (); // Os dados não são realmente escrito até
que // fechar a conexão!

// Imprimir mesma coisa para a tela para debuggingSerial.print


(timestamp); Serial.print ( ","); Serial.println (dataString);
Capítulo 13 ■ Registro de dados com cartões SD 297

}
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.

Usando o DS1307-Real Time Clock

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

Arduino (veja a Figura 13-18).

Figura 13-18: Relógio de tempo real de fuga montado em um Arduino

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.

Imagem criada com o Fritzing.


Capítulo 13 ■ 299
Registro de dados com cartões SD 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

relógio de tempo real (RTC) de chip. Sem surpresa, a biblioteca é chamada

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 ()

comando. Na próxima seção, você usaessa funcionalidade para habilitar o registro


Imagem criada com o Fritzing.
■ UsingtheReal-TimeClock
Tópicos Avançados e Projetos

Agora é hora de combinar o relógio cartão SD e em tempo real, juntamente com o

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

Arduino. Se você estiver usando o escudo SD Cooking Hacks eo RTC adafruit


escudo, ele deve procurar algo como a Figura 13-20.
Figura 13-20:

Arduino com cartão SD montado e placas de desagregação RTC// Definir pinos


Capítulo 13 ■ Note-se que o último pino no RTC está pendurad
Registro de dados com cartões SD 301

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

Se, whenyourunyourprogram, younoticethatitsimplystopsaftera shortwhile, youmayberunningoutofRAM.Inm


Serial .impressã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

#include <SD.h> // Para falar com cartão SD

#include <Wire.h> // Para RTC


#include "RTClib.h" // Para RTC
// Definir pinos
■ // Cartão SD está nos pinos SPI padrão // RTC está no padrão I2C Pinsconst int CS_PIN = 10; const i
Tópicos Avançados e Projetos

// Taxa Padrão de 5 secondsint refresh_rate


= 5000;

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

// Início do barramento I2C eo RTC libraryWire.begin (); RTC.begin ();

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

// Inicializar Cardif SD (! SD.begin (CS_PIN))


{

Serial.println (F ( "Cartão Failure")); return;


}

Serial.println (F ( "Cartão Pronto"));


Capítulo 13 ■ Registro de dados com cartões SD 303

// Leia as informações de configuração (speed.txt) Arquivo


commandFile = SD.open ( "speed.txt"); if (commandFile)

{
Serial.println (F ( "File Reading Command"));

while (commandFile.available ())


{
refresh_rate commandFile.parseInt = ();
}
Serial.print (F ( "Refresh Rate =")); Serial.print
(refresh_rate); Serial.println (F ( "ms"));
commandFile.close ();

}
outro
{
Serial.println (F ( "Não foi possível ler o arquivo de comando."));
Retornar;

// Escreve coluna headersFile DATAFILE = SD.open ( "log.csv",


file_write); if (DATAFILE)

{
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!

// Imprimir mesma coisa para a tela para


debuggingSerial.println (F ( "\ nNova Log começado!"));
Serial.println (F ( "Data, Hora, Frase"));

}
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

segundo = String (datetime.second (), DEC);

// Concatenar as strings em data e timedate = ano + "/" +


mês + "/" + dia, o tempo = hora + ":" + minutos + ":" +
segundo;

Cordas dataString = "Olá lá!";

// Abre um arquivo e gravar em it.File DATAFILE = SD.open


( "log.csv", file_write); if (DATAFILE)

{
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!

// Imprimir mesma coisa para a tela para debuggingSerial.print


(data); Serial.print (F ( "")); Serial.print (tempo); Serial.print (F
( "")); Serial.println (dataString);

}
outro
{
Serial.println (F ( "Não foi possível abrir arquivo de log"));
}
atraso (refresh_rate);
}

A biblioteca RTC é importado pelo esboço via #include "RTClib.h" e um


RTC objeto é criado com RTC_DS1307 RTC;. O RTC é um I2dispositivo C, e depende
na biblioteca de fio, de modo que deve ser incluído, também. Esta é a mesma biblioteca que utilizou
no Capítulo 8, "A I 2
C Bus ". Em configuração(), RTC.isrunning () cheques para
ver se a RTC não estiver em execução. Se não for, a data ea hora são definidas com base no tempo de
compilação, determinado pelo relógio do seu computador. Assim que isso for definido, o

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.

Durante cada passagem do laço, o data horaobjeto é ajustado à corrente


data e hora. Você pode então extrair o ano, mês, hora, e assim por diante a partir deste objeto e
convertê-los para cadeias de caracteres que você pode concatenar no
encontroe
Capítulo 13 ■ Registro de dados com cartões SD 305

Tempovariáveis. Essas variáveis são impressos para o console de série e ao SD


arquivo de log do cartão.
Depois de executar este esboço em seu Arduino por pouco tempo, usar o computador
para ler o cartão SD e abrir o arquivo de log; ele deve ser preenchido com a data ea hora e algo parecido
com a Figura 13-21. O seu software de planilha pode

alterar automaticamente as datas em sua formatação local.

Figura 13-21: saída de planilha de teste RTC cartão SD

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.

Imagem criada com o Fritzing.

Figura 13-22: hardware logger entrada

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

Figura 13-23: Entrada logger treinados em uma porta

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

é implementado na Listagem 13-4. As pesquisas Arduino o sensor de distância a cada 50ms (e


escreve uma1para a coluna "activa" é detectado a cada movimento do tempo). Se o movimento não
está sendo detectado, ele só escreve uma
0a coluna "ativa" uma vez
cada segundo (em oposição a cada 50ms).
Listagem 13-4 mostra o software concluída para o registrador de entrada, dado o
melhorias que acabamos de descrever.

Listagem 13-4: Entrada Logger Software-entrance_logger.ino

// Logs Room Entrance Atividade

#include <SD.h> // Para falar com cartão SD


#include <Wire.h> // Para RTC
#include "RTClib.h" // Para RTC

// Definir pinos // SD Card está no padrão SPI pinos // RTC está no


padrão I2C Pinsconst int CS_PIN = 10; // SS para SD Shieldconst int
SD_POW_PIN = 8; // Alimentação para SD Shieldconst int
RTC_POW_PIN = A3; // Usado como outputconst digitais int
RTC_GND_PIN = A2; // Usado como outputconst digitais int IR_PIN =
0; // Entrada analógica 0

// Definir um RTC
objectRTC_DS1307 RTC;

// Inicializar stringsString ano, mês, dia, hora, minuto, segundo, hora, data;

// Inicializar variablesint distância raw


= 0; int raw_prev = 0; boolean ativa
= false; int update_time = 0;

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_GND_PIN, OUTPUT);

// Poder Setup e terrestres pinos para ambos os módulos


digitalWrite (SD_POW_PIN, HIGH);
Capítulo 13 ■ Registro de dados com cartões SD 309

digitalWrite (RTC_POW_PIN, HIGH); digitalWrite


(RTC_GND_PIN, LOW);

// Início do barramento I2C eo RTC libraryWire.begin ();


RTC.begin ();

// 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__));

// Inicializar Cardif SD (!
SD.begin (CS_PIN))

{
Serial.println (F ( "Cartão Failure")); return;

}
Serial.println (F ( "Cartão Pronto"));

// Escreve coluna headersFile DATAFILE = SD.open ( "log.csv",


file_write); if (DATAFILE)

{
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!

// Imprimir mesma coisa para a tela para


debuggingSerial.println (F ( "\ nNova Log começado!"));
Serial.println (F ( "Data, Hora, Raw, o Active"));

}
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

minuto = String (datetime.minute (), DEC), em segundo


lugar = String (datetime.second (), DEC);

// Concatenar as strings em data e timedate = ano + "/" +


mês + "/" + dia, o tempo = hora + ":" + minutos + ":" +
segundo;

// Reunir movimento dataraw = analogRead (IR_PIN); // Se o valor é alterado


por mais de 75 entre as leituras, // indicam movement.if (abs (matéria-
raw_prev)> 75) ativo = true; elseactive = false; raw_prev = cru;

// Abre um arquivo e gravar em it.if (ativo ||


update_time == 20)

{
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!

// Imprimir mesma coisa para a tela para debuggingSerial.print


(data); Serial.print (F ( "")); Serial.print (tempo); Serial.print (F
( "")); Serial.print (bruto); Serial.print (F ( "")); Serial.println
(ativo);

}
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

alguns minutos pode parecer.

Figura 13-24: os dados de entrada do registador em gráfico durante vários minutos


312 Parte IV ■ Tópicos Avançados e Projetos

Resumo

Neste capítulo, você aprendeu sobre o seguinte:

■■ arquivos CSV utilizar novas linhas e vírgulas como delimitadores facilmente armazenar dados
em um formato de texto simples.

■■ Você pode formatar um cartão SD no Windows, Mac ou Linux.

■■ Há uma infinidade de escudos cartão SD disponíveis, cada um com características únicas.

■■ 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

Peças que você vai precisar para este capítulo

Arduino (Uno recomendado) USB


temperatura cableArduino Ethernet
shieldPhotoresistor10kΩ
resistorTMP36 sensorRGB LED220Ω
resistores (n3) 150Ω resistorSpeaker
ou buzzerEthernet cableAccess a um
fio routerJumper wiresBreadboard

313
314 parte III ■ Interfaces de comunicação

CÓDIGO E CONTEÚDO DIGITAL PARA ESTE CAPÍTULO

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.

É isso, a fronteira final (e capítulo). Curto de lançar o seu Arduino


para o espaço, ligando-o à Internet é provavelmente o mais próximo que você vai começar a fazer o
mundo todo o seu playground. conectividade com a Internet, em geral, é um tema extremamente
complexo; você poderia facilmente escrever volumes inteiros de livros sobre a melhor maneira de
interface do Arduino com a "Internet das coisas", como é chamado agora frequentemente. Porque é
inviável para cobrir a infinidade de maneiras que você pode fazer interface seu Arduino com a web, este
capítulo concentra-se em transmitir algum conhecimento a respeito de como a conectividade de rede
funciona com o seu Arduino e como você pode usar o escudo Arduino Ethernet tanto para servir web
páginas e para transmitir dados para a web. Especificamente, você aprenderá sobre atravessando sua
topologia de rede, como uma página da web é servido, e como usar um serviço de registro de dados de
terceiros para ligar o Arduino para a "Internet das coisas".

Theweb, theArduino, andyou

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

um roteador, você precisa usar Network Address Translation (NAT).

Figura 14-1: Uma visão simplificada da web e sua rede local

Tradução do Endereço da Rede

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.

A POST é muito semelhante, mas a informação não é transmitida de modo visível


meio através do URL. Em vez disso, as mesmas variáveis são transmitidos transpa-
temente no fundo. Isso geralmente é usado para esconder informações sensíveis ou para garantir
que a página não pode ser ligada ao se ele contém informações exclusivas.

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

Anexar o escudo Ethernet para o Arduino, e se conectar Ethernet do escudo


porta a uma porta Ethernet disponível no router casa usando um cabo Ethernet. Este deve ser um cabo
Ethernet cruzado ordinária (quase todos os cabos serão marcados como "crossover" no revestimento).
Conecte o cabo USB ao seu com-putador e Arduino para a programação. Se o seu roteador não está perto
do computador que você deseja usar para a programação, o programa pela primeira vez, e, em seguida,
conectá-lo ao roteador. No entanto, alguns dos exemplos depender de informações de depuraçã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

Imagem criada com o Fritzing.


Figura 14-2: servidor Arduino ligado ao LED RGB e alto-falante

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.

Listagem 14-1: Formulário de Página HTML-server_form.html

<Form action = '' method = "get"> <input type = '' name =


'L' value = 'escondidas 7' /> <input type = "enviar" value =
"Alternar Red '/> </ form>

<Form action = '' method = "get"> <input type = '' name =


'L' value = 'escondidas 6' /> <input type = "submit 'value ='
Green Alternar" /> </ form>

<Form action = '' method = "get">


320 parte III ■ Interfaces de comunicação

<Input type = name = 'L' value = 'escondidas' '5' /> <input


type = "submit 'value =' Blue Alternar" /> </ form>

<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>

Esta página HTML inclui quatro elementos do formulário. <Form>especifica o


começando de uma forma, e </ Form>especifica o fim. Dentro de cada forma são
<Input />tags que especificar quais os dados serão passados para o servidor quando o
formulário é enviado. No caso dos botões de comutação de LED, uma variável chamada euvontade
ser passado para o servidor através de um método GET com um valor equivalente ao número de pinos I /
O que você vai ser alternando. o vazio
açaoo elemento em Formatoetiqueta
indica que a mesma página deve ser recarregada quando a variável é transmitida para o servidor. o entrada
ocultoespecifica que o valor só vai ser transmitido quando o botão Enviar é pressionado. Para o controle
deslizante frequência, estamos usando um novo HTML5

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

no seu navegador (veja a Figura 14-3).

Figura 14-3: teste o conteúdo da página Web no Chrome.

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

Conexão à rede e recuperando um IP via DHCP

Graças às maravilhas de DHCP, se conectar à rede com o Arduino


escudo Ethernet é um piscar de olhos. Antes de mostrar o código, vamos olhar para o que vai
acontecer. Na parte superior do seu programa, você deve incluir o número de série

interface de periféricos (SPI) e bibliotecas Ethernet, definir o endereço MAC do seu


escudo Ethernet (que será em uma etiqueta sobre o escudo), e criar uma instância de
EthernetServer. Dentro doconfiguração(), Você começa uma sessão de Ethernet com o
Endereço MAC que você tenha definido e iniciar o servidor web. Você pode, opcionalmente, sup-ply um
endereço IP estático ao iniciar a sessão Ethernet, mas deixando que o argumento para fora, o Arduino
vai conectar via DHCP e retornar o endereço IP atribuído através do terminal serial. então você pode
usar esse endereço IP para se conectar ao Arduino e visualizar a página web que será a anfitriã.

Respondendo a uma resposta do cliente

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.

O Arduino será sempre a verificação de conexões de cliente (a partir do seu laptop,


por exemplo) para o servidor. Quando um cliente se conecta, o Arduino responde com duas coisas: o
cabeçalho de resposta HTTP ea página web em formato HTML que foi solicitado. O cabeçalho de resposta
informa ao navegador que tipo de informação está prestes a ser enviada. Quando você tentou visitar uma
página web inexistente, você já deve ter chegado a temida "404 Resposta." O cabeçalho 404 indica ao
navegador que o servidor não conseguiu encontrar a página solicitada. Uma "resposta 200,"

Em contraste, indica que o pedido foi recebida e que o código HTML


vai ser transmitida para o navegador. Assim, no Arduino, você quer enviar um "200 Response" para o
navegador e seguir-se que com uma definição do tipo de conteúdo (HTML, neste caso). Este cabeçalho
completo se parece com isso:

HTTP / 1.1 200 OKContent-


Type: text / html

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

do HTML que você escreveu anteriormente, o comando para o controle de LED eu


é ,um
e as
comando para o ajuste de freqüência de alto-falante é um S. Dependendo de quais
delas é na URL, o programa analisa inteiros fora do URL e os controles
322 parte III ■ Interfaces de comunicação

o periférica em conformidade. Depois que isso aconteceu, umapausacomando é usado


para sair do código do circuito de cliente conectado, e ele começa a ouvir uma nova conexão do cliente
para fazer todo o processo novamente.

Putting It Together: Esboço Web Server

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.

Listagem 14-2: Web Server Code-control_led_speaker.ino

// Arduino Web Server // Algum código adaptadas de acordo com MIT


Licença de // http: //bildr.org/2011/06/arduino-ethernet-pin-control/

#include <Ethernet.h>
#include <SPI.h>

const int AZUL = 5; const int


VERDE = 6; const int RED =
7; const int COLUNA = 3;

// Para LEDS controladores e o alto-falante // Se você deseja controlar as


coisas adicionais, adicionar variáveis para // controlá-los here.int freq = 0;
pin int;

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

// Inicie o servidor no servidor de porta 80EthernetServer =


EthernetServer (80); // Porta 80

boolean receptora = false; // Para acompanhar se estamos // obtenção de


dados.

void setup ()
{
Serial.begin (9600);
Capítulo 14 ■ Ligar o Arduino à Internet 323

pinMode (RED, OUTPUT); pinMode


(VERDE, OUTPUT); pinMode (AZUL,
OUTPUT);

// Connect with DHCPif (!


Ethernet.begin (Mac))

{
Serial.println ( "Não foi possível configurar Ethernet com DHCP."); Retornar;

}
outro
{
Serial.println ( "Configurado Ethernet!");
}

// Inicie o serverserver.begin (); Serial.print ( "Servidor


Iniciado \ nLocal IP:."); Serial.println (Ethernet.localIP
());

void loop ()
{
cliente EthernetClient server.available = ();

Se (cliente)
{

// Uma solicitação HTTP termina com um lineboolean


em branco currentLineIsBlank = true; boolean
sentHeader = false;

while (client.connected ())


{
Se (client.available ())
{
char c = client.read (); // Leia a partir do buffer de entrada

if (recebendo && c == '') recebendo = false; // Terminada receivingif (c == '?')


Recebendo = true; // argumentos Encontrados

// Isto olha a requestsif GET (receber)

{
// 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

digitalWrite (pin, digitalRead (pin)!); break;

}
// 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

// Imprimir o cabeçalho de resposta ea pageif HTML (! SentHeader)

{
// 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

// Adicionar formas formulários adicionais para controlar mais coisas aqui.

sentHeader = true;
}

if (c == '\ n' && currentLineIsBlank) break;

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:

}
}

Este código executa todas as funcionalidades que foi descrito no precedente


Seções. Certifique-se de alterar o endereço MAC listado neste código para o endereço MAC impresso na
etiqueta em seu escudo Arduino. Se você não conseguir localizar o endereço, ele ainda pode trabalhar
com o endereço errado; você pode usar o que é

já enumeradas no código. Carregá-lo no seu Arduino e lançar a série


monitor. Garantir que o seu Arduino está conectado à sua rede e que o seu roteador tem DHCP
habilitado (a maioria). Após alguns segundos, a conexão DHCP deve ter sucesso, e você verá uma
mensagem que informa o endereço IP

que foi atribuída (ver Figura 14-4).

Figura 14-4: confirmação de aquisição DHCP IP via serial


326 parte III ■ Interfaces de comunicação

No caso mostrado na Figura 14-4, o Arduino foi atribuído o endereço de IP local


192.168.0.9. Este número quase certamente será diferente em sua rede, por isso não deixe de verificar o
que é! Anote esse endereço IP; agora você vai precisar usá-lo para acessar a interface web que acabam de
lançar.

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.

Controlando a sua Arduino através da 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

servidor através de barra de URL do navegador (veja a Figura 14-5).

Figura 14-5: Arduino página web controle e depuração de série


Capítulo 14 ■ Ligar o Arduino à Internet 327

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

Usando Port Forwarding Controle seu Arduino de qualquer lugar

As etapas na seção anterior permitem-lhe controlar o seu Arduino a partir


em qualquer lugar dentro de sua rede local. Isso ocorre porque o endereço IP que você está se
conectando é um endereço local, que fica atrás de seu roteador. Se você quiser controlar o seu Arduino
a partir de computadores fora de sua rede local, você precisa

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:

1. Reserve o endereço DHCP local usado pelo seu Arduino.

2. Encaminhar uma porta externa do roteador para uma porta interna apontando para o
Arduino.

3. Conecte seu roteador para um serviço de atualização de DNS dinâmico.

ATENÇÃO Thestepsinthissectionareadvancedandwilldiffer (maybedras-


ticamente) dependingonwhatkindofrouteryouhave.Iwillgeneralize, butIalsoassumesomeexistingknowledgeofrouteradministra
ingthewebforinstructionsspecifictoyourrouterforeachofthestepslisted.Ifthisisyourfirsttimeloggingintoyourrouter'sadministratio
youcouldpotentiallymessupyournetworksetup.Someroutersmaynotevensupportallthefunctionsrequiredtoenableportforwarding
rkadministra-ção, sticktolocalwebaccessfornow.

Como efetuar login no Router

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.)

Se esse endereço IP não funcionar, você precisa determinar manualmente. Em


Windows, você pode abrir um prompt de comando e digite ipconfig. Você quer
usar o endereço do gateway padrão para a conexão de rede ativa. Se você estiver em um Mac,
acesse Preferências do Sistema, vá para Rede, clique no botão Avançado, vá para a guia TCP / IP, e
usar o endereço do roteador. Se você estiver no Linux, abra um terminal, digite rota -N,e usar a última
lista de endereços Gateway que

é diferente de zero.

A reserva do seu do Arduino DHCP Endereço

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.

Depois de encontrar a opção, reserva tudo o endereço IP de seu Arduino é cur-


atualmente usando, atribuindo-o para o endereço MAC que você definir no esboço anterior.
Certifique-se de aplicar a definição, o que pode exigir reiniciar o roteador. Você pode confirmar que isso
funciona reiniciando o roteador eo Arduino e ver se o seu Arduino recebe o mesmo IP quando se
reconecta.

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 .

Encaminhar a porta 80 para o Arduino

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.

Usando uma Atualização de serviço DNS dinâmico

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.

Depois de ter determinado o seu endereço IP público (ou obtido um dinamicamente


atualizar URL), você pode inserir isso em seu navegador, e você deve se conectar ao seu Arduino. Dar
o endereço a um amigo para que eles possam testar remotamente!

SendingLiveDatatoaGraphingService

Na seção anterior, você aprendeu como transformar seu Arduino em um web


servidor que expôs uma interface web para controlar seus pinos de E / S através da rede local ou pela
Internet. No entanto, uma razão igualmente comum para conectar o Arduino para a Internet é fazer
com que nós sensores em rede. nós sensores

geralmente só transmitir informações, em vez de ouvir comandos. Porque,


Neste cenário, o Arduino será inicializar um pedido para uma entidade conhecida na web (neste caso,
você vai usar um serviço de gráficos on-line), você não tem de mexer em tudo com endereços IP de
encaminhamento, memorizando o endereço IP, e assim por diante.

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.

Criando uma conta Xively

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.

Criando um feed de dados

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

também optar por fazer o seu feed público ou privado.

Figura 14-6: Além de alimentação Xively

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.

Instalando as Bibliotecas Xively e HttpClient

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

pasta "Xively-Arduino-master" para "xively."

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".

3. Abra o ambiente de desenvolvimento integrado Arduino (IDE) (você vai precisar


reiniciá-lo se ele foi aberto quando você copiou as bibliotecas) e navegue até Arquivo>
Exemplos. Confirmar que você veja "HttpClient" e "xively" na lista de exemplos. Isto confirma
que as bibliotecas foram instaladas com êxito.

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

Fiação Up Your Arduino

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

é cabeada, conecte o Arduino ao computador e sua rede.

Imagem criada com o Fritzing.

Figura 14-7: Arduino com Ethernet escudo ligado a photoresistor

Configurando o esboço Xively e executar o código

Você já instalou as bibliotecas apropriadas e abriu o exemplo


esboço. Agora você precisa configurar, compilar e executar o código no seu Arduino. Primeiro, você vai
configurar o esboço de falar com a alimentação em sua conta Xively.

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

de antes. Localize a seção "chaves de API" (ver Figura 14-8).

Figura 14-8: Alimentação Xively e Informações API

Esta seção fornece o ID de alimentação (o primeiro número) e a chave de API (o segundo


número) para inserir em seu esboço. Os seguintes trechos de código mostrar as linhas de código que
você precisará atualizar com os valores apropriados. listagem 14-3

mostra um exemplo de o esboço completo com todos os valores inseridos (o seu


Os valores serão diferentes do que os mostrados na listagem).
Substitua o endereço MAC com seu próprio:

// Endereço MAC para o seu shieldbyte Ethernet mac [] = {0xDE, 0xAD,


0xBE, 0xEF, 0xFE, 0xED};

Substituir a chave de API Xively com seu próprio:

// Sua chave Xively para deixá-lo fazer o upload datachar


xivelyKey [] = "YOUR_XIVELY_API_KEY";

Substitua o ID de alimentação (15552 no exemplo) com seus próprios (o seu pode ter
um número diferente de dígitos):

// Finalmente, envolva os fluxos de dados em um feed feedXivelyFeed (15552, fluxos de


dados, 1 / * número de fluxos de dados * /);

Listagem 14-3 mostra o programa completo.


334 parte III ■ Interfaces de comunicação

Listagem 14-3: Xively Datastream Carregar-xively.ino

#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>

// Endereço MAC para o seu shieldbyte Ethernet mac [] = {0x90, 0xA2,


0xDA, 0x00, 0x4A, 0xE0};

// 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;

// Definir as cordas para o nosso fluxo de dados IDschar sensorId [] = "sensor_reading";


datastreams XivelyDatastream [] = {XivelyDatastream (sensorId, strlen (sensorId),
DATASTREAM_FLOAT),

};
// Finalmente, envolva os fluxos de dados em um feed feedXivelyFeed (1242622121, fluxos de dados,
1 / * número de fluxos de dados * /);

cliente EthernetClient; XivelyClient


xivelyclient (cliente);

void setup () {// Coloque o seu código de configuração


aqui, para executar uma vez: Serial.begin (9600);

Serial.println ( "Iniciando carregamento fluxo de dados único para Xively ...");


Serial.println ();

while (Ethernet.begin (Mac)! = 1)


{
Serial.println ( "Erro ao obter endereço IP via DHCP, de tentar novamente ..."); delay
(15000);

}
}

vazio loop () {int SensorValue = analogRead (sensorPin);


fluxos de dados [0] .setFloat (SensorValue);

Serial.print ( "Ler valor do sensor"); Serial.println (fluxos


de dados [0] .getFloat ());

Serial.println ( "upload para Xively"); int ret =


xivelyclient.put (alimentação, xivelyKey);
Capítulo 14 ■ Ligar o Arduino à Internet 335

Serial.print ( "xivelyclient.put retornado"); Serial.println


(ret);

Serial.println (); delay


(15000);

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.

Exibindo dados na Web

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

para se comunicar com e atualizar seu feed no servidor Xively.

Figura 14-9: Dados de luz que está sendo exibido na Xively


336 parte III ■ Interfaces de comunicação

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.

Adicionando um sensor de temperatura analógico

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á

lida pela entrada analógica 3.

Imagem criada com o Fritzing.

Figura 14-10: A adição de um sensor de temperatura TMP36

Adicionando Leituras adicionais sensor ao Datastream

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>

// Endereço MAC para o seu shieldbyte Ethernet mac [] = {0x90, 0xA2,


0xDA, 0x00, 0x4A, 0xE0};

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

// Definir as cordas para o nosso fluxo de dados IDschar lightId [] = "light_reading";


caractere IDTEMP [] = "temp_reading"; datastreams XivelyDatastream [] =
{XivelyDatastream (lightId, strlen (lightId), DATASTREAM_FLOAT), XivelyDatastream
(IDTEMP, strlen ( IDTEMP), DATASTREAM_FLOAT),

};
// Finalmente, envolva os fluxos de dados em um feed feedXivelyFeed (1242622121, fluxos de dados,
2 / * número de fluxos de dados * /);

cliente EthernetClient; XivelyClient


xivelyclient (cliente);

void setup () {// Coloque o seu código de configuração


aqui, para executar uma vez: Serial.begin (9600);

Serial.println ( "Iniciando carregamento fluxo de dados dupla para Xively ...");


Serial.println ();

while (Ethernet.begin (Mac)! = 1)


338 parte III ■ Interfaces de comunicação

{
Serial.println ( "Erro ao obter endereço IP via DHCP, de tentar novamente ..."); delay
(15000);

}
}

vazio loop () {int lightValue = analogRead


(lightPin); fluxos de dados [0] .setFloat (lightValue);

Serial.print ( "Ler valor de luz"); Serial.println (fluxos de


dados [0] .getFloat ());

int tempValue = analogRead (tempPin); fluxos de


dados [1] .setFloat (tempValue);

Serial.print ( "Ler valor temp"); Serial.println (fluxos de


dados [1] .getFloat ());

Serial.println ( "upload para Xively"); int ret =


xivelyclient.put (alimentação, xivelyKey); Serial.print
( "xivelyclient.put retornado"); Serial.println (ret);

Serial.println (); delay


(15000);

Em primeiro lugar, note que todas as referências anteriores


sensor a
foram atualizados para leve.
Agora que você está transmitindo informações de dois sensores, é uma boa prática de codificação
para diferenciá-las corretamente. UMA
IDTEMP []corrente de dados estava
adicionado e inserido no datastreams []objeto. oXivelyFeedobjeto defi-
definição foi atualizado para indicar que agora existem dois fluxos de dados em vez de um. Dentro
doloop (), As linhas que foram previamente impressão sensor de informa-ção sobre o sensor de luz foram
duplicados para imprimir as mesmas informações sobre o sensor de temperatura. Note que a
informação de luz está listado em primeiro lugar nodatastreamsobjeto, por isso é referenciado como

fluxos de dados [0]. A temperatura


informação está listado em segundo lugar no datastreamsobjeto, por isso é referenciado como
fluxos de dados [1].
Quando você executar este código no seu Arduino, a interface web automaticamente
atualiza-se para refletir seus novos fluxos de dados. Você pode querer excluir seu
velho sensor_readingfluxo de dados, comolight_reading está agora sendo atualizado
ao invés. Após vários minutos de atualizações, seus gráficos deve ser algo como Figura 14-11.
Capítulo 14 ■ Ligar o Arduino à Internet 339

Figura 14-11: gráficos Xively para múltiplos sensores

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

Neste capítulo, você aprendeu sobre o seguinte:

A Internet tem um monte de siglas. Você aprendeu os significados de IP, DHCP,


■■

DNS, MAC, e muito mais.

Você aprendeu as diferenças entre clientes e servidores.


■■

Você aprendeu o suficiente HTML básico para escrever um formulário para controlar o seu
■■

Arduino através da web.

Você correu um servidor web de sua Arduino.


■■

Você pode controlar pinos I / O em seu Arduino através da Internet.


■■

Você aprendeu a ligar o Arduino para o servidor gráfico Xively.


■■

Você aprendeu como exibir dados de vários sensores online.


■■
um endix PP

Decifrar os ATmega
Folha de Dados e Arduino
Schematics

No coração de todos os Arduinos é um microcontrolador Atmel. Este apêndice não se resume as


características de todos os microcontroladores em todos os Arduinos, mas é um exercício útil para
investigar um ATmega folha de dados para ter uma idéia melhor sobre como ele funciona. Além disso,
tendo um olhar para os esquemas de código aberto para o Arduino Uno fará com que seja mais fácil
entender como um Arduino realmente funciona.

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

www.Arduino.ccsite. Quando você tem a ficha na mão, comece por comentário-


ing a primeira página (veja a Figura A-1). Na maioria dos casos, a primeira página diz-lhe tudo o que você
precisa saber sobre as características de que MCU.

Crédito: © 2013 Atmel Corporation. Todos os direitos reservados.

Figura 1-A: A primeira página do ATmega 328p folha de dados


Apêndice ■ Decifrar o ATmega folha de dados e Arduino Schematics 343

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) é.

NOTA Thisdatasheetisactuallyhundredsofpages, andtherecouldprobably


beanentirebookdedicatedjusttointerpretingit, soIwon'tgomuchfurtherhere.However, throughouttheremainderofthisappendix, I

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.

Crédito: © 2013 Atmel Corporation.


Todos os direitos reservados.

R pu

PXn Lógica

C pino ver Figura


"General Digital I / O" para
detalhes

Figura A-2: I / O pins diagrama

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.

Crédito: © 2013 Atmel Corporation. Todos os direitos reservados.

Figura A-3: ATmega 328p DIP pin-out

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.

■■GND é, claro, a ligação à terra.


Apêndice ■ Decifrar o ATmega folha de dados e Arduino Schematics 345

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,

Figura A-4: Mapeamento Arduino ATmega Pin

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

PC1 ++ VIN PC2C2


LMV358IDGKR 47U 47u100n
GND

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

F1MF-MSMF050-2 500mA RESET (PC1 / DW) (PCINT5) PB5 ZU4


USB-B_TH USBVCC PB4 MOSI
(/ PCINT4 T1) PB4 1112
XT2 1716 MISO2 REINICIAR SS19
CD1206-S01575

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

Figura A-5: Arduino Uno Rev 3 esquemática Crédito: Arduino, www.arduino.cc


Apêndice ■ Decifrar o ATmega folha de dados e Arduino Schematics 347

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

=(Atribuição) operador, magnetômetros, 50potentiometers,


34==(Comparação) do operador, leitura, sensores, acelerômetros 45-
32&&Operador (lógico), 35 49temperature eixo 50-54triple, 51

3 bits de quantização analógico, 44-45


poder 3.3V, o poder 75V, 7, registo 82- sinais analógicos, 42
8474HC595 turno, 148-151 a conversão para digital, 43-45vs.
sinais digitais, 43

analógico para digital conversores. Vejo ADCs


UMA analogRead ()função, 45-48, 53-54analogWrite
()função, 27-29, 39-41,
acelerômetros, eixo triplo, 51actuators, servo-
motores, 80-86AD714 chips / AD715 I2C, 56-58
(conversores analógico-digitais) 166-167Adafruit
bares animados progresso, criando, 206-209anodes,
32U4 bordo de fuga, escudo registro de dados
22API modo, rádios XBee, placas 223Arduino. Veja
12adafruit, 287ADCs, 7,
também placas específicas

43-45accuracy de, dispositivos Arduino-compatíveis,


44 12components, 4-8controlling a partir da
web, 318-329
Arduino Due,
10Arduino Uno, 5Mega concepção de uma página web simples, 318-
2560, 10resolution, 320setting-se I / O hardware de controle, 318via da
44-45 rede, 326-329writing um esboço servidor, 320-326

alternate.ino arquivo, 152-153


entradas analógicas, controladores saídas analógicas, Resumo dos quadros de oficiais, as
capacidades de comunicação 8-12serial,
56-59
saídas analógicas 108-115
controlar com entradas analógicas, 56- De terceiros, comunicação 12wireless, 236-
59creating (Vejo PWM (largura de pulso 246

modulação)) dispositivos Arduino-compatíveis,


12Arduino Devido
sensores analógicos
criando, sensores 54-59distance, componentes, interrupções
giroscópios eixo 50dual, 51 10hardware, 261-262microcontroller, 6

349
350 Index ■ Um C-

BJT (transistor bipolar-junção), programa 66-


ecossistema Arduino, 4Arduino Ethernet escudo SD, escudo
286Arduino Ethernet, 317-318, 321, 332. 68Blink

componentes, 16-
Veja também conectividade com a Internet 18loading, 15-16

Arduino IDE blink.ino arquivo, 26


descarga, biblioteca 13LiquidCrystal, funções de bloqueio, variáveis
monitor de 203-209serial, 119- 250Boolean, 34-35bootloader, 6,
127servos, controlando, 85-86 "upload" botões 8bouncy, 32-35braking
de comando, 8 estado (H-ponte), 73breadboards, 21

Arduino Leonardo
interrupções de hardware, 261keyboards, fiação
emulando, 135-140microcontroller, 6, motores DC, 68-
9mouse, emulando, 140-144 69LCDs, 200-203

escovado DC (corrente contínua) Motores


Arduino Nano, controle da direção do motor, 72-79controlling
11Arduino Uno velocidade do motor, 70-72high corrente
cargas indutivas, 65-70overview, 65schematic,
resolução ADC, interrupções 44-45hardware, 66
261image de, 5microcontroller, programador
6as para o rádio XBee, 229schematic,
microcontrolador 347-349secondary, 6
brushless DC (corrente contínua) motores, 65

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

barramento I2C, 165, 169SPI


ônibus, 182, 183, 184-185
folha de dados, interface de 343- fase do relógio, polaridade 182-183clock, 182-
347programming, 6 183collector (C) pin, NPN BJT, arquivos de valores
separados por 67comma. Vejo CSV
unidade de Atmel microcontrolador (MCU), 6.
Veja também microcontroladores específicas
attachInterrupt () função, 261-262 arquivos (valores separados por vírgula)
audio / display visual, criando com SPI comentários, protocolos
DigiPots, 193-197 16communication

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

controlar o brilho de LED, 185-193controlling de estabilização () função, 213-


dispositivos de SPI, configuração 185hardware, 214debounce.inoarquivo, 33-34
183-184vs. I2C, 185overview, 182-183
debouncing
comutadores digitais, interrupção botão 35-
38hardware-filtrada por

comparação (==) Operador, 32connecting à Internet. circuitos, 262-269


Vejo Internet vários botões, 213-214
conectividade LED de depuração, 5, tipo de
dados 6decimal, capacitores
constoperador, 25restringir ()função, 56,
119decoupling, 83definition
58-59
arquivos, 95-96
restringindo leituras analógicas, servos de
rotação 58-59continuous, 80control pinos,
demora()Função, 18, 214-215
servos, 81
DHCP (Dynamic Host Configuration
control_led_speaker.ino arquivo, 322-325 Protocol), 316-317reserving endereços
Cozinhar Hacks MicroSD escudo, 284-285, DHCP, 328

289-292, 300 endereços IP recuperação, 321


ondas seno, 43Cosm. Vejo arquivos (valores DigiPots, a comunicação com barramento SPI,
separados por vírgula) XivelyCSV 185-193
entradas digitais, leitura, saídas 29-
formatação de dados com, 279 35digital

log.csvarquivo, 289-291 tábuas de madeira, 20-21,


csv_logger.ino arquivo, 137-138 23programming, LEDs 24-
25wiring, 22
resistores, personagens 36custom limitador de corrente,
acrescentando que LCDs, 206-209 sinais digitais
vs. sinais analógicos, 43converting sinais
analógicos para, 43-45
D
encadeamento registos de deslocamento, digitalRead ()comando, 31-32digitalWrite ()
linha 153data, I2C, 165, logging 169data comando, 25, 33
díodos, díodos de protecção, os motores de
corrente 67direct. Vejo motores de corrente
CSV (valores separados por vírgula) arquivos, contínua
279entrance exemplo logger, exemplo do relógio em display_temp.pdearquivo, 178
tempo 305-311real, 297-305SD cartões
sensores de distância, 50
exemplo entrada logger, sensores 305-
311sweeping, construção, 86-89
formatação, de 279-
284reading, 293-297shields, DNS (Domain Name System), 317
284-288SPI interface, para
serviços de atualização dinâmica, 328-329
288writing, 289-293
campainha / receiving_arduino ,
251-252
utiliza, 278 campainha / transmitting_arduino ,
opções de tipo de dados, 249-250
119datasheets motoristas, instalar, motores 14-
15driving
MCP4221 potenciômetros digitais, sensor 186-
189TC74 temperatura, 166-167, motores de corrente contínua,
motores 65-79servo, 80-86
169-171
leitura, 343-347 relógio de circuito integrado DS1307 em tempo real,
DC (corrente contínua) motores, 65, 80-86 298-305
controle da direção do motor, 72-79controlling giroscópios eixo duplo, 51duty ciclo, serviços de
velocidade do motor, cargas indutivas 70- actualização de DNS 28-29dynamic, 328-329Dynamic
72high circulante, 65-70as indutores, Host Configuration Protocol. Vejo
problemas causados por, 67schematic,
66wiring, 69
DHCP
DynDNS, 329
352 Index ■ E-I

E HTML (Hypertext Markup Language),


E (emissor) pin, NPN BJT, 67 316, 318-320

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

177-179 sensor, 167-173

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

ICSP (em circuito programador serial)


G
conectores, 5, 6, 8
de propósito geral I / O pins. Vejo pedidos pinsGET,
(Internet Protocol) endereços IP 316global, indutores, motores de corrente contínua como,
67Industrial, científicos e médicos (ISM)

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

5V, gerando a partir da bateria de 9V,


eu
82-84
LCD_progress_bar.inoarquivo, 207-
209LCD_text.inoarquivo, limites da fonte de alimentação do Arduino, 84
205LCD_thermostat.inoarquivo, 215-219 Linux, a formatação dos cartões SD, displays de
cristal 282-283liquid. Vejo biblioteca
LCDs (telas de cristal líquido) LCDsLiquidCrystal, 203-209
cursor, movendo-se, personagens 204-206custom,
acrescentando: 206-209initializing, termostato adicionando personagens personalizadas para LCDs,
204personal, criando, 209-219 206-209
a adição de texto para LCDs, 204-206
list_control.ino arquivo, 126-127
aviso sonoro, acrescentando: programa 214-
215complete, 215-219displaying de dados, gráficos em tempo real, criando, 329
211-213expanding, 219fan, controlando, adicionando componentes da ração, 336-
214-215hardware configuração, ponto 339building feeds de dados, 330-335
210set, ajustando, 213-214
redes locais, acesso Arduino mais,
326-327
variáveis locais, 38
lock_computer.ino arquivo,
criação, 200-203text,
140log.csvarquivo, 289-291
acrescentando: 204-206
dados de registro. Vejo logginglogical
led.inoarquivo, dados (&&) Do operador, 35
25led_button.ino arquivo, 31
loop ()função, 24, 37
LED_speaker.inoarquivo, 195-196
LUFA pilha de firmware, fluxo
LEDs 113luminous por unidade de área,
associados, 226bar 43lux, 43
gráficos

monitoramento de temperaturas, 173-


179reponding às entradas, 157-160 M
controlador MAC endereços, 316, 321, 325, 328, computadores 332-
333Mac, formatar o cartão SD,
brilho, listas 185-193with de valores,
caracteres individuais 125-127with, 122- 280-282
124
magnetômetros, 50
filtrada por-interrupção de hardware botão mapa()função, 56-59

circuitos, 262-269
354 Index ■ H-P

mapeamento termostato pessoal, criando, 209-219


analógicos leituras, 56-59frequencies notar aviso sonoro, acrescentando: programa 214-
nomes, 95-96 215complete, os dados 215-219displaying,
211-213fan, controlando, 214-
dispositivos mestres 215functionality, expandindo, 219hardware
barramento I2C, 164-166, 167- configuração, ponto 210set, ajustando, 213-
168SPI ônibus, 183, 184-185 214

MCP4231 potenciômetros digitais, 185-193


folha de dados, 186-189setting-se
hardware, software 189-190writing, fotorresistências, 54-59
190-193
piano.inoarquivo, 104 pinMode
MCUs (unidades microcontrolador) ()de comando, 25pinMode
()função, 17
Atmel, 6secondary compatível com USB,
112-114single compatível com USB, 114 pins, 7
ADC, 7BJTs, 67H-pontes, 74-75as interrupções, 261-
Mega 2560 bordo, 6, 10, 14, placa 261Mega 262LCDs, 200-203MCP4231 potenciômetros digitais,
ADK, piano 11micro, construção, unidades 102- 186-189multiplexed, escudos cartão 109SD,
105microcontroller. Vejo folhas de dados 284servos, registros 80-84shift. Vejo deslocar
MCUsmicrocontroller, 343-347motion sensores, registerssweeping sensor de distância, 87-88
305-311

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

NAT (Network Address Translation), caráter encaminhamento de porta, os


315newline, 117-118 pedidos 327-329POST, 316

nightlight.ino arquivo, 58 pot.inoarquivo, 47,


117pot_tabular.ino arquivo, 118
código sem bloqueio, 250
pot_to_processing / arduino_read_pot ,
nenhum()função, 95, 104, 214-215
NPN bipolar-junção, 66-68 240
pot_to_processing / processing_
display_color, 130, 242-243
O
potenciômetros
tipo de dados octal, a Lei de
119Ohm, 23-24, estado 31open motores de corrente contínua, ajustando velocidade, 70-
(H-ponte), 73 72, 76-79reading, impressão 45-49serial, 116-118servo
controles, 85-86SPI DigiPots

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

impressão()função, 115, 117, 119, 121, nightlight LED RGB


138, 279 adicionando sensores de luz, 56-
impressão para terminal serial, 115-119 59building, 38-42

println () função, 279, 290 rgb_nightlight.ino arquivo, 37-39


esboço de processamento routers, registrando em, 327-328RSSI LED,
instalar, comunicação 128serial, sistema de 226RTC (relógio em tempo real) de chips, 299-
monitoramento 127-134temperature, 173-179 305

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

com analogWrite (), 27-29 biblioteca SD, 284


DC velocidade do motor, controlando, 70-72 sd_read_write.ino arquivo, 295-297
sd_read_write_rtc.ino arquivo, 301-304
q linha SDA, I2C, 165,
quantização, 44 169secondary

circuitos integrados, 110, 112-


114microcontrollers, 6, fontes 112-
R 114power, motores DC, 68
limitações de memória RAM, superando, circuitos
301RC, debouncing botões, 263-265 sensores
sensores de distância, 50
read_temp.inoarquivo, 171-172, 171-182readButton
()função, 143 entrada logger, 305-311sweeping,
construção, 86-89
leitura
entradas digitais, 29- giroscópios de eixo duplo,
35potentiometers, cartões SD 51temperature, 50-54, acelerômetros
45-49from, 293-297 eixo 167-173triple, 51

readJoystick () função, 143 comunicação serial. Veja também USB


relógio exemplo, tensão 297-305reference, 44- placas communicationArduino,
45register pino do relógio, IP 149reserved (Internet 108-115
Protocol) endereços em tempo real,
Arduino IDE monitor serial, opções de tipo de
119-127data, 119printing ao terminal, 115-
119Processing esboço, 127-134vs.
328 comunicação USB, 109-110
Botão de restauração, 5, 6resistance,
divisores de tensão 23-24resistive, 55-
56resistors
de série em, paralelo out (SIPO) registos de deslocamento.
Vejo serial-to-paralelas registos de deslocamento
limitador de corrente, monitor serial, 119-127
36pulldown, 32-35pull-up, 30, exibindo dados, 46-49
31, 165, 167
modo pass-through de série, rádios XBee,
resolução, ADCs, 44-45 223
356 Index ■ S-t

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

registos de deslocamento em série-paralelo, 147-148 máquina de interromper-driven som, 272-


74HC595 registo, 148-151converting entre binário e 275pentatonic micro piano, 102-105production
decimal processo, 94properties, 92-94

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

registradores de deslocamento, 146-147 SPI_led.inoarquivo, 192-193


74HC595 registo, 148-151combining com a ondas quadradas, servos 43standard, IP 80static
comunicação I2C, (Internet Protocol) endereços,

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

shiftOut ()função, 151-154


curto-circuitos, com pontes H, comentários T
de linha 73single, 16
caractere de tabulação, 117-118TC74 sensor de
single_char_control.ino arquivo, 124 temperatura, 166, 169-171, 174
SIPO (de série no, paralela out) registos de deslocamento.
temp_unit.inoarquivo, 175-
Vejo serial-to-paralelas registos de deslocamento 176tempalert.inoarquivo, 53-54
dispositivos escravos, 182 sistema de monitoramento de temperatura, 173-179
I2C bus, 164-166, 167-168, ônibus 172SPI, ferragens, 173-174modifying programa integrado,
182, 183, 184-185 174-176writing esboço Processing, 177-179
sons
criando, 95-102 sensores de temperatura, 50-54, 167-173
Índice ■ T-Z 357

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

de comunicação sem fio. Vejo XBee radioswireless


campainha, 246-252
placas de terceiros, as hardware receptor, software 248-
interrupções 12timer, 270 249receiver, design 250-252system,
hardware 246-247transmitter, software
download biblioteca TimerOne, 270-271executing
247-248transmitter, 249-250
tarefas simultaneamente, máquina de som 271-
272interrupt-driven,

construção, 272-275 fiação


timer1.inoarquivo, 271 motores DC, 68-
TimerOne Biblioteca, sensor 270-272TMP36 69LCDs, 200-203LEDs,
temperatura, 50-51, 52-54 22speakers, 96-99

tom()função, 95-102, 214-215, 273-275


transistores write_to_sd.ino arquivo, 290-292
NPN bipolar de junção, interruptores 66-68as, 66- escrevendo para cartões SD, 289-293
67

acelerômetros triplo eixo, protocolo 51two fios, 164.


Veja também I2C bus
X
X-CTU, configurando rádios XBee, rádios 231-235XBee

você configuração, 228-236


adaptadores USB, configurar rádios XBee, configurações, 230-231via escudos, 228-
228-230 230with um terminal serial, adaptadores
USB 235-236via, 228-230with X-CTU,
comunicação USB. Veja também serial
231-235
placas communicationArduino,
108-115

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

V escudos, 224-228wireless campainha,


construção, 246-252
resistores de tensão variável
fotorresistências, 54- Xively, envio de dados para, 329
59potentiometers, 45-50 adicionando componentes da ração, 336-
variáveis voláteis, 339building feeds de dados, 330-335
268voltage xively.ino arquivo, 334-335
divisores xively2.inoarquivo, 337-338
potenciômetros, leitura, 45-50resistive,
55-56
Z
tensão de referência, 44- norma ZigBee, 223
45regulators, 7

~StormRG~

Você também pode gostar