Escolar Documentos
Profissional Documentos
Cultura Documentos
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para obter informações on-line e encomendar este e outros livros de Manning, visite Topics
recuperação ou transmitida , de qualquer forma ou por meio eletrônico, mecânico, fotocópia ou outro,
Muitas das designações usadas por fabricantes e vendedores para distinguir seus produtos são
reivindicadas como marcas registradas. Onde essas designações aparecem no livro, e a Manning
Publications estava ciente de uma reivindicação de marca registrada, as designações foram impressas
Reconhecendo a importância de preservar o que foi escrito, é política da Manning imprimir os livros
que publicamos em papel sem ácido, e envidamos nossos melhores esforços para esse fim. Reconhecendo
também nossa responsabilidade de conservar os recursos de nosso planeta, os livros Manning são
impressos em papel que é pelo menos 15% reciclado e processado sem o uso de cloro elementar.
UAU! e-book
www.wowebook.org
Machine Translated by Google
ISBN 9781617293863
1 2 3 4 5 6 7 8 9 10 – EBM – 23 22 21 20 19 18
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Sumário
direito autoral
Tópicos
Sumário
Tutoriais
Índice
Ofertas e promoções
Prefácio
Destaques
Agradecimentos
Configurações
Sobre este livro
Suporte
1. Introdução ao hardware de um JavaScripter
Sair
Capítulo 1. Unindo JavaScript e hardware
Índice
Lista de Figuras
Lista de mesas
Lista de Listagens
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
Índice
História
direito autoral
Tópicos
Sumário
tutoriais
Índice
ofertas e promoções
Prefácio
luzes
Agradecimentos
configurações
Suporte
1. Introdução ao hardware de um JavaScripter
Sair
Capítulo 1. Unindo JavaScript e hardware
1.1.2. Em processamento
1.4.5. Ferramentas
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
2.3.5. Estruturação de scripts com JohnnyFive
Resumo
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
4.2. Entradas digitais
Resumo
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
6.2.1. Controlando um servo com JohnnyFive
Resumo
7.3.1. UARTs
7.4.2. 2C
UAU! e-book
www.wowebook.org
Machine Translated by Google
7.5.3. Passo 3: atualizar o display para mostrar temperatura e pressão
Resumo
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
9.2. Controlando os interruptores remotos com um plug-in de componente JohnnyFive
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
10.3.2. O Pico e o Nokia 5110 LCD
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
11.3.1. Adaptação da mini estação meteorológica para o Pi 3
Resumo
UAU! e-book
www.wowebook.org
Machine Translated by Google
12.4.5. Controlando o LED a partir de uma página da web
Resumo
Índice
Lista de Figuras
Lista de mesas
Lista de Listagens
UAU! e-book
www.wowebook.org
Machine Translated by Google
Prefácio
História
Em um dia do final do verão de 2013, eu estava em um palco em uma grande tenda no Topics
Bletchley Park, na Inglaterra, o local onde os decifradores britânicos (incluindo Alan Turing) derrotaram a
Ofertas e promoçõesde
Primeiro, alguma forma, consegui vencer um concurso de hackers (é por isso que eu estava no palco).
O National Museum of Computing – também localizado no terreno do Bletchley Park – Highlights estava
buscando
ajuda técnica para criar exibições de linha do tempo interativas baseadas na web. Fiquei acordado a noite
configurações : essa foi minha inscrição, que foi, para minha grande alegria, declarada a melhor do show. A
segunda coisa maravilhosa foi que ganhei um prêmio — e não um prêmio qualquer.
Apoiar
A recompensa que recebi foi um dos kits originais do Arduino Uno - uma placa Arduino Sign Out , uma
coleção
de componentes eletrônicos e um livro de instruções. Mudou profundamente a minha vida. Mais tarde,
descobri que combinar minhas habilidades eletrônicas recém-adquiridas com as coisas que fazia todos os
dias – codificar sites e aplicativos de código aberto baseados em padrões – resultou em uma das
alquimias mais fascinantes que já experimentei: JavaScript on Things. Ou seja, eu poderia usar o
JavaScript que já conhecia como um turbo boost para hackers eletrônicos e internet das coisas (IoT).
Isso veio depois, no entanto. Inicialmente, aprendi a construir circuitos eletrônicos simples trabalhando com
os exemplos do livro do kit e, posteriormente, pesquisando avidamente na web para aprender mais. Aprendi
como aplicar o controle lógico a esses circuitos programando o microcontrolador do Arduino Uno,
escrevendo esboços simples (programas) na linguagem (muito) C/C++ do Arduino, otimizada para o
memória.
E então, no final de 2013, descobri o JohnnyFive. A estrutura Node.js de software livre era jovem na
época, mas já poderosa. Em vez de escrever código Arduino restrito e de nível inferior, eu poderia escrever
, . .
programas JavaScript de nível superior para controlar meu Uno. Eu pensei: “Uau, se eu tivesse descoberto
isso antes.”
.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A combinação de JavaScript e microcontroladores não é apenas um truque de salão, executado para
revestir todo o mundo conhecido com JavaScript. A princípio, até eu, um adepto do Node.js, fiquei
prototipagem de pequenos projetos muito, muito mais rápida. Eu poderia usar fluxos de trabalho de
desenvolvimento que eram mais familiares para mim como desenvolvedor da web. Eu não precisava me
resultante pode ser mais limpo e fácil de trabalhar do que muitas bibliotecas do Arduino. E isso me permitiu
aproveitar as profundezas quase insondáveis do ecossistema mundial Node.js via npm. Eu poderia
simplesmente importar módulos, como qualquer outro script Node.js existente. Era
maravilhoso.
Quero ser bem claro: não há nada de errado com o Arduino ou com a programação de
com o gerenciamento de memória, por exemplo, especialmente se você estiver escrevendo firmware
ou fazendo dispositivos de produção. E o Arduino é um milagre: toda a sua razão de ser é tornar a
eletrônica embarcada acessível aos novatos. Começar do zero com o Arduino e a linguagem de
Mas o JavaScript pode ajudar os desenvolvedores da Web a se familiarizarem com a eletrônica mais
rapidamente. Por um lado, os materiais introdutórios para Arduino (e outras plataformas) geralmente
não assumem nenhum conhecimento pré-existente de programação, o que significa que você pode acabar
se debruçando sobre explicações sobre o que é um array e como os loops funcionam. As restrições
meticulosas e as particularidades dos microcontroladores podem ser uma distração quando você está
apenas aprendendo como as coisas funcionam. IDEs podem ser desajeitados. Em alguns casos, você
pode acabar gastando muito tempo configurando as coisas e pouco tempo fazendo as coisas realmente
acontecerem. O JavaScript tem o poder de abstrair muito disso, permitindo que você se concentre
A partir dessa noção, surgiu este livro: a ideia de que o JavaScript pode servir como uma porta de
entrada para a eletrônica, tornando mais fácil para mais pessoas aprender como fazer coisas legais
com um mínimo de esforço cognitivo. JavaScript é a linguagem de programação mais popular do mundo,
a linguagem de fato da web; e a internet das coisas e a cultura maker são tentadoras criativa e
UAU! e-book
www.wowebook.org
Machine Translated by Google
No final do dia, essas coisas são divertidas. É um prazer poder sonhar e tornar realidade suas
próprias invenções. É um aumento de confiança ter uma competência básica com circuitos
eletrônicos de baixa tensão e entender como os sistemas embarcados funcionam no mundo real.
Talvez você realmente ame isso como eu. Talvez você ajude a contribuir com projetos de
código aberto. Talvez você construa um gadget extremamente inteligente. Talvez você ensine a
outras pessoas o que aprendeu.
Talvez você simplesmente se divirta. Isso, por si só, é mais do que suficiente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
Agradecimentos
História
Minha gratidão começa exatamente onde meu amor por hacking de hardware começou: com a
equipe da conferência Over the Topics Air e o National Museum of Computing (Reino Unido), de onde
meu Arduino Starter Kit inicial se originou. Nada disso teria acontecido sem isso
Tutoriais
evento fortuito. Dan Appelquist, Margaret Gold e Matthew Cashmore — obrigado por criarem uma
conferência tão esplêndida e até por me convidarem para ela, mais de uma vez!
Ofertas e promoções
Rick Waldron realiza mais em um dia do que eu em um mês. (Rick, seu JavaScript
O gênio
dos destaques é uma lenda.) Seu envolvimento com o TC39, o grupo de trabalho da ECMA responsável pela própria
linguagem JavaScript, significa que ele é literalmente indispensável. Ah, e ele também inventou o JohnnyFive, o principal
framework
Node.js de código aberto para robótica e IoT, em torno do qual gira grande parte deste livro. Eu poderia continuar por páginas,
Escrever um livro leva um tempo ridiculamente grande. Agradeço imensamente aos líderes e colegas
do Sign
Out da Bocoup por me darem o tempo e o apoio de que eu precisava e por continuamente bombear
quantidades constantes de entusiasmo em minha direção, bem como aos parceiros e funcionários
da Cloud Four por sua paciência.
Grandes editores são um verdadeiro presente em um mundo que às vezes descarta o valor do
processo editorial e do feedback. Minha editora, Susanna Kline, forneceu apoio útil e
perspicaz ao longo do caminho. Brad Luyster, seu feedback de revisão técnica foi fenomenal;
é difícil agradecer o suficiente. Vários outros revisores também forneceram feedback útil sobre
o manuscrito em diferentes estágios: Alessandro Campeis, Amit Lamba, Andrew Meredith, Bruno
Sonnino, Earl Bingham e Kevin Liao. Também quero agradecer à editora de Manning, Marjan Bace,
e ao restante das equipes editorial e de produção que trabalharam nos bastidores do livro.
Agradeço também a Francis Gulotta pela contribuição técnica, Kyle Jackson da Manning por atender
às minhas necessidades de suporte técnico e meu amigo Chau Doan por compartilhar seu firmware e
sabedoria eletrônica.
.
As comunidades JohnnyFive e JavaScriptonThings relacionadas têm sido simplesmente
brilhantes. Obrigado, Derek Runberg da SparkFun! Obrigado, Donovan Buck, David
UAU! e-book
www.wowebook.org
Machine Translated by Google
Resseguie, Brian Genisio e todos os outros contribuidores do JohnnyFive!
A biblioteca Arduino de Shawn Hymel para o sensor APDS9960 - um belo trabalho - serviu como trampolim
8 são adaptados do código escrito por Rick Waldron. (Mais uma vez, Rick, obrigado!)
Igualmente importante para aqueles que o ajudam em um projeto em si são aqueles que o ajudam a manter
Salvei este ponto extramelhor aqui para agradecer ao meu parceiro (e pessoa fantástica em geral)
Bryan Fox: sem sua presença alegre e constante, este livro não poderia
existir.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
“Tenho curiosidade sobre hardware, eletrônica e IoT, mas não tenho absolutamente nenhuma
ideia
de por onde começar.” Já ouvi essa noção, em muitas variações, de muitos (dezenas?—pelo
menos—talvez uma centena?) desenvolvedores web. Sim, certamente seria divertido poder
Tutoriais
construir robôs e engenhocas inteligentes. Sim, seria útil saber ler os dados dos sensores e fazer
coisas interessantes com os dados, para poder construir o seu próprio
Ofertas e promoções
dispositivos automatizados conectados à web (para alimentar seu animal de estimação no
horário, detectar a quantidade de chuva, exibir as últimas pontuações do rugby - a mente
realmente
se confunde com todas as possibilidades do Highlights ). Mas também, sim, pode parecer
uma nova paisagem assustadora, até mesmo avassaladora, se você nunca fez um LED piscar, muito
menos
escreveu e exibiu o firmware otimizado para um microcontrolador embutido.
Apoio
Boas notícias! Você pode tirar proveito de sua compreensão de JavaScript e metáforas gerais de programação para enquadrar sua
aventura de aprendizado e fazer com que envolver sua cabeça de saída neste novo mundo seja um pouco menos caótico. O
JavaScript
pode dar um toque de familiaridade, fornecendo uma pedra de toque para facilitar sua introdução à eletrônica,
Este livro ensina os fundamentos da eletrônica e dos sistemas embarcados para pessoas que se
sentem confortáveis com o JavaScript básico, mas que podem não ter nenhuma experiência em
conectar até mesmo o circuito mais simples. A ênfase é colocada nos tópicos que serão novos
para os desenvolvedores de software: os fundamentos críticos do projeto e construção de
circuitos, componentes de hardware (sensores, motores, resistores e similares) e a interface entre
hardware e software.
Ao longo deste livro, você terá contato direto com uma variedade de placas de desenvolvimento,
componentes de hardware e plataformas de software. Para os experimentos (pequenos projetos) nos
primeiros dois terços do livro, usaremos o framework Node.js de código aberto JohnnyFive
com a placa de desenvolvimento Arduino Uno. A API do JohnnyFive fornece muitas classes de
componentes intuitivas que você pode usar para prototipar rapidamente seus gadgets e invenções.
O Uno é a placa de hobby mais onipresente do mundo, apresentando estabilidade, simplicidade,
confiabilidade e uma enorme comunidade de usuários e educadores. O último terço do livro examina
uma gama mais ampla de plataformas, incluindo o Node.jscapable
UAU! e-book
www.wowebook.org
Machine Translated by Google
Tessel 2 e o muito popular Raspberry Pi.
No final do livro, você deve ter um kit de ferramentas fundamental — tanto mental quanto físico —
ROTEIRO
partir dos quais são construídos. Ele explica as maneiras pelas quais o JavaScript e o hardware podem
trabalhar juntos.
O Capítulo 2 apresenta a placa de desenvolvimento Arduino Uno e coloca você na prática, rapidamente,
com alguns LEDs piscantes básicos. Veremos brevemente como controlar o Uno com o Arduino IDE antes
O Capítulo 3 dá um zoom nos fundamentos da eletrônica que servem de base para todos os
circuitos que você construirá. Você vai mergulhar nas profundezas da lei de Ohm e construir alguns
gadgets embutidos, explorando entrada (sensores), saída (atuadores) e movimento físico (motores
e servos). Usando o framework JohnnyFive, você terá a chance de construir vários experimentos
O Capítulo 7 examina a comunicação serial, que é usada para trocar dados mais sofisticados.
No capítulo 8, você aprenderá como fazer projetos que não são amarrados por fios. No capítulo 9, você
como o Espruino Pico. O Capítulo 11 explora computadores de placa única (SBCs) de uso mais geral,
O Capítulo 12 aborda os serviços de nuvem e o controle de hardware do navegador e olha para o futuro.
UAU! e-book
www.wowebook.org
Machine Translated by Google
implante um aplicativo JohnnyFive em um BeagleBone Black e você criará uma campainha sem
Este é um livro para pessoas que têm alguma experiência com JavaScript, mas que sabem pouco ou
Os exemplos de código neste livro não são, em sua maioria, complexos. Minha filosofia é que é melhor
que o código seja legível e compreensível do que exibido e inteligente. Você certamente não precisa ter
uma profunda familiaridade com cada palavra na especificação ECMA262 (esse é o documento
que define a linguagem JavaScript); mas se você se sentir fraco ao ver as funções de seta ou ainda não
conhece Promises, por exemplo, você pode querer retocar um pouco ou manter um companheiro
amigável ao seu lado, como o excelente Secrets of the JavaScript Ninja, Second Edition, de John Resig,
Embora as instruções passo a passo para os experimentos forneçam todos os comandos necessários
para fazer suas criações funcionarem, você deve ter competência básica para instalar, gerenciar e usar o
Node.js e o gerenciador de pacotes npm. Você também deve se sentir confortável com a execução
Um conhecimento prático de HTML e compreensão geral de CSS é útil, embora não seja essencial.
(Você sempre pode recortar e colar a marcação de origem para esses componentes.)
O Capítulo 12 envolve o uso do software de controle de versão do Git — a experiência anterior com o Git é
Este livro inclui exemplos abundantes, que incluem vários recursos necessários para aplicativos e
experimentos: JavaScript, HTML, CSS, JSON e assim por diante. O código-fonte nas listagens ou no texto
parâmetros de métodos, elementos HTML e similares em texto também são apresentados usando uma fonte
de largura fixa.
JohnnyFive é de código aberto, lançado sob a licença de software (liberal) MIT. O livro faz uso de muitos
outros projetos de software de código aberto, incluindo cerca de uma dúzia de módulos npm de terceiros.
FÓRUM DO LIVRO
A compra do JavaScript on Things inclui acesso gratuito a um fórum privado da Web administrado
pela Manning Publications, onde você pode fazer comentários sobre o livro, fazer perguntas
técnicas e receber ajuda do autor e de outros usuários. Para acessar o fórum, acesse https://
forums.manning.com/forums/javascriptonthings. Você também pode aprender mais sobre os
fóruns de Manning e as regras de conduta em
https://forums.manning.com/forums/about.
O compromisso de Manning com nossos leitores é fornecer um local onde possa ocorrer um
diálogo significativo entre leitores individuais e entre leitores e o autor. Não é um compromisso
com qualquer quantidade específica de participação por parte do autor, cuja contribuição ao fórum
permanece voluntária (e não remunerada). Sugerimos que você tente fazer algumas perguntas
desafiadoras ao autor, para que o interesse dela não se desvie! O fórum e os arquivos das discussões
anteriores estarão acessíveis no site da editora enquanto o livro estiver sendo impresso.
SOBRE O AUTOR
Lyza Danger Gardner gosta de descobrir como fazer as coisas. Por sua vez, ela também gosta
de ensinar aos outros como fazer coisas novas. Lyza foi cofundadora da Cloud Four, uma
consultoria web em Portland, Oregon. Ela vem construindo coisas na web há mais de 20 anos,
defendendo padrões elegantes, educação e compaixão em busca do melhor futuro possível da
web. Você pode encontrá-la online em www.lyza.com ou @lyzadanger no Twitter. Como um
UAU! e-book
www.wowebook.org
Machine Translated by Google
contraponto à sua vantagem técnica futurista, ela vive na floresta em Vermont e
gosta de hobbies anacrônicos. Ela lê e lê e lê.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Você conhecerá a placa de desenvolvimento Arduino Uno R3 no capítulo 2, que usaremos com todos
os destaques dos experimentos até o capítulo 7. Você aprenderá o que as principais partes das placas
de desenvolvimento fazem e como elas interagem com outros softwares e hardwares componentes.
Você
experimentará alguns experimentos básicos de LED com o Uno usando o Arduino IDE e a estrutura
JohnnyFive Node.js.
Apoiar
O Capítulo 3 ensinará os principais fundamentos dos circuitos eletrônicos, mergulhando na lei Sign
Out de
Ohm e nas relações entre tensão, corrente e resistência. Você trabalhará em uma breadboard,
construindo séries e circuitos paralelos que contêm vários LEDs.
Ao terminar esta parte do livro, você terá uma compreensão dos fundamentos básicos do
sistema embarcado e dos principais conceitos de circuito. Você estará pronto para começar a
criar pequenos projetos controlados por JavaScript com diferentes tipos de entradas e
saídas.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Capítulo 1. Unindo JavaScript e hardware
Este capítulo cobre
Tópicos
Configurações Como um desenvolvedor web experiente em JavaScript, você faz a alquimia lógica acontecer todos os dias. Mas agora é
possível exercer suas habilidades de desenvolvimento de software de uma nova maneira, para programar o suporte e controlar as
coisas no
mundo real. Neste capítulo, você aprenderá sobre o hardware envolvido em diferentes tipos de projetos e dispositivos e também
Estamos cercados por pequenas coisas mágicas que misturam o mundo físico com o reino do
lógico, conectado e virtual (figura 1.1). Um chaveiro que transmite sua localização sem fio para
que você possa encontrá-lo com um aplicativo em seu smartphone. Um vaso de plantas que
faz barulho quando precisa ser regado ou, melhor ainda, envia uma mensagem de texto
petulante. Bilhões desses objetos piscam, bipam, tuitam, diminuem automaticamente as luzes,
fazem bules de chá personalizados e realizam suas funções especializadas em todo o
planeta.
UAU! e-book
www.wowebook.org
Machine Translated by Google
É divertido construir essas coisas. A criatividade envolvida na criação com esses tipos de dispositivos
físicos, o charme básico de projetos caseiros criativos - esses são os tipos de coisas que atraem os
desenvolvedores da web. Somos feitos para prototipagem, experimentando novas tecnologias e trilhando
Mas começar pode ser intimidante. Quando vemos todos os fios e componentes, ouvimos o jargão, ficamos
do lado de fora olhando para as comunidades de hackers de hardware, os tipos de habilidades envolvidas
podem parecer formidáveis, estranhos. Como desenvolvedor de JavaScript, você pode se deparar com alguns
de hardware e software - ao fazer suas primeiras tentativas de incursão no mundo do hardware físico.
Vamos usar seu know-how em JavaScript como uma vantagem, uma ajuda para aprender como projetar e
construir os tipos de coisas que compõem a “internet das coisas” (IoT) e inspirar hackers de hardware. Você
será capaz de usar suas habilidades de desenvolvimento de software para ignorar algumas distrações e se
Para ter uma ideia da jornada que estamos fazendo, vamos primeiro dar uma olhada nos tipos de coisas
que você aprenderá a construir. Vamos explorar o que queremos dizer, exatamente, quando dizemos coisas ou
hardware.
Poderíamos construir um pequeno dispositivo que ligasse automaticamente um ventilador quando esquentasse.
As entradas fornecem dados de entrada para o sistema e os sensores são um tipo de entrada
que fornece dados sobre o ambiente físico. Existem todos os tipos de sensores que você pode usar
em projetos: sensores de luz, calor, ruído, vibração, vapores, umidade, cheiros, movimento,
chamas - você escolhe. Alguns, como o sensor de temperatura do nosso ventilador, fornecem dados
simples – apenas um único valor representando a temperatura – enquanto outros, como GPS
ou acelerômetros, produzem dados mais elaborados.
As saídas de um projeto representam sua funcionalidade líquida para alguém que o utiliza. Luzes
piscando, bipes irritantes, leituras de status em telas LCD, um braço robótico movendo-se
lateralmente - todos esses são tipos de saídas. Para este projeto, o ventilador é a única saída.
Por outro lado, uma mudança na umidade do solo (entrada do sensor físico) pode fazer com que um vaso de
1.1.2. Em processamento
Nosso ventilador automático também precisa de um cérebro, algo que preste atenção nas leituras
do sensor de temperatura e ligue o ventilador quando estiver muito quente. O tipo de cérebro de que ele
de processar entradas e controlar saídas. Quando processador, memória e funcionalidade de E/S estão
contidos em um único pacote físico, chamamos o chip resultante de microcontrolador (figura 1.3).
Microcontroladores (MCUs) não são tão poderosos quanto os processadores de uso geral em laptops.
A maioria não pode executar um sistema operacional completo (a maioria, não todos, como você verá), mas
são baratos, confiáveis, pequenos e consomem o mínimo de energia - é por isso que são onipresentes
Precisamos conectar os componentes usando um ou mais circuitos eletrônicos e fornecer alguma energia. A
UAU! e-book
www.wowebook.org
Machine Translated by Google
de componentes no espaço físico (figura 1.4).
Conectar fios diretamente aos minúsculos pinos de um microcontrolador exigiria solda e uma
mão muito firme. Sem mencionar que acabaríamos com muitas peças soltas flutuando
desajeitadamente. Para auxiliar os desenvolvedores de hardware, os microcontroladores
geralmente são montados em placas físicas de desenvolvimento (figura 1.5). Entre outras coisas,
as placas facilitam a conexão de dispositivos de E/S ao microcontrolador.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Uma placa de desenvolvimento ajuda, mas ainda ficamos com vários fios e componentes soltos.
Para ajudar a controlar isso, os desenvolvedores de hardware usam uma ferramenta de prototipagem
Figura 1.6. Uma protoboard fornece uma grade conectada eletricamente na qual
prototipar circuitos eletrônicos.
UAU! e-book
www.wowebook.org
Machine Translated by Google
laço principal
lê o valor do sensor de temperatura em currentTemp
UAU! e-book
www.wowebook.org
Machine Translated by Google
se currentTemp for maior que fanThreshold se outputFan estiver desligado
ligue o outputFan
else se currentTemp for menor ou igual a fanThreshold
se outputFan estiver ligado
desligue o ventilador de saída
A linguagem dominante para programar microcontroladores tem sido C (ou derivados de Clike).
Escrever C para microcontroladores tende a ser específico da plataforma e pode ser de baixo nível.
Referências a endereços de memória específicos e operações bit a bit são
comum.
O código é compilado para o código assembly específico da arquitetura. Para inserir o código no
projeto, ele é carregado fisicamente, ou atualizado, na memória do programa do microcontrolador.
Essa memória de programa geralmente é uma memória não volátil - ROM, o tipo de memória que permite
ao microcontrolador “lembrar” o programa mesmo se estiver desligado (em contraste com a RAM, que
só retém seu conteúdo se estiver ligada). O espaço disponível para programas é restrito, muitas
vezes da ordem de algumas dezenas de kilobytes, o que significa que os programas executados
em microcontroladores precisam ser cuidadosamente otimizados.
Depois que o programa é atualizado para o microcontrolador, ele funciona como o firmware do
microcontrolador - quando ligado, o microcontrolador executa o programa continuamente até que seja
programado com algo diferente (ou redefinido).
Figura 1.7. Memória de programa não volátil (EEPROM e Flash) e placas de fácil
utilização facilitaram a programação de microcontroladores com firmware.
UAU! e-book
www.wowebook.org
Machine Translated by Google
EEPROM (ROM programável apagável eletricamente), exemplificado pelo bem conhecido meio
de memória flash, é comumente usado em microcontroladores. Esse tipo de memória regravável
torna possível reprogramar microcontroladores repetidamente com lógica diferente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
complicado. Um minúsculo computador que combina processador, memória e E/S forma o cérebro.
Como você viu com nosso ventilador automático, conectar as entradas, saídas e o
microcomputador juntos e fornecer energia a eles cria um sistema independente. Dizemos que está
embutido porque geralmente está escondido dentro de alguma coisa - um gabinete, um ursinho de
Embora um ventilador automático, um guarda-chuva que acende quando chove e um ursinho de pelúcia
twittando não pareçam imediatamente semelhantes, eles têm mais em comum do que você imagina.
Esses exemplos, juntamente com a maioria dos projetos de hardware e dispositivos que formam a IoT,
Ao combinar JavaScript com sistemas embarcados, ainda construímos circuitos eletrônicos da mesma
forma que faríamos para outros tipos de projetos de hardware. Ainda há entradas e saídas, fios e
componentes. No entanto, em vez de usar código assembly ou C para definir o que o microcontrolador
Existem várias maneiras de fazer isso, diferentes métodos para usar JavaScript para fornecer o
UAU! e-book
www.wowebook.org
Machine Translated by Google
lógica para projetos de hardware. Esses métodos são categorizados com base em onde a
própria lógica do JavaScript é executada: em um computador host separado do sistema
incorporado, no microcontrolador do sistema incorporado ou em algum outro lugar.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Muitos microcontroladores têm limitações que afetam sua capacidade de executar JavaScript.
A memória do programa é restrita, o que significa que programas complexos não cabem ou precisam
ser bastante otimizados. Além disso, muitos microcontroladores baratos são construídos com arquiteturas
de 8 ou 16 bits rodando em velocidades de clock que são baixas em relação, digamos, a computadores
desktop. A maioria não estaria à altura da tarefa de executar um sistema operacional, descartando a
Em vez disso, o método hostclient envolve a execução da lógica JavaScript em um computador host, como
seu laptop, que tem a força necessária para executar um sistema operacional completo. A máquina
host é capaz de executar Node.js e pode usar o ecossistema mundial de software JavaScript (incluindo
npm e a web).
O truque para fazer essa configuração funcionar é fazer com que o hardware do cliente (como o
microcontrolador) e o sistema host (seu laptop) se comuniquem usando uma “linguagem” mutuamente
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para configurar nosso sistema de ventiladores automáticos para usar esse método, primeiro
precisamos preparar o hardware embarcado carregando um firmware especial na
memória do programa do microcontrolador. Em vez de um programa específico e de propósito
único para controlar o ventilador, este programa de firmware torna o microcontrolador capaz de
se comunicar com outras fontes que falam a mesma “linguagem” (a API). Ou seja, ele
transforma o hardware baseado em microcontrolador em um cliente, todo ouvidos e pronto para
fazer as ordens do computador host (figura 1.11).
O hardware agora está pronto para se comunicar - a próxima etapa é escrever o software
para o ventilador, usando o computador host. Para que o hardware e o software se entendam,
o computador host precisa emitir instruções em uma linguagem que o microcontrolador possa
compreender. Para que isso aconteça, podemos escrever código usando uma biblioteca ou
estrutura que implemente a API comum (figura 1.12).
O host é conectado ao hardware do cliente por meio de uma conexão física por cabo
(geralmente USB) ou sem fio (WiFi ou Bluetooth).
Figura 1.13. À medida que o host executa a lógica do JavaScript, as instruções e os dados são
continuamente trocados entre o cliente e o host, usando uma API comum.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Não entre em pânico, você não terá que escrever um software API de protocolo de firmware de baixo
nível! Existem opções diretas e de código aberto para firmware e estruturas Node.js que implementam
esses protocolos de firmware, para que você possa escrever sua lógica JavaScript do lado do host com
o mínimo de confusão.
Além disso, ele oferece acesso a todo o ecossistema Node.js, evitando as restrições de desempenho e
A desvantagem é que o hardware do cliente é indefeso sem o host - ele só pode fazer seu trabalho
Iremos eventualmente sem fio, mas começaremos com a mais simples das opções de hostclient -
tethering USB. Isso significa que, por um tempo, seus projetos ficarão fisicamente conectados ao seu
computador.
Muitos microcontroladores não estão aptos a rodar JavaScript nativamente, mas alguns sim. Como seria
de esperar com o avanço da tecnologia, os microcontroladores baratos estão ficando mais avançados.
A maioria das plataformas também fornece um conjunto de ferramentas de software para complementar seu hardware.
Pode haver uma biblioteca ou estrutura a ser usada para escrever código JavaScript compatível e uma CLI (interface de
para o microcontrolador.
O tipo de JavaScript do Espruino combina o núcleo otimizado do JavaScript com uma API de recursos relevantes
para o hardware. Por exemplo, você escreve código para a placa Espruino Pico em um IDE baseado na web e carrega-o na
placa via USB (figura 1.14). Para adaptar nosso ventilador automático para uma placa Espruino, precisaríamos
Outro exemplo de JavaScript embutido é o Tessel 2 (https://tessel.io/), uma plataforma de desenvolvimento baseada
em Node.js. Você pode controlar e implantar código em seu Tessel usando o módulo tesselcli npm — sem fio, se quiser,
Figura 1.15. O Tessel 2 é uma plataforma open source que roda Node.js nativamente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Ser capaz de executar o JavaScript diretamente no hardware incorporado pode ser eficiente em termos
de energia e autocontido. Os projetos são sistemas independentes que podem ser executados por
conta própria. Ao contrário da configuração hostclient, que requer firmware para traduzir de
JavaScript para código de máquina, há (geralmente) menos camadas de abstração entre seu JavaScript e o
hardware.
Isso parece ótimo, e você pode se perguntar por que não usaríamos essa abordagem
exclusivamente. Existem algumas desvantagens. Por um lado, há menos opções de hardware no
momento. Além disso, cada plataforma tem suas próprias técnicas específicas de plataforma
(software, ferramentas, metodologia), que podem turvar as águas ao aprender os fundamentos do
hardware. A maioria também tem certas limitações, seja no suporte ao recurso de linguagem
JavaScript ou nos tipos de entradas e saídas suportadas. Mas é um método inspirador com um
futuro muito brilhante.
Pequenos computadores de placa única (SBCs) combinam o host e o cliente em uma unidade. Os
serviços baseados em nuvem possibilitam escrever código JavaScript online e implantá-lo sem fio no
hardware. E recursos emergentes, novos e experimentais nos próprios navegadores da
Web podem oferecer um portal para o mundo do hardware para milhões de
desenvolvedores da Web.
UAU! eBook
Executando JavaScript em computadores minúsculos (SBCs) www.wowebook.org
Machine Translated by Google
Executando JavaScript em computadores minúsculos (SBCs)
Computadores de placa única (SBCs) como a família Raspberry Pi e BeagleBone Black podem executar
ambientes de sistema operacional completos (normalmente Linux) e, por extensão, Node.js. Em vez de
um microcontrolador de 8 ou 16 bits, os SBCs têm processadores de uso geral de maior desempenho.
Mas muitos SBCs também têm pinos de E/S e recursos embutidos na mesma placa (figura 1.16).
Figura 1.16. Vários computadores de placa única (SBCs): Intel Galileo, Gen 2 (superior), Raspberry Pi 2
Modelo B (canto inferior esquerdo) e Raspberry Pi Zero (canto inferior direito)
O uso de um SBC para controlar um projeto de hardware combina aspectos do método hostclient e da
execução de JavaScript incorporado. O processador precisa executar continuamente a lógica JavaScript para que
o projeto funcione (como no modelo hostclient), mas todo o pacote está contido em uma placa e se parece
configurar.
Ao contrário dos microcontroladores que executam a lógica JavaScript incorporada, porém, o processador em um
SBC não executa um programa de propósito único - ele pode executar simultaneamente outros
UAU! e-book
www.wowebook.org
Machine Translated by Google
processos.
Esses computadores de placa única estão ficando baratos. Neste momento, há o Raspberry Pi Zero
de $ 5 (se você conseguir colocar as mãos em um - eles estão notoriamente esgotados) e o Pi Zero W
habilitado para WiFi por apenas um pouco mais. Não há mais um diferencial de custo tão grande entre hardware
Embora a execução de JavaScript em computadores de placa única com suporte a GPIO (E/S de uso geral)
ofereça várias opções em um único hardware integrado, ele apresenta algumas desvantagens. Os SBCs não
são tão de baixa potência quanto muitas placas baseadas em microcontroladores - o Raspberry Pi 2
Modelo B consome 4 watts. Os SBCs que veremos têm suporte GPIO, mas os mapeamentos e uso de pinos
podem ser confusos e a documentação superficial ou técnica, o que pode ser desafiador se você estiver
Você também precisará estar pronto para enfrentar os obstáculos de administração do sistema, pois
as distribuições Linux para SBCs, especialmente quando combinadas com Node.js, podem exigir alguma
depuração e paciência.
Esta última categoria abrangente para combinações de JavaScript de hardware é reconhecidamente embaçada.
As coisas estão mudando. Rápido. O crescimento atual de serviços comerciais baseados em nuvem para IoT
assumiu a forma proverbial de taco de hóquei, e estamos apenas vendo a vanguarda dos avanços que
IoT em escala. Muitos deles são direcionados à empresa. O Resin.io (figura 1.17), por exemplo, cria,
empacota e implanta código de aplicativo em contêiner para dispositivos provisionados, cuidando de algumas
UAU! e-book
www.wowebook.org
Machine Translated by Google
Outro projeto aberto do Google, o Physical Web, propõe uma ideia descomplicada: dar
a um pequeno dispositivo a capacidade de transmitir uma URL com Bluetooth Low Energy (BLE).
Um beacon usado dessa forma pode transformar um sinal de parada de ônibus em um rastreador
de chegadas em tempo real, transmitindo a URL para um aplicativo da web com essas
informações (figura 1.18). Um conceito simples, mas flexível.
Figura 1.18. Neste exemplo de aplicação da Web física, um sinal de parada de ônibus usa um
beacon BLE para transmitir uma URL uma vez por segundo (1); um ser humano nas
proximidades pode procurar por beacons disponíveis em seu dispositivo e selecionar aquele
correspondente ao ponto de ônibus (2); o dispositivo do passageiro do ônibus agora pode buscar
a URL transmitida pelo beacon e exibi-la no navegador (3).
UAU! e-book
www.wowebook.org
Machine Translated by Google
De todos os casamentos entre JavaScript e hardware, esta variante – a integração mais profunda
da web com o hardware – é a mais volátil. É ao mesmo tempo intrigante e imprevisível. É
provável que a demanda por mais formas de construir produtos IoT com JavaScript leve a uma
aceleração estonteante neste espaço.
Então, talvez possamos usar JavaScript para hackear hardware de várias maneiras, mas deveríamos?
Existe utilidade aqui ou é apenas um truque de salão auto-indulgente?
Quando a ideia de usar JavaScript com hardware começou a surgir alguns anos atrás, não foi recebida
com entusiasmo universal. Foi visto por alguns como esperteza arbitrária e equivocada - nós
realmente temos que usar JavaScript em todos os lugares? cansaço.
Outros argumentaram que o desempenho do JavaScript em hardware restrito nunca seria aceitável
para nada além do uso de hobby. Uma certa quantidade de grosseria da velha guarda veio à
tona, tópicos de comentários atolados com escoriações apaixonadas contra qualquer coisa, exceto
C/C++, e pessimistas alertaram que uma linguagem de alto nível obscureceria nuances essenciais de
hardware de baixo nível dos recém-chegados.
E, no entanto, houve muitos que permaneceram de mente aberta. Por que usar JavaScript quando
C/C++ é bom o suficiente? teve um eco curioso de uma mudança de paradigma anterior em hardware:
por que usar C quando a linguagem assembly é boa o suficiente?
Seja incrível ou ruim — e não vamos discutir isso agora — JavaScript é a linguagem de programação
de fato da Internet. As pessoas conhecem, usam e está em toda parte. A onipresença do JavaScript dá a
ele um potencial único para servir como um
UAU! e-book
www.wowebook.org
Machine Translated by Google
gateway para milhões de desenvolvedores da web que com certeza adorariam entrar na IoT.
Vai ser fascinante ver onde vamos parar. O trem do JavaScript está saindo da estação de hardware e muitas
Você fez um rápido tour pelos ingredientes que compõem os sistemas embarcados e pelos métodos de
combinação de hardware com JavaScript. Vamos agora ser mais específicos sobre os tipos de hardware
físico, acessórios e ferramentas necessários para criar esses tipos de projetos. Então estaremos
Nossos projetos combinarão uma placa de desenvolvimento com hardware de entrada e saída. Para
bem como fios, energia e acessórios. Jogue em algumas ferramentas básicas e você está pronto para ir.
processamento com recursos de suporte úteis (figura 1.19). Eles são o pão com manteiga do estilo
de vida hacker de hardware. As placas variam em custo de apenas alguns dólares a mais de US $ 100 para
UAU! e-book
www.wowebook.org
Machine Translated by Google
As placas são centradas em torno de seu cérebro, uma combinação de processador, memória
e E/S. Os microcontroladores de 8 ou 16 bits estão no centro das placas de
prototipagem simples e básicas, como (a maioria) dos Arduinos (figura 1.20). Placas com
microcontroladores de 32 bits mais sofisticados podem executar JavaScript embutido.
Figura 1.20. Esta placa Arduino Uno é alimentada pelo AVR ATmega 328-P, um
microcontrolador de 8 bits.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Nem todas as placas são baseadas em microcontroladores. Os SBCs mais poderosos são
alimentados por componentes que você normalmente encontraria na placa-mãe de um computador.
A arquitetura dessas placas é, portanto, mais complexa, envolvendo um ou mais sistemas miniaturizados
em um chip (SoCs) e interconexões adicionais como HDMI, áudio ou Ethernet. Embora os SBCs possam
ter interfaces físicas de E/S integradas - Raspberry Pis, por exemplo - seus processadores de uso geral
podem ser facilmente usados para alimentar projetos não centrados em hardware.
Oh, que coisa, existem tantos sensores e aparelhos que você pode conectar às suas placas para
aprimorar seus projetos! Isso é divertido, mas também pode parecer opressor no começo.
Muitos termos técnicos são usados e há muitos números, valores e especificações a serem absorvidos.
Você aprenderá a se orientar conforme avança neste livro.
A maioria dos componentes de entrada e saída com os quais trabalharemos são de design simples
e estão prontos para serem conectados a uma breadboard (ou seja, são compatíveis com breadboard).
Alguns são embalados como placas de breakout. Da mesma forma que as placas de
desenvolvimento facilitam a entrada/saída conectando os minúsculos pinos de um microcontrolador a
conexões mais convenientes, as placas breakout facilitam o trabalho com sensores de finalidade única
ou dispositivos de saída conectando seus pinos a conexões mais convenientes (figura 1.21). .
UAU! e-book
www.wowebook.org
Machine Translated by Google
Embora possa parecer que há muitas peças pequenas, os componentes básicos como
resistores, capacitores, diodos e transistores são baratos e podem ser adquiridos em kits iniciais
convenientes (figura 1.22). Levaremos nosso tempo para conhecer essas partes - logo elas se sentirão
como velhas amigas.
Figura 1.22. Componentes comuns como esses ajudarão você a construir circuitos
eletrônicos funcionais.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Uma coisa que você logo perceberá é que existem muitas maneiras de potencializar um projeto!
As placas de desenvolvimento podem ser alimentadas por USB ou conectadas a um adaptador DC (verruga na parede). Em
muitos casos, outros componentes do projeto podem aproveitar essa mesma fonte de energia (figura 1.23).
As baterias são úteis para tornar os projetos sem fio, bem como para fornecer energia adicional em diferentes tensões.
Existem muitos tipos de encaixes de bateria e suportes para conectar baterias a projetos.
Para conectar as coisas, você precisará de fios. Os fios jumper são fios pré-cortados. Uma variedade particularmente
útil possui pinos em cada extremidade que deslizam facilmente nas placas de ensaio e nos pinos de E/S em muitas placas.
Como alternativa, o fio de conexão geralmente vem em um carretel e pode ser cortado em comprimentos específicos conforme
necessário.
1.4.5. Ferramentas
Um alicate de ponta fina e uma ou duas chaves de fenda de precisão são companheiros úteis na construção de projetos.
Você vai querer um par de desencapadores de fios - que geralmente têm cortadores de fio embutidos - se estiver cortando ou
Ao começar a construir projetos, você acabará com muitas peças pequenas. Você pode encontrar
Caixas e estojos projetados para iscas de pesca podem ser recipientes especialmente úteis para peças
eletrônicas porque seus compartimentos são pequenos e suas divisórias se ajustam perfeitamente (figura 1.24).
Figura 1.24. Esta caixa de equipamentos compacta tem espaço na parte superior para ferramentas e
armazenamento de componentes em contêineres empilháveis e removíveis.
UAU! e-book
www.wowebook.org
Machine Translated by Google
É hora de começar nossa jornada. Hacking com hardware embutido de baixa potência pode ser divertido,
criativo e excitante - e é cada vez mais útil no mundo comercial. Os desenvolvedores da Web (como
você) já possuem habilidades que podem ser excelentes trampolins em seu caminho.
Você pode usar a linguagem onipresente da web, JavaScript, para começar e reduzir
distrações na estrada.
Em nossa aventura, você obterá uma compreensão fundamental das poucas relações
básicas que fazem os circuitos eletrônicos funcionarem. Não é matemático? Não se preocupe, eu também não.
Você encontrará alguns personagens úteis no caminho: componentes e módulos, diferentes tipos de
A estrada continua para sempre, os horizontes são infinitos. Não poderemos visitar tudo, mas ao final
deste livro você estará preparado para avaliar e usar tecnologias futuras que ainda não surgiram. No
momento em que você estiver no meio de suas viagens, é provável que a estrada que você escolheu tenha
mudado notavelmente. Mas, confiando em algumas constantes como sua bússola — noções básicas de
hardware, aplicação de JavaScript, tecnologias da web — você será capaz de encontrar seu caminho.
RESUMO
Começar do zero em um hobby de eletrônica embarcada pode parecer intimidador, mas suas
Um microcontrolador combina processador, memória e E/S em um único chip. A lógica que define o
do MCU.
Existem várias maneiras pelas quais o JavaScript pode controlar o hardware: hostclient, JavaScript
os dados são trocados com o microcontrolador usando um protocolo de mensagens (API). O projeto
Alguns microcontroladores restritos são otimizados para executar JavaScript (ou um subconjunto de
adicionais, como portas USB ou conexões de áudio. Esses dispositivos geralmente podem executar full
UAU! e-book
www.wowebook.org
Machine Translated by Google
sistemas operacionais desenvolvidos e muitas vezes se comportam como computadores minúsculos. Muitos
oferecem a opção de controlar a E/S e o comportamento com linguagens de nível superior, como python, C+
+ ou JavaScript.
Placas de desenvolvimento são plataformas que combinam um microcontrolador (ou outro componente
de processamento) com recursos úteis de suporte. Eles fornecem conexões convenientes para pinos de E/S,
Projetos de construção envolvem uma certa quantidade de equipamentos eletrônicos: placas de desenvolvimento,
componentes de entrada e saída, componentes eletrônicos básicos como resistores e diodos, conexões de
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Capítulo 2. Embarcando em hardware com Arduino
Este capítulo cobre
tópicos
O que é o Arduino e os recursos da placa de desenvolvimento Arduino Uno R3
tutoriais
Conectando componentes e energia ao Arduino Uno
Ofertas e promoçõesCodificação e upload de um esboço usando o Arduino IDE para fazer um LED piscar
Figura 2.1. O Arduino Uno é a placa mais popular do Arduino e aquela que
exploraremos nos próximos capítulos.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Embora todo o hardware (e software) do Arduino seja de código aberto, o que significa que você pode
facilmente obter os esquemas e até mesmo construir suas próprias placas sem muito esforço, apenas placas
O termo placa compatível com Arduino descreve placas que são fabricadas com as mesmas especificações
de design das placas Arduino oficiais, mas não são necessariamente produzidas pela Arduino (a empresa).
Genuino é uma marca usada para placas Arduino comercializadas fora dos Estados Unidos
Estados.
Vários produtos, como o pcDuino e o Netduino, usam o sufixo duino para sugerir suas qualidades de Arduino, e
ambos têm fatores de forma que permitem o uso de shields compatíveis com Arduino. O pcDuino permite que
UAU! e-book
www.wowebook.org
Machine Translated by Google
O hardware do Arduino é muito popular, barato e bem testado. É fácil configurar um Arduino com o
tipo de firmware que permite controlá-lo usando o framework JohnnyFive Node.js, tornando-o
um ponto de partida ideal para combinar
UAU! e-book
www.wowebook.org
Machine Translated by Google
JavaScript e hardware.
De todos os modelos de placa Arduino, o Arduino Uno é o mais popular. Ele foi testado em todo o
mundo por novatos em hardware e não deve nos trazer grandes surpresas. É confiável e
onipresente.
No capítulo 1 você viu alguns dos recursos comuns das placas de desenvolvimento, como
microcontroladores, pinos de E/S e conexões de alimentação. A Figura 2.2 mostra essas e outras
características principais de uma placa Arduino Uno:
Pinos de E/S digitais— Dos pinos de E/S do Uno, 14 são pinos digitais, que podem ser usados
Pinos de energia— Vários pinos no Uno fornecem acesso a uma fonte constante de energia e
aterramento. Você pode usá-los para fornecer energia aos seus projetos.
Pinos de entrada analógica— Seis dos pinos do Uno são capazes de processar entradas analógicas.
Os pinos digitais só podem ler ou produzir dois estados (ALTO ou BAIXO, mais sobre isso em
breve), mas os pinos de entrada analógica usam o conversor analógico-digital (ADC) integrado do
Uno para converter a entrada analógica - diferentes tensões - em valores entre 0 e 1.023.
Isso é útil para obter dados de sensores. Os pinos analógicos também podem ser usados como
pinos digitais.
Conector DC (corrente contínua) — Se você não estiver alimentando a placa via USB, o conector
DC do Uno permite que você conecte a placa a um adaptador de energia DC ou outra fonte de
energia DC.
os pinos do Uno voltam aos níveis padrão, o que é aproximadamente análogo a “reiniciar” a placa.
Na tradição do software, os programas Hello World são um primeiro exercício comum ao aprender uma
nova linguagem ou sistema – geralmente esses programas fazem algo trivial como imprimir as palavras
Truques básicos com LEDs são o Hello World dos hackers de hardware. Fazer um acender e piscar foi
Para acender um LED, você precisará construir um circuito. Um circuito fornece um caminho ininterrupto
da energia ao solo ao longo do qual os elétrons podem viajar. Ao longo desse caminho, os elétrons
podem encontrar e percorrer componentes, fazendo com que coisas interessantes aconteçam, como
acender um LED.
Quaisquer lacunas no caminho da energia ao terra arruinarão tudo - nenhum elétron vai a lugar nenhum.
Para acender o LED, você precisa completar um circuito preenchendo os intervalos entre energia e terra.
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Arduino Uno
A placa Arduino precisa ser alimentada para funcionar. Existem várias maneiras de
fornecer energia a uma placa Arduino, mas a mais fácil agora é conectá-la a uma porta USB
do seu computador. Vá em frente e conecte o Arduino ao USB com o cabo que acompanha a
placa. O LED ON mostrado na figura 2.3 deve acender.
Quando a placa recebe energia, vários dos pinos de energia da placa (figura 2.4) ficam ativos.
Quando ativos, eles fornecem uma tensão - ou seja, uma fonte constante de baixa tensão
UAU! e-book
www.wowebook.org
Machine Translated by Google
poder - e você pode conectar componentes a eles, se desejar (e nós fazemos!).
Figura 2.4. Alguns dos pinos de alimentação do Arduino Uno. Estes são alimentados sempre
que a placa é alimentada.
Você aprenderá mais sobre tensões e potência no capítulo 3, mas a figura 2.4 fornece uma visão rápida
LEDs como o mostrado na figura 2.5 são diodos emissores de luz - um tipo de diodo que dissipa parte
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os diodos são componentes eletrônicos que permitem que a corrente flua apenas em uma direção - um
diodo não permite que a corrente passe por ele ao contrário. Por causa disso, é importante identificar os terminais
positivo (ânodo) e negativo (cátodo) de qualquer tipo de diodo antes de tentar conectá-lo a qualquer coisa.
A luz ON no Uno, como pode ser visto na figura 2.5, também é um LED - um LED de montagem em superfície.
Os componentes de montagem em superfície são frequentemente vistos em placas produzidas em massa e construídas em máquinas.
Eles precisam ser soldados e suas dimensões minúsculas os tornam difíceis de usar em projetos construídos
à mão. Em vez disso, ficaremos com componentes maiores e com furos (eles têm terminais que se encaixam nos
furos de pinos, placas de ensaio ou outras placas de circuito) como o LED na figura 2.5.
Desconecte!
Certifique-se sempre de desconectar sua placa de desenvolvimento das fontes de energia antes de conectar
os componentes. Caso contrário, você corre o risco de causar danos aos componentes ou
o quadro.
Agora você está pronto para construir o circuito para acender um LED. Antes de prosseguir, certifique-se de
desconectar seu Arduino Uno do USB ou de qualquer outra fonte de energia. Conecte o LED ao Arduino:
1. Localize o cátodo (terminal negativo) do seu LED. Consulte a figura 2.5 se precisar de ajuda
UAU! e-book
www.wowebook.org
Machine Translated by Google
a seção POWER da placa, conforme a figura 2.6.
Figura 2.6. Iluminando um LED com um Uno. Conectar a energia (3,3 V) ao terra
(GND) com o LED completa o circuito, removendo quaisquer lacunas e
permitindo que os elétrons fluam.
2. Localize o ânodo (terminal positivo) do LED e conecte-o ao pino marcado com 3.3
V na seção POWER.
Depois que o LED estiver orientado e conectado, conecte o Uno ao seu computador com USB para
que ele tenha energia.
Tada! Você usou os cabos do LED para conectar a energia ao terra, criando um circuito e
acendendo o LED (figura 2.6).
A tensão operacional típica de um Arduino Uno é de 5 V, e os projetos que você desenvolverá nos
próximos capítulos envolverão principalmente circuitos baseados nessa tensão. Isso pode deixar você
curioso para saber por que o LED neste exemplo está conectado à alimentação de 3,3 V.
Conectar esse tipo de LED diretamente nos pinos de alimentação de 5 V do Arduino dá um pouco
de energia demais - não é muito arriscado, mas você pode queimar seu LED. Você aprenderá mais sobre
UAU! e-book
www.wowebook.org
Machine Translated by Google
os comos e porquês desse tipo de coisa à medida que avançamos, e vou parar de usar termos vagos
como suco.
Em projetos futuros, usaremos resistores, componentes eletrônicos que resistem ao fluxo de eletricidade,
para trazer a corrente do circuito a um nível menos difícil para LEDs e outros componentes. Por enquanto,
usaremos apenas 3,3 V, que, na corrente do Uno, não é tão ruim para o seu LED.
Dito isto, nunca é uma boa ideia alimentar um LED sem um resistor limitador de corrente por longos
períodos de tempo, portanto, não deixe seu arranjo UnoLED conectado por mais de alguns minutos ou mais
(você pode notar que seu LED está esquentando para quanto mais tempo ele fica aceso).
Ao conectar a energia do pino de 3,3 V ao terra por meio de um LED, você completou um circuito (figura
2.7). A energia pode fluir através deste circuito e, como um bom efeito colateral, faz seu LED brilhar.
Você poderia ter construído o circuito básico de LED com qualquer fonte de energia de baixa voltagem,
como baterias. Não há lógica envolvida, então você não precisa tecnicamente de uma placa de
desenvolvimento (embora a fonte de energia constante do Uno seja útil). Mas as coisas ficam mais
interessantes quando você programa o Arduino para fazer coisas diferentes – vamos tentar isso agora.
Nenhuma situação de LED Hello World está completa sem fazê-lo piscar.
Mas você não pode fazer o LED piscar usando os pinos aos quais ele foi conectado no exercício
anterior. O pino de alimentação de 3,3 V sempre será alimentado sempre que a própria placa
for alimentada - o LED sempre estará aceso porque o circuito sempre estará completo. Em vez
disso, o que precisamos fazer é controlar um LED conectado a um dos módulos do Arduino.
Um pino digital configurado pode ter um de dois estados: ALTO ou BAIXO. Essa lógica binária
pode parecer familiar para você como programador - a dualidade verdadeiro/falso, 1/0, sim/não
é um tema seminal no desenvolvimento de software e na arquitetura digital em geral.
No nível do hardware, as lógicas HIGH e LOW correspondem às tensões. Quando um pino digital
WOW! e-
book www.wowebook.org
Machine Translated by Google
está configurado como uma saída, um estado HIGH significa que o pino está fornecendo tensão, então há
energia aplicada a esse pino (no caso do Uno, 5 V ou próximo a ele) - ele está, de fato, ligado. BAIXO
significa que a tensão no pino está em ou próximo de 0 V - o pino está efetivamente desligado.
Programar um pino digital configurado como uma saída para alternar entre ALTO e BAIXO é o tíquete para
Entradas digitais
Quando um pino digital é configurado como um pino de entrada, os estados HIGH e LOW também estão
em jogo, mas de uma maneira um pouco mais sutil. Mais sobre isso quando falarmos sobre sensores
Para configurar e programar os pinos digitais no Uno, você precisará escrever um esboço e carregá-lo na
recente do Arduino IDE para sua plataforma de sistema operacional. É gratuito e suporta Windows, Mac
Figura 2.9. Na primeira vez que você iniciar o Arduino IDE, ele criará um novo esboço vazio para
você.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O que é um esboço?
Sketch é simplesmente uma palavra chique para código ou programa. O Arduino mantém seus esboços
em um chamado sketchbook (basicamente uma pasta). O termo esboço pode ser rastreado até a
Sugestões da linhagem do Arduino também podem ser vistas em algumas das bibliotecas de funções
Dentro do Arduino IDE, você pode escrever esboços para seu Arduino Uno (ou outras placas
compatíveis com Arduino) usando a linguagem de programação Arduino. Vamos ver um WOW! e-book
www.wowebook.org
Machine Translated by Google
alguns exemplos de trechos de código, que parecem bem diferentes do JavaScript que usaremos mais
tarde.
Para obter um pino digital pronto para suportar um LED, você o configura em um esboço do Arduino
como um pino de saída – afinal, o LED é um componente de saída. A configuração de um pino digital
como um pino de saída se parece com o seguinte na linguagem de programação do Arduino.
pinMode(12, OUTPUT); 1
Para programar o pino de saída, você o define como HIGH ou LOW usando a função digitalWrite
digitalWrite(12, HIGH); 1
digitalWrite(12, BAIXO); 2
Mas você não deve fazer isso. Lembre-se, a tensão de saída dos pinos digitais quando definida como
ALTA é de 5 V. Não estamos usando resistores para controlar a tensão (ainda), e a saída de 5 V do
pino pode sobrecarregar o LED e potencialmente queimá-lo (figura 2.10).
Figura 2.10. É difícil para seus LEDs conectá-los diretamente a um pino de E/S digital Uno de
5V.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Estamos com sorte, no entanto. O Arduino Unos possui um LED embutido no pino 13 (figura 2.11).
Sempre tão conveniente! Sempre que o pino digital 13 estiver definido como HIGH, o LED integrado
acenderá. Para esta experiência, você não precisa conectar nada - em vez disso, vamos nos
concentrar na parte de programação.
Figura 2.11. O minúsculo LED de montagem em superfície ao lado do pino 13 acende (laranja)
sempre que o pino 13 é definido como ALTO.
UAU! e-book
www.wowebook.org
Machine Translated by Google
setup—É aqui que você pode—aposto que já adivinhou—colocar o código de configuração para
o seu esboço. Este código é executado uma vez no início da execução do programa.
Para configurar seu esboço de LED piscando, o setup precisará configurar o pino
conectado ao LED (13). Mesmo que você não conecte fisicamente um componente externo a
este pino, você ainda precisa configurá-lo como um pino OUTPUT digital.
loop - Após a conclusão da configuração, o código no loop será executado repetidamente até
que o Arduino perca energia ou seja reinicializado. Esta é a parte do esboço que precisa
definir alternadamente o pino 13 HIGH (tensão de 5 V aplicada) e LOW (sem tensão) para que
o LED pisque.
UAU! e-book
www.wowebook.org
Machine Translated by Google
No Arduino IDE, crie um novo esboço para conter o código para piscar o LED onboard, conforme
mostrado na listagem a seguir.
void setup()
{ pinMode(13, OUTPUT); 1
}
void loop()
{ digitalWrite(13, HIGH); 2 delay(500); 3
digitalWrite(13, BAIXO); 4
atraso(500);
}
Se a linguagem de programação do Arduino se parece com C/C++ para você, você está certo,
basicamente é, menos alguns tipos e recursos. A linguagem Arduino também fornece uma
biblioteca integrada de funções específicas de hardware, incluindo pinMode e digitalWrite.
Esboços de exemplo
Se você não quiser digitar o esboço piscando no Arduino IDE, ou apenas quiser ver mais
esboços de exemplo, você pode encontrar um esboço piscando semelhante e muito mais em
Arquivo > Exemplos no IDE.
Vá em frente e conecte seu Arduino Uno a uma porta USB do seu computador. No IDE, você
pode clicar no botão Verify na janela do esboço (figura 2.12) para garantir que seu código esteja
livre de erros ou ir direto para o botão Upload, que verificará, compilará e enviará seu esboço
para o microcontrolador da placa. Se você ainda não salvou o esboço, será solicitado a fazê-lo
ao carregá-lo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se tudo deu certo, você deve ver o LED integrado piscar a cada 500 ms (figura
2.13).
Figura 2.13. O esboço carregado deve fazer o LED integrado piscar a cada 500
EM.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Embora a linguagem de programação do Arduino seja uma sintaxe de nível inferior ao JavaScript, ainda é uma
linguagem de alto nível. O conteúdo do seu esboço é primeiro compilado em código de máquina que o
microcontrolador pode executar nativamente. Esse código compilado é então gravado na memória de programa
não volátil do microcontrolador. O microcontrolador do Uno armazena o programa em memória flash, mesma
Assim como as fotos não desaparecem de um cartão de memória quando você remove o cartão de uma câmera
energia. Compare isso com a memória volátil (como a RAM), que perde seu conteúdo se não for alimentada.
Seu esboço carregado com sucesso permanecerá até ser substituído por outra coisa.
Um programa armazenado indefinidamente em memória não volátil é chamado de firmware. Cada vez que você
carrega um novo esboço em um Arduino, você está substituindo seu firmware. O firmware não
“desaparecerá” depois que você desconectar a placa de seu cabo USB. Se você conectar WOW! e-book
www.wowebook.org
Machine Translated by Google
a placa de volta no USB, ou conecte-a em outra fonte de energia, o LED começará a piscar
novamente porque o firmware ainda está intacto.
Quando um Arduino recupera a energia após uma desconexão, ele será redefinido, trazendo seus
pinos de volta ao comportamento padrão e reiniciando o firmware do microcontrolador. A
execução do firmware na memória do programa começará desde o início. Da perspectiva de um
esboço do Arduino, isso significa que o código de configuração será executado novamente. A
redefinição pode ser uma tática de economia de sanidade se você tiver algo enlouquecido em um desenvolvime
quadro.
Você não precisa desconectar a placa Arduino Uno da energia para reiniciá-la. Você pode usar o
prático botão RESET integrado - pressione e segure-o por um momento - para realizar a mesma coisa.
Agora você já viu a configuração básica da terra do Arduino Uno e aprendeu o básico de escrever e
fazer upload de esboços usando o IDE. É hora de chegar ao JavaScript!
O fluxo de trabalho para trabalhar com um Arduino usando JavaScript e uma configuração
de hostclient é diferente do fluxo de trabalho padrão do Arduino. Em vez de criar e carregar esboços
repetidamente usando o Arduino IDE, você carregará inicialmente um único esboço que
permanecerá no lugar como o firmware da placa.
Depois disso, você não usará mais o Arduino IDE - em vez disso, escreverá o código JavaScript
usando o editor de texto de sua escolha e o executará com o nó de dentro de um terminal.
Estas são as etapas para definir uma configuração de hostclient com o Uno:
UAU! e-book
www.wowebook.org
Machine Translated by Google
um protocolo chamado Firmata.
formato baseado em mensagens MIDI. O protocolo Firmata especifica como devem ser essas mensagens
de comando e dados. A implementação Arduino de Firmata fornece o firmware real que você pode colocar
Firmata. Ele assume a forma de um esboço do Arduino que você carrega na placa (figura
2.14).
Figura 2.14. A primeira etapa para definir a configuração host-cliente com o Uno é
carregar um esboço Firmata que permitirá que a placa se comunique usando
o protocolo Firmata.
Boas notícias: o Firmata é popular o suficiente para que os esboços do Firmata de que você precisa
Siga estas etapas para carregar o tipo certo de Firmata para o seu Uno para que ele possa ser usado como um
Isso é um pouco análogo aos pacotes de recursos opcionais para veículos novos. Os clientes podem
encomendar um carro ou caminhonete com uma certa combinação de opções - teto solar, som premium,
tapetes - mas você não pode combinar todas as opções em um único veículo. Não há espaço para três
tipos de tapetes e apenas alguns consumidores estão interessados na suspensão de desempenho mais
decadente.
suporte para escudos Ethernet. AnalogFirmata tenta maximizar o número de entradas analógicas que
podem se comunicar ao mesmo tempo. StandardFirmataPlus é um bom equilíbrio de todas as coisas mais
Quando você fez o LED piscando usando o Arduino IDE, você carregou um esboço que se tornou o
Em contraste, o firmware Firmata não tem uma finalidade específica. Em vez disso, é um programa
que permite que a placa se comunique com a estrutura Node.js que você está
prestes a instalar.
Por enquanto, você terminou o IDE do Arduino - você pode sair do programa depois de carregar o esboço
Firmata.
especial em robótica, mas você pode fazer muitas coisas diferentes com o software. Ele existe há mais
tempo do que a maioria dos frameworks JavaScript para hardware e tem uma API clara e um pouco de
Para criar seu primeiro projeto JohnnyFive, crie um diretório para ele e instale o pacote npm do
$ mkdir olamundo
$cd olamundo
$ npm instalar johnnyfive
UAU! e-book
www.wowebook.org
Machine Translated by Google
npm, mas o processo de instalação compila algumas extensões nativas, que ocasionalmente podem causar
ai.
Se você estiver usando o Windows e tiver problemas, tente executar este comando:
Dentro do diretório helloworld onde você instalou o JohnnyFive, crie um arquivo chamado
hello.js e abra-o no editor de texto de sua preferência. Dentro deste arquivo JavaScript, você pode
escrever o código para controlar seu Arduino Uno, mostrado na listagem a seguir.
led.blink(500); 5
});
UAU! e-book
www.wowebook.org
Machine Translated by Google
4 Instancia um objeto de LED no pino 13 (pino de LED interno do Uno)
Salve o arquivo. Conecte seu Uno a uma porta USB do seu computador, caso ainda não
esteja conectado. Em um terminal, cd para o diretório do projeto e execute este comando:
node hello.js
$ node hello.js
1457806454739 Dispositivo(s) /dev/cu.usbmodem1421
1457806454752 Conectado /dev/cu.usbmodem1421
1457806458536 Repl inicializado
LED embutido piscando? É isso! Você acabou de controlar um Arduino Uno com
JavaScript.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para interromper a execução do programa JohnnyFive hello.js, digite CtrlC duas vezes na janela
do terminal. Dê uma olhada no seu Uno. Dependendo do momento em que você sai do
programa, o LED pin13 pode estar apagado, ou pode ficar aceso constantemente. Em ambos os
casos, não estará mais piscando.
Isso ocorre porque o programa no computador host parou de executar e, como resultado,
parou de enviar mensagens para o firmware Firmata. A placa é deixada em um estado que
representa as últimas mensagens do programa comunicadas com sucesso.
Agora que o script hello.js não está mais em execução, pressione e segure o botão RESET
WOW! e-
book www.wowebook.org
Machine Translated by Google
botão por um momento. O LED do pino 13 do Uno estará apagado e permanecerá apagado.
Lembre-se que, ao resetar, o Arduino Uno reseta seus pinos e reinicia o programa de firmware.
Anteriormente, quando seu firmware era o esboço de LED piscando carregado do Arduino IDE, a piscada
seria retomada. Agora o firmware é o Firmata, que não faz os LEDs piscarem sozinhos, mas aguarda
instruções sobre o que fazer. O LED no pino 13 é desligado pela redefinição de hardware dos pinos e nada
No método hostclient, o cliente não faz nada sozinho — ele precisa ser continuamente direcionado
pelo host. O cliente Uno é como uma marionete nesta configuração. Ele precisa de entrada constante de
A estrutura dos esboços escritos na linguagem de programação Arduino com o Arduino IDE difere da
Na linguagem de programação do Arduino, você divide seu código em configuração e loop. O código dentro
do loop é executado perpetuamente até que a placa seja redefinida ou o firmware seja substituído. Para
loop void() {
digitalWrite(13, HIGH);
atraso(500);
digitalWrite(13, LOW);
atraso(500);
}
Cada vez que o código dentro do loop é executado, ele define o pino 13 como ALTO, espera 500 ms, define-
o como BAIXO e espera outros 500 ms. Em seguida, o loop é executado novamente (e novamente e
As placas acionam o evento pronto apenas uma vez (não se preocupe; se você vincular ao evento pronto
evento depois que ele disparar, ele ainda invocará a função do manipulador de eventos). Isso significa que a função
você passar como o manipulador também será executado apenas uma vez - não é um loop.
Outra diferença é que JohnnyFive fornece uma API de nível superior. Em vez de configurar um pino
como uma saída digital genérica, com o JohnnyFive você inicializa um objeto que representa um componente de
LED, especificamente. Isso lhe dá acesso a alguns métodos e propriedades úteis na classe Led, que incluem
os métodos blink, on, off e toggle, junto com outros mais interessantes que você conhecerá mais tarde.
Em vez de manipular o LED definindo um pino como HIGH ou LOW e invocando um atraso entre os dois, você
pode invocar o método blink com um argumento que define o período de piscamento em milissegundos. Nos
bastidores, JohnnyFive usa um setInterval para lidar com o tempo em piscadas. Um LED piscará até que você
Mas como dizemos ao LED para parar de piscar? É aqui que as metáforas JavaScript começam a ter um papel e
oferecem ótimas opções para interagir com seu dispositivo. No JohnnyFive, o método blink do Led recebe
um segundo argumento opcional, uma função de callback. Sempre que o LED acender ou apagar, o retorno de
led.blink(500, () => { 3
piscarContagem++;
UAU! e-book
www.wowebook.org
Machine Translated by Google
2 Configura quantas vezes o LED deve piscar no total
3 Esta função de retorno de chamada é invocada cada vez que o LED liga ou desliga.
$ node hello.js
Este exemplo impede que o LED pisque após um determinado número de piscadas, mas você pode fazer várias
outras coisas usando um retorno de chamada em Led.blink. Por exemplo, você pode alterar a frequência
das piscadas ou simplesmente acompanhar o número total de piscadas durante um longo período de tempo.
Quando você olha para o código JohnnyFive, pode parecer mais natural e familiar do que o código de
circuitos eletrônicos – pode ser um mundo completamente novo para você. Mas há algumas coisas básicas
RESUMO
As placas Arduino são um ponto de partida comum para aprender sobre hardware porque são
Em um fluxo de trabalho típico do Arduino, os esboços são escritos no IDE de plataforma cruzada do Arduino
UAU! e-book
www.wowebook.org
Machine Translated by Google
e carregado, como firmware, para placas.
Para controlar uma placa Arduino com JavaScript em uma configuração hostclient, o
mesmo protocolo do host. Firmata é um desses protocolos e pode ser carregado no quadro como
um esboço.
A estrutura JohnnyFive Node.js se comunica usando o protocolo Firmata, mas também expõe uma API
de nível superior. Led é um exemplo de uma classe JohnnyFive para controlar um componente
de hardware.
Scripts escritos em JohnnyFive podem ser executados a partir da linha de comando, usando node.
O código no host deve ser executado e se comunicar constantemente com a placa do cliente — o
Os scripts JohnnyFive são orientados a eventos, um padrão de design familiar para JavaScript
programadores.
UAU! e-book
www.wowebook.org
Machine Translated by Google
tutoriais
Prototipagem de circuitos básicos em breadboards
oferece
A diferença
e
Ofertas entre circuitos paralelos e em série
Detalhes detalhados sobre LEDs e como conectá-los em várias configurações úteis de
ghlights
Sair
1 Arduino Uno
4 resistores de 220 V
4 resistores de 560 V
1 resistor de 100 V
1 botão de pressão
1 bateria de 9 V
1 encaixe de bateria de 9 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 tábua de pão de meio tamanho
Projetar e construir circuitos pode ser completamente novo para você e pode parecer
intimidador. A boa notícia é que existem apenas alguns conceitos básicos para entender. Depois de
entender a interação de tensão, corrente e resistência - conforme formalizado na lei de Ohm
- você estará no caminho certo para ser capaz de
compreender circuitos básicos.
Existem algumas metáforas tradicionalmente usadas para ilustrar tensão, corrente e resistência. A
analogia mais comum é um sistema hidráulico (água) envolvendo tanques e tubulações. Eficaz, mas nem
sempre memorável. Vamos tentar uma aventura diferente.
No alto das montanhas, nas profundezas da floresta de algum lugar que não existe, uma tribo de
gnomos se viu inexplicavelmente na posse de um suprimento infinito de águas-vivas.
Os gnomos, sendo teimosos e travessos, procuraram encontrar um uso humorístico para as criaturas
inertes. Eles se divertiram muito jogando águas-vivas sobre penhascos, observando-as
mergulhar no lago abaixo ou quicar nos telhados das aldeias locais.
Os habitantes da cidade próxima ficaram inicialmente incomodados, mas logo reconheceram que
os invertebrados em queda carregavam energia e poderiam ser uma fonte gratuita de energia para
suas fábricas de biscoitos - mas apenas se o ataque pudesse ser controlado com segurança. Então eles
observaram e, com o tempo, entenderam e manipularam os principais fatores dos circuitos
elétricos: tensão, corrente e resistência.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os habitantes da cidade notaram rapidamente, por exemplo, que quanto mais alto e mais íngreme
o penhasco, mais energia as águas-vivas lançadas têm quando atingem o lago no fundo do vale.
Declives menores não fornecem tanta energia potencial para hijinks quando a água-viva mergulha
(figura 3.1).
Figura 3.1. Penhascos mais altos fornecem mais “tensão”, ou seja, potencial elétrico.
A voltagem é como “pressão” elétrica, empurrando as cargas (água-viva) de alto
potencial de energia para um local de menor potencial.
A tensão é uma medida da diferença de energia potencial entre dois pontos. É algo como pressão,
tensão ou força gravitacional, já que a eletricidade está sempre ansiosa para passar de uma tensão
mais alta para uma mais baixa. A voltagem, medida em volts, é energia potencial, mas a voltagem
sozinha, sem mover elétrons carregados (água-viva), não pode causar estragos (figura 3.2).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para que algo interessante aconteça, as águas-vivas precisam ser jogadas ativamente da beira
do penhasco, uma tarefa que os gnomos estão mais do que felizes em realizar.
Figura 3.3. A corrente, o fluxo de eletricidade, pode ser medida contando quantas cargas
(água-viva) passam por um ponto específico em um penhasco durante um período de tempo
definido.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Eles projetaram sistemas de canalização de água-viva nas faces do penhasco (figura 3.4), restringindo
o fluxo de água-viva a um nível mais razoável. Para circuitos perto das falésias mais altas (mais
tensão), esses sistemas tinham que ser mais robustos por causa da imensa pressão de queda de
água-viva de cima.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A diferença de elétrica
semelhante à “pressão”
Tensão EM volts
elétrica. É o que empurra cargas
tempo definido.
uma medida de
Ohms (indicado pelo
Resistência capacidade do material de R
símbolo V)
resistir ao fluxo elétrico.
No final, os habitantes da cidade aperfeiçoaram o circuito e a água-viva ajudou a fazer alguns dos melhores
biscoitos da região.
Há uma fonte de energia - tropas de gnomos - jogando água-viva em um penhasco. Quanto maior o WOW!
e-book
www.wowebook.org
Machine Translated by Google
precipício, mais tensão (energia potencial) é fornecida ao circuito. A corrente (fluxo) de águas-vivas segue
em direção ao maquinário da fábrica.
Para reduzir a corrente da água-viva a níveis administráveis, sistemas de canalização e tubos adicionam
resistência.
Depois que as águas-vivas dão energia ao maquinário de biscoitos e chegam ao chão da fábrica, elas
atingem o ponto de menor potencial do circuito. Os gnomos usando jetpack agem como uma
espécie de bomba, içando a água-viva cansada de volta ao penhasco, onde podem ser jogadas
novamente. E de novo e de novo... (figura 3.5).
Tensão, corrente e resistência são conceitos vitais de circuitos básicos. O próximo passo é
entender como esses fatores se relacionam e como eles se aplicam ao mundo real.
circuitos.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O portador do biscoito pode morder o fator que deseja determinar - então veja como ele pode ser
derivado dos outros dois fatores (figura 3.7).
Figura 3.7. Ao morder a borda do biscoito impresso com o fator que o comedor de
biscoito quer descobrir, eles podem ver rapidamente a equação que precisam resolver.
Por exemplo, se eles quiserem determinar a resistência (R), eles podem cortar isso e ver
que R = tensão (V) dividida pela corrente (I).
Georg Ohm descobriu essas relações-chave entre voltagem, resistência e corrente na década de
1820, bem antes dos espertos habitantes da cidade de biscoitos, e é por isso que a lei de Ohm
leva seu nome. Se você preferir sua matemática na forma não-cookie, estas são as equações
relevantes:
“OK”, você pode estar pensando, “mas como aplico isso no mundo real?”
UAU! e-book
www.wowebook.org
Machine Translated by Google
Projetar e construir circuitos básicos começa com o equilíbrio certo dos principais fatores: tensão, corrente e
resistência.
A Tabela 3.2 descreve alguns exemplos comuns de como ajustar tensão, corrente e resistência em
circuitos básicos. Os exemplos não são exaustivos (por exemplo, existem maneiras adicionais de ajustar a
tensão em um circuito), mas destacam os tipos de coisas que faremos a curto prazo para que nossos circuitos
funcionem corretamente.
Use uma fonte de alimentação com Use uma fonte de alimentação com
Tensão V = IS
uma tensão mais alta. uma tensão mais baixa.
resistência. resistência.
Uma das necessidades de cálculo mais comuns que surgem no hobby de hackers eletrônicos é “dada uma tensão
de alimentação, que resistor preciso usar para garantir que meu componente receba a corrente desejada” (figura
3.8)?
Figura 3.8. Um problema comum da lei de Ohm do mundo real: qual valor de resistor é
necessário para fornecer um LED com 20 mA de corrente em um circuito com uma tensão de
alimentação de 6 V?
UAU! e-book
www.wowebook.org
Machine Translated by Google
A tensão geralmente é definida pela fonte de alimentação do projeto - baterias, alimentação USB,
adaptador CC - e você sabe que deseja fornecer uma corrente específica a um componente do circuito.
Tensão e corrente são, então, definidas, o que significa que você precisa resolver para R,
resistência.
Digamos que você saiba que a tensão de alimentação será de 6 V e que você tem um componente
que precisa de 20 mA (0,02 A ou 20 milésimos de ampère) de corrente (figura 3.10). Resolver para R
(resistência em ohms) significa dividir V (tensão em volts) por I (corrente em amperes) porque R =
V / I:
R = 6 V / 0,02 A
então
R = 300 V
Certifique-se de manter suas unidades consistentes ao usar as equações da lei de Ohm. A corrente
sempre deve ser medida em ampères (A), tensão em volts (V) e resistência em ohms (V). Volts e
ohms tendem a ser diretos, mas quando você está lidando com correntes em faixas de eletrônicos de
hobby - muitas vezes dezenas de miliamperes - não se esqueça de expressar esses valores em amperes
ou obterá a resposta errada:
mas
UAU! e-book
www.wowebook.org
Machine Translated by Google
300 (V) þ 6 (V) / 20 (mA)
OK! Quase pronto. Mas antes de começarmos a montar circuitos com esse novo
entendimento, vamos ter um momento adulto e nos proteger contra alguns problemas
potenciais.
O primeiro dos dois problemas surge quando você fornece muita corrente a um componente em um
circuito (geralmente usando um valor de resistor muito baixo ou esquecendo de adicionar um
ao circuito inteiramente). Parte dessa energia é convertida no que provavelmente é um resultado
desejado - luz no caso de um LED, por exemplo - mas o restante também precisa ser usado. Se
você fornecer 100 mA de corrente a um LED classificado para um máximo de 20 mA para uso
constante (sem piscar), isso não funcionará bem a longo prazo. O primeiro sinal de muita corrente
geralmente é o calor - o LED começará a ficar quente ao toque. Em um certo
O segundo “uh oh” tem potencial para ser muito pior. Se não houver carga em um circuito - ou seja,
nenhum componente ou resistor para atrair ou resistir à corrente - as coisas ficam realmente
complicadas. Se houver, digamos, um caminho indo diretamente do terminal positivo para o
negativo de uma bateria, não haverá resistência para limitar a corrente que passa pelo circuito.
Isso é um curto-circuito (figura 3.9) e faz com que uma quantidade imensa de corrente seja
descarregada pelo circuito muito, muito rapidamente. Essa energia pode causar calor, incêndio e até explosõ
Figura 3.9. Um curto-circuito não tem carga para moderar a corrente. Uma
ilustração comum de um curto-circuito é passar um fio diretamente do terminal
positivo para o negativo de uma bateria (não faça isso na vida real).
UAU! e-book
www.wowebook.org
Machine Translated by Google
energia do Uno para aterrar (PS, não faça isso), não explodirá porque a placa possui limitadores de corrente
em seus pinos de saída (sua placa pode estar torrada, no entanto). O máximo de corrente que você obterá
de seu pino de 5 V é 450 mA; o máximo de um único pino de E/S é cerca de 40 mA.
Você não obtém essa proteção contra correntes ultrajantes se estiver trabalhando com baterias - você pode
causar um lamentável festival de faíscas, ou coisa pior. Por isso tem cuidado.
Agora que você foi interrogado, vamos experimentar! Ao começar a adicionar componentes aos circuitos,
você precisará de uma maneira de organizá-los sem enlouquecer. Torcer o fio ou tentar manter vários
Em vez disso, as breadboards são ótimas bases para o layout de circuitos. Eles desempenham um papel
semelhante a uma base LEGO, fornecendo uma grade para conectar componentes e fios.
Placas de ensaio para circuitos de prototipagem são sem solda, o que significa que você pode colocar coisas
diretamente na placa sem necessidade de solda. Eles vêm em várias formas e tamanhos, mas são
consistentes em como as conexões da placa são conectadas. A Figura 3.10 mostra o layout de uma protoboard
de tamanho médio (as protoboards de tamanho normal são como duas protoboards de tamanho
UAU! e-book
www.wowebook.org
Machine Translated by Google
Uma breadboard típica combina fileiras de terminais horizontais (um termo técnico que realmente significa
“pontos para conectar componentes”) com trilhos de alimentação verticais (orifícios destinados à conexão
As fileiras de terminais geralmente têm um entalhe entre cada conjunto de cinco furos. Um terminal tenhole
linha - dois conjuntos de cinco orifícios conectados divididos por um entalhe - é um layout comum. Cada
orifício em uma linha de cinco unidades é conectado eletricamente, mas as conexões não continuam ao longo
do entalhe.
Os trilhos de alimentação têm dois orifícios por linha: um para positivo e outro para negativo. Eles
geralmente são marcados para você em vermelho (positivo) e azul ou preto (negativo).
As conexões nos trilhos de energia correm verticalmente ao longo do comprimento da placa. O power rail de
um lado da placa não está conectado ao power rail do outro lado da placa
quadro.
Vamos ter uma ideia de como essas conexões funcionam usando uma placa de ensaio para religar o
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 resistor de 220 V
Primeiro, vamos verificar a lei de Ohm para descobrir o que precisamos ajustar para fazer o circuito
A corrente máxima que devemos passar pelo LED é algo em torno de 20 mA (0,02 amperes) - para a
Como temos uma tensão fixa e uma corrente alvo, o valor variável é a resistência.
Qual valor do resistor é necessário para criar o circuito? Lembrar,
R = V/I
então
R = 5 V / 0,02 A
R = 250 V
Os resistores vêm em certos valores de resistência comuns e 250 V não é um resistor comumente
produzido. Calcular um valor de resistência necessário apenas para descobrir que não existe esse
resistor acontece o tempo todo - não se preocupe. Normalmente, a regra geral é arredondar para o
próximo valor de resistor comum (ter muita resistência é mais seguro do que não o suficiente,
normalmente).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Encontrando o resistor certo
Os resistores são codificados por cores de maneira padrão para ajudar na identificação. Existem dois sistemas de
distribuição por aí: resistores de quatro bandas e resistores de cinco bandas. Os resistores de quatro bandas são um
pouco mais comuns.
Cada resistor tem bandas de cores que representam dígitos iniciais no valor do resistor.
Os resistores de quatro bandas têm duas dessas bandas, enquanto os resistores de cinco bandas têm três.
As duas últimas bandas de um resistor são sua banda multiplicadora e sua banda de tolerância,
respectivamente.
A cor da banda do multiplicador indica quantos zeros devem ser adicionados após o valor indicado pelas
bandas de dígitos anteriores. Em outras palavras, multiplicar os dígitos iniciais por esta potência de dez fornece o valor
do resistor.
A cor da faixa de tolerância indica a precisão da resistência garantida. Uma tolerância de +/5% (ouro) é comum para
Um resistor de quatro bandas tem bandas de dois dígitos. O resistor de quatro bandas na figura a seguir é codificado da
seguinte forma:
4 Tolerância: +/ 5% (ouro)
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os resistores são codificados com faixas coloridas para indicar sua resistência e tolerância.
seu valor é
4 Multiplicador: 1 (marrom)
o valor é
Existem algumas maneiras de representar um circuito visualmente, para fornecer a outros construtores um
“mapa” para recriar o circuito. A forma mais formal de representar um circuito é através de um esquema,
notação e símbolos padronizados. Pode ser pensado como uma espécie de gráfico visual abstrato: a posição
dos componentes em um esquema não corresponde necessariamente ao seu layout no espaço físico.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Existem muitas maneiras possíveis de implementar fisicamente o esquema da figura 3.11, portanto,
um diagrama de fiação pode ser uma ferramenta útil. Diagramas, como o da figura 3.12 (criado com
o aplicativo de desktop Fritzing de código aberto), mostram uma implementação específica do
circuito e como ele poderia ser disposto (neste caso, em uma placa de ensaio).
Figura 3.12. Diagrama de fiação do circuito de LED simples, mostrando um layout físico
específico para implementar o circuito a partir de seu esquema. Este diagrama foi criado
no aplicativo de desktop Fritzing de código aberto.
Os esquemas podem parecer matemáticos e abstratos no início, mas são usados universalmente no
UAU! e-book
www.wowebook.org
Machine Translated by Google
comunidade eletrônica. Você conhecerá mais símbolos e convenções à medida que continuarmos
nossa jornada, e eles começarão a se sentir mais à vontade. Para melhorar sua compreensão dos
Os LEDs são polarizados, o que significa que precisam ser conectados de uma certa maneira para
funcionar corretamente. Como você aprendeu anteriormente, o ânodo é o terminal positivo e o cátodo é o
terminal negativo.
Os resistores não são polarizados, o que significa que não importa em que direção você os conecta. Eles
Outra coisa a observar é que, embora eu forneça coordenadas precisas de linha e coluna neste exercício,
você pode conectar os componentes com sucesso em qualquer linha ou coluna, desde que as conexões
funcionem no final (as linhas terminais estão conectadas horizontalmente; trilhos de força,
verticalmente).
Hora de montar o circuito. Consultando a figura 3.12, comece conectando os componentes nas fileiras de
terminais. Conecte o ânodo do LED vermelho no orifício 5C (linha 5, orifício C) e seu cátodo no orifício 5D
(a próxima linha abaixo). Conecte uma extremidade do resistor no orifício 5B, próximo ao cátodo do LED.
Alimentando o circuito
O circuito precisa estar conectado à energia. Primeiro, você precisará conectar os componentes
Se você tiver um pacote de jumpers coloridos, pode estar se perguntando quais cores são para qual finalidade.
Por convenção, as conexões de energia geralmente são feitas com fios vermelhos (positivos) e
pretos (terra). Outras cores que você pode ver representando conexões de energia negativa incluem
Verde e amarelo são frequentemente usados para conexões de entrada e saída, que surgirão
UAU! e-book
www.wowebook.org
Machine Translated by Google
em capítulos posteriores. Embora haja uma consistência generalizada no uso de vermelho e
preto/branco para conexões de energia, diferentes hackers usam diferentes combinações de cores para
várias outras coisas. Resumindo: não há regras rígidas e rápidas, mas tente ser consistente em qualquer
Os fios jumper não são polarizados. Eles podem ser conectados em qualquer direção.
Use um fio jumper vermelho para conectar o orifício 5B—conectado eletricamente ao ânodo do LED—a
um orifício na coluna vermelha (positiva) do barramento de alimentação. A quarta linha abaixo deve
funcionar bem se você não conseguir decidir sobre um favorito. Conecte a extremidade livre do resistor
caminho ininterrupto que vai do trilho de alimentação positivo, passando pelo fio vermelho até o LED,
Os tipos de projetos que estamos construindo com placas de desenvolvimento e sistemas embarcados
usam circuitos DC (corrente contínua). O fluxo de corrente em um circuito CC ocorre em uma única
direção, geralmente processada como indo da fonte positiva (energia potencial mais alta) para
Tecnicamente, isso não está correto - a corrente pode ser descrita com mais precisão como fluindo do
negativo para o positivo, e mesmo isso é uma simplificação exagerada. Mas a convenção de
desenhar circuitos com fluxo na direção positiva para negativa (+ em direção a ) está profundamente
arraigada e não há nada inerentemente prejudicial em representar o fluxo de corrente CC dessa maneira
tradicional, desde que você seja consistente. Curiosidade: a prática de visualizar o fluxo de corrente
do positivo para o negativo foi estabelecida por ninguém menos que o pioneiro da eletricidade, Benjamin
Franklin.
Além da CC, o outro tipo de fluxo de corrente é a CA (corrente alternada), na qual o fluxo da corrente inverte
os sentidos periodicamente. A energia da tomada é AC, oscilando na direção 50 ou 60 vezes por segundo,
Desconecte o Uno!
Como sempre, verifique se o Uno está desconectado do USB ou da tomada antes de conectá-lo
UAU! e-book
www.wowebook.org
Machine Translated by Google
a componentes ou circuitos.
O Uno pode fornecer bons e estáveis 5 V de seu pino de alimentação de 5 V. Usando um fio jumper
vermelho, conecte uma extremidade no pino de 5 V do Uno e a outra na linha superior do barramento de
alimentação positivo. Passe um fio jumper preto do pino GND do Uno até a linha superior do barramento
Agora conecte seu Uno em USB ou na tomada. Seu LED deve acender!
Se o seu LED não acender, há algumas coisas a verificar. A razão mais comum para um circuito como
este falhar é que é um circuito aberto, o que significa que há uma lacuna no caminho entre as extremidades
Certifique-se de que nenhum dos terminais de metal expostos nos componentes estejam se tocando.
Se essas etapas não funcionarem, tente trocar seu LED por um novo, caso o LED esteja morto.
Ocasionalmente, as conexões de uma breadboard podem ser instáveis (embora isso seja mais comum
em breadboards que você usa há muito tempo). Como último recurso, tente conectar os componentes em
uma parte diferente da placa de ensaio ou tente com outra placa de ensaio.
Este circuito de LED simples (figura 3.13) é um circuito em série. Um circuito em série tem apenas um
caminho para os elétrons - a corrente, aquelas medusas individuais que fluem do mundo dos gnomos - seguir.
Como só há uma rota possível, todas as águas-vivas/elétrons percorrem toda a rota; eles não podem
se perder em algum atalho ou estrada secundária. Isso significa que a corrente é a mesma em todos
Figura 3.13. Um circuito em série tem apenas um caminho possível para as cargas (água-
viva) fluirem - não há ramificações. A corrente é a mesma em qualquer ponto de um
circuito em série, o que significa que os pontos 1, 2, 3 e 4 têm corrente igual.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Ao modificar a corrente de um circuito em série com resistores, não importa se você usa, digamos, um
resistor classificado em 200 V ou dois resistores em 100 V. Os valores dos resistores se somam e
modificam a corrente em todo o circuito (figura 3.14).
Embora a corrente seja a mesma em qualquer ponto de um circuito em série, a tensão pode diferir
de ponto a ponto. Falaremos sobre isso quando construirmos divisores de tensão no capítulo 4.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Um detalhe desses circuitos em série que pode ter causado uma pausa é a posição do(s) resistor(es) limitador(es) de
corrente (um resistor limitador de corrente é aquele que é colocado para moderar a corrente no circuito).
Na figura 3.14, os resistores são conectados entre o LED e o terra, ou seja, são posicionados “depois” do LED. Acontece
que não importa onde os resistores estão posicionados em relação ao LED em um circuito em série.
Um resistor limitador de corrente colocado em um circuito em série afeta a corrente em todo o circuito, não importa
circuito em série.
1 botão de pressão
1 resistor de 220 V
3 fios de jumper
UAU! e-book
www.wowebook.org
Machine Translated by Google
No circuito simples de LEDs em série que você conectou, toda a corrente passa pelo LED,
depois pelo resistor e depois pelo terra (figura 3.14). Uma única lacuna em um circuito em
série fará com que todo o circuito pare de funcionar, porque é uma lacuna no único caminho
através do circuito. Isso torna possível ativar e desativar todo o circuito com um interruptor.
Você pode ver como isso funciona adicionando um botão ao circuito. Um botão é um tipo de
interruptor que só completa uma conexão quando é pressionado (às vezes, os botões são
chamados de interruptores momentâneos) (figura 3.15).
Na figura 3.16, o botão está conectado a uma protoboard, orientada de forma que os pinos
“sempre conectados” atravessem o entalhe no meio. Isso significa que as conexões
destacadas da linha superior estão sempre conectadas eletricamente, assim como as
destacadas na linha inferior. Enquanto o botão está inativo (não pressionado), as duas
linhas ficam isoladas uma da outra. Quando o botão é pressionado, no entanto, é feita uma
conexão entre os pinos superior e inferior no lado esquerdo do botão e os pinos superior e
inferior no lado direito. O efeito é que ambas as linhas destacadas são conectadas
eletricamente uma à outra enquanto o botão é pressionado.
Figura 3.16. Um botão de pressão conectado a uma breadboard, abrangendo o entalhe central.
Quando não pressionado, os pares de pinos na parte superior e inferior do botão são
conectados eletricamente (horizontalmente). Quando pressionado e mantido, os pares de
pinos nos lados esquerdo e direito do botão são conectados eletricamente (verticalmente).
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
3. Usando um fio jumper preto, conecte GND no Uno à linha superior do negativo
power rail no lado direito da breadboard.
4. Conecte o botão à breadboard. Seu botão pode ter um tamanho e ajuste diferentes
mais confortavelmente entre linhas diferentes, o que é bom.
5. Conecte o ânodo do LED (perna mais longa) em um slot na mesma linha das duas pernas inferiores
do botão.
O LED não deve estar aceso inicialmente. Aperte o botão. O LED deve acender enquanto você
mantiver o botão pressionado.
Figura 3.18. Diagrama de fiação do circuito de LED adaptado com um botão de pressão
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para refrescar sua memória, o cálculo visava encontrar o valor correto do resistor para um
LED—corrente alvo 20 mA—em um circuito de 5 V:
R = 5 V / 0,02 A
R = 250 V
Em vez de arredondar para o próximo valor de resistor comum, arredondamos para 220 V.
A razão pela qual um resistor de 220 V é mais do que suficiente para um LED em um circuito de 5 V
a 20 mA é que, devido a uma característica dos LEDs, não precisamos levar em conta os 5 V completos
Existe uma lei relevante, chamada lei de voltagem de Kirchoff (KVL para quem conhece). Afirma WOW!
e-book
www.wowebook.org
Machine Translated by Google
que toda a tensão no circuito deve estar em equilíbrio: a quantidade gerada deve ser igual à
quantidade usada. Tensão de entrada, tensão de saída.
No circuito da série LED, 250 V seria o resistor aproximado correto a ser usado se o resistor
fosse a única coisa no circuito “usando” alguma tensão. Mas isso não. Os LEDs têm uma
métrica chamada queda de tensão direta. Há um pouco de detalhe nisso, mas para nossos
propósitos é a quantidade aproximada de voltagem que o LED usará no circuito (figuras
3.19 e 3.20).
Figura 3.19. À medida que a eletricidade passa por um LED, alguma voltagem é usada ou diminuída.
A quantidade de tensão usada é chamada de tensão direta do LED. Ela varia entre cerca de 1,8 V e
3,5 V, dependendo da cor do LED – quanto maior a frequência da luz emitida, maior a queda de
tensão.
Figura 3.20. Voltando à analogia da tensão como inclinação ou altura do penhasco, o mesmo
circuito de LED em série pode ser visto de uma perspectiva diferente. À medida que a
corrente da água-viva passa pelo LED, 1,8 V é “consumido”, reduzindo a tensão
restante para 3,2 V (reduzindo a inclinação). Esses 3,2 V são então usados pelo resistor limitador
de corrente. Quando a água-viva atinge o ponto de menor potencial elétrico, toda a tensão no
circuito foi contabilizada.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Embora a maioria dos LEDs padrão comuns tenham uma corrente direta consistente (para fins de
brevidade, você pode pensar nisso como “aproximadamente a corrente que deve receber”) de 20 mA,
Os LEDs vermelhos têm uma tensão direta que varia na maior parte entre 1,8 e 2 V. Se o LED no circuito
tiver uma queda de tensão direta de 1,8 V, podemos subtrair isso da tensão do sistema de 5 V, que é a
5 V (tensão de alimentação)
1,8 V (tensão direta do LED vermelho)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Dado que queremos apontar para essa corrente de 20 mA (0,02 A), a equação da lei de Ohm
resultante é
R = 3,2 V / 0,02 A
ou
R = 160 V
Um resistor de 220 V tem um valor próximo o suficiente para ser excelente - arredondando para o
próximo valor de resistor comum conforme a convenção. Agora, 220 V é mais resistência do que 160 V, então
UAU! e-book
www.wowebook.org
Machine Translated by Google
você pode se perguntar que efeito o uso de um valor de resistência mais alto tem no LED e no circuito.
Maior resistência com tensão constante significa que a corrente diminui (porque, como sempre, a lei de
Ohm):
I = V/R
I = 3,2 / 220 V
I = 0,0145 A
No final, o LED recebe menos corrente do que 20 mA – cerca de 15 mA (0,0145 A). A quantidade de
corrente fornecida a um LED é diretamente proporcional ao seu brilho: um LED recebendo 15 mA não
será tão brilhante quanto um recebendo 20 mA.
Qual é a situação se outro LED vermelho idêntico for adicionado a este circuito em série?
Qual o resistor necessário? Precisamos levar em conta a queda de tensão de ambos os LEDs (figura
3.21).
Figura 3.21. Cada um dos dois LEDs reduz parte da tensão no circuito e,
novamente, a tensão restante é reduzida pelo resistor.
5 V (alimentação) 1,8 V
(LED 1)
1,8 V (LED 2)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
= 1,4 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
R = 1,4 V / 0,02 A
R = 70 V
Arredondando para o próximo valor de resistor comum, um resistor de 100 V funcionará bem,
conforme mostrado no esquema da figura 3.22.
Figura 3.22. Os dois LEDs são ligados em série com um resistor de 100 V. Há apenas
um único caminho através deste circuito quando o botão é pressionado: através do
primeiro LED, através do segundo LED, através do resistor e de volta ao terra.
1 resistor de 100 V
3 fios de jumper
3. Conecte o ânodo de um segundo LED na mesma linha que o cátodo do primeiro LED
Se você conectar seu Uno à energia e pressionar o botão, os dois LEDs devem acender.
Eles são ligados em série, o que pode ser mais fácil de visualizar olhando a figura 3.22 novamente.
E se você adicionar um terceiro LED? Pergunta capciosa: você realmente não pode. Não se você quiser
produzir luz confiável e brilhante. Há apenas 1,4 V “sobrando” após a queda de tensão dos dois
primeiros LEDs. Isso não é suficiente para alimentar um terceiro LED - um LED requer pelo menos seu valor
de queda de tensão para acender. Você pode conseguir que os três LEDs acendam fracamente, mas eles
UAU! e-book
www.wowebook.org
Machine Translated by Google
É possível alimentar continuamente mais de dois LEDs com 5 V, mas para isso é necessário um
circuito paralelo.
À medida que os elétrons se movem pelo circuito e encontram uma bifurcação na estrada, cada um deles
toma uma decisão sobre qual ramo seguir. A corrente prefere um caminho com menos resistência
(figura 3.25).
Figura 3.25. Como os dois ramos desse circuito paralelo têm a mesma resistência (100
V), metade da corrente passará por um ramo e a outra metade pelo outro.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Ao calcular quanta resistência existe no circuito paralelo, as coisas ficam um pouco estranhas e
contra-intuitivas. Observe novamente o circuito paralelo na figura 3.25. Qual é a resistência total
fornecida pelos dois resistores de 100 V?
A resistência total dos circuitos em série é fácil de descobrir - basta somar e voilà!
Você tem a resistência total. É tentador fazer o mesmo no início com circuitos paralelos — assumir
que a resistência total é de 200 V. Não. Ou talvez você tenha percebido que qualquer carga
que passa pelo circuito está passando apenas por um resistor, não por ambos. Então isso deve
significar que há uma resistência total de 100 V? Além disso, desculpe, não.
A resposta correta é 50 V.
Eu sei eu sei. Isso não parece certo, mas é verdade: em um circuito paralelo, a resistência
total sempre será menor que o menor valor do resistor. Vamos nos armar com a lei de Ohm e
algumas respirações profundas e examinar como isso pode acontecer. Calcular a resistência
equivalente em circuitos paralelos é um dos conceitos mais desafiadores para hackers
eletrônicos novatos, portanto, não puxe os cabelos ainda.
Vamos decompô-lo e colocá-lo de volta juntos. O circuito em série de 5 V com um resistor de 100 V
mostrado na figura 3.26 consumirá 50 mA de corrente (I) porque
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora digamos que você duplique o mesmo caminho - 5 V e um resistor de 100 V - e o coloque no
circuito. Esse segundo caminho também consumirá independentemente 50 mA porque a tensão
de alimentação (5 V) e a resistência (100 V) permanecem as mesmas (figura 3.27).
Figura 3.27. Cada ramificação de um circuito paralelo isoladamente atua como seu próprio
circuito em série. Podemos usar a lei de Ohm para verificar se esse ramo também consumirá 50 mA.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 3.28. A corrente total que entra no circuito é de 100 mA (ponto A). Ele se divide
igualmente em duas ramificações - cada ramificação recebe 50 mA (pontos B, C). A
corrente volta e no ponto D é novamente 100 mA. Em um circuito paralelo, a tensão
fornecida é constante para cada ramificação, mas a corrente varia.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Olhando para o circuito como um todo agora, sua corrente total é de 100 mA (0,1 A) e a tensão de
R = 50 V
A resistência fornecida por cada resistor em um circuito paralelo é reduzida porque cada ramificação
em um circuito paralelo aumenta a corrente total no circuito. A corrente está subindo enquanto a tensão é
divisores atuais
Qualquer circuito que divide a corrente proveniente da fonte de alimentação em mais de um ramo é
Se uma carga se encontra em uma bifurcação na estrada e ambos os caminhos disponíveis têm a
mesma resistência, a carga tem a mesma probabilidade de seguir qualquer rota (como o circuito
paralelo na figura 3.28). Mas se a resistência for desigual, mais cargas irão optar pelo caminho com menor
resistência – ou seja, mais corrente irá pegar o ramal de menor resistência.
Você pode calcular a resistência total no circuito mostrado nesta figura observando cada ramificação
isoladamente e descobrindo o consumo total de corrente do circuito:
Filial 1:
5 V / 200 V = 0,025 A (25 mA) porque I = V / R
Filial 2:
5 V / 100 V = 0,05 A (50 mA) porque I = V / R
0,025 A (ramo 1)
+ 0,05 A (ramo 2)
=========================
Fazer cálculos para resistência total dessa maneira pode se tornar complicado à medida que o número
de ramificações aumenta. Não iremos arquitetar divisores de corrente complexos com muitos ramos com
diferentes resistências, mas se você for do tipo curioso, existe uma fórmula para calcular a
resistência equivalente (total) em qualquer circuito paralelo:
Alguns desses cálculos de circuitos paralelos podem parecer inutilmente complicados, mas têm
aplicações úteis.
Aqui está o problema: cada ramificação do circuito paralelo é fornecida com a mesma voltagem. Portanto,
se pegarmos o LED do circuito em série e adicionarmos mais ramificações a ele (transformando-o em
um circuito paralelo – figura 3.29), cada ramificação obtém “seus próprios” 5 V para trabalhar. Dessa
forma, podemos conectar três, quatro ou até mais LEDs no mesmo circuito e não ficar sem tensão como nós
faria em um circuito em série.
4 resistores de 220 V
6 fios de jumper
A Figura 3.30 mostra um layout físico do mesmo circuito. Para conectar quatro LEDs no mesmo circuito,
2. Conecte as extremidades do cátodo na mesma fileira de terminais, mas do outro lado do espaço
3. Passe quatro fios de jumper vermelhos do trilho de alimentação positivo no lado esquerdo da placa
à linha de ânodo de cada LED.
4. Conecte um resistor de 220 V da linha de cátodo de cada LED ao barramento de alimentação negativa em
5. Conecte os trilhos de alimentação aos pinos 5 V e GND do Uno (usando um vermelho e preto
UAU! e-book
www.wowebook.org
Machine Translated by Google
jumper, respectivamente).
6. Conecte o Uno à alimentação USB ou DC.
Figura 3.30. A fiação de LEDs em paralelo permite que você conecte mais em um único
circuito porque cada ramificação recebe a mesma tensão (5 V).
Os circuitos paralelos têm outro recurso útil. Se você removesse o fio vermelho entre o LED
na linha 2 e o barramento de alimentação, os outros 3 LEDs ainda acenderiam. O circuito ainda tem
três outros caminhos completos que pode usar. Compare isso com um circuito em série, onde
uma única lacuna impede que a corrente flua para qualquer componente.
Uma única bateria de 9 V é uma fonte de alimentação conveniente e, no caso dos circuitos de LED
que você construiu, elimina a dependência de uma placa de desenvolvimento.
UAU! eBook
Construa o circuito: LEDs alimentados
por 9 V www.wowebook.org
Machine Translated by Google
Monte o circuito: LEDs alimentados por 9 V
1 tábua de pão
4 fios jumper
4 resistores de 560 V
Isso significa que precisaremos usar resistores diferentes para os LEDs no circuito paralelo.
Lembre-se de que cada ramificação em um circuito paralelo “obtém” toda a tensão de alimentação de 9 V para
trabalhar, portanto, você pode calcular o resistor necessário em cada ramificação usando a lei de Ohm:
R = 9 V / 20 mA
R = 450 V
Um resistor de 560 V é o valor de resistor comum mais próximo e funcionará bem (você notou que há um
Desconecte os trilhos de alimentação da placa de ensaio do Arduino e troque cada um dos resistores de 220
V em favor dos resistores de 560 V mais robustos. Agora conecte os fios positivo e negativo da caixa da
Figura 3.31. Alimentar o circuito de LED paralelo com uma bateria de 9 V envolve a troca de
alguns resistores e a conexão de um encaixe de bateria de 9 V aos trilhos de alimentação.
UAU! e-book
www.wowebook.org
Machine Translated by Google
RESUMO
As relações entre tensão, corrente e resistência — conforme formalizadas na lei de Ohm — são as
chaves para entender os circuitos básicos.
As placas de ensaio fornecem uma plataforma de prototipagem tangível e conveniente, com padrões
de conexão padrão, para testar circuitos.
Um circuito em série fornece um único caminho para o fluxo elétrico. Um circuito paralelo tem dois
ou mais caminhos.
Os LEDs têm uma característica chamada queda de tensão direta. Ao calcular o resistor correto
para um LED conectado em série, primeiro subtraia essa queda de tensão direta da tensão de
alimentação.
Em um circuito em série, é fácil calcular a resistência total no circuito: some os valores do resistor.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Parte 2. Noções básicas do projeto: entrada e saída com Johnny-Five
Esta parte do livro é onde as coisas realmente começam a cozinhar: você aprenderá como adicionar
sensores, saídas de tópicos e partes móveis a projetos, construindo um monte de pequenos
experimentos ao longo do caminho com sua placa Arduino Uno e JohnnyFive.
Tutoriais
No capítulo 4, você conhecerá tudo sobre entradas (sensores), tanto analógicas quanto digitais. Você vai
Ofertas e promoções
tente ler dados de um simples sensor de temperatura e um resistor fotossensível e você aprenderá a
detectar o pressionamento de botões.
Destaques
O Capítulo 5 trata das saídas, com base em suas experiências anteriores com LEDs. Você irá além
de LEDs piscando para LEDs animados e LEDs RGB coloridos.
Configurações Você exibirá o texto em um módulo LCD paralelo e construirá sua própria “bola meteorológica” (uma exibição
Sair Se
você estava esperando pela parte dos robôs, é o capítulo 6! Este capítulo é sobre movimento:
motores e servos. Investigaremos como os motores funcionam e como alimentá-los e controlá-los. No
final do capítulo 6, você construirá um robô itinerante simples usando um kit de chassi de robô
barato.
Ao final desta parte do livro, você terá pesquisado todos os principais tipos de entradas e saídas simples
para pequenos projetos incorporados. Você poderá ler dados ambientais de sensores e emitir luz e
som. Você estará pronto para construir projetos mais sofisticados e sem fios.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O papel dos sensores em projetos como transdutores, convertendo fenômenos físicos em sinais
Tutoriais elétricos
Construindo
Destaques circuitos divisores de tensão para ler sensores resistivos como fotoresistores
Usando a classe Sensor genérica do JohnnyFive para ler os dados do sensor e ouvir os dados
Configurações e alterações
Para construir dispositivos bacanas, sejam eles ventiladores automáticos com controle de temperatura
ou invenções mais interessantes, você precisa ser capaz de coletar informações e informações do
mundo físico real.
1 fotoresistor
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 botão de pressão
1 resistor de 10 kV
UAU! e-book
www.wowebook.org
Machine Translated by Google
Essa conversão de entrada física em saída elétrica significa que os sensores são um tipo de
transdutor, que é qualquer dispositivo que converte uma forma de energia em um sinal (ou vice-
versa).
Sensores e entradas são classificados com base no tipo de sinal que produzem: analógico, um
conjunto contínuo e suave de valores sem lacunas, ou digital, que consiste em um conjunto discreto
e finito de valores (figura 4.2).
Figura 4.2. Um sensor analógico como um sensor de temperatura (em cima) traduz as mudanças de
temperatura em um sinal analógico suave. Uma entrada digital como um interruptor de
inclinação (parte inferior) pode ter apenas dois valores de saída discretos: um quando orientado
normalmente (desligado, BAIXO, 0 ou falso) e outro quando invertido (ligado, ALTO, 1, verdadeiro).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os sensores analógicos são sensíveis a essas entradas analógicas do mundo real. Sua
saída é um sinal suave, geralmente de voltagem variável que corresponde à intensidade do que
estão medindo (figura 4.3).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Sensores analógicos como o sensor de temperatura no ventilador fornecem um sinal analógico, mas nosso
mundo de programação é digital. Os sinais de entrada analógica precisam ser, de alguma forma,
amostrados e normalizados — quantizados — em valores digitais discretos para que possam ser
Fazer essa conversão de amostras de sinal de analógico para digital requer um pouco de hardware
digital (ADC) integrada em seis de seus pinos. Os pinos de entrada analógica—aqueles com suporte ADC—
UAU! e-book
www.wowebook.org
Machine Translated by Google
O número de valores possíveis que podem ser derivados de um sinal analógico de entrada
depende da largura de banda do hardware ADC no microcontrolador. O ATmega328P no
Uno fornece ADC de 10 bits para cada um de seus seis pinos ativados. Isso significa que ele
10
pode resolver 1024 (2) possíveis valores digitais interpretados. Uma entrada analógica de 0 V será
interpretada como 0, 5 V como 1023, e qualquer valor entre escalado para o valor de passo
(inteiro) mais próximo.
Um sensor analógico responde a um estímulo físico ao qual é sensível, transduzindo essa energia
física em um sinal de saída de tensão variável. Esse sinal pode ser amostrado por um pino
de entrada analógica em um microcontrolador e convertido em valores digitais usando a capacidade
analógico-digital (ADC) do MCU. Para ver como isso funciona em ação, vamos experimentar um
sensor analógico básico.
Quando as coisas estão escuras, o fotoresistor tem maior resistência, chegando a cerca de 10 kV
quando está totalmente escuro. À medida que a quantidade de luz à qual é exposto aumenta, ele
se torna mais condutivo – sua resistência diminui – até cerca de 1 kV quando as coisas estão
bastante brilhantes (figura 4.5).
UAU! eBook
Figura 4.5. À medida que as condições de luz mudam, a resistência do fotoresistor muda. www.wowebook.org
Machine Translated by Google
Figura 4.5. À medida que as condições de luz mudam, a resistência do fotoresistor muda.
Ele se torna mais condutor - ou seja, menos resistente - quando mais luz o atinge. Quando está
mais escuro, a resistência é maior.
Tensões em um circuito
Digamos que queremos ser capazes de usar o pino A0 compatível com ADC do Uno para
ler um sinal que representa valores variáveis de luz ambiente. Precisamos de um circuito
que contenha o fotorresistor e que esteja conectado à alimentação, terra e pino A0 no Uno.
Mas o circuito mostrado na figura 4.6 não vai funcionar. Lembre-se da lei de tensão de
Kirchoff (KVL) do capítulo 3? Toda a tensão em um circuito precisa ser usada. O único componente
no circuito da figura 4.6 que “consome” qualquer tensão é o próprio fotoresistor.
Figura 4.6. Com um circuito como este, não haverá nenhuma variação de tensão significativa no
pino A0.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Isso significa que não importa qual seja o valor real da resistência do fotorresistor em um determinado
momento, ele vai consumir toda a tensão do circuito de qualquer maneira - o que significa que a
tensão em A0 não mudará.
No capítulo 3, você também viu como a corrente é a mesma em todos os pontos de um circuito em
série. O circuito mostrado na figura 4.7 assume uma queda de tensão direta de 2 V no LED, deixando
3 V para os resistores cuidarem. A resistência total no circuito é de 200 V (os dois
Resistores de 100 V somados), então
I = V/R
por isso
0,015A = 3V / 200V
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vamos separar o circuito da figura 4.7 e analisá-lo para ver para onde está indo a tensão.
2 V da fonte de 5 V está sendo mastigado pelo LED por causa de sua queda de tensão
direta. Isso deixa 3 V que precisam ir... para algum lugar. Ele é dividido entre os
demais componentes do circuito.
Como há dois resistores e eles têm a mesma resistência, a tensão restante será
distribuída de 50 a 50 entre eles. Os resultados seriam diferentes se os resistores
tivessem valores diferentes (por exemplo,
1
se R fosse 300 V2 e R fosse 100 V, suas
tensões atribuídas seriam 1,125 V e 0,375 V, respectivamente).
UAU! e-book
www.wowebook.org
Machine Translated by Google
No circuito representado na figura 4.9, os dois resistores
1
R 2e R têm resistência
igual - cada um fornece metade da resistência total do circuito. Assim, a tensão
restante (3,0 V) no circuito será dividida igualmente (50–50) entre eles - 1,5 V cada.
Figura 4.9. A lei de tensão de Kirchoff afirma que somar todas as tensões em um
circuito sempre produz 0. Ou seja, toda a tensão no circuito precisa ser contabilizada
(ser usada).
Uma maneira mais formal de dizer que “toda a tensão em um circuito precisa ser usada” é que
todas as tensões em um circuito devem somar 0. Percorrendo o circuito na figura 4.9, começamos
na fonte de alimentação: +5 V . Em seguida, R diminui sua parcela, 1,5 V; o LED diminui 2,0
1 2
V; e R diminui 1,5 V. Tudo isso soma 0:
Como sabemos quanta tensão cada componente do circuito está consumindo, podemos
derivar a tensão em diferentes pontos do circuito (figura 4.10).
Figura 4.10. As tensões em pontos diferentes em um circuito em série variam com base
na quantidade de tensão que caiu nos componentes do circuito.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Portanto, quando houver apenas um componente em um circuito, ele consumirá toda a tensão.
Se você ligar o fotoresistor sem quaisquer outros componentes (figura 4.11), ele fornecerá
100% da resistência no circuito (tecnicamente, isso não é bem verdade por causa de um resistor
que veremos mais adiante que está escondido dentro do microcontrolador, mas é perto
o suficiente).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Precisamos de uma maneira de criar um circuito que tenha um ponto de referência, um ponto em
que a tensão varie de maneira previsível e possa ser lida.
Divisores de tensão para o resgate! Um circuito divisor de tensão possibilita a leitura de valores úteis do
fotoresistor. Para entender como, vamos primeiro ver o que é um divisor de tensão e como ele
funciona.
Um divisor de tensão é um circuito que usa um par de resistores para converter uma tensão de
alimentação mais alta em uma tensão de saída mais baixa. Embora a tensão do circuito como um todo
seja a tensão de alimentação (5 V em nossos exemplos), a tensão entre os dois resistores é uma nova
tensão de saída (figura 4.12).
Figura 4.12. Um divisor de tensão fornece uma nova tensão mais baixa nos pontos , disponível em
V de saída entre dois resistores, R e R . Existem várias maneiras de desenhar um esquema de divisor
1
de tensão 2 ; os dois circuitos descritos aqui são funcionalmente idênticos.
Se os dois resistores usados no divisor de tensão tiverem resistência igual e forem os únicos
componentes no circuito, é intuitivo que a tensão disponível em V na figura 4.13 será metade
fora
da tensão de alimentação original - R diminui sua parcela proporcional da tensão de alimentação ,
1
50%, à medida que a eletricidade flui através dele.
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
Por outro lado, se R permanecesse em 100 V, mas R mudasse a resistência para 400 V, 80%
2 1
da tensão disponível cairia em R (figura 4.14), de modo que a tensão de saída no ponto V é
1
agora 20% da tensão de alimentação. tensão.
fora
Voilà! Mudanças na proporção de resistência que R fornece ao circuito são refletidas como
1
mudanças de tensão em V . Aí está o ponto de referência que precisamos!
fora
A fórmula para circuitos divisores de tensão - isto é, o método para determinar qual tensão
estará em V entre os dois resistores - é a seguinte:
fora
V é o que “sobra” da tensão de alimentação após R ter diminuído sua porção da tensão do
fora 1
circuito.
Estaremos usando um resistor fixo de 4,7 kV como R (figura 4.15). O fotorresistor fará o papel
2
de R . Sua resistência varia entre 1 kV e 10 kV, dependendo da luminosidade do
1
ambiente.
UAU! eBook
Figura 4.15. O esquema do circuito fotoresistor www.wowebook.org
Machine Translated by Google
Figura 4.15. O esquema para o circuito fotoresistor
R1 = 10000V
R2 = 4700V
V(fora)
= 5 V * (4700/14700)
= 5 V * 0,32
= 1,6 V
R1 = 1000V
R2 = 4700V
V(saída) = 5 V * (4700/5400)
= 5 V * 0,825
= 4,125 V
Usando um circuito divisor de tensão com o fotoresistor, você pode criar um sinal de tensão de saída
4,125 – 1,6 V = 2,525 V, ou apenas um pouco mais de 50% da faixa total de 0 a 5 V. Isso significa que
você obterá uma distribuição decente de valores - variando de (mais ou menos) cerca de 328 (~1,6
1 fotoresistor
Como os outros resistores com os quais você está trabalhando, os fotoresistores não são polarizados,
então você não precisa se preocupar com a orientação positivo-negativo. Conecte a fotocélula e o resistor
UAU! e-book
www.wowebook.org
Machine Translated by Google
A saída do divisor de tensão, V , está disponível em qualquer orifício da fileira de terminais entre a
fora
fotocélula e o resistor (lembre-se de que os cinco orifícios em cada fileira de terminais na
Conecte uma extremidade de um fio jumper verde em um desses orifícios e a outra extremidade no pino
A0 no Uno. Conecte a energia ao barramento de energia dos pinos GND e de energia de 5 V do Uno.
Agora você pode deixar sua placa de ensaio de lado por um momento e vamos nos voltar para o
lado do software.
Assim que o circuito do fotoresistor for alimentado (ainda não! A propósito), um sinal de tensão
variável estará presente no pino A0. Então, como podemos ler os valores desse sinal usando nossa útil
A API do JohnnyFive contém uma coleção de classes que podem ser usadas para interagir com sua placa
de desenvolvimento e componentes. Você viu Led, por exemplo. Muitas das classes de
componentes, como Led, são para tipos específicos de dispositivos, como Acelerômetro e Servo. Existem
também algumas classes mais genéricas que têm uso mais amplo, incluindo uma que pode ser usada com
JohnnyFive, como muitos outros softwares de código aberto, está em constante evolução. Novos
recursos e classes são adicionados e a API também evolui. Você pode manter-se atualizado com a API
UAU! e-book
www.wowebook.org
Machine Translated by Google
A classe Sensor pode ser usada para ler e processar dados de sensores analógicos. Primeiro, crie um novo objeto
1 Ao instanciar um Sensor, “pin” é a única propriedade necessária para o objeto de opções passado.
As partes internas do Sensor cuidam da configuração do pino indicado como um pino de entrada analógica e, em seguida, da
Então, o que você pode fazer com um objeto Sensor? Você pode desconectar seu valor, como mostra a listagem a seguir —
value é um dos vários parâmetros disponíveis em objetos Sensor e contém o valor lido mais recentemente.
console.log(sensor.value); 1
});
1 Isso será registrado apenas uma vez (o evento pronto é acionado uma vez).
Mas o código na listagem 4.2 registrará o valor do sensor apenas uma vez - isso é de uso limitado.
É muito mais útil observar os valores do sensor ao longo do tempo. Este é um trabalho para JavaScript orientado a eventos.
Diferentes objetos no JohnnyFive fornecem diferentes eventos aos quais seu código pode se vincular.
Você pode manipular esses eventos, quando eles ocorrerem, usando uma função de retorno de chamada.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A classe Sensor, por exemplo, possui um evento de dados que é acionado toda vez que o valor
do pino é lido com sucesso, conforme mostrado na listagem a seguir.
sensor.on('dados', () => { 1
console.log(sensor.value); });
1 O evento de dados é acionado toda vez que um valor é lido com sucesso do pino.
Testando o fotoresistor
Vamos montar nosso circuito fotoresistor aprimorado por divisor de tensão com algum código
JohnnyFive para detectar mudanças nas condições de luz ao redor. Crie um novo arquivo,
photoresistor.js, e preencha-o com o seguinte código.
Conecte o cabo USB do Arduino ao seu computador - agora a placa e o circuito breadboard têm
energia. Execute o script do fotoresistor:
node photoresistor.js
Depois que o script estiver em execução, aumente e diminua a quantidade de luz que atinge o
fotorresistor colocando sua mão sobre ele ou diminuindo as luzes. Ao fazer isso, você deve ver os
valores na alteração de saída registrada, que se parecerá com o seguinte.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os valores do fotorresistor estão rolando muito rápido. Por padrão, o Sensor lerá, calculará
e escalará os dados ADC uma vez a cada 25 ms. É por isso que o registro do valor do fotorresistor
está rolando tão rapidamente. É possível ajustar a frequência dessas leituras com o parâmetro freq,
como mostra a listagem a seguir.
Os eventos do objeto Sensor ligam isso ao objeto Sensor, o que significa que você pode escrever
um código como o seguinte:
Observe que, devido à ligação que ocorre com as funções de seta usadas como retornos de chamada
anônimos, o seguinte não funcionará:
sensor.on('data', () =>
{ console.log(this.value); // > undefined WOW! eBook www.wowebook.org
Machine Translated by Google
});
Uma abordagem mais elegante é vincular ao evento de alteração em vez do evento de dados. O evento
change é acionado sempre que o valor mais recente do sensor difere em mais de um valor limite do
O valor do limite é padronizado para 1, o que significa que - porque os valores do sensor de leitura são
inteiros — qualquer alteração no valor acionará o evento change. threshold é um atributo na instância do
objeto Sensor e pode ser alterado a qualquer momento para alterar o limite para acionar eventos de
alteração. A listagem a seguir combina isso em um script que efetua logout sempre que o sensor altera
board.on('pronto', () => {
sensor const = novo cinco.Sensor({
pino: 'A0' });
console.log(sensor.value); 1
sensor.threshold = 5; 2
sensor.on('alterar', () => { 3
console.log(sensor.value);
});
});
Como a tensão real em V para o circuito do fotorresistor varia dependendo de qual resistor é usado
fora
em R , os valores de alteração do fotorresistor são mais relativos (está ficando mais claro, está ficando
2
mais escuro) do que absolutos (em footcandles ou qualquer intensidade de luz medida). . Outros
tipos de sensores fornecem uma tensão de saída calibrada que pode ser convertida diretamente em
unidades fixas, como graus Celsius no caso de analógico
sensores de temperatura.
UAU! e-book
4.1.5. Usando um sensor analógico de temperatura www.wowebook.org
Machine Translated by Google
4.1.5. Usando um sensor de temperatura analógico
www.wowebook.org
Machine Translated by Google
Para realizar este cálculo, no entanto, você precisa converter a leitura de 10 bits do ADC
de volta para a tensão (aproximada) e também colocar a aritmética em seu código. Para
tornar isso conveniente para nós, JohnnyFive oferece a classe Thermometer, que suporta
vários tipos diferentes de sensores de temperatura.
1 sensor TMP36
O circuito para o TMP36 é mostrado na figura 4.18. Conecte o TMP36 à energia usando
fios jumper vermelho e preto e, em seguida, conecte seu pino de saída (meio) a A0 com
um fio jumper verde.
UAU! e-book
www.wowebook.org
Machine Translated by Google
pino: 'A0' 2
});
tmp36.on('data', () =>
{ console.log(tmp36.celsius); 3
});
});
Quando um script JohnnyFive está em execução, você pode interagir com ele na janela do
terminal. Ou, você poderia, se todo aquele material do console.log não estivesse rolando. Às
vezes, o console.log é tudo o que você precisa, mas para uma depuração ou inspeção mais
conveniente sem precisar reiniciar o script ou alterar o código, você pode aproveitar o REPL
(loop readevaluateprint) do JohnnyFive. UAU! e-book
www.wowebook.org
Machine Translated by Google
Se você removesse o manipulador de eventos de dados console.loging de temperature.js e
executasse o script, veria algo como o seguinte.
Você pode digitar expressões JavaScript no prompt de seta dupla e pressionar Enter no teclado
— é um prompt interativo. Talvez você queira ver qual é o valor do sensor de temperatura tmp36,
em Fahrenheit, conforme mostrado na listagem a seguir.
>> tmp36.fahrenheit
ReferenceError: temp36 não está definido
na repetição:1:1
em REPLServer.defaultEval (repl.js:264:27) em vinculado (domain.js:287:14)
em REPLServer.runBound [como eval]
(domain.js:300:12) em REPLServer.<anonymous> (repl. js:431:12)
em emitOne (events.js:77:13)
em REPLServer.emit (events.js:169:7)
em REPLServer.Interface._onLine (readline.js:211:10) em REPLServer.Interface._line
(readline.js:550:8) em REPLServer.Interface._ttyWrite (readline.js:827:14)
Este não é o fim do jogo; apenas perdemos uma etapa. “Injetar” algo no escopo do REPL do
JohnnyFive exige que sejamos explícitos sobre isso.
Dentro de seu script JohnnyFive, você pode injetar seletivamente coisas no REPL que gostaria
de ter disponíveis para inspeção ou manipulação quando o script estiver em execução, conforme
mostrado na listagem a seguir.
foo: 'barra' 3
});
Tornar a string 'bar' disponível como foo é meio bobo, mas o ponto é que você pode
disponibilizar qualquer tipo de valor que desejar dentro do REPL. Você pode usar o REPL
como um console para interagir com esses itens, como mostra a listagem a seguir.
pino: 'A0'
});
board.repl.inject({
tmp36: tmp36
});
});
Agora, ao executar o node temperature.js, você não verá o registro de dados, mas receberá um
prompt REPL assim que a placa for inicializada. Então você pode interagir com o objeto tmp36.
Tente digitar isto:
>> tmp36.celsius
Ou isto:
>> tmp36.fahrenheit
Isso pode ser útil, especialmente ao depurar ou explorar configurações mais complexas
componentes.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para alguns tipos de detecção ambiental, porém, você não precisa de um conjunto contínuo de valores
como entrada. Para esses tipos de aplicações, você pode usar componentes que geram sinais digitais.
Os pinos de 0 a 13 no Uno são pinos digitais. Cada um pode ser configurado como um pino de entrada ou
um pino de saída. Quando configurado para entrada, um pino digital pode avaliar, com base na tensão
Botões e algumas chaves são bons exemplos de componentes que fornecem sinais digitais simples
porque são binários. Um botão está pressionado ou não está: está ligado ou está desligado. Isso corresponde
aos pinos de entrada digital, cujos estados também são binários (BAIXO ou ALTO).
Nosso desafio é construir um circuito que faça corretamente com que um pino digital esteja em um estado
ALTO quando um botão (também conhecido como interruptor momentâneo) é pressionado, mas em um
estado BAIXO caso contrário. Dessa forma, nosso software pode determinar quando um botão está sendo
Os pinos que compartilham um lado de um botão são conectados eletricamente apenas quando o
botão é pressionado. Mas os pinos em lados opostos do botão são sempre eletricamente
conectado.
UAU! e-book
www.wowebook.org
Machine Translated by Google
As conexões de pinos de um botão de pressão típico
Digamos que você tenha um pino de entrada digital configurado no Arduino, mas ainda não tem
nada conectado a ele. Que estado você esperaria que o pino tivesse se lesse seu valor?
Acontece que é impossível prever. Pode ser ALTO, pode ser BAIXO. Se você o lesse ao longo do
tempo, veria LOWs e HIGHs praticamente aleatórios. Esse tipo de comportamento desconectado é
chamado de flutuante.
Um pino digital não precisa ter exatamente 5 V presentes para ler ALTO. Da mesma forma, baixa
tensão de, digamos, 0,8 V, resultará em um BAIXO lógico. Cada microcontrolador possui um
conjunto de faixas de tensão que resultarão em um estado BAIXO ou ALTO, bem como uma margem de ruído
No meio.
Faixas de tensão para estados lógicos nos pinos do Arduino Uno. Qualquer tensão abaixo de 1,5 V é
BAIXA; qualquer coisa acima de 3 V, ALTA. Tensões entre 1,5 V e 3 V caem na margem de ruído e
devem ser evitadas.
Isso ocorre por causa da alta impedância do pino, na qual é necessária apenas uma pequena
quantidade de corrente para mover o pino entre um nível lógico e outro. Isso é útil e eficiente - o pino
pode detectar alterações nos componentes conectados sem precisar gastar muita corrente para fazer isso.
de outros pinos no mesmo microcontrolador são suficientes para fazer o pino alternar entre LOW
1 botão de pressão
1 resistor de 10 kV
4 fios jumper
O que precisamos fazer é construir um circuito seguro (que não tenha risco de curto-circuito) que
estabeleça um nível lógico “padrão” confiável quando o botão não for pressionado - BAIXO ou ALTO,
mas que não t flop em torno de aleatoriamente. Uma maneira de fazer isso é puxando o pino de entrada
Quando um resistor pulldown está presente no circuito, há sempre uma conexão entre o pino 2
Figura 4.19. Um resistor pull-down “puxa” o pino digital para nível lógico LOW quando o componente
(botão) não é pressionado (conectado).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Isso resolve o problema de flutuação - se alguma corrente parasita aparecer sem ser convidada
quando o botão não for pressionado, ela será desviada para o terra através do resistor (lado
esquerdo da figura 4.19). O pino 2 lerá continuamente LOW (0 V) quando o botão não for pressionado.
Quando o botão é pressionado (lado direito da figura 4.19), a corrente flui a 5 V através do botão
e, em seguida, para o pino 2 e para o terra - o pino 2 indicará ALTO. O resistor pulldown
desempenha aqui outra função: evita um curto-circuito quando o botão é pressionado,
limitando a corrente que circula.
Ao usar um resistor suspenso no circuito, você estará criando um divisor de corrente, mesmo
que não seja imediatamente óbvio. Lembre-se do capítulo 3 que a divisão de corrente é uma
característica dos circuitos paralelos (o circuito na figura é um circuito paralelo porque há mais
de um caminho que uma carga individual pode seguir). Quando há mais de um caminho para
escolher, a corrente será dividida proporcionalmente com base na resistência em cada caminho.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Usar um resistor pulldown em combinação com um pino de entrada na verdade cria um divisor de corrente.
Internamente, o circuito de pinos do microcontrolador inclui um resistor com alta resistência (da ordem de
100 kV a vários megohms) quando um pino é configurado para entrada (estado de alta
impedância). Este resistor interno fará o papel de R . Para R , temos o resistor pulldown de 10 kV - alta
2 1
resistência, mas cerca de uma ordem de magnitude menos resistente que o resistor interno (R ).
Quando a corrente flui através do circuito (o botão é pressionado), muito mais dela passará pelo caminho
Em um divisor de corrente, cada caminho recebe uma distribuição de corrente diferente, mas ambos
recebem a mesma tensão. O bit de corrente que atinge o pino 2 está em ou próximo de 5 V, o que definirá o pino
para ALTO.
O diagrama elétrico resultante (figura 4.20) não é muito complexo. Vá em frente e conecte o botão na
UAU! e-book
www.wowebook.org
Machine Translated by Google
A classe Button do JohnnyFive cuida da configuração de um pino de saída digital e fornece vários
recursos que você deseja em um botão, incluindo a capacidade de ouvir pressionamentos de
botão, conforme mostrado na listagem a seguir.
board.on('pronto', () => {
pushButton const = new five.Button(2);
pushButton.on('down', () => { console.log('Fui
pressionado!'); });
});
Experimente o código da Listagem 4.13. Conecte seu Arduino à alimentação USB e execute o script:
$ node button.js
Depois que a placa for inicializada, toda vez que você pressionar o botão para baixo, deverá ver isto:
Neste capítulo, você viu alguns tipos de entradas básicas: dois tipos de sensores analógicos e
entrada digital com um botão de pressão. Entradas e sensores são vitais para coletar
informações sobre o ambiente físico, mas fica consideravelmente mais divertido quando você
realmente faz algo com essas informações - quando você cria uma saída. Isso é o que você fará a
seguir.
UAU! e-book
RESUMO www.wowebook.org
Machine Translated by Google
RESUMO
Os sensores analógicos geram sinais de tensão variável com resolução (teoricamente) infinita
e os microcontroladores convertem esse sinal em equivalentes de valor digital usando a
conversão analógico-digital (ADC).
O Arduino Uno possui seis pinos de entrada analógica, que fornecem ADC de 10 bits (1024
valores). Seus 14 pinos digitais podem ser configurados como entrada ou saída e possuem
níveis lógicos binários: LOW ou HIGH.
Cada componente em um circuito em série recebe a mesma quantidade de corrente, mas a tensão
é distribuída com base na resistência proporcional do componente. Um divisor de tensão usa esse
princípio para converter uma tensão de entrada mais alta em uma tensão de saída mais baixa,
usando dois resistores conectados em série.
Um circuito divisor de tensão cria um ponto de referência no qual você pode detectar mudanças na
resistência como mudanças na tensão. Essa abordagem pode ser usada para ler dados de
sensores resistivos como um fotoresistor.
Cada ramificação em um circuito paralelo recebe a mesma quantidade de tensão, mas a corrente é
distribuída com base na resistência proporcional da ramificação. Um divisor de corrente usa esse
princípio usando resistores conectados em paralelo.
Usar um resistor pulldown é uma forma de evitar uma situação flutuante de nível lógico indeterminado
quando as entradas digitais estão desconectadas ou inativas.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Dominando técnicas de controle de LED mais avançadas - animando LEDs e usando LEDs RGB
Tutoriais coloridos
Usando o suporte de modulação por largura de pulso (PWM) para fazer sinais de saída digital
Ofertas e promoções
Destaques
Noções básicas de bitshifting e operações binárias em JavaScript
Integrando uma API meteorológica de terceiros para criar uma “bola meteorológica” LED multicolorida
Gadget de
configurações
Desconectar
Combinando vários componentes de entrada e saída para construir um temporizador avançado
dispositivo
Agora é hora de fazer algo barulhento. Ou algo brilhante. Ou algo piscante ou expressivo. Você
experimentou alguns truques básicos de LED, mas agora vamos dar uma olhada mais abrangente em
algumas das maneiras pelas quais você pode integrar saídas em projetos.
y, qualquer cor
2 LEDs padrão,
1 fotoresistor
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 LED RGB de cátodo comum
3 botões de pressão
1 potenciômetro rotativo
1 piezo
3 resistores de 10 kV
2 resistores de 220 V
Os LEDs parecem fazer muito mais truques do que apenas ligar ou desligar. Se você olhar em volta
para os componentes eletrônicos embutidos em seus próprios dispositivos eletrônicos, verá que eles pulsam
Esses comportamentos comuns de LED são, tecnicamente, ilusões (figura 5.1). Um LED pode emitir
apenas um comprimento de onda de luz - só pode ser de uma cor. E ainda, LEDs ao nosso redor
UAU! e-book
www.wowebook.org
Machine Translated by Google
certamente parecem escurecer ou assumir tons diferentes.
Figura 5.1. Os LEDs emitem uma única cor e estão ligados ou desligados.
Hora de se tornar um mágico do LED - existe uma técnica eletrônica que podemos aproveitar para fazer os
OK, então um LED só pode estar ligado ou desligado a qualquer momento. Você fez uma piscada, que na
verdade é apenas um ciclo de liga e desliga periódicos. Vamos ficar mais caprichados com o piscar,
1 tábua de pão
2 resistores de 220 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
Primeiro, construa o circuito mostrado na figura 5.2. Em seguida, crie um arquivo e adicione o
código mostrado na listagem a seguir.
led2: led2
});
});
Este código realmente não faz muito. Ele instancia dois objetos Led e os
disponibiliza no REPL do JohnnyFive como led1 e led2. Execute o script:
UAU! e-book
www.wowebook.org
Machine Translated by Google
$ node experimentLED.js
Assim que estiver funcionando, você poderá digitar comandos no prompt do REPL. Primeiro - e sei que este é
>> led1.blink()
O primeiro LED deve estar piscando agora, em períodos de 100 ms (ligado por 100 ms, desligado por 100 ms) —
este é o comprimento de fase padrão (velocidade dos períodos de piscada) para o método de piscada, se você
não especificar o contrário.
Agora, quero que você pegue cuidadosamente o Arduino e a breadboard com os LEDs em uma mão e agite-
os na frente do seu rosto. Você saberá que está acenando freneticamente quando o LED parece não
Você está enganando seus próprios olhos. Quando as coisas se movem muito rapidamente, seus olhos e
cérebro não conseguem acompanhar. Seu cérebro, na verdade, conecta os pontos para você e decide que você
está vendo uma linha contínua de luz. Se você é um fotógrafo, pode pensar nisso como uma espécie
de análogo à velocidade do obturador - sua própria “velocidade do obturador” não é rápida o suficiente e você
acaba com um desfoque de movimento. É por isso que filmes e filmes podem parecer fluidos em 24 quadros
O mesmo vale para a detecção de piscadas individuais. Se uma luz piscar rápido o suficiente, os
humanos não conseguirão ver o piscar (figura 5.3). Diferentes seres humanos têm diferentes limiares de
percepção - isso explica por que fico mal-humorado com velhas lâmpadas fluorescentes ou CRTs com
frequências de atualização lentas, enquanto alguns de meus colegas não se incomodam nem um pouco.
Mas todos perdem de forma confiável a capacidade de discernir piscadas individuais em torno de 100 Hz (cem
Figura 5.3. Perdemos a capacidade de discernir piscadas individuais quando um LED está se movendo
rapidamente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Então, ótimo, qual é o sentido de fazer um LED piscar tão rápido que as piscadas são invisíveis e parece
que está sempre ligado? Não podemos simplesmente acender um LED continuamente para obter o
mesmo efeito?
Acontece que coisas interessantes acontecem se você mexer na proporção de tempo que o LED fica ligado
(versus desligado). Se você piscar o LED muito rápido, os humanos não conseguirão perceber a piscada
– isso nós cobrimos. Mas se o LED estiver ligado apenas um quarto do tempo (desligado nos outros três
Faça parar!
Se o LED piscando estiver deixando você maluco, você sempre pode parar de piscar com o método
de instância Led.stop:
> led1.stop()
Dependendo de quando o comando é emitido, o resultado pode ser um LED apagado ou um LED
permanentemente aceso. Se o LED estiver aceso e você quiser apagá-lo, use isto:
> led1.off()
Você precisará usar os dois métodos - você não pode simplesmente pular para o método off. A parada
UAU! e-book
www.wowebook.org
Machine Translated by Google
>> led1.on()
>> led2.brightness(64)
brilho é um método de instância em objetos JohnnyFive Led que assume um valor de 8 bits (0–255).
Um valor de 64 é, então, um quarto do valor mais brilhante possível. O resultado da chamada para
led2.brightness(64) é que o LED passa 75% do tempo desligado e fica aceso 25% do tempo. Tudo isso
liga e desliga está acontecendo em frequências muito rápidas para o olho captar. Você notará que o
led2 agora parece menos brilhante que o led1—
é mais escuro.
O microcontrolador do Uno ajuda aqui. Ele fornece suporte de hardware para uma técnica chamada
modulação por largura de pulso (PWM), que faz malabarismos de liga e desliga mais rapidamente do
que o software pode fornecer facilmente. A porcentagem de tempo em que um sinal PWM é ALTO
(ligado) é chamada de ciclo de trabalho. Diz-se que uma saída que é ALTA um quarto do tempo
tem um ciclo de trabalho de 25% (figura 5.4).
O suporte de hardware PWM é comum porque é bastante útil, mas seu suporte varia de placa para placa
e normalmente está disponível apenas em determinados pinos. É o caso do Arduino Uno. PWM está
disponível apenas nos pinos 3, 5, 6, 9, 10 e 11.
Não se preocupe, você não precisa memorizar isso. Se você olhar para o seu Arduino, verá que
esses números de pinos são serigrafados com um til (~) próximo a eles (figura 5.5). Isso indica que o
>> led1.brightness(64)
Isso não vai funcionar. Você receberá uma exceção que começa com algo como
Tudo bem, vimos várias coisas em nossa exploração aqui. As pessoas não conseguem discernir
as piscadas se forem muito rápidas. Alterar o ciclo de trabalho do sinal em um LED faz com que
seu brilho pareça mudar. Uma última coisa, e então faremos algo com esse conhecimento.
Certifique-se de usar pinos com suporte PWM para recursos que o exijam
Métodos como brilho e vários outros que você precisará em instâncias de Led exigem o WOW! e-
book
www.wowebook.org
Machine Translated by Google
componente a ser conectado a um pino que suporta PWM. JohnnyFive lançará um erro se você
tentar invocar um método PWMrequiring em um pino que não o suporte.
Ao projetar seus circuitos, é bom ter em mente quais pinos suportam PWM para
economize tempo e dores de cabeça mais tarde.
>> led1.on()
>> led2.brightness(128)
128 está exatamente no meio da faixa de brilho, portanto, você pode esperar que essas duas
expressões JavaScript resultem no segundo LED brilhando com metade do brilho em
comparação com o primeiro, que está no máximo. Mas, a menos que você aperte os olhos com
muita força, os dois LEDs parecem iguais. Você pode ser capaz de ver uma pequena diferença, mas não mui
Isso porque o brilho vence. o brilho (128) resulta em um ciclo de trabalho de 50% - o LED fica ligado
apenas na metade do tempo - mas o cérebro o direciona para o brilho. Dito de outra forma, a
escala de brilho de 8 bits de JohnnyFive de 0 a 255 parece não linear, inteiramente devido à
percepção humana.
JohnnyFive inclui uma classe Animation, que oferece controle refinado sobre as animações de
- no momento da escrita - o brilho dos LEDs e os movimentos dos servos (encontraremos os
servos no capítulo 6).
Trabalhar com animações no JohnnyFive envolve algumas etapas, mostradas na listagem a seguir.
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Cria um objeto de opções contendo detalhes de animação—mais sobre isso em breve
2 Instancia um objeto Animation e passa a ele um componente de destino - o destino será animado
Vamos dar uma volta fazendo um LED parecer pulsar. JohnnyFive precisa de nós primeiro
para definir como queremos que a animação se comporte.
O LED pulsante deve aumentar e diminuir novamente em loops que usam easing atraente. As
funções de atenuação são funções que variam a taxa de uma animação durante sua duração. Por
exemplo, uma animação que suaviza começa movendo-se rapidamente, mas fica mais lenta à medida
que avança.
As funções atenuantes são tipicamente não lineares, integrando seno, cúbico, exponencial e outras curvas
na equação. Um easing inoutsine cria uma animação com um ritmo como o mostrado na figura 5.6. As
funções de atenuação podem tornar uma animação mais realista ou dar a ela diferentes qualidades de
movimento. Obviamente, os LEDs não se movem, mas as mudanças em seu brilho podem
definitivamente ser animadas.
A atenuação inOutSine é o que usaremos para pulsar, pois as mudanças no brilho começam
lentas e depois aceleram no meio do brilho do LED. Um pulso é uma animação metronômica, o
que significa que, uma vez que a animação avança, ela deve retroceder, movendo-se entre seus
pontos inicial e final em um loop para frente e para trás.
Também precisamos informar à animação o que ela está atenuando definindo quadros-chave
UAU! e-book
www.wowebook.org
Machine Translated by Google
(figura 5.7). Os quadros-chave definem os estados específicos (como quadros estáticos) entre os
quais a animação deve preencher os quadros intermediários usando a função easing. O processo de
criação desses quadros ou estados intermediários entre os quadros-chave é conhecido como interpolação.
Para esse pulso simples, os quadros-chave são simples: totalmente desativados (brilho 0) e totalmente
ativados (brilho 255).
opções const = {
easing: 'inOutSine',
metronômico: verdadeiro,
circuito: verdadeiro,
quadros-chave: [0, 255],
duração: 1000
};
Vamos ver o que isso parece, não é? Você pode usar o circuito do último conjunto de
experimentos para esta parte (você não usará o primeiro LED). Crie um novo arquivo
chamado animateLED.js. Cole o conteúdo de experimentLED.js em animateLED.js como
ponto de partida e edite o código para criar um único LED no pino 3. Adicione o objeto de
opções após a instanciação do objeto Led pulsante da seguinte maneira.
UAU! Listagem
de e-books 5.4. animate-led.js www.wowebook.org
Machine Translated by Google
Listagem 5.4. animate-led.js
easing: 'inOutSine',
metronômico: verdadeiro,
circuito: verdadeiro,
};
// ...
});
board.on('pronto', () => {
const pulsandoLED = novo five.Led(3);
opções const = { easing : 'inOutSine',
metronomic: true,
circuito: verdadeiro,
};
});
$ node animateLED.js
E aí está. Bem, mais ou menos. Eu fiz você fazer isso da maneira mais difícil, porque como
UAU! e-book
www.wowebook.org
Machine Translated by Google
acontecer, o código na listagem a seguir faz a mesma coisa.
Por baixo, a implementação do pulso é semelhante ao que fizemos anteriormente, mas é um uso tão
Os LEDs pulsantes podem ser uma boa maneira de chamar a atenção sem serem muito invasivos. Usando o
que abordamos, você pode criar um cronômetro simples usando apenas algumas linhas de código - ele
setTimeout(() => { 2
pulsandoLED.pulse();
}, timerLength);
});
Claro, este temporizador é de uso limitado. Você não pode alterar a duração do cronômetro ou quando o
cronômetro inicia ou iniciar um novo cronômetro. Não se preocupe, vamos melhorar daqui a pouco.
Obviamente, a saída é mais interessante se estiver respondendo a algum tipo de entrada significativa.
As conexões entre entrada e saída são o que faz a internet das coisas funcionar.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Um desses acoplamentos poderia ser um fotoresistor e um LED para criar uma luz noturna com
reconhecimento de brilho. Quando as leituras do fotoresistor são mais baixas, o LED pode ser
mais brilhante, ou seja, a “luz noturna” acende à “noite”, quando está mais escuro.
1 LED padrão, qualquer cor (você pode reutilizar o LED pulsante de cima)
1 fotoresistor
1 resistor de 10 kV
1 resistor de 220 V
Fios jumper amarelo (1), vermelho (2), verde (1) e preto (1)
Deixe o LED conectado ao pino 3 da protoboard (o LED pulsante do último exemplo), mas remova o
UAU! e-book
www.wowebook.org
Machine Translated by Google
A Listagem 5.8 mostra uma primeira tentativa de uma luz noturna sensível à luz usando
Light, uma classe em JohnnyFive que fornece recursos para trabalhar com fotoresistores
(ldr significa resistor dependente de luz, outro nome para fotoresistor).
1 Verificar os níveis de luz duas vezes por segundo (a cada 500 ms, o valor de freq) deve
ser mais do que suficiente.
A linha a seguir pode ter feito seus olhos se cruzarem se você não passou muito tempo no
mundo dos operadores bit a bit:
UAU! e-book
www.wowebook.org
Machine Translated by Google
Lembre-se de que o microcontrolador do Arduino Uno fornece leituras ADC como inteiros de 10 bits (0–1023).
Enquanto isso, o método de brilho no objeto Led espera um número de 8 bits (0–255).
A expressão valorresistor.foto >> 2 desloca valor.resistor.foto para a direita em dois bits. Isso significa que dois
bits saltam do lado direito do número e nunca mais são ouvidos (figura 5.9). No caso de photoresistor.value
>> 2, entra um número de 10 bits, seus dois dígitos menos significativos são inicializados e o que é retornado
é um número de 8 bits.
Figura 5.9. Deslocar um número de 10 bits para a direita por 2 resulta em um número de 8 bits.
Você pode pensar no número de 10 bits como sendo muito preciso para uma entrada de 8 bits; o
deslocamento de bits para a direita em 2 “arredonda” para uma resolução mais baixa que o brilho pode usar.
A parte ^ 255 usa o operador bit a bit XOR (OU exclusivo) (^) para obter o que chamarei vagamente de
número de 8 bits “oposto” do argumento à esquerda. XOR realiza uma comparação em cada par de bits e
retorna 1 no lugar do dígito somente quando os dígitos avaliados são diferentes – quando um é 1 e o outro é 0
(figura 5.10).
Figura 5.10. A operação XOR compara cada dígito binário, produzindo um 1 se os dígitos
binários forem diferentes.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Bitshifting e operações bit a bit podem parecer estranhos para desenvolvedores de software que
geralmente trabalham em código de nível superior, mas surgem em todos os lugares ao
trabalhar com hardware. A Mozilla Developer Network tem uma boa referência de operadores
JavaScript bit a bit, que contém as principais coisas que você deseja saber (http://mng.bz/CLvy).
A primeira versão do nightlight tem algumas deficiências, que você pode ver em ação ao executá-
lo:
$ node nightlight.js
Por um lado, o LED está sempre ligado com algum brilho, mesmo quando as leituras do
fotoresistor estão próximas dos valores mais brilhantes possíveis. Não queremos que o LED acenda
apenas quando está mais escuro? Não precisamos dele em plena luz do dia. A segunda
versão do código nightlight aborda isso substituindo o que acontece dentro da função de
retorno de chamada de alteração, conforme mostrado na listagem a seguir.
1 As instâncias leves têm um valor de nível, que é uma porcentagem entre 0,0 e 1,0.
Nesta variante, o LED é totalmente desligado se o nível do fotoresistor for maior ou igual a
0,5 (nightlight.off()).
Se o photoresistor.level for menor que 0,5 (50%), sabemos que seu valor de 10 bits também
deve ser menor que 512 (porque 511 é o meio da faixa de possíveis valores de 10 bits,
0–1023). Isso significa que photoresistor.value é um número inteiro entre 0 e 511, inclusive.
Todos os números nesse intervalo são números de 9 bits (0 a 511). Isso significa que
só precisamos deslocar um bit para a direita para converter o valor em um número de
8 bits (0–255).
O resultado final é que o LED ficará cada vez mais brilhante à medida que os valores do
fotorresistor diminuem de 511 para 0.
Mas ainda podemos fazer melhor. Como você viu no capítulo 4, mesmo ao escolher o melhor
valor de resistor possível para o divisor de tensão do circuito fotoresistor, você não conseguirá
obter toda a gama de tensões de 0 a 5 V. Seria melhor se a luz noturna pudesse calibrar
baseado na gama real de condições e leituras que está encontrando, conforme mostrado na
próxima listagem.
mais brilhante = 0;
ldr.on('alterar', () => {
if (ldr.value < dimmest) { dimmest = ldr.value; }
if (valor.ldr > mais brilhante) { mais brilhante = valor.ldr; }
const parenteValue = five.Fn.scale(ldr.value, mais escuro, mais brilhante, 0, 511); if (relativeValue <= 255) {
UAU! e-book
www.wowebook.org
Machine Translated by Google
nightlight.brightness((relativeValue >> 1) ^ 255); } else {
nightlight.off();
}
});
});
2 Atualiza mais escuro e mais brilhante se encontrar valores mais baixos e mais altos
3 Dimensiona o valor atual para um número de 9 bits entre as leituras mais escuras e mais
brilhantes
O código da luz noturna na listagem 5.10 faz duas alterações. Primeiro, ele rastreia os valores
reais mais escuros e brilhantes vistos durante a vida útil do script da luz noturna. Em seguida, ele
aproveita o método de utilidade de escala disponível no objeto Fn a bordo
instâncias.
atualmente existe em um intervalo entre fromLow e fromHigh (os valores mais escuros e mais
claros vistos) e o remapeia para um intervalo entre toLow e toHigh (0 e 511), proporcionalmente.
O número resultante será um número de 9 bits (entre 0 e 511). Agora podemos prosseguir, sabendo que
valores <= 255 estão na metade inferior dos valores observados. A luz noturna continuará a se ajustar
Tudo bem, essa é uma cobertura extensa de escurecimento de um LED, mas e os LEDs que parecem
mudar de cor? Claro, um único LED pode ter apenas uma cor - um comprimento de onda - mas se você
agrupar LEDs vermelho, verde e azul em um único pacote e controlar o brilho (ciclo de
trabalho) de cada LED componente, voilà! Todas as cores do arco-íris.
Os LEDs RGB têm quatro pernas. Há uma perna para cada LED (vermelho, verde, azul). A quarta
perna é um cátodo ou um ânodo. LEDs RGB de catodo comum - onde todos os LEDs de três cores
compartilham uma única perna de cátodo - são do tipo que usaremos (figura 5.11). LEDS RGB de
ânodo comum , que possuem uma perna de ânodo compartilhada, também estão disponíveis.
Figura 5.11. Os LEDs RGB de cátodo comum têm três LEDs componentes (vermelho, verde,
azul) em um pacote. A perna mais longa é o cátodo compartilhado.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Como os LEDs comuns, os LEDs RGB permitem controlar o brilho com PWM, mas agora existem
três LEDs que representam as cores primárias da luz. Para LEDs de cátodo comum, um ciclo de
trabalho de porcentagem mais alta em um LED de cor de componente tornará essa cor mais brilhante,
enquanto um ciclo de trabalho menor o tornará mais escuro.
Eu cresci em Portland, Oregon, e quando era criança, avistar a bola do tempo no topo do Standard
Insurance Plaza sempre foi um pouco emocionante. A bola meteorológica fornecia uma representação
visual codificada muito básica da previsão do tempo para as próximas 24 horas.
A bola meteorológica montada em um poste era grande o suficiente para ser vista por toda a cidade e
estava coberta de luzes.
Só tinha seis estados possíveis. A tendência de temperatura prevista foi representada pela cor:
vermelho se a previsão é de que fique mais quente, branco se estiver ficando mais frio, verde se
permanecer o mesmo. Se a precipitação estivesse próxima, ela piscaria. Simples e, no entanto, notavelmente
claro e útil. Vamos fazer um.
1 resistor de 220 V
Fios jumper vermelho (1), verde (1), azul (1) e preto (1)
1 tábua de pão
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora precisamos da previsão do tempo! O serviço Dark Sky fornece uma API de previsão do tempo que,
no momento da escrita, fornece resultados gratuitos para até 1.000 consultas por dia. Você precisa se inscrever
para obter uma chave de API, o que pode ser feito em https://darksky.net/dev/register.
Pode ser necessário fornecer um número de cartão de crédito para se inscrever no serviço.
Assim que tiver uma chave de API de desenvolvedor, anote-a e guarde-a em algum lugar razoavelmente
seguro. Você também precisará de sua latitude e longitude, que você pode encontrar em
http://mygeoposition.com/.
Crie um novo arquivo chamado weatherBall.js. Primeiro, vamos coletar algumas configurações para a bola do
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Estou em Vermont. Altere os valores LAT e LONG para sua própria localização.
Usaremos o pacote de solicitação para fazer chamadas de API para o Dark Sky. Adicione
requer ao topo do arquivo e vá em frente e instancie um quadro com JohnnyFive. Observe na
próxima listagem que JohnnyFive fornece um tipo especial de classe de componente Led para RGB
LEDs: Led.RGB.
Em seguida, precisamos obter alguns dados sobre a previsão solicitando-os da API Dark Sky
na próxima listagem.
//...
board.on('ready', () => { console.log('Powered
by Dark Sky: https://darksky.net/poweredby/'); const rgb = new five.Led.RGB({ pinos: [ 3, 5, 6] }); const requestURL = `$
{API_URL}/${API_KEY}/${LAT},${LONG}`; 1
});
});
UAU! e-book
www.wowebook.org
Machine Translated by Google
Assumindo que tudo correu bem, agora você terá dados para trabalhar. Vamos fazer a bola do
tempo funcionar, conforme mostrado na listagem a seguir.
console.error(erro);
} else if (response.statusCode === 200) {
previsão const = JSON.parse(body);
const diário = previsão.diário.data;
const willBeDamp = daily[1].precipProbability > 0,2;
const tempDelta = diária[1].temperaturaMax diária[0].temperaturaMax;
console.log(previsão);
if (tempDelta > 4) {
rgb.color('#ff0000'); // mais quente
} else if (tempDelta < 4) { rgb.color('#ffffff'); //
mais frio
} outro {
rgb.color('#00ff00'); // aproximadamente o mesmo
}
if (willBeDamp) { rgb.strobe(1000); } }
});
4 Define a cor do LED RGB com base em quanto a temperatura está mudando
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para flexibilidade máxima, os métodos relacionados às cores nas instâncias do objeto do componente JohnnyFive
- mais relevante, Led.prototype.color neste caso - aceitam vários formatos de cores diferentes, como estes:
Hex (string)— Familiar para desenvolvedores web, valores hexadecimais RGB como "#00ff00" (verde
Matriz de valores R, G, B (array) — Cada elemento da matriz deve ser um valor de 8 bits, como [0x00, 0xff, 0x00]
Objeto de valores RGB (objeto)— Novamente, valores de 8 bits devem ser usados, como {
$ node weatherBall.js
Os sensores e saídas que usamos nos exemplos até agora exigiram apenas alguns fios e tiveram conexões
simples. Na próxima seção, você encontrará um componente que possui vários fios, mas não é difícil de trabalhar,
LCDs (displays de cristal líquido) podem exibir caracteres e formas, tornando-os saídas úteis para vários projetos.
Sua resolução geralmente é definida em termos de quantos caracteres eles podem exibir. O módulo LCD 16x2
que usaremos nos experimentos a seguir pode exibir até 32 caracteres no total: 16 cada em 2 linhas.
Cada slot de “caractere” é, na verdade, sua própria matriz de pontos 5x7; formas não-caracteres também podem
ser representadas.
Os módulos LCD estão disponíveis com diferentes interfaces, incluindo várias opções seriais (você aprenderá
sobre comunicação serial no capítulo 7). O módulo mostrado na figura 5.13 possui uma interface paralela.
Figura 5.13. Módulos LCD paralelos 16x2 estão disponíveis em muitos fabricantes.
Eles têm 16 pinos e uma luz de fundo LED.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Não entre em pânico ao ver os diagramas de fiação nesta seção. Conectar LCDs paralelos requer um punhado
de jumpers, mas trabalhar com eles não é complicado. Certifique-se de prestar atenção em quais fios vão para
onde quando estiver conectando as coisas e você ficará bem. Melhorar o projeto do temporizador do início do
capítulo requer mais fios de jumper do que você já viu em um só lugar, mas é um bom exercício para juntar
1 módulo LCD paralelo 16x2 5 V, como qualquer um dos módulos paralelos 16x2 5 V básicos do SparkFun
Módulos LCD
1 potenciômetro rotativo
1 resistor de 220 V
3 resistores de 10 kV
1 piezo (opcional)
23 fios de jumper
UAU! e-book
www.wowebook.org
Machine Translated by Google
Este temporizador mais inteligente permitirá que você ajuste a duração do temporizador usando botões
(mesmo quando o temporizador estiver funcionando!) e fará a contagem regressiva do tempo restante no
LCD. Você também pode pausar e reiniciar o cronômetro. Quando o tempo acabar, um LED pulsará
Construindo o circuito
O circuito totalmente construído terá a aparência da figura 5.14. Vamos dividi-lo em algumas etapas para
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vamos começar com alguns botões que permitirão ao usuário controlar o cronômetro. Da esquerda para
1. Um botão para baixo (representado por downButton no código a seguir), que irá
subtrair um segundo do cronômetro atual
2. Um botão para cima (upButton), que adicionará um segundo ao cronômetro atual 3. Um botão
UAU! e-book
www.wowebook.org
Machine Translated by Google
Certifique-se de que os botões estejam alinhados com o entalhe central e orientados conforme mostrado
na figura 5.15. Cada botão é conectado ao terra por meio de um resistor suspenso de 10 kV e ao barramento
Crie um novo arquivo chamado timeradvanced.js e comece adicionando o seguinte código para lidar
UAU! e-book
www.wowebook.org
Machine Translated by Google
goButton.on('press', () => {
console.log('ir');
});
});
Começando com alguns manipuladores de botão simples, você pode validar se seus botões estão
conectados corretamente antes de passar para outras partes do dispositivo. Execute o script
(nó timeradvanced.js) e verifique se pressionar os diferentes botões registra a mensagem correta
no console.
Conectando o LCD
Com os botões afastados, podemos passar a conectar o módulo LCD à breadboard, conectando
a maioria de seus 16 pinos (figura 5.16).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os módulos paralelos 16x2 mais comuns têm a mesma orientação dos pinos, com o pino 1 à
esquerda e o 16 à direita, quando na orientação mostrada no diagrama de posicionamento do LCD
( figura 5.17). Verifique novamente se o seu módulo LCD tem a mesma orientação de pinos - pode
ser necessário virar o LCD, caso contrário.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Assim como os fotoresistores, os potenciômetros são um tipo de resistor variável (figura 5.18).
Os potenciômetros têm três pinos: dois pinos de alimentação e um terceiro pino do meio. Como o botão
é WOW! e-
book www.wowebook.org
Machine Translated by Google
ligado um potenciômetro rotativo (ou deslizado em outros tipos de potenciômetros), a tensão em seu pino do
meio muda. Os potenciômetros têm divisores de tensão internos, de modo que suas tensões de saída
podem ser lidas diretamente - não precisamos construir um divisor de tensão como fazemos com os fotoresistores.
Figura 5.18. Potenciômetros são resistores variáveis. Eles vêm em várias formas e
tamanhos.
A eletrônica interna do LCD lê a voltagem naquele pino para determinar o contraste do display. Girar o
Seu potenciômetro pode ter um tamanho ou formato diferente daquele mostrado no diagrama de posicionamento
do LCD (figura 5.17): tudo bem. Conecte seus pinos externos à energia e ao aterramento - você não
pode invertê-lo, pois os potenciômetros não são polarizados. Qualquer orientação funciona. Em
seguida, conecte a perna do meio do potenciômetro ao pino 3 do LCD (lembre-se, as conexões não
Avante! O LCD tem várias conexões de alimentação (figura 5.19). Conecte os pinos 1, 5 e 16 do LCD ao
UAU! e-book
www.wowebook.org
Machine Translated by Google
O pino 5 é um pino de leitura/gravação (R/W). Quando é puxado para o chão, ele coloca o LCD no
modo de gravação, que é o que geralmente se deseja ao usar um LCD - gravar nele.
O restante dos pinos que usaremos no LCD se conectará diretamente aos pinos do Arduino
(figura 5.20).
UAU! e-book
www.wowebook.org
Machine Translated by Google
O pino 6 no LCD é o pino de habilitação (EN). Ele deve ser conectado ao pino 8 do
Arduino. Escrever uma voltagem para este pino solicita que o LCD leia os dados recebidos
esperando por eles nos pinos de dados.
Pinos de dados, hein? Essas são as últimas conexões LCD restantes. Os pinos 7 a 14 no LCD são
pinos de dados paralelos (D0–D7), que representam os valores de bit dos dados gravados nos
registradores do dispositivo. Você só precisa conectar quatro dos oito - D4 a D7 (pinos 11, 12, 13
e 14 do LCD, conectados aos pinos 9, 10, 11 e 12 no Arduino WOW! eBook
www.wowebook.org
Machine Translated by Google
respectivamente). Ufa. São muitos fios!
Você pode dar uma volta no seu LCD usando a classe JohnnyFive LCD. Por padrão, o
construtor de objeto LCD do JohnnyFive tratará o LCD como um LCD paralelo. Ele espera uma
matriz de seis números de pinos para fios conectados a diferentes pinos no LCD: seleção de
registro (RS), habilitação (EN) e quatro conexões de dados (D4, D5, D6 e D7).
Os detalhes da interação com LCDs paralelos são de baixo nível, mas JohnnyFive abstrai
muito disso para você. Métodos LCD úteis no JohnnyFive incluem estes:
board.on('pronto', () => {
const downButton = new five.Button(2);
const upButton = new five.Button(3);
const goButton = new five.Button(4); const lcd = new five.LCD([7, 8,
9, 10, 11, 12]); 1
/** funções do manipulador de botões... **/
lcd.cursor(0, 0).print('olá, mundo'); 2 lcd.cursor(1, 0).print('olá, de novo'); 3 });
2 Posiciona o cursor na 0ª linha, 0ª posição (canto superior esquerdo) e imprime “hello, world”
Execute o script (nó timeradvanced.js) e, uma vez executado, gire o dial do potenciômetro
para ajustar o contraste no LCD.
O LCD deve exibir “hello, world” na primeira linha e “hello, again” na segunda WOW! e-book
www.wowebook.org
Machine Translated by Google
linha.
Se o seu LCD parece não funcionar direito, ou de todo, a primeira coisa a fazer é verificar novamente todas as
conexões dos fios e certificar-se de que estão conectadas aos pinos corretos no
Arduino.
Se o seu LCD não acender, verifique as conexões de energia nos pinos 15 e 16 (alimentação da luz de fundo).
Certifique-se de que o módulo LCD esteja encaixado corretamente e que os pinos estejam alinhados com precisão.
Nosso circuito LCD está pronto. É hora de programar o timer. Vamos dividir isso em partes, mas uma visão geral
// constantes
função inicial () {
// inicializa o temporizador
}
função carrilhão () {
// pulsa o LED indicador
}
// inicializa o timer
});
Saltando de cima para baixo, uma seção de inicialização de variável configura alguns dos valores
que precisaremos para operar o timer, conforme mostrado na listagem a seguir. Adicione-os ao
timer advanced.js.
// ...
});
1 60 segundos é a duração do temporizador padrão, em ms. Você pode mudar isso se quiser.
O limite superior de 99 minutos é baseado na forma como o tempo restante é formatado no LCD
(mm:ss). Durações mais longas não caberiam.
Falando em formatação de exibição, vamos começar. É hora de adicionar uma função para
inicializar um timer e mostrar o tempo restante no timer atual no LCD. O próximo trecho de código a
ser adicionado define as funções init() e showRemaining().
// ...
board.on('ready', () => { // ...
componentes e função de inicialização variável init () { 1
mostrarRestante();
}
função mostrarRestante () { 2
var minutos, segundos, minPad, secPad;
minutos = Math.floor(restante / 60000); segundos = Math.floor((restante
% 60000) / 1000); minPad = (minutos < 10) ? '0' : '';
A função showRemaining será invocada com frequência quando o cronômetro estiver realmente em
execução. A verificação para garantir que a sequência de tempo foi alterada antes de atualizar o LCD
(timeString != lastTimeString) melhorará o desempenho. O tempo restante no cronômetro atual será
Os manipuladores de botão precisam ser registrados para invocar o AdjustTime(), e esse também é um bom
// ...
board.on('pronto', () => {
// ... variável e função de inicialização de componente init () { /* ... */ }
function showRemaining () { /* ... */ }
mostrarRestante(); 1
}
});
upButton.on('press', () => { // adiciona um segundo
ajusteTempo(1000);
});
calor(); 2
});
1 A duração do timer foi alterada, então o display do LCD precisa ser atualizado.
Agora, vamos ligar o botão Go. Esse botão deve alternar o cronômetro (reproduzir/pausar).
Isso significa que também precisaremos de lógica para ativar o timer — invocar a função tick() a cada
// ...
UAU! e-book
www.wowebook.org
Machine Translated by Google
board.on('ready', () => { // ... variável
e função de inicialização de componente init () { /* ... */ }
início da função () {
lcd.clear(); 1
timestamp = Date.now(); timer =
setInterval(tick, 250); 2
carrapato(); 3
}
função pausa () {
timer = clearInterval(timer); 4
lcd.cursor(0, 9).print('PAUSADO'); 5
}
função carrapato () {
lastTimestamp = timestamp; timestamp =
Date.now();
restante = (timestamp lastTimestamp);
if (restante <= 0) {
timer = clearInterval(timer);
aquecer();
}
mostrarRestante();
}
});
aquecer();
});
2 Define um intervalo para invocar o tick quatro vezes por segundo ou mais
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora você pode iniciar e pausar o cronômetro, mas o que acontece quando o tempo acabar? Precisamos
Como parte final da construção deste circuito, você pode adicionar um LED conforme mostrado na figura 5.21.
Ele deve ser conectado através de um resistor de 220 V ao terra, e seu ânodo deve ser conectado ao
pino 7 do Arduino.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Precisaremos fazer alguns ajustes nas funções start e tick, e adicionaremos uma nova
função chime, mostrada na listagem a seguir.
// ...
board.on('pronto', () => { const
downButton = new five.Button(2);
const upButton = new five.Button(3);
const goButton = new five.Button(4);
const lcd = new five.LCD([7, 8, 9, 10, 11, 12]);
const alertLED = novo five.Led(6);
início da função () {
alertLED.stop().off();
lcd.clear();
timestamp = Date.now(); timer =
setInterval(tick, 250);
marcação();
}
função carrapato () {
lastTimestamp = timestamp; timestamp =
Date.now(); restante = (timestamp lastTimestamp);
if (remaining <= 0) {
timer = clearInterval(timer);
carrilhão();
aquecer();
}
mostrarRestante();
}
função carrilhão () {
alertLED.pulse();
lcd.cursor(0, 9).print('CONCLUÍDO!');
}
});
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Instancia um objeto Led no pino 6
2 Sempre que o cronômetro estiver em contagem regressiva, o chimeLED deve estar desligado.
3 Alguma lógica para determinar se o tempo acabou e, em caso afirmativo, para limpar o intervalo e
breve
4 carrilhões()...
Como init() é chamado novamente quando o tempo se esgota, o cronômetro pode ser usado várias
$ nó timeradvanced.js
A lógica do cronômetro acontece dentro do retorno de chamada pronto para o objeto da placa
JohnnyFive e está começando a parecer difícil de manejar. Provavelmente seria mais elegante
encapsular a lógica em um módulo externo. Você verá exemplos disso em capítulos posteriores.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Em primeiro lugar, não vou tentar convencê-lo de que os piezos (figura 5.23) fazem ruídos
adoráveis e suaves. Eles podem produzir tons, baseados em frequências simples, mas soam
minúsculos e ásperos. Ainda assim, você pode fazer um tocar uma música e é divertido brincar
com eles. Se quiser adicionar um piezo ao seu timer, você pode trocar o LED por um piezo (como
você verá na figura 5.24). Então você estará pronto para se divertir e irritar os amigos com seu
piezo!
Figura 5.23. Alguns piezos têm fios condutores e outros têm pernas. Piezos têm
dois pinos: + e -.
Quando a tensão é aplicada a um piezo, ela causa mudanças físicas na forma de uma
superfície dentro do piezo. Os piezos transformam a energia elétrica em energia mecânica, e nós,
UAU! e-book
www.wowebook.org
Machine Translated by Google
como humanos, detectam essa energia mecânica como ondas sonoras. A aplicação de tensões
em frequências específicas cria vibrações que correspondem a diferentes notas musicais.
Esse fenômeno é conhecido como efeito piezoelétrico reverso – a eletricidade é convertida em
movimento mecânico.
Piezos também podem ser usados como sensores. Usados como entrada, os piezos podem
detectar batidas ou outros tipos de vibração. Isso demonstra o inverso do efeito piezoelétrico
reverso, ou seja, o efeito piezoelétrico.
Para fazer um piezo soar uma nota requer uma combinação de PWM e temporização. Para
fazer um piezo fazer barulho, você fornece tensão em um ciclo de trabalho de 50% - isso cria
ondas quadradas (on off on off). Para fazer um piezo tocar uma nota específica, você ajusta a
frequência desses ciclos PWM.
Por exemplo, a nota A4 ou A440 é uma nota de afinação de referência comum. Chama-se A440
porque vibra a 440 Hz. A cada 1/440 de segundo, há um período de onda completo. Na vida real,
essas são ondas analógicas suaves. Com um piezo, são ondas digitais quadradas. Aplicando uma
tensão de ciclo de trabalho de 50% a um piezo 440 vezes por segundo, você pode aproximar A4.
A frequência dobra a cada oitava. A3 (220 Hz) é metade da frequência de A4 (440 Hz), enquanto
A5 (880 Hz) é o dobro da frequência de A4. A's têm boas frequências redondas.
As notas intermediárias também têm frequências previsíveis que dobram a cada oitava, como dó
central (C4) a 261,626 Hz e C5 a 523,521 Hz.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A nota A4 tem uma frequência de 440 Hz. Um período de onda completo é 1/440 de segundo.
Ao contrário das ondas sonoras analógicas naturais, que têm curvas suaves, os piezos emitem ondas quadradas
ondas.
As frequências envolvidas aqui excedem em muito a resolução do que você pode fazer com temporizadores JavaScript
embutidos (setInterval, setTimeout), então JohnnyFive depende de um pacote npm chamado nanotimer. Isso permite
um comportamento semelhante ao setInterval, mas com uma precisão muito mais precisa e refinada.
Dependendo do tipo de piezo que você possui, conecte-o diretamente na breadboard ou conecte seus fios na
UAU! e-book
www.wowebook.org
Machine Translated by Google
A classe Piezo do JohnnyFive fornece algumas ferramentas úteis para fazer os piezos tocarem
músicas, lidando com as complexas conversões de tempo e frequência. As notas são expostas
por seus nomes (como 'e5') para que você não precise memorizar frequências. Você pode
passar um objeto representando uma “melodia” para o método play, com propriedades como
andamento (BPM) e uma música (array de notas e suas durações).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Atualize a função chime() para reproduzir uma música, conforme mostrado na listagem a seguir.
função carrilhão () {
ÿÿalertChime.play({ ÿÿÿÿtempo:ÿ120,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1
música: [ ['e5', 1], 2
['b4', 2],
['e5',1], ['f#5',1], ['g#5',1],
['e5', 2],
['g#5', 1], ['e5', 1],
['f#5', 1],
['b4', 2],
['b4', 1], ['f#5', 1], ['g#5', 1],
['e5', 2]
]
});
lcd.cursor(0, 9).print('CONCLUÍDO!');
}
Você terá que tentar isso para descobrir qual é a melodia do tempo!
RESUMO
Um LED pode emitir apenas um comprimento de onda (cor) e só pode estar desligado ou ligado a qualquer
momento, mas a modulação por largura de pulso (PWM) pode ser usada para enganar o olho e pensar que
O suporte a PWM é um recurso de hardware e apenas alguns pinos nas placas de desenvolvimento
suporta PWM.
O brilho dos LEDs pode ser “animado” para criar efeitos e comunicar informações. O uso de
diferentes funções de easing e o fornecimento de diferentes opções de animação podem gerar diferentes
Os LEDs RGB combinam três LEDs (vermelho, verde, azul) em diferentes brilhos - via WOW! e-book
www.wowebook.org
Machine Translated by Google
PWM—para criar cores diferentes. Os LEDs RBG de cátodo comum têm três
Os LCDs paralelos têm muitas conexões. JohnnyFive fornece uma interface simplificada para LCDs por meio de
sua classe LCD.
Os potenciômetros são outro tipo de resistor variável, como os fotoresistores. Ao contrário dos fotoresistores,
eles têm seus próprios divisores de tensão internos, portanto, a mudança de tensão pode ser lida no terceiro
pino.
Os piezos aproveitam o efeito piezoelétrico reverso para transduzir tensões em diferentes frequências em
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Capítulo 6. Saída: fazendo as coisas se moverem
Usando
Ofertas e promoções diodos, capacitores e transistores em circuitos para controlar motores e proteger
componentes
Destaques
Como posicionar as coisas, precisamente, com servos
A essa altura, você provavelmente já está batendo os pés com impaciência e se perguntando: “Quando é que
vamos
fazer Sign Out para fazer robôs?” Bem, seu navio chegou. É hora de aprender como fazer as coisas se moverem.
Os motores e servos que você vai conhecer fornecem o controle fundamental dos movimentos dos robôs. Há muito
o que aprender, mas ao final deste capítulo você terá construído um robô itinerante básico.
Os motores giram, fazendo as rodas rolarem. Os servos permitem o posicionamento preciso dos
componentes: câmeras, braços robóticos e assim por diante. Vamos nos mexer.
1 motor CC de 9 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 bateria de 9 V e encaixes
1 diodo 1N4001
1 capacitor de 100 ÿF
Fios de jumper
Quando uma corrente elétrica passa por um fio, um campo magnético também é criado. O campo
magnético é orientado em ângulo reto com a direção da corrente (figura 6.2).
Figura 6.2. A corrente elétrica através de um fio cria um campo magnético em ângulo reto com o
fluxo de corrente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O campo magnético induzido por corrente perto de um único fio reto é fraco,
relativamente falando. Mas é possível concentrar o efeito magnético enrolando um
pedaço de fio ao redor (e ao redor e ao redor) de um pedaço de metal. Quando a corrente
é aplicada à bobina de fio, o campo magnético coletivo em ângulo reto tem força suficiente
para puxar alguns dos átomos anteriormente desorganizados no núcleo de metal para um
alinhamento norte-sul. E, voilá! Você criou um ímã usando eletricidade: um eletroímã (figura 6.3).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se você inverter a direção da corrente que passa pelo fio enrolado, a polaridade
do eletroímã também mudará — os pólos magnéticos norte e sul trocarão de
lugar (figura 6.4). Corte a corrente do fio e o campo magnético se dissipará - você
pode desligar o ímã!
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vamos imaginar nosso eletroímã imaginário sendo colocado em uso teórico. No lado
esquerdo da figura 6.5, um eletroímã não energizado é montado em um eixo e
suspenso entre dois ímãs estacionários. Assim que a corrente é aplicada ao eletroímã (no
meio da figura 6.5), o eletroímã desejará se alinhar conforme as forças magnéticas
determinam - seu pólo norte em direção ao ímã estacionário com o pólo sul voltado para dentro.
O que ele vai querer fazer é girar meia volta para que isso aconteça, como à direita na
figura 6.5. Claro, este motor hipotético não vai funcionar: a bateria está atrapalhando e as
coisas estão se emaranhando.
Figura 6.5. Um eletroímã em um eixo entre dois ímãs fixos vai querer se
orientar – girando – conforme as forças magnéticas determinam.
Sem mais intervenção, as coisas parariam aqui - os ímãs estão alinhados de maneira
feliz. Mas se pudéssemos mudar a direção da corrente através do eletroímã novamente
exatamente neste ponto, o movimento poderia ser forçado a continuar, pois o ímã busca se
alinhar corretamente mais uma vez. Inverter
manter a polaridade da corrente a cada meia volta pode
WOW! e-book www.wowebook.org
Machine Translated by Google
as coisas vão para sempre. Na verdade, esse conceito é como os motores funcionam. Um motor
conectado como o mostrado na figura 6.5 rapidamente se tornaria um emaranhado de baterias e fios,
então um motor real envolve algumas melhorias de projeto.
A Figura 6.6 mostra um motor CC com escovas - ainda simplificado demais. A parede do motor
contém ímãs fixos. Conexões de energia positiva e negativa da fonte de energia são conectadas
a duas escovas estacionárias, que “escovam” a energia em uma determinada polaridade à medida
que o eixo do motor gira e entram em contato com diferentes partes de um anel bipartido chamado
comutador. A corrente - e, portanto, o campo magnético - muda de polaridade conforme o motor
gira, mantendo tudo em movimento. Os motores com escovas são muito comuns, mas os motores
sem escovas usam os mesmos conceitos gerais - eletricidade e ímãs - para realizar a mesma
coisa.
Figura 6.6. Os eletroímãs de um motor com escovas são conectados a um anel dividido
chamado comutador (A). O comutador e os eletroímãs giram conforme o motor gira.
As escovas de posição fixa (B) são conectadas à fonte de alimentação e
“escovam” polaridades alternadas no comutador conforme ele gira abaixo delas,
alterando a polaridade dos eletroímãs na armadura do motor (C).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vamos facilitar o controle do motor com cuidado, construindo um circuito básico que alimenta um motor,
controlado por um botão de pressão. Em breve, adicionaremos a capacidade de controlar o motor com o Arduino
Uno e o JohnnyFive.
1 bateria de 9 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 pequeno motor DC, nominal até 9 V
1 diodo 1N4001
Figura 6.7. Quando um motor é girado por uma força externa, uma corrente
elétrica é gerada.
As características dos componentes indutivos são relevantes para o seu circuito. Digamos
que você aplique corrente a um motor e ele esteja girando alegremente. Remova a corrente
- desligue a energia - e o motor continuará girando sozinho por um tempo. Durante esse
breve período, ele estará gerando energia, e uma coisa importante a ser observada é
que um motor (ou qualquer indutor) gerará tensão na direção oposta à tensão de
entrada ( figura 6.8).
Isso significa que o fluxo de eletricidade pode “se mover para trás” em seu circuito, e o pico de
tensão negativa pode ser enorme (embora por um período de tempo muito curto). Sem
intervenção, essa tensão de retorno (também chamada de força eletromotriz de retorno ou EMF
de retorno) pode fazer coisas desagradáveis, como danificar componentes ou causar faíscas reais!
Um circuito sem proteção contra esta contratensão funciona bem quando o circuito está fechado
e a corrente está fluindo através do motor (figura 6.9), mas pode ser problemático quando a
corrente através do motor muda (figura 6.10), que muda quando o botão é pressionado. liberado
(a chave é aberta, interrompendo o circuito).
Figura 6.9. No circuito desprotegido mostrado aqui, o fluxo de corrente é controlado com
um botão (interruptor). Quando o interruptor é pressionado e mantido, a corrente flui
conforme o esperado, alimentando o motor. O motor consome a tensão fornecida.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A grande tensão negativa gerada brevemente na figura 6.10 quer tanto criar um caminho
para a tensão de +9 V que pode fazer coisas malucas, como pular no ar ou através
de outros materiais não condutores para chegar lá. Temos que proteger nosso circuito
contra esse tipo de pico de tensão indutiva.
Figura 6.10. Ao soltar o botão (interruptor aberto), o motor continua girando por
um tempo. Durante este tempo está gerando tensão negativa. O condutor
anteriormente conectado ao terminal positivo da bateria (através do interruptor)
pode acumular um potencial negativo muito grande – centenas de volts,
digamos – que é muito, muito menor do que os +9 V da bateria.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Temos que administrar essa situação de contratensão para a saúde e a segurança de nosso circuito.
Precisamos ter certeza de que a voltagem negativa não é permitida vagando pelo circuito por vontade
própria, ferindo componentes inocentes.
Existe um método padrão para fazer isso, usando um diodo (figura 6.11). Você conheceu
rapidamente os diodos no capítulo 2 — os LEDs são uma espécie de diodo. Um diodo é um
componente semicondutor que permite apenas que a corrente flua através dele em uma direção.
Figura 6.11. Os diodos são componentes semicondutores que permitem apenas que a corrente
flua em uma direção.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A colocação do diodo no diagrama de fiação do circuito para o motor controlado por botão que
estamos prestes a construir - com o cátodo do diodo conectado ao barramento de alimentação
positivo - olha para trás, e é (figura 6.12).
Figura 6.12. Diagrama de circuito de um motor básico controlado por botão, incluindo um
diodo de proteção
A maneira como o diodo é orientado (“para trás” ou, mais tecnicamente, com polarização reversa)
no circuito significa que a corrente será impedida de fluir através dele - geralmente. Mas
quando surge a situação de contratensão e o fluxo através do circuito é invertido, o diodo
torna-se temporariamente polarizado diretamente - é momentaneamente orientado para que a
corrente
UAU! e-book www.wowebook.org
Machine Translated by Google
pode fluir através dele. Nesses momentos, ele pode criar um caminho para “afastar” a perigosa
corrente de tensão negativa e redirecioná-la através do motor repetidamente até que a tensão
negativa se dissipe naturalmente por conta própria (não se preocupe, ela irá, e rapidamente).
Um diodo usado dessa maneira é chamado de diodo flyback ou diodo snubber (figura 6.13).
Figura 6.13. Se um diodo flyback for usado em um circuito com um indutor como um motor, ele
pode fornecer um caminho para a tensão negativa reprimida que está tentando seguir o caminho errado.
Ele pode encaminhá-lo de volta pelo motor em um loop até que se dissipe.
Elementos indutivos como motores precisam de corrente, especialmente quando estão sendo ligados ou
desligados (a esta altura você provavelmente já deve ter percebido que os indutores têm algumas
características interessantes quando estão ligando ou desligando). O consumo máximo de corrente possível de
Além disso, muitos motores de hobby são classificados em 6 V ou até 9 V - mais do que o Uno pode fornecer, em
termos de tensão. Usaremos uma fonte de energia estável e separada para nosso motor - uma bateria de 9 V -
Construindo o circuito
Para o motor mostrado na figura 6.12 girar, você precisará criar um caminho fechado a partir do WOW! e-book
www.wowebook.org
Machine Translated by Google
fonte de energia (terminal positivo da bateria) ao terra (terminal negativo da bateria). Pressionar o botão
de pressão conectará este caminho - o motor funcionará quando o botão for pressionado.
Monte o circuito conforme a figura 6.12, tomando cuidado para orientar corretamente o diodo
flyback. Se você invertê-lo, ficará muito quente (no mínimo) ou possivelmente até explodirá ou danificará
a bateria.
Depois de construir o circuito, você poderá ligar o motor pressionando o botão. Esses pequenos
motores de passatempo giram rápido!
Seu motor pode ter fios vermelhos e pretos, indicando que existe uma maneira “correta” ou
“polarizada” de conectar o motor a um circuito. Isso é um pouco enganador: os motores ficam felizes
conectados em qualquer orientação - trocar as conexões simplesmente inverterá a direção em que o
motor gira. Você pode tentar reorientar os condutores do seu motor no circuito e ver se consegue fazê-
lo funcionar "ao contrário". Alterar a direção da corrente através de um motor para alterar a direção
do motor é uma parte fundamental do controle robótico, como você verá a seguir.
JohnnyFive tem uma classe de componente Motor que pode lhe dar mais controle sobre a
velocidade do motor. Ele oferece ainda mais controle se você usar circuitos integrados ou controladores
de motor mais sofisticados - mas vamos começar pelo básico.
1 pequeno motor DC de 9 V
1 diodo 1N4001
4 fios jumper
Neste experimento, queremos substituir o botão de pressão humano por um mecanismo de comutação que pode ser
Você já sabe que o motor precisa de mais do que a alimentação integrada do Arduino pode fornecer - tanto em
termos de tensão quanto de corrente - mas qualquer sinal de saída de um pino Uno será de 5 V. Vamos acabar com
circuitos que combina duas fontes de energia separadas: 9 V (bateria) e 5 V (lógica Arduino).
MOSFETs são transistores de efeito de campo de metalóxido semicondutor (uau, não é de admirar que as pessoas
apenas digam MOSFET). Transistores são componentes semicondutores que desempenham uma de duas funções:
amplificar ou comutar sinais. Há mais coisas a saber sobre transistores, mas em nosso caso imediato, vamos usar
Quando uma pequena tensão é aplicada ao pino gate do MOSFET (figura 6.14), os outros dois pinos (fonte e dreno)
são conectados e a corrente pode fluir entre eles – o MOSFET é ligado. O Uno pode alcançar com um “dedo”
de 5 V mais fraco e “empurrar” o pino do portão, completando o circuito de 9 V conectado à fonte e ao dreno. Ou
seja, você pode usar um sinal com baixa tensão e potência para controlar um sinal com maior tensão e potência. O
circuito do motor resultante tem duas fontes de alimentação de entrada: a bateria de 9 V e a entrada de 5 V
vinda do Uno.
Figura 6.14. Um MOSFET e seu símbolo de circuito. Uma pequena tensão aplicada ao pino gate (G) fará
uma conexão entre os pinos dreno (D) e fonte (S).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Pinagem MOSFET
Embora a maioria dos transistores de efeito de campo (FETs) desse tipo (Nchannel) use a pinagem mostrada
na figura 6.14, certifique-se de verificar a folha de dados do seu componente para confirmar quais pinos
Uma última coisa: você precisa conectar as duas fontes de energia a um aterramento comum.
Embora as fontes de energia de entrada sejam segregadas - o barramento de energia positivo é apenas para
Construindo o circuito
Certifique-se de que a guia de metal do MOSFET esteja orientada conforme mostrado no diagrama de fiação
do motor MOSFETswitched (figura 6.15) - a guia deve estar voltada para a direita.
De cima, o primeiro pino é o portão: este deve ser conectado ao pino 6 do Uno.
Conecte o pino inferior - a fonte - ao terra. O pino de drenagem do MOSFET (pino do meio) deve ser conectado
a um dos condutores do motor e ao diodo flyback conforme mostrado (o diodo está em paralelo com o motor).
Figura 6.15. Diagrama de circuito para um controle de motor comutado por transistor
UAU! e-book
www.wowebook.org
Machine Translated by Google
Quando a tensão é aplicada ao pino do portão, a corrente poderá fluir entre os pinos de
fonte e dreno, permitindo que o motor gire.
});
});
A classe de componente Motor do JohnnyFive tem mais do que isso, mas estamos começando com a
instanciação mais básica: identificar um único pino para controlar a velocidade de um motor em um
único WOW!
e-book www.wowebook.org
Machine Translated by Google
direção. Isso é chamado de motor não direcional.
$ node motorbasic.js
Depois que a placa e o REPL forem inicializados, você poderá experimentar a referência de objeto do motor
motor.speed(100).
motor.start().
A velocidade do motor é controlada com modulação por largura de pulso (PWM), então é bom termos uma
chave rápida (o MOSFET) que pode abrir e fechar o circuito em altas frequências.
Agora você tem todas as ferramentas necessárias em seu kit de construção para construir o ventilador
Desafio: Em vez de usar o REPL para controlar um motor, adicione um sensor TMP 36 ao seu circuito e
use alterações em seu valor para ligar ou desligar o ventilador ou alterar sua velocidade. Você pode se
divertir mais se cortar uma pá de ventilador de papel duro ou papelão e prendê-la ao eixo do motor!
Os servos são mecanismos para posicionar as coisas com precisão e são indispensáveis na robótica e
em outros dispositivos que exigem que as coisas sejam movidas com precisão (figura 6.16).
Figura 6.16. Um servo e suas partes básicas. Os chifres vêm em diferentes formas e tamanhos:
discos, estrelas, braços simples.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A maioria dos servos tem cerca de 180 graus de rotação. Eles têm uma posição “neutra” (90
graus ou “para cima”) e podem girar cerca de 90 graus a partir dessa posição neutra em
qualquer direção (figura 6.17). Os 180 graus de rotação são o melhor caso: servos baratos de
baixa potência têm apenas ~ 150 graus de rotação.
A posição de um servo, ou ângulo, é controlada pelo envio de PWM através de seu fio de sinal, mas é
um “sabor” especial de PWM. Um servo espera receber um pulso a cada 20 ms. O período de tempo
que o pulso persiste - a quantidade de tempo em que o sinal é ALTO - determina a posição do servo.
Quanto menor a duração do pulso, mais à esquerda será a posição resultante.
Normalmente, um pulso de 1,5 ms fará com que o servo aponte para sua direção neutra (90°). Um pulso
de 1 ms ou mais direcionará o servo para a esquerda (0°), enquanto um pulso de 2 ms o posicionará
totalmente para a direita (180°).
A duração de um pulso PWM determina o ângulo do servo. Um pulso de 1,5 ms posiciona o servo
em um ângulo neutro. Pulsos mais curtos equivalem a ângulos mais agudos e pulsos mais longos
a ângulos obtusos.
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 micro servo (4,8 V)
1 tábua de pão
A maioria dos fios dos servos termina em um conector fêmea com três terminais.
A maneira mais fácil de conectá-los a uma placa de ensaio é obter alguns pinos de cabeçalho separáveis.
Essas tiras de pinos vêm em fileiras de 16 a 40 pinos e você retira o número de pinos necessário para conectar
um determinado componente. Alguns são mais resistentes do que outros e podem exigir um alicate para
se separar.
Procure por pinos de cabeçalho macho em um passo de 0,1 "(o passo de 0,1" os torna compatíveis
com breadboard).
Os pinos de cabeçalho separatistas machos vêm em tiras. Você “quebra” (quebra) o número de pinos
que precisa para um determinado componente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Como os motores, os servos consomem muita energia quando se movem e podem causar
flutuação de tensão no circuito. No entanto, é possível alimentar micro servos de baixa voltagem—
aqueles classificados para 4,8 V ou menos—diretamente da fonte de alimentação do Uno se você tomar
algumas precauções.
Capacitores (figura 6.18) são componentes eletrônicos passivos que agem como baterias: eles
armazenam uma certa quantidade de carga, medida em unidades chamadas farads (abreviadas
como F). Um farad é muito; a maioria dos capacitores para eletrônicos de hobby são medidos
Um capacitor carregado ficará inquieto se houver uma flutuação de tensão entre a fonte de alimentação
e o terra. Por exemplo, se a tensão cair repentinamente para 4,5 V, o capacitor descarregará parte de sua
Isso significa que um capacitor pode atuar como uma pequena bateria de reforço, esguichando carga extra
conforme necessário para manter a tensão estável. Um capacitor usado dessa maneira é chamado de
capacitor de desacoplamento, pois desacopla o restante do circuito do ruído de tensão causado por
componentes.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Atenção! Capacitores são diabinhos sorrateiros e podem ser absolutamente perigosos em
certos casos. Eles merecem mais respeito e cuidado.
Uma coisa importante a saber é que os capacitores podem reter sua carga por longos períodos de
tempo, mesmo que a corrente não esteja passando por eles. Eles são, novamente, como baterias
a esse respeito. Isso significa que se você acidentalmente completar um circuito através de um
capacitor - e, sim, você pode causar essa situação com os dedos - ele pode descarregar imediata
e violentamente. Se você se pegar desconstruindo televisões antigas ou flashes de câmeras
eletrônicas, tenha muito cuidado. Se um desses poderosos capacitores descarregar em você
inesperadamente, você pode estar prestes a ir para o hospital, ou coisa pior.
Uma coisa mais cotidiana a ter em mente é que os capacitores eletrolíticos, como o usado
neste experimento, são polarizados. Eles não toleram ser conectados ao contrário e têm o hábito
bastante teimoso de explodir quando usados em uma orientação inversa. Em nosso mundo de
baixa voltagem e baixa capacitância, essas são explosões bastante brandas, mas ainda
podem assustar você, ou derreter componentes e placas que você prefere não derreter.
Conecte a alimentação, o aterramento e os fios de controle do seu servo à placa de ensaio, usando
os pinos de cabeçalho, se necessário (consulte a figura 6.19). Diferentes fabricantes de servos
usam cores de fios diferentes, mas a conexão de alimentação positiva deve ser um fio vermelho.
A maioria dos servos usa preto para o fio negativo, mas alguns têm um fio marrom ou marrom.
Finalmente, o fio de sinal pode ser branco, amarelo, laranja ou mesmo azul. Resumindo, o fio
vermelho é a alimentação, o fio mais escuro é o terra e o que sobra é o fio de sinal (figura 6.20).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 6.20. Os fios de servo vêm em várias cores e possuem conectores diferentes.
Deve haver um fio vermelho - ele se conecta a Vcc (fonte de alimentação). O fio mais
escuro — preto ou marrom — é o terra. O fio restante é o fio de sinal – aqui abreviado
como S – para controlar a posição do servo.
Você já deve ter adivinhado que JohnnyFive tem uma classe Servo para controlar servos.
Crie um novo arquivo, servobasic.js, e adicione o seguinte JavaScript. Isso é semelhante ao test drive do
motor: ele disponibilizará uma referência ao servo para você no REPL.
});
});
Execute o script:
$ nó servobasic.js
Se você tentar posicionar seu servo nos extremos de sua faixa - 0 ou 180 ou próximo a esses valores
- ele provavelmente protestará, fazendo sons triturantes tristes. Isso porque o alcance efetivo do
servo é inferior a 180 graus. Tente experimentar para determinar os valores de ângulo mais baixo e mais
alto que seu servo pode alcançar confortavelmente.
Este pequeno test drive é apenas uma breve introdução aos servos. Se a próxima seção - construindo
um WOW! e-
book www.wowebook.org
Machine Translated by Google
robô!—atrai você, e a robótica é uma área na qual você deseja mergulhar, você terá muito mais encontros
É hora de construir um robô. Para construir um robô que se mova sobre rodas, você precisa de algumas
Um chassi – Todo robô precisa de um corpo. Um chassi é uma estrutura na qual você pode conectar
Pelo menos dois motores com engrenagens— Os motores para acionar robôs precisam ter alguma
redução de engrenagem para fornecer algum torque. Caso contrário, eles não serão capazes de
geralmente (mas nem sempre) em ângulo reto com o giro do próprio motor.
Circuito do motor— Seu robô precisa de alguns componentes para traduzir o desejado
movimento em movimento motor.
Figura 6.21. Um robô básico precisa de um chassi (corpo). Dois ou mais motores de engrenagem
se conectam a rodas ou trilhos para impulsionar o bot. Claro, você também precisará de circuitos, um
cérebro (microcontrolador) e uma fonte de alimentação.
Uma das coisas que podem ser desconcertantes em entrar na robótica básica é a
UAU! e-book
www.wowebook.org
Machine Translated by Google
despesa combinada de várias partes. O chassi pode custar até algumas centenas de dólares (!), e
blindagens, placas ou outros circuitos disponíveis no mercado para controlar os motores podem custar uma
um pouco também.
Nosso primeiro robô itinerante usará peças bastante baratas. Você pode encontrar o kit de
chassi Actobotics Peewee Runt Rover sugerido por cerca de US $ 16 on-line e em eletrônicos
lojas de abastecimento.
[1]
1 Arduino Uno e cabo USB
Se por acaso você tiver um cabo USB A para USB B mais longo do que o que veio com o seu Arduino, este seria um
bom momento para usá-lo.
[2]
1 kit de robô Actobotics Peewee Runt Rover ou similar
Bateria de 9 V e encaixes
15 fios de jumper
Fita dupla face, fita isolante, fita isolante ou outro adesivo (opcional)
O kit Actobotics Peewee Runt Rover é uma opção útil para um primeiro robô porque é barato e inclui
um chassi, rodas, motoredutores e suportes - as peças básicas de que você precisará. Mas outros
quadros ou kits de chassi de duas rodas também são bons. O chassi Shadow do SparkFun é
outra opção barata (embora você precise comprar motores e rodas
UAU! e-book
www.wowebook.org
Machine Translated by Google
separadamente). Seja o que for que você faça, certifique-se de ter um chassi, motoredutores e rodas.
As instruções a seguir para a construção de um robô móvel assumem o kit Peewee, mas a construção não
deve diferir muito para kits semelhantes.
PWM e como a direção de um motor pode ser invertida trocando suas conexões de alimentação e terra.
Você também viu como os circuitos do motor são um pouco mais complexos do que outros circuitos:
você precisa de diodos para proteger os outros componentes do circuito e provavelmente precisará de
uma fonte de alimentação mais robusta para um motor do que uma placa de desenvolvimento pode fornecer.
Fica um pouco mais complicado. Um robô itinerante precisa de pelo menos dois motores para ser dirigível,
e você precisa ser capaz de operar esses motores em uma direção para frente e para trás (sem
desconectar fisicamente e trocar os cabos, é claro). Múltiplos motores em um único circuito também
devem ser isolados com capacitores de desacoplamento para que picos repentinos causados por um
motor não afetem o outro motor ou componentes. Os detalhes estão começando a se encaixar.
Uma Hbridge é um circuito com quatro interruptores e uma carga no meio - a carga sendo um motor,
Figura 6.22. Um circuito de ponte H contém quatro interruptores, com o motor no centro.
Diferentes combinações de estados de comutação podem direcionar a corrente através
do motor em diferentes direções.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A disposição das chaves (isto é, transistores) em uma Hbridge permite que a direção
do motor seja controlada sem que você tenha que alterar fisicamente sua fiação. Fechar
as chaves 1 e 4 (figura 6.23, esquerda) permite que a corrente flua através do motor
em uma direção, enquanto fechar as chaves 2 e 3 (figura 6.23, direita) permite que o
motor gire na direção oposta.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Existem 16 estados possíveis (combinações de chaves) em que um circuito Hbridge pode estar,
dos quais os dois na figura 6.23 são os mais obviamente úteis. Vários outros são inócuos, permitindo
que o motor pare por inércia (quando não há passagem pelo circuito) ou freando o motor (ambos
os condutores do motor conectados à mesma tensão).
Existem seis combinações de interruptores que são más notícias, causando uma situação chamada
“dispare”, mais simplesmente descrita como um curto-circuito (figura 6.24). Isso não é bom e vai fritar
as coisas.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para o nosso robô, precisaríamos construir um circuito Hbridge por motor, sem mencionar a
adição de diodos e capacitores de proteção adicionais - isso está começando a parecer
um monte de conexões e complicações. Felizmente, Hbridges estão disponíveis de forma
barata como chips de circuito integrado (IC) (figura 6.25). Melhor ainda, muitos ICs baratos
agrupam circuitos Hbridge junto com diodos internos e outros dispositivos para proteger
o circuito do motor, bem como evitar estados de disparo. Esses chips são chamados de
drivers de motor ou apenas drivers.
Figura 6.25. Drivers de motor baratos, como este Texas Instruments SN754410,
fornecem controle lógico sobre circuitos internos de ponte H. Eles também incluem outros
componentes, como diodos, tornando o controle do motor mais simples e menos sujeito a
erros. O SN754410 é uma ponte H dupla - pode controlar dois motores.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O Driver Quadruple HalfH SN754410 da Texas Instruments custa apenas alguns dólares e está
disponível em vários revendedores de suprimentos eletrônicos. Sim, seu nome é um bocado
(dica bônus: uma meia-ponte quádrupla é equivalente a dois circuitos Hbridge completos),
mas faz tudo o que precisamos para acionar os dois motores do nosso primeiro robô itinerante.
Antes de mergulharmos nos detalhes dos pinos do IC do driver do motor e circuitos relacionados,
vamos começar com as peças fundamentais do nosso primeiro robô.
Você vai querer prender os suportes laterais (isso pode levar algum esforço) e sua placa
de ensaio à placa inferior do chassi do robô (figura 6.26). Se você tiver o kit Peewee, os suportes laterais
são as peças de plástico com os orifícios retangulares maiores no
meio.
Figura 6.26. A placa inferior do chassi Peewee Runt Rover, com suportes laterais
anexados e breadboard. Se você estiver usando um chassi diferente, parecerá um
pouco diferente, é claro.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A maioria das protoboards de tamanho médio tem adesivo que pode ser exposto descascando um pedaço de
papel de apoio, e isso pode ser útil para aderir a protoboard ao chassi do robô para evitar que ele se mova. Se
você não puder enviar permanentemente uma protoboard ao robô - talvez esta seja sua única protoboard! -
ou se sua protoboard não tiver adesivo, você pode prendê-la temporariamente ao chassi do robô usando
fita dupla face, fita isolante, gaffer's fita adesiva ou adesivo removível de sua escolha. Você
da placa deixará um pouco do adesivo exposto (se você estiver fixando permanentemente sua placa de ensaio).
Você pode cortar um pedaço do papel de apoio no formato do buraco e recolocá-lo para cobrir a superfície
Os motorredutores feitos para robôs têm um eixo de saída com engrenagem para as rodas motrizes
que (normalmente) está em um ângulo reto em relação ao giro do motor. Rodas anexadas ao eixo de saída,
UAU! e-book
www.wowebook.org
Machine Translated by Google
voltado para fora do robô, enquanto o eixo giratório do motor está orientado para cima
(como no kit Peewee, figura 6.27) ou para trás (como no SparkFun Shadow Chassis). Em
todos os casos, você desejará ter os fios dos motores por dentro.
Figura 6.27. A placa superior do chassi Peewee Runt Rover, mostrada com motores de
engrenagem conectados, rodas, suporte para placa de desenvolvimento e Arduino Uno.
Certifique-se de que os fios dos motores estejam voltados para dentro do chassi. Os
fios do motor podem passar por baixo do Uno e pelo orifício central da placa do chassi.
Pegue a placa superior do chassi Peewee e prenda os motoredutores a ela. Os condutores dos
motores podem então ser direcionados para baixo através do orifício circular no meio da placa
superior, para acesso à placa de ensaio abaixo. O kit Peewee também vem com dois suportes
de placa de desenvolvimento, em forma de nós largos e rasos. Estes devem ser anexados à placa
superior agora, e você pode aninhar o Arduino neles, com a conexão USB voltada para o que será
a parte traseira do robô (a placa é simétrica da frente para trás, então você pode decidir agora onde
a parte traseira do seu bot é).
Agora você pode deslizar as rodas nos eixos do motoredutor. Neste ponto, você deve ter uma placa
inferior com breadboard e suportes laterais anexados e uma placa superior com Arduino, motores e
rodas conectados.
A primeira etapa para conectar o SN754410 é conectar alguns de seus pinos à alimentação e ao
aterramento (figura 6.29).
Figura 6.29. O SN754410 precisa ser conectado a uma fonte de alimentação do motor em
VCC2 (pino físico 8) e à fonte de alimentação lógica em VCC1 (pino físico 16). Os dois pinos
de habilitação devem ser conectados diretamente a 5 V para defini-los como ALTO. Existem
também quatro pinos GND que, sem surpresa, precisam se conectar ao terra.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O driver precisa estar conectado a duas fontes de energia separadas. A bateria de 9 V alimentará os próprios
motores (fonte de alimentação do motor), enquanto a lógica de controle dos motores será de 5 V do
Além disso, existem dois pinos de habilitação no chip: um para cada driver do motor. Você precisa “ligar”
cada driver conectando cada pino de habilitação (EN) — pinos físicos 1 e 9 — a 5 V (ou seja, nível lógico ALTO).
Faça as conexões aos pinos de alimentação e habilitação conforme mostrado no diagrama de fiação de
alimentação do motor (figura 6.30). Observe que os trilhos de aterramento são interligados (terra compartilhado),
mas as fontes de alimentação são isoladas: o trilho esquerdo para a fonte de alimentação do motor (9 V), o
Figura 6.30. Fiação das conexões de energia do SN754410 na placa de ensaio do robô
No SN754410, cada motor é controlado por meio de dois pinos de entrada. Dois correspondentes WOW!
e-book
www.wowebook.org
Machine Translated by Google
pinos de saída são conectados ao motor (figura 6.31).
Figura 6.31. Cada um dos dois drivers de motor tem dois pinos de entrada e dois pinos de saída.
Diferentes combinações de nível lógico nos dois pinos de entrada de um motor fazem com que coisas
diferentes aconteçam com cada motor, graças aos interruptores e circuitos Hbridge internos. Para
cada motor, um pino de entrada pode ser usado para controlar a direção enquanto o segundo pino de
entrada pode ser usado para controlar a velocidade do motor. Vamos dar uma olhada em como isso
pode acontecer, examinando como o primeiro dos dois motores é controlado (o segundo motor
é controlado de forma idêntica).
Usaremos o pino 1A (pino físico 2 no SN54410) para controlar a direção do primeiro motor (figura
6.32).
Figura 6.32. O primeiro controlador de motor: dois pinos de entrada e dois pinos de saída.
Usaremos um dos pinos de entrada para controlar a direção do motor e o outro para controlar
sua velocidade.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 6.33. Quando a primeira entrada for definida como ALTA e a segunda entrada for definida
como BAIXA, o motor girará na direção direta.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Da mesma forma, quando o pino de direção 1A é definido como BAIXO, o motor girará na direção
reversa (o fluxo de corrente de 9 V é invertido) sempre que o pino 2A estiver em ALTO (figura 6.34).
Dito de outra forma, sempre que 1A e 2A tiverem níveis lógicos opostos, o motor será alimentado para
girar na direção ditada pelo nível lógico do pino 1A. Mas se ambos os pinos de entrada tiverem o mesmo
nível lógico, nenhuma corrente fluirá pelo motor (detalhado na tabela 6.1).
O pino 2A (SN54410 pino 7) controlará a velocidade do primeiro motor, usando PWM. Digamos que o pino
1A, o pino de direção, esteja definido como BAIXO, indicando uma direção reversa para a rotação do motor,
UAU! e-book
www.wowebook.org
Machine Translated by Google
enquanto o PWM com um ciclo de trabalho de 25% é aplicado ao pino 2A, o pino de velocidade (figura 6.35).
Setenta e cinco por cento das vezes, 1A e 2A terão os mesmos níveis lógicos (BAIXO/BAIXO),
durante os quais nenhuma corrente fluirá pelo motor. No entanto, 25% do tempo, a combinação BAIXO/ALTO
Isso resulta no que queremos: o motor girando na direção inversa a uma configuração de velocidade de 25%.
Figura 6.35. Com a direção definida como LOW (reversa) no pino 1A e um ciclo de trabalho
de 25% no pino 2A (velocidade), o motor será alimentado 25% do tempo na direção reversa.
O mesmo vale para o controle de velocidade na direção de avanço, mas há uma ruga. Digamos que 1A (direção)
seja definido como ALTO — para frente — e 2A (velocidade) seja definido como um PWM de ciclo de trabalho de 25%.
O que pretendemos é que o motor gire para frente na velocidade de 25%, mas o que vai acabar acontecendo é
Figura 6.36. Com a direção definida como HIGH (para frente) no pino 1A e um ciclo de
trabalho de 25% no pino 2A (velocidade), o motor será alimentado 75% do tempo na
direção para frente.
Para levar em conta isso, o sinal PWM precisa ser invertido quando a direção do motor for para frente.
Alguns drivers de motor lidam com isso para você, invertendo automaticamente o PWM quando o
motor está configurado para girar para frente. O SN54410, no entanto, não, então teremos que
considerá-lo em nosso código.
UAU! eBook
Completando o circuito do
motor www.wowebook.org
Machine Translated by Google
Completando o circuito do motor
O restante do circuito envolve conexões com o Arduino, fonte de alimentação do motor de 9 V e os dois
motores (figura 6.37). As conexões com o Arduino e os motores devem ser roteadas através do orifício
central da placa superior do chassi. Ao terminar de fazer essas conexões, você pode colocar a placa
superior do chassi na placa inferior do chassi e colocar a bateria de 9 V dentro, mas não encaixe as peças
Antes de montar o robô, você deve testar se o circuito do motor está funcionando conforme o esperado.
Crie um arquivo chamado motortest.js em seu diretório de trabalho e coloque o seguinte código nele.
board.repl.inject({
motores: motores
});
});
Para o construtor Motors, você passa um array contendo opções para cada Motor.
Agora que cada motor é controlado por dois pinos, JohnnyFive precisa saber quais pinos
fazem o quê: um para direção (dir) e outro para velocidade (pwm).
Lembre-se que o sinal PWM precisa ser invertido quando o motor avança.
O hardware não faz isso automaticamente, mas você pode informar ao JohnnyFive que
isso precisa ser feito, e o JohnnyFive fará isso por você, usando a opção invertPWM.
Antes de executar os motores no script de teste, levante seu robô parcialmente construído
do chão para que as rodas fiquem no ar. Caso contrário, pode escorrer!
UAU! e-book
www.wowebook.org
Machine Translated by Google
Execute o script:
$ node motortest.js
> motores.forward(100)
Agora olhe para os seus motores. Eles estão correndo para frente, bem devagar? Há uma chance
razoável de que um ou ambos estejam girando na direção errada. Não é um problema.
Elimine o script, desconecte a energia e troque a conexão entre os cabos do motor e os pinos de
saída no driver do motor para qualquer motor que esteja indo para o lado errado. Em seguida, tente
novamente.
Prenda as pequenas protuberâncias de plástico na parte inferior da placa inferior, na frente e atrás.
É neles que o bot repousa quando não está em movimento. Confiante de que seus motores
estão girando conforme o esperado? Bom. Agora você pode encaixar as placas superior e inferior
do chassi (figura 6.38).
UAU! e-book
Escrevendo o software do robô
www.wowebook.org
Machine Translated by Google
Escrevendo o software do robô
O software do rover permitirá que você use as setas do teclado para dirigir o bot (e use a barra de espaço
para pará-lo). O código consistirá em alguns scripts (módulos) e uma dependência extra (o módulo npm
keypress). Vamos ser um pouco mais organizados sobre a área de trabalho do projeto:
2. Execute este comando: npm init yes. Isso inicializará um arquivo package.json
com alguns padrões sensatos.
3. Execute este comando: npm install save johnnyfive keypress. Isso vai
Crie um arquivo chamado Rover.js (listagem 6.5). Este módulo conterá uma classe JavaScript que define
os movimentos básicos do rover. O Rover não sabe sobre os pinos específicos ou a configuração dos
motores no objeto Motors passado para seu construtor; esses detalhes são abstraídos.
classe Rover { 1
construtor (motores) { 2
this.motors = motores;
}
avançar () {
console.log('A toda velocidade!');
this.motors.forward(255);
}
para trás () {
console.log('Reverse!'); this.motors.reverse(255);
esquerda () {
console.log('À esquerda!'); this.motors[0].reverse(200); 3
this.motors[1].forward(200); 4
}
certo () {
console.log('À direita!');
this.motors[0].forward(200);
this.motors[1].reverse(200);
}
UAU! e-book
www.wowebook.org
Machine Translated by Google
stop()
{ this.motors.stop();
console.log('Parando motores...');
}
}
module.exports = Rover; 5
1 Organizar o comportamento com sintaxe de classe pode tornar o código mais legível.
3 Cada Motor em um objeto Motors pode ser acessado com notação de matriz.
Agora o robô precisa de uma interface e uma forma de controlá-lo. Crie outro arquivo
chamado index.js, mostrado na listagem a seguir.
// ...
board.on('pronto', function () {
// 1. Instanciar motores
motores const = novos cinco.Motors([
{ pinos: { dir: 12, pwm: 11 }, invertPWM: verdadeiro }, 1
{ pinos: { dir: 4, pwm: 5}, invertPWM: verdadeiro } 2
]);
UAU! e-book
www.wowebook.org
Machine Translated by Google
// 3. Configure `keypress` para gerar eventos em keypresses no REPL // 4. Ouça os eventos `keypress` e invoque
os métodos Rover apropriados });
Para controlar o robô, você precisa ouvir os pressionamentos de tecla relevantes para entrada de direção. A terceira
//...
board.on('ready', function () { // 1. Instanciar
motores (como antes)
// 2. Instanciar Rover, com motores (como antes)
// 3. Configure `keypress` para gerar eventos em teclas pressionadas no REPL
keypress(processo.stdin);
process.stdin.setEncoding('utf8'); // 4. Ouça os eventos `keypress` e invoque os métodos Rover apropriados
});
1 Diga ao pressionamento de tecla para gerar eventos para process.stdin (entrada padrão, por meio do teclado)
//...
board.on('ready', function () { // 1. Instanciar
motores (como antes)
// 2. Instanciar Rover, com motores (como antes)
// 3. Configure `keypress` para gerar eventos em pressionamentos de tecla no REPL // 4. Ouça os eventos
`keypress` e invoque os métodos Rover apropriados process.stdin.on('keypress', function (ch, key) { 1
if (!chave) { return; } 2
UAU! e-book
www.wowebook.org
Machine Translated by Google
rover.stop(); console.log('Tchau!');
process.exit(); 4
quebrar;
caso 'acima': 5
rover.forward();
quebrar;
caso 'para baixo':
rover.backward();
quebrar;
caso 'esquerda':
rover.left();
quebrar;
caso 'certo':
rover.right();
quebrar;
caso 'espaço': 6
rover.stop(); break;
padrão: 7
retornar;
}
});
});
5 'up' refere-se à seta para cima do teclado (e assim por diante com 'down', 'left' e assim por
diante).
Coloque seu robô onde ele tenha um pouco de espaço para se movimentar e execute o script:
$ node index.js
Depois que o quadro e o REPL forem inicializados, você poderá usar as teclas de seta (para cima, para baixo, para a
esquerda,
WOW! eBook www.wowebook.org
Machine Translated by Google
direita) para orientar o robô e a barra de espaço para fazê-lo parar.
Você pode sentir sentimentos mistos de triunfo (viva! primeiro robô!) e restrição (as aventuras são limitadas
pelo comprimento do seu cabo USB). Há boas notícias: à medida que avançamos, você poderá desamarrar
Antes de fazermos isso, entretanto, você irá completar os principais tópicos de entrada e saída aprendendo
RESUMO
Os eletroímãs fazem os motores girarem. Um motor alimentado com corrente converterá essa energia
elétrica em energia mecânica - ele girará. Girar o eixo de um motor faz com que ele atue como um
Construir circuitos com motores envolve cuidados adicionais. Os circuitos do motor geralmente combinam
várias tensões e as fontes de alimentação do motor tendem a ser isoladas dos circuitos lógicos de baixa
tensão.
A direção do motor pode ser revertida invertendo a direção do fluxo de corrente através do motor, e a
Transistores como MOSFETs podem ser usados como interruptores de alta velocidade, usando lógica de
Diodos e capacitores são dois componentes que podem ajudar a construir circuitos de motor mais seguros.
Os diodos só permitem que a corrente flua através deles em uma direção. Um diodo, orientado para ser
polarizado reversamente em paralelo com um motor, pode proteger o circuito, atuando como um diodo
flyback.
Os capacitores armazenam carga elétrica e podem ser colocados em paralelo com os componentes para
isolá-los do circuito e suavizar as mudanças de tensão que causam. Quando usados dessa forma, eles
A maioria dos alcances dos servos são, aparentemente, 180 graus, mas o alcance utilizável é mais estreito
em servos baratos.
Os circuitos Hbridge fornecem a capacidade de direcionar a corrente através de uma carga (motor) em
várias direções, permitindo que você inverta a direção do motor. Hbridges, combinados com outros
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Parte 3. Projetos mais sofisticados
Esta parte do livro aumenta a aposta e abre novas possibilidades por meio da
comunicação serial Topics e da elegante placa de desenvolvimento Node.jscapable Tessel 2.
Tutoriais
Para usar sensores mais sofisticados e trocar dados mais complexos, você precisará entender
como funciona a comunicação serial, que é o tópico do capítulo 7. Você obterá uma
Ofertas e promoções
chance de experimentar alguns sensores bacanas, incluindo um acelerômetro, um GPS e uma
bússola. Ao longo do caminho, você aprenderá a diferença entre assíncrono e
2
Destaca a
serial síncrona e você conhecerá os protocolos IC e SPI. Você também aprenderá a
solda.
Configurações
No capítulo 8, você desvinculará seus projetos, ficando sem fio com a placa de
desenvolvimento Tessel 2 Support . Você conhecerá o Tessel, que pode executar seus scripts
JohnnyFive nativamente, e construirá experimentos mais complexos que fazem uso crescente de
pacotes
npm de terceiros Sign Out .
Ao continuar sua aventura, você provavelmente começará a pensar em suas próprias coisas para
construir. O Capítulo 9 percorre as etapas de adaptação do hardware existente e da criação de seu
próprio suporte de software para os componentes. Você hackeará um interruptor de tomada com
controle remoto e a placa de detecção de gestos APDS9960.
Esta parte do livro é um passo em direção a mais independência e sofisticação para seus projetos.
Você alcançará a independência dos fios por meio do Node.js nativo do Tessel e do WiFi
integrado e experimentará componentes mais sofisticados usando comunicação serial.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Capítulo 7. Comunicação serial
Este capítulo cobre
Tópicos
Configurações Construindo projetos mais complexos combinando vários componentes de dispositivos seriais
Apoiar
Sair
Fios de jumper
UAU! e-book
www.wowebook.org
Machine Translated by Google
2 tábuas de pão de meio tamanho
Em nossos experimentos até agora, conseguimos reunir alguns dados divertidos, mas diretos,
sobre o mundo ao nosso redor, como temperatura (figura 7.1) ou intensidade da luz ambiente.
E ouvindo a variação em um sinal digital básico (HIGH vs. LOW), poderíamos dizer se um botão
foi pressionado.
Figura 7.1. Com um sensor analógico simples como o TMP36, você pode obter um valor
para um único ponto de dados (temperatura) amostrando a tensão do sinal em diferentes
pontos no tempo (A, B, C).
Mas há muito mais informação por aí do que pode ser (plausivelmente) retransmitida com
um único sinal analógico. Na verdade, muitos dos dados interessantes são
consideravelmente mais complicados e precisam de uma coordenação mais refinada (figura
7.2). E se você quiser detectar movimento físico em três direções simultaneamente, como em um acelerôm
UAU! e-book
www.wowebook.org
Machine Translated by Google
E quanto à leitura de informações de chips de GPS? Coordenadas e direções precisas
da bússola? Dados mais sofisticados exigem métodos mais estruturados e sofisticados
de comunicação digital entre os componentes.
Figura 7.3. Na comunicação serial (topo), um bit é enviado de cada vez sequencialmente.
Em contraste, a comunicação paralela (abaixo) transmite vários bits ao mesmo
tempo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os benefícios da comunicação em paralelo podem ser bastante evidentes: por que lançar bits um de
cada vez se você pode abrir as comportas e lançar uma série de bits simultaneamente? É
verdade, a comunicação paralela pode ser muito rápida. Mas há algumas pegadinhas.
Na verdade, você já viu uma das desvantagens da comunicação paralela. Lembra-se do experimento
do cronômetro LCD no capítulo 5? Esse circuito usava um componente LCD paralelo.
Pense por um momento no circuito. Uma de suas características era que exigia um rebanho inteiro
de fios. Quatro desses fios eram responsáveis por enviar dados, em paralelo, para o LCD, e esse
circuito usava apenas quatro dos oito pinos de dados paralelos possíveis no LCD. Desvantagem
número um para paralelo: toneladas de fios.
O hardware paralelo também requer mais bits e peças físicas do que o hardware serial.
Mais fios levam a circuitos mais caros e complexos - e muitas peças significam que há mais coisas
que podem quebrar.
Também é complicado organizar todos esses bits paralelos e garantir que eles cheguem ao mesmo
lugar ao mesmo tempo. No final, a complexidade do paralelo pode ser mais problemática do que
vale a pena. E serial, apesar de sua simplicidade, é mais do que rápido o suficiente. Serial está ao
nosso redor: HDMI, USB, Ethernet. Serial é o método de troca de dados para uma vasta gama
de componentes eletrônicos. Então, vamos falar sobre serial.
um número assustador de maneiras pelas quais isso pode realmente acontecer. Quão rápido esses
bits devem se mover? Quantos bits compõem cada agrupamento discreto (quadro) de dados
entregues? Como os erros são detectados e corrigidos? Se houver mais de dois componentes se
precisam estar de acordo sobre como essa conversa vai funcionar (figura 7.4) – eles precisam usar o
mesmo protocolo. Existem muitos protocolos seriais e isso pode parecer opressor. A boa notícia
se você estiver se sentindo especialmente cauteloso, observe que quase toda a complexidade de baixo
nível pode ser abstraída para você por bibliotecas como JohnnyFive.
Figura 7.4. Para que os dispositivos troquem dados usando comunicação serial, eles
precisam saber como se comunicar.
Quando as pessoas se referem a serial sem qualquer qualificação adicional, elas geralmente
se referem à comunicação serial assíncrona - dois dispositivos transmitindo (TX) e recebendo (RX)
dados entre si (figura 7.5). No entanto, mesmo uma configuração tão simples quanto essa precisa
tem algumas regras.
Figura 7.5. A troca de dados seriais assíncronos: cada um dos dois dispositivos
conectados pode transmitir dados (TX) e receber dados (RX) do outro componente.
Observe que o TX de um dispositivo se conecta ao RX do outro e vice-versa. Uma
placa de breakout de GPS como a da Adafruit é um exemplo de componente que comunica
seus dados usando serial assíncrona.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Serial assíncrono é assim chamado porque não há sinal de clock gerenciado compartilhado pelos componentes. Cada
dispositivo deve ser seu próprio cronometrista. Tudo bem, mas deve haver um acordo comum entre os componentes
sobre quantos bits são enviados por unidade de tempo. Dito de outra forma, cada componente precisa saber
quanto tempo um bit de dados levará - por exemplo, quanto tempo um sinal permanecerá ALTO para indicar um
(Sem saber disso, como um receptor seria capaz de dizer a diferença entre dois bits 1 sequenciais e um único bit 1
longo?). A velocidade dos bits geralmente é expressa em bits por segundo (bps) ou taxa de transmissão.
Mas espere, tem mais! Os dados não são enviados em fluxos intermináveis de 1s e 0s. Em vez disso, os dados são
empacotados em breves segmentos chamados frames. Cada quadro de dados enviado é composto de várias
partes: os próprios dados (de 5 a 9 bits), mas também um bit de início, um bit de parada (ou dois) e talvez (embora
não com tanta frequência) um bit de paridade para auxiliar na detecção de erros (figura 7.6).
Figura 7.6. Um quadro de dados seriais assíncronos. Um único bit de início é seguido por 5 a 9
bits de dados. Um bit de paridade pode ser usado para detecção de erro. Em seguida, um ou
dois bits de parada indicam o fim do quadro.
Cada configuração de protocolo assíncrono define as especificidades de como seus quadros de dados
serão estruturados, bem como a taxa de transmissão. Por exemplo, 9600/8N1, uma configuração
de protocolo comum, indica uma taxa de dados de 9600 baud, blocos de dados de 8 bits, sem paridade
UAU! e-book
www.wowebook.org
Machine Translated by Google
bit e um bit de parada (figura 7.7).
Figura 7.7. A estrutura do quadro de dados de 9600/8N1: bit de início, 8 bits de dados, sem bit de
paridade, um bit de parada
A arquitetura do JohnnyFive faz uma distinção clara entre a API JS de alto nível exposta para
componentes e a implementação de I/O real sob as capas que gravam dados e os lêem desses
componentes conectados.
ativar uma gravação digital em um pino (para configurá-lo como ALTO ou BAIXO), mas não se importa
especificamente como essa gravação digital é implementada. Em vez disso, é responsabilidade dos plug-
ins de E/S compatíveis definir como essas operações realmente ocorrem.
Ao instanciar um objeto Board, opcionalmente, você pode declarar qual plug-in de E/S usar. Por
exemplo, se você quiser usar JohnnyFive com a placa Tessel 2 (e faremos isso no próximo capítulo),
você pode definir uma propriedade de opção io.
Você provavelmente notou que, até agora, não fornecemos uma opção io em nossas instanciações
do Board. Se a opção não estiver definida, JohnnyFive, por padrão, usa Firmata para I/O. Essa camada
de E/S padrão da Firmata é compatível com uma série de placas Arduino, incluindo o Uno.
Ao executar um script JohnnyFive Node.js em seu computador host, é o Firmata que traduz a lógica de
seu aplicativo em comandos de E/S para enviar à placa. Também é UAU! e-book www.wowebook.org
Machine Translated by Google
rodando na placa como firmware e faz a tradução na outra direção: enviando dados
da placa de volta para o computador host.
7.3.1. UARTs
Um receptor/transmissor assíncrono universal (UART) é uma peça de hardware para
lidar com a comunicação serial assíncrona (figura 7.8). Um UART pode pegar um monte de
dados paralelos - digamos, dados vindos de vários pinos de E/S ou outras fontes - digeri-
los e WOW!
e-book www.wowebook.org
Machine Translated by Google
cuspi-lo em um protocolo serial desejado. Também acontece o contrário: um UART também pode
decodificar dados seriais de entrada e disponibilizá-los como dados paralelos. Entrada paralela, saída
serial — e vice-versa. Os UARTs podem ser configurados para falar diferentes tipos de serial
assíncrono: diferentes taxas de transmissão e assim por diante. Isso torna os UARTs bits de hardware
altamente flexíveis e úteis.
O termo transistortransistor logic (TTL) geralmente se refere a um método para construir circuitos digitais
usando transistores para lógica - por exemplo, portas AND, inversores lógicos, portas XOR e assim
por diante. As tensões padrão usadas em componentes TTL parecerão familiares: +5 V para indicar um
ALTO lógico e 0 V para BAIXO. ICs TTL, especialmente aqueles compatíveis com a popular família
Texas Instruments 7400, foram amplamente usados na década de 1990. Eles ainda estão muito
disponíveis e são úteis para projetos de hobby ou sistemas embarcados mais simples, embora
tenham sido substituídos por outras tecnologias para a maioria dos eletrônicos sofisticados
produzidos em massa (por exemplo, semicondutor de óxido de metal complementar, que é abreviado
para algo que você pode reconhecer: CMOS ).
Talvez de forma confusa, o termo TTL também é aplicado a um dispositivo ou circuito que pode
ser conectado a outro dispositivo ou circuito sem nenhuma tradução ou interface extra. Neste contexto,
indica que o sinal entre os dois se comunicará logicamente usando os níveis lógicos HIGH (+5 V) e
LOW (0 V). É esse uso que leva à convenção de se referir alternadamente ao serial assíncrono
como serial TTL.
Seu fiel Arduino Uno possui um UART (mais precisamente, seu microcontrolador ATmega
328P possui um UART). Enquanto um script JohnnyFive está sendo executado em seu computador
host, o UART do Uno está ocupado recebendo e transmitindo mensagens no Firmata
formatar.
Há um conflito potencial aqui. Digamos que você tenha um componente de dispositivo que deseja usar
em seu projeto que comunique dados usando serial assíncrono. Mas o UART do seu Uno já está
ocupado, monopolizado pela comunicação Firmata que ele precisa para continuar no WOW! e-book
www.wowebook.org
Machine Translated by Google
para fazer os programas JohnnyFive funcionarem.
Felizmente, há uma maneira! O trabalho que um UART realiza é certamente mais eficiente e rápido
quando implementado em hardware, mas pode ser emulado em software. O chamado serial de
software permite que você se comunique em serial assíncrono por meio de pinos do microcontrolador
que normalmente não o suportariam no nível do hardware. O serial de software pode exigir muito do
processador e não é tão rápido quanto um UART, mas pode ser rápido o suficiente e fazer o trabalho.
1 tábua de pão
É aqui que fica divertido - a primeira vez que você conecta um GPS e vê os dados recebidos, é incrível.
A leitura de dados de GPS com um Arduino Uno costumava parecer um pouco misteriosa - muitas
cópias e colagens de código do Arduino e dependência de bibliotecas de baixo nível criadas por
membros da comunidade. Funcionou, mas não foi muito intuitivo para o especialista não-C.
Interagir com GPS usando JohnnyFive hoje em dia, no entanto, é tão simplificado que parece quase
mágico. Seu pequeno chip GPS está ouvindo satélites! É difícil acreditar que algo tão sofisticado
possa ser controlado e amostrado com apenas algumas linhas claras de JavaScript. A tecnologia é legal.
Muitos chips de GPS emitem dados em conformidade com um padrão chamado NMEA 0183.
A National Marine Electronics Association (NMEA) mantém esse padrão, que define a estrutura
de dados dos tipos de hardware que você pode esperar encontrar a bordo de uma embarcação
marítima: sonar, giroscópios, radar marinho - e GPS.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os dados NMEA são comunicados por serial assíncrona como caracteres ASCII - os caracteres
ASCII têm 7 bits, que se encaixam perfeitamente em um byte de dados - e esses caracteres são
reunidos em sentenças NMEA limitadas por vírgula. Embora o padrão mencione uma configuração
específica (4800 8N1), os dados NMEA podem ser enviados por várias configurações. A quebra
do GPS da Adafruit é padronizada para 9600 baud, mas alguns GPS
os módulos podem transmitir ainda mais rápido.
A boa notícia é que a construção de um circuito com uma placa de GPS requer conexões
mínimas. Você descobrirá que os componentes eletrônicos de suporte geralmente são integrados
a placas de distribuição - capacitores, resistores e assim por diante - deixando apenas conexões de
energia e dados para conectar.
Por outro lado, você precisará aprender a soldar agora. A placa de breakout GPS Adafruit
precisa ser soldada nos conectores para que você possa conectá-la a uma breadboard (figura 7.9).
A soldagem não é difícil, mas, como qualquer nova habilidade essencial para a vida, pode levar algumas tentativas antes que
Figura 7.9. Antes de poder usá-lo em uma breadboard, o GPS precisa ter alguns pinos
de cabeçalho soldados a ele.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A solda é uma liga metálica destinada a fazer — fundir — ligações permanentes entre pedaços de
metal (figura 7.10). A solda derrete a uma temperatura mais baixa do que as pernas e conexões de
seus componentes, permitindo que ela flua, líquida, em torno dessas conexões sem danificá-
las. Depois que endurece - isso acontece quase instantaneamente - você tem uma
conexão permanente. É como uma cola condutora de metal. A solda vem em comprimentos longos e
finos em um carretel, como arame.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para fornecer o calor necessário para derreter a solda e fazer essas conexões, você precisará
de um ferro de solda (figura 7.11). Os ferros de solda variam de dez dólares (EUA) a várias
centenas. Sem surpresa, você obtém o que você paga. Ferros de solda baratos se comportam
de maneira bem barata e não são ajustáveis. Mas um ferro de solda barato fará o trabalho muito
bem se você não estiver pronto para investir em um modelo de qualidade.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Certifique-se de que seu ferro de solda tenha um suporte para colocá-lo quando não estiver em suas
mãos (figura 7.12). Você também precisará de uma esponja para limpar a ponta do ferro de solda entre
as soldas e para estanhar a ponta (mais sobre isso em breve). Boas esponjas de solda são de latão,
mas esponjas domésticas comuns também funcionam. Se você usar uma esponja doméstica de
celulose, certifique-se de umedecê-la antes de usá-la com o ferro.
Figura 7.12. Seu ferro de solda precisa de um suporte para segurá-lo quando não estiver em uso e para
proteger as coisas ao seu redor contra queimaduras.
Se a lista de suprimentos de solda necessários parecer onerosa (figura 7.13), você pode
considerar um kit “aprender a soldar”, vendido por varejistas de eletrônicos on-line, que vem
com a maioria dos itens necessários e um projeto prático para iniciar.
Figura 7.13. Principais coisas que você precisa para começar a soldar
UAU! e-book
www.wowebook.org
Machine Translated by Google
A solda, tradicionalmente, é feita de uma liga contendo uma alta porcentagem de chumbo. Como você
provavelmente sabe, o chumbo é ruim para os humanos. Desde 2006, o uso de chumbo em eletrônicos foi
restrito na UE por meio da Diretiva de Restrição de Substâncias Perigosas (RoHS), que praticamente
eliminou o uso de chumbo na fabricação de solda. A solda sem chumbo é definitivamente boa para as
pessoas e para a terra, mas também é um pouco mais difícil de trabalhar - ela não flui tão suavemente
quanto a solda com chumbo. Estão disponíveis solda sem chumbo e com chumbo; alguns acham que
aprender a soldar com solda com chumbo é mais fácil do que com chumbo
livre.
Você também pode pegar um carretel de pavio de solda (também conhecido como trança de
dessoldagem). Este fio de cobre trançado atua como um aspirador químico para desfazer soldas ruins:
reaqueça a junta soldada e use a trança de solda para remover a solda mal colocada.
Leia estas instruções completamente antes de começar a soldar, para que você esteja preparado e pronto
para o rock:
1. Antes de começar, configure seu espaço de trabalho usando uma terceira mão (figura 7.14) ou algum
outro método para proteger seu trabalho e deixar suas mãos livres - encaixar pinos de cabeçalho em
uma placa de ensaio e posicionar a placa no lugar no topo também é uma opção.
Tenha as ferramentas e peças que você espera precisar à mão para não ficar se debatendo com um
Figura 7.14. Proteja seus componentes antes de soldar. Uma terceira mão é uma
ferramenta conveniente para isso.
UAU! e-book
www.wowebook.org
Machine Translated by Google
2. Conecte o ferro de solda e deixe-o aquecer por alguns minutos. Agora, especialmente se você tiver um
Trabalhar com um ferro de solda que não está quente o suficiente é uma receita para frustração e
placas chamuscadas.
3. Prepare (estanho) a ponta do seu ferro de solda. Derreta um pouco de solda na ponta do ferro e limpe
o excesso com a esponja. Isso deve resultar em uma ponta brilhante e brilhante em seu ferro de
solda. Se a solda não derreter facilmente quando você tocá-la na ponta do ferro, o ferro não está quente
Pressione a ponta do seu ferro quente no pino do cabeçalho e na almofada de conexão por cerca de um
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 7.16. O pino aquecido fará com que a solda derreta e flua ao redor da
junta.
6. A solda derreterá e fluirá ao redor da junta. Depois de ter uma boa aparência
monte de solda em forma de montanha (figura 7.17), remova o ferro de solda e
pronto! Você descobrirá com o tempo que o tipo de solda naturalmente “quer” fluir para
aquela forma de vulcão.
Figura 7.17. Uma conexão bem soldada se assemelha a um pequeno vulcão de solda.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Soldar não é complicado, mas pode levar algumas rodadas para acertar. O YouTube e a web são
seus amigos: existem muitos vídeos e tutoriais para aprender a soldar.
É uma daquelas habilidades que podem ser mais fáceis de entender se você a observar em movimento.
Como qualquer nova habilidade física, a soldagem leva um tempo para dominar. Aqui estão
algumas das coisas comuns que podem atrasá-lo:
Uma pistola de solda que você sabe que está quente não parece “querer” derreter a solda
ou “simplesmente não parece funcionar”— Certifique-se de manter a ponta do seu ferro de
solda estanhado, isto é, revestido com apenas um pouco de solda. Você pode dizer que uma
ponta está enlatada porque ela ficará brilhante. Se a ponta do seu ferro de solda for preta
ou com textura fosca, ela está oxidada e você precisa retiná-la. Esse processo pode ser
tedioso: você precisa derreter a solda para cobrir a ponta, mas as partes não estanhadas da
ponta não causam a reação química que faz com que a solda flua corretamente. Tome seu
tempo, seja paciente e faça isso direito, usando sua esponja para ajudar a direcionar a solda e
limpar o excesso. A melhor maneira de corrigir isso é evitar que isso aconteça: verifique o
ferro após cada algumas juntas soldadas e retoque a ponta com alguma solda adicional se
começar a parecer oxidada em qualquer ponto. Observe que a solda sem chumbo fará com
que seu ferro de solda oxide consideravelmente mais rápido do que com chumbo
solda.
com aparência chamuscada ainda funcionarão bem, mas às vezes você pode descobrir que
realmente fritou alguma coisa. Vá devagar, mire com cuidado e experimente suas primeiras tarefas de
Juntas soldadas não funcionam direito — Uma junta sem solda suficiente (uma “junta fria”) não
conduz — conecte seu ferro de solda novamente e tente novamente. Outro problema comum é
acidentalmente usar muita solda e soldar a conexão a uma conexão vizinha também,
causando vários problemas com o circuito. Uma superabundância de solda pode ser limpa com pavio
de solda.
A solda simplesmente não gruda no que você está tentando colar— Soldar é um processo químico.
Você não pode soldar em superfícies não metálicas como plásticos, e mesmo alguns metais não
podem ser soldados.
de olhos. Conecte o GPS na protoboard. Conecte a alimentação e o GND aos pinos 5 V e GND do Uno,
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
});
});
Assim que a placa GPS estiver conectada à energia, ela começará a tentar obter uma posição de satélite.
Até que seja corrigido, você verá um LED integrado piscar cerca de uma vez por segundo.
O GPS tem uma antena embutida, mas não será capaz de obter uma posição de satélite sem exposição
a uma ampla fatia do céu. Muito provavelmente, você precisará sair. Com sorte, esse requisito não será muito
complicado - pegue seu laptop, Uno e breadboard e vá para o ar livre por alguns minutos. Então,
novamente, estava 24 graus (F) fora e cuspindo bolas de neve quando testei este código. Ou talvez você
esteja trabalhando em um computador de mesa, que não será adequado para ambientes externos.
Você pode ter sorte ao lado de uma grande janela com uma visão clara do céu ou pode usar um cabo USB mais
longo para que o Uno e a breadboard possam ficar do lado de fora enquanto o computador está dentro.
Demora cerca de 30 a 60 segundos para obter uma posição de satélite sólida (“coldstart”).
“Mas espere”, você diz, “meu telefone pode obter minha posição GPS em apenas alguns segundos... e funciona
Seu smartphone usa alguns truques extras para derivar sua localização: onde está em relação a torres de
telefonia celular locais e redes Wi-Fi próximas. Na verdade, para o seu telefone obter um bloqueio de GPS real
- do tipo satélite - pode demorar tanto ou mais do que esses chips autônomos - até vários minutos.
Uma vez que seu chip GPS tenha uma posição de satélite, o LED integrado parará de piscar tão rapidamente,
diminuindo para uma piscada a cada 15 segundos. Não importa quando você inicia o script gps.js - antes que o
chip seja corrigido ou depois - mas, obviamente, os dados de localização não serão
UAU! e-book
www.wowebook.org
Machine Translated by Google
disponível até que a correção seja sólida:
$ node gps.js
Supondo que você tenha uma correção, agora você pode começar a interagir com seu GPS e desconectar dados,
42.38
>>
Tudo bem, legal - quase fácil demais! Você pode tentar inspecionar outras propriedades em seu objeto gps, como
longitude. Consulte a documentação do JohnnyFive GPS para obter as informações mais recentes sobre o que você
Legal. Você dominou a conectividade serial assíncrona básica usando serial de software.
Serial assíncrono é direto e útil, mas não é o ajuste certo para tudo. Para levar em conta pequenas diferenças
potenciais nos relógios de cada um dos componentes, cada bloco de dados deve ser cercado por bits de início e
parada, e talvez um bit de paridade também seja inserido. Essa é uma sobrecarga considerável: na melhor das
hipóteses (um bit de início, um bit de parada, sem paridade), são necessários 10 bits para transmitir 8 bits de informação.
O hardware UART é complexo e as implementações de software são mais lentas e exigem muito do processador. Obter
a taxa de transmissão e outros detalhes classificados entre os componentes pode ser complicado. Finalmente, a serial
assíncrona é realmente cortada apenas para permitir que dois dispositivos se comuniquem.
Protocolos seriais síncronos adicionam uma linha de relógio compartilhada além de conexões de dados para sincronizar
componentes. Como o sinal do clock determina a velocidade da transmissão de dados, a taxa de dados dos
Certos protocolos seriais síncronos também tornam possível e conveniente a comunicação entre muitos
dispositivos no mesmo barramento de comunicação. Também existem desvantagens; por exemplo, os protocolos SPI
2
e IC que você está prestes a conhecer exigem que os fios de conexão sejam curtos - por exemplo, você não pode se
2
comunicar razoavelmente usando IC em um cabo de 20 pés.
UAU! e-book
7.4.1. Interface Serial Periférica (SPI)
www.wowebook.org
Machine Translated by Google
7.4.1. Interface Serial Periférica (SPI)
Serial Peripheral Interface (SPI) é um protocolo serial síncrono originalmente desenvolvido pela
Motorola na década de 1980. Ele permite que um dispositivo “mestre” controle e coordene a
troca de dados entre ele e um ou mais dispositivos “escravos”. Para uma conexão mestre-escravo
um-para-um, apenas três fios podem ser usados (figura 7.19), mas quatro ou mais são necessários
se houver vários dispositivos escravos (figura 7.20).
Figura 7.19. Em uma configuração SPI simples - um mestre, um escravo - apenas três fios podem
ser usados para troca de dados: uma linha de relógio compartilhada (SCK) gerenciada pelo
mestre, mestre-saída-escravo-entrada (MOSI) e mestre-escravo. in-slave-out (MISO).
Figura 7.20. Quando mais dispositivos são adicionados, pelo menos uma linha adicional—
slave select (SS)—é necessária, embora algumas configurações SPI exijam uma linha SS por
dispositivo escravo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A maior vantagem do SPI é que ele permite taxas de transmissão de dados realmente rápidas. O
hardware de recebimento também é significativamente mais simples que um UART. Os cartões de memória
Os componentes SPI estão amplamente disponíveis para criadores de hobby. JohnnyFive tem suporte para
um determinado barômetro SPI, por exemplo. Além disso, trabalharemos com um módulo LCD (Nokia 5110)
no capítulo 10 que possui uma interface SPI. Mas os componentes SPI não são tão comuns quanto o
2
protocolo bighitter: I C. É onde colocaremos nossa atenção.
Não sou fã da terminologia arcaica masterslave para descrever certas metáforas em eletrônica e ciência
acrônimos como MOSI e MISO. Assim, estou usando a linguagem mestre-escravo aqui, relutantemente, pois
Observe também que nessas discussões sobre diferentes configurações seriais, o hardware serial da placa
2 7.4.2. CI
2
InterIntegrated Circuit (mais comumente escrito como IC, pronunciado “IsquaredC”) é um protocolo serial
2
Figura 7.21. Não importa quantos dispositivos estejam conectados juntos, com IC
sempre há apenas duas linhas: SCL (relógio) e SDA (dados).
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
Com IC, você pode ter até, oh, cerca de mil dispositivos em um único barramento (1008 se você usar endereçamento
de 10 bits; o endereçamento de 7 bits mais comum permite até 127). Isso significa que você está de volta à
simplicidade de conexão da serial assíncrona - fios mínimos - mas obtém os benefícios da serial sincronizada - vários
Todos os dados de todos os componentes conectados são transportados em uma única linha SDA (dados seriais).
O segundo fio é o SCL (relógio serial), que, assim como o SDA, é compartilhado por todos os componentes
conectados. Conecte cada dispositivo às linhas SDA e SCL (e dê a eles um pouco de energia!), e você está
2
Como os dispositivos IC conversam entre si
2 2
Como geralmente há muitos componentes IC no mesmo barramento, as mensagens IC precisam ser mais
estruturadas e algo precisa assumir o controle do tráfego direcionado. Um ou mais dispositivos mestres no
barramento possuem esta autoridade. O mestre ativo (pode haver mais de um dispositivo mestre em um barramento,
mas apenas um pode estar ativamente no comando em um determinado momento) gera o sinal de clock e informa
Para dar o pontapé inicial, o mestre ativo primeiro transmite um quadro de endereço (primeiro quadro à esquerda na
2
Estrutura de alto nível de quadros IC
Cada dispositivo conectado no barramento tem seu próprio endereço exclusivo. Normalmente, este é um
endereço de 7 bits, e o quadro de endereço completo (8 bits) consiste em 7 bits de endereço seguidos
por um bit R/W (leitura/gravação). O bit R/W designa se o dispositivo indicado deve ler ou escrever dados.
Espera-se então que o dispositivo endereçado transmita um único bit ACK para indicar que todos os
sistemas estão ativados. Então quadros de dados podem ser transmitidos, cada quadro seguido por
Os prós e contras dos detalhes do protocolo são um pouco mais complicados - por exemplo, você
precisaria usar endereços de 10 bits para exercitar o barramento máximo de 1008 dispositivos (números de 7 bits
não ultrapasse 127 e cada dispositivo precisa ter um endereço único) e a mecânica exata de um
processo readfromslave requer a identificação de coisas como de qual registro de memória ler. Se
2
você quiser aprender mais, recomendo o tutorial “IC” do Sparkfun (https://learn.sparkfun.com/tutorials/i2c).
2
Muitos dispositivos IC são fornecidos com endereços definidos por hardware. Isso significa que você não
pode alterar o endereço do dispositivo: se você tiver outro dispositivo com o mesmo endereço (com fio),
não poderá colocá-los no mesmo barramento. Mas alguns dispositivos têm configurações configuráveis
endereços.
2
7.4.3. Fazendo uma bússola digital com um magnetômetro IC
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
O Honeywell HMC5883L é um popular chip de magnetômetro de eixo triplo IC - ou seja, uma bússola
- disponível em uma placa de fuga amigável de 5 V da Adafruit. Determinar sua orientação está a
momentos de distância, combinando a classe Compass de JohnnyFive com um quadro de fuga
Você terá que exercitar suas habilidades de solda novamente - a placa de separação precisará ser
soldada nos pinos de cabeçalho (figura 7.22) antes de encaixar em uma placa de ensaio.
Figura 7.22. A placa de fuga da bússola, como a fuga de GPS, precisará ser
soldada nos pinos de cabeçalho.
Tal como acontece com a placa breakout do GPS, uma vez que os cabeçalhos são soldados, a fiação
é simples para este circuito: conecte o pino SDA da placa breakout ao pino A4 do Uno e o SCL ao
pino A5 do Uno. Conecte o VIN à alimentação de 5 V do Arduino e conecte o pino de aterramento
ao GND (figura 7.23).
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
Suporte de hardware IC no Arduino Uno
Observe que os números dos pinos para este circuito não são arbitrários: os pinos Uno A4 e
2
A5 têm suporte de hardware para IC; outros pinos não. O pino A4 do Uno fornece SDA; A5 é SCL.
A classe Compass do JohnnyFive suporta vários chips diferentes, portanto, você precisará informá-
lo, durante a instanciação, qual controlador específico usar; consulte a listagem 7.4. A
documentação do JohnnyFive Compass identifica os componentes suportados (http://
johnnyfive.io/api/compass/). Você não precisa definir em quais pinos a bússola está
UAU! e-book 2
www.wowebook.org
Machine Translated by Google 2
conectado, pois há apenas uma maneira de conectar dispositivos IC à placa Uno (pinos A4 e A5).
Usar uma opção de controlador para diferenciar entre diferentes hardwares suportados é um padrão
comum em muitas das classes de componentes do JohnnyFive. Você o viu pela primeira vez no capítulo
4, com o sensor de temperatura analógico TMP36.
Dentro do diretório de trabalho JohnnyFive, crie um arquivo chamado compass.js, conforme mostrado
na listagem a seguir.
2 As instâncias do objeto Compass, como a maioria dos outros objetos do componente J5, possuem
um evento change.
$ node compass.js
Depois que a placa e o REPL inicializarem, você verá a saída em seu terminal como esta:
$ node compass.js
1479310483561 Dispositivo(s) /dev/cu.usbmodem1411
1479310483570 Conectado /dev/cu.usbmodem1411
1479310485230 Repl inicializado
UAU! e-book
www.wowebook.org
Machine Translated by Google
>> { nome: 'East', abreviatura: 'E', baixa: 84,38, alta: 95,62, proa: 94 }
{ nome: 'Leste', abreviatura: 'E', baixa: 84,38, alta: 95,62, proa: 91 }
Cada objeto de rumo que está sendo registrado contém várias propriedades (abbr, cabeçalho e assim
por diante). Essa bússola digital seria mais inteligente se tivesse uma saída — faremos uma agora.
2
Este próximo experimento combina vários sensores IC juntos e exibe a saída em um LCD. Existem
sensores suficientes aqui que é difícil exibir toda a saída de uma vez no LCD, então usaremos um
acelerômetro para criar um recurso de exibição shaketoswap. Ao agitar o dispositivo, você pode
alternar quais dados são exibidos no LCD: uma tela com dados de temperatura e pressão ou uma
tela com o rumo atual da bússola.
2
Os pinos A4 e A5 são os únicos pinos compatíveis com IC no Arduino Uno, mas tudo bem - o
2
protocolo IC permite um monte de dispositivos em um único barramento. Ou seja, você pode controlar
2
vários dispositivos IC usando apenas esses dois pinos.
Fios de jumper
Obviamente, você precisará adaptar os exemplos de código para usar os controladores corretos para o
hardware escolhido.
Observe que a maioria desses sensores vêm em placas de fuga que exigem que você solde os pinos
de cabeçalho.
2
Se você tem um IC LCD compatível com JohnnyFive, como o módulo LCD Grove RGB, está com
2
sorte: é muito fácil conectar LCDs IC. Um LCD paralelo também funcionará bem neste circuito, mas,
como você sabe, requer muito mais fios.
Usar o GPS breakout neste projeto de sensor combinado parece ser uma boa ideia. No entanto, o
suporte JohnnyFive para serial de software é relativamente novo e algumas das complicações da
implementação de serial de software significam que pode ser difícil prever quantos dados um sensor
irá comunicar (a troca de dados não é estruturada como IC a esse respeito ). Por causa disso, no
2
momento da redação deste artigo, combinar um GPS com outros sensores ou saída pode causar
problemas de lixo com a exibição do LCD e outros comportamentos imprevisíveis.
Figura 7.24. Diagrama de fiação, etapa 1. Os fios na breadboard com a bússola breakout
board são dispostos para dar espaço para os sensores que serão
UAU! e-book
adicionado mais tarde.
www.wowebook.org
Machine Translated by Google
adicionado mais tarde.
Uma coisa que gosto de fazer com os rumos da minha bússola é corrigi-los para minha declinação
magnética local. Uma bússola sempre dará leituras relativas ao norte magnético, que está em lugares
diferentes em relação ao norte verdadeiro (geográfico), dependendo de onde você está na superfície
da terra. Na minha localidade, o norte verdadeiro está a cerca de 14 graus a oeste do norte magnético -
ou seja, há uma declinação magnética aqui de -14,28 graus. Você pode encontrar sua declinação
magnética visitando www.magneticdeclination.com—a usaremos em
o código do dispositivo.
Em seguida, adicione uma função auxiliar para corrigir as leituras da bússola para a
declinação local. A aritmética na função de correção de declinação a seguir garantirá que o valor
retornado seja uma medida de grau válida entre 0 e 360.
3 Subtrai unidades de 360 (graus) do valor corrigido até que seja menor que 360
E agora, uma função auxiliar de formatação para formatar a exibição das leituras feitas pelos
sensores do projeto. Nesta primeira rodada, mostrada na listagem a seguir, ele formatará uma
propriedade de cabeçalho - iremos preenchê-la em breve com os dados da bússola.
/* ... */
function correctForDeclination (cabeçalho, declinação) { /** ... **/ } function formatDisplay (leituras) { /** ...
**/ }
board.on('pronto', () => {
const compass = new five.Compass({ controller: 'HMC5883L' }); const lcd = new five.LCD({ pins: [7, 8, 9, 5,
6, 12] }); 1
lcd.useChar('círculo'); 2
atualização de função () {
var display = formatDisplay({ título:
correctForDeclination(compass.heading, DECLINATION), 3
});
if (!lastDisplay || (lastDisplay.join('') != display.join(''))) { 4
lcd.clear();
lcd.cursor(0, 0).print(display[0]);
lcd.cursor(1, 0).print(display[1]);
últimaExibição = exibição; 5
}
}
2 Diz ao LCD para usar o caractere de círculo especial (para um marcador de grau)
Verificando apenas os dados a cada segundo (frequência do loop da placa) e apenas reimprimindo
UAU! e-book
www.wowebook.org
Machine Translated by Google
evitado.
Experimente:
$ node multisensor.js
Você deve ver uma bússola em seu LCD - ajustada para declinação magnética e arredondada para o grau completo
mais próximo. Ele deve ser atualizado a cada segundo conforme a bússola é reorientada.
A classe multicomponente do JohnnyFive destina-se a dispositivos como o BMP180, que combinam vários
sensores em um único pacote. A Figura 7.25 mostra a placa de breakout BMP180 da Adafruit , que contém
Como o GPS e a bússola, a placa BMP180 precisa ser soldada nos pinos de cabeçalho
antes de usar em uma breadboard.
Um objeto Multi se comporta como um contêiner para vários componentes do sensor e permite
que você interaja com eles de maneira coordenada. Cada sensor contido é mapeado para sua
própria classe de componente J5 apropriada. Por exemplo, o objeto instanciado como
UAU! e-book
www.wowebook.org
Machine Translated by Google
termômetro—Uma referência a uma instância do JohnnyFive Thermometer para o
sensor de temperatura
2
O BMP180 usa IC para comunicação, ou seja, você pode conectá-lo à linha SDA e SCL
compartilhada já em uso pela bússola (figura 7.26).
Essa é uma maneira simplista de ajudar o programa a determinar qual tela - temperatura e pressão
ou rumo da bússola - exibir.
displayLine1 = 'TEMP/PRESSÃO:';
displayLine2 = leituras.temperatura.toFixed(1) + ':círculo:F'; displayLine2 += ' / ' + Math.round(10 * leituras.pressão) + 'mb'; 3
2 Esta ramificação nunca será executada nesta versão do código (é sempre falsa).
3 A pressão está em kPa; multiplique por 10 e arredonde para obter milibares mais
familiares
Em seguida, atualize o callback pronto da placa: instancie um sensor Multi e passe mais
propriedades para a função displayformatting, conforme mostrado na listagem a seguir.
board.on('pronto', () => {
const compass = new five.Compass({ controller: 'HMC5883L' });
const lcd = new five.LCD({ controlador: 'JHD1313M1' });
lcd.useChar('círculo');
formatDisplay({
temperatura: multi.thermometer.F, 2
últimaExibição = exibição;
}
}
board.loop(UPDATE_FREQ_MS, atualização);
});
$ node multisensor.js
Você deve ver a temperatura e pressão atuais na tela do LCD (mas não o rumo da bússola).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Adicione o acelerômetro ao circuito (figura 7.28) depois de soldá-lo nos pinos de cabeçalho,
conectando-se às linhas SDA e SCL compartilhadas na breadboard.
UAU! e-book
www.wowebook.org
Machine Translated by Google
verificamos se ele excede um limite aproximado que sugere um movimento rápido e semelhante a um tremor.
movimento.
Primeiro, adicione variáveis adicionais perto do topo do arquivo para definir um limite de vibração (em
Gs) e para acompanhar a última vibração detectada, para fins de debounce:
UAU! e-book
www.wowebook.org
Machine Translated by Google
O evento de aceleração de um objeto Accelerometer é acionado sempre que a leitura da
aceleração muda. Em experimentos grosseiros e não científicos, descobri que um limite
razoável para o que deve ser registrado como uma vibração é de cerca de 1,15 G. Se você achar
que isso é muito sensível ou requer uma vibração muito enérgica, você pode ajustar o limite no código.
Um movimento da vida real, como um tremor, gera valores de aceleração flutuantes durante
o período de várias leituras do dispositivo. Ou seja, vários eventos de aceleração sequencial
são disparados em um curto espaço de tempo, várias vezes, com leituras que excedem o limite.
Se implementássemos a troca para alternar exibições cada vez que o acelerômetro
relatasse aceleração acima do limite, a exibição piscaria descontroladamente para trás e
adiante.
Em vez disso, precisamos evitar a troca, evitando que ela ocorra com muita frequência. Podemos
fazer isso acompanhando a última vez que a exibição foi trocada e certificando-nos de não trocá-
la com mais frequência do que, digamos, uma vez por segundo.
Também dentro da função de retorno de chamada pronto, adicione um manipulador para o evento de aceleração,
accel.on('aceleração', () => {
if (accel.acceleration > SHAKE_THRESHOLD) { 1 var jiggleTime = Date.now(); if (!lastJiggleTime ||
jiggleTime > (lastJiggleTime + 1000)) { 2
altDisplay = !altDisplay; 3
lastJiggleTime = Date.now(); 4
atualizar(); 5
}
}
});
5 Atualize a exibição.
$ node multisensor.js
Inicialmente, você deve ver as informações de temperatura e pressão exibidas no LCD. Pegue a
breadboard com os sensores e dê uma sacudida rápida: você deve ver o LCD mudar para a exibição
da bússola.
A essa altura, é provável que você tenha notado um elefante na sala. Você acabou de construir um
dispositivo parecido com orientação... que está conectado por um cabo ao seu laptop ou
computador. O Arduino e seus componentes anexados são inúteis sem o poder de computação na
máquina host – é onde o processo Node.js é executado. Esta é, obviamente, uma configuração
bastante ridícula para caminhar pela floresta. Da mesma forma, o robô que você construiu no capítulo
6 só pode se mover até onde o cabo USB permitir.
2
Trocando em um IC LCD: um estudo de caso
A fiação para o circuito do sensor combinado está lotada, exigindo duas placas de ensaio.
2
Na chance de você ter um display LCD habilitado para IC por aí (eu tinha), você pode usá-lo em vez do
2
paralelo. Usei um LCD IC compatível com Grove (número de peça, JHD1313M1). Grove é um
sistema de componentes feito pelo Seeed Studio que todos compartilham conectores comuns -
mas, infelizmente, esses conectores não são compatíveis com headers ou breadboards. Você
pode comprar adaptadores de conectores, mas, no meu caso, fiz algumas cirurgias caseiras:
cortei o conector na extremidade e soldei os quatro fios trançados (VCC, GND, SCL e SDA, como
2
qualquer outro dispositivo IC) à conexão solidcore fio que encaixava mais facilmente em uma placa
de ensaio.
2
O circuito resultante libera um monte de pinos Uno e é muito mais simples no geral. O IC é um protocolo
ideal para reduzir o número de pinos de E/S da placa de desenvolvimento física necessários para
suportar os componentes do seu projeto.
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
Diagrama de fiação usando o componente Grove IC LCD. Ele pode compartilhar o mesmo SDA e
Linhas SCL como os outros sensores conectados.
usa isto:
RESUMO
Embora sinais analógicos simples sejam suficientes para dados básicos do sensor, a leitura de
dados de componentes mais avançados exige uma forma mais estruturada de troca de
informações.
A comunicação paralela é rápida por natureza, mas pode ser complicada. A comunicação
serial - um bit de cada vez - é o método de escolha para troca de dados em
UAU! e-book
www.wowebook.org
Machine Translated by Google
eletrônica passatempo.
Serial assíncrono é comum, mas requer que ambos os dispositivos sejam configurados para especificações
O hardware UART possibilita a serial TTL rápida nas placas, mas esse tipo de comunicação serial
Os protocolos seriais síncronos adicionam uma linha de relógio compartilhada ao barramento de comunicação.
SPI é um protocolo que requer três ou quatro fios (dados e relógio); o protocolo IC ainda mais
2
popular requer apenas dois fios.
Os componentes seriais podem ser combinados para criar projetos divertidos e mais poderosos.
Embora apenas dois dispositivos possam trocar dados em uma conexão serial assíncrona (TTL), muitos
2
dispositivos podem ser adicionados aos mesmos barramentos SPI ou IC, permitindo um uso mais eficiente
O suporte para troca de dados seriais geralmente é fornecido no nível do hardware (a emulação serial de
software é a exceção evidente). Em placas de desenvolvimento, isso geralmente depende do suporte serial
nos pinos A4 (SDA) e A5 (SCL), SPI nos pinos 10 (SS), 11 (MOSI), 12 (MISO) e 13 (SCK).
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Capítulo 8. Projetos sem fios
Este capítulo cobre
Tópicos
Por que os projetos eletrônicos de hobby precisam de fios e como se livrar deles
Tutoriais
Usando JohnnyFive com diferentes plugins de I/O em diferentes plataformas
Configurando
Ofertas e promoções e trabalhando com a plataforma de desenvolvimento Tessel 2
Configurações Aproveitando o ecossistema Node.js e npm para criar um software mais complexo para o Tessel 2 Suporte
com o Tessel 2
Sair
1 resistor de 100 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
Bateria de 9 V e encaixes
Fios de jumper
As coisas que estamos construindo estão se tornando mais complexas e poderosas, mas há um fator
limitante: elas estão fisicamente conectadas a um computador. Esses projetos JohnnyFive baseados em
Arduino Uno carecem de independência física - eles são totalmente dependentes de um computador host
para obter instruções lógicas e poder. Para alguns tipos de projetos, essa configuração de hostclient
conectado não é um problema. Mas, para avançar em sua jornada, para criar projetos controlados
por JavaScript, autônomos e autocontidos - para se livrar de fios - você precisará expandir seus horizontes
de hardware.
comunicado ao Uno, que atua como um thin client. Da mesma forma, os dados provenientes do Uno
— leituras de sensores e assim por diante — são comunicados de volta ao host para processamento
(figura 8.1).
Com o JohnnyFive, formatar e trocar essas instruções e dados entre o host e o cliente é tarefa da
camada de E/S.
Arduinos, incluindo o Uno, são um caso especial com JohnnyFive: Firmata fornece a camada de E/S e
está disponível por padrão em JohnnyFive. Ou seja, quando você instanciar um objeto Board, a
menos que você diga o contrário (com uma opção), o Firmata (por USB) será usado para E/S. Você
Até agora, você usou o tethering USB físico para seus projetos porque a conexão USB
forneceu um meio de troca de E/S e um fornecimento de energia. Para
UAU! e-book
www.wowebook.org
Machine Translated by Google
desconecte, você precisa atender a esses requisitos — E/S e energia — de maneiras diferentes, então vamos
Embora JohnnyFive defina APIs e o comportamento lógico dos componentes, exatamente como os dados e
instruções são trocados entre um aplicativo JohnnyFive e o hardware é deixado para a camada de E/S. É assim
que o JohnnyFive se mantém agnóstico de plataforma: ele deixa esses detalhes para plug-ins de E/S
compatíveis.
Você não usou nenhum plug-in JohnnyFive I/O até este ponto porque Arduinos comuns, incluindo o Uno, são casos
especiais com JohnnyFive. Quando você instancia objetos Board sem especificar qual E/S usar, JohnnyFive usa
Firmata via USB por padrão – é por isso que “simplesmente funciona”. Ao contrário dos plugins I/O para outras
plataformas, que devem ser instalados individualmente, o Firmata vem com o JohnnyFive (tecnicamente: é uma
dependência). Isso pode fazer parecer que os detalhes de I/O da Firmata e nittygritty fazem parte do código do
JohnnyFive, o que não é realmente o caso. Ao experimentar o JohnnyFive em outras plataformas, você verá que
precisa instalar plug-ins de E/S apropriados. Mais sobre isso daqui a pouco.
Na configuração do seu hostclient JohnnyFive com um Arduino Uno até agora, o cabo USB serve como um
Essa é uma das razões pelas quais você foi fisicamente amarrado.
Algo tem que alimentar os circuitos em um projeto. A conexão USB que você está usando é uma fonte de alimentação
constante de 5 V. Com exceção de alguns circuitos indutivos - motores e servos, que requerem mais corrente ou
tensão do que a placa de desenvolvimento pode fornecer - você conta com o cabo USB para alimentação e
O Arduino Uno possui um conector DC interno que você pode usar para conectá-lo a um adaptador DC
alimentado na parede. Essas “verrugas de parede” são onipresentes, convertendo energia CA baseada na parede
As verrugas de parede de outrora têm conectores barriljack que podem se encaixar em qualquer coisa, desde
UAU! e-book
www.wowebook.org
Machine Translated by Google
A maioria das placas de desenvolvimento (incluindo o Uno) possui reguladores de tensão integrados
para suas entradas de energia, o que significa que não há problema em fornecer de 9 V a mais de 20 V
para o Uno via DC, e ele se encarrega de regular isso até os 5 V necessários .
Os reguladores de tensão precisam ser fornecidos com uma tensão maior do que a tensão de saída
desejada. Como com os LEDs, há uma queda de tensão direta no próprio regulador - o circuito de ajuste
de energia na placa consome parte da tensão de entrada. No caso do Uno, para obter 5 V estáveis, são
necessários pelo menos 7 V de entrada.
Qualquer adaptador CC de 9 V–12 V com polaridade positiva central e um plugue de 5,5 mm x 2,5
mm (o tamanho mais comum) é ideal para alimentar o Uno.
Este símbolo indica que o adaptador de energia tem polaridade central positiva. Ou seja, a ponta do
conector tem polaridade positiva e a luva é negativa. A maioria das verrugas da parede DC são de
polaridade positiva central - esse é o tipo que você deseja para alimentar o Uno e, normalmente, outras
placas de desenvolvimento. UAU! e-book
www.wowebook.org
Machine Translated by Google
Nem todos os adaptadores têm um símbolo de polaridade impresso neles. É uma pena, porque você
não pode assumir que um determinado adaptador é de polaridade centro-positiva - não há padrão,
Eu mantenho uma coleção de verrugas de parede DC, bem como carregadores USB de 5 V, à mão
para uso em projetos. Há muito órfãos de seus eletrônicos de consumo originais, eles são úteis em sua
Abordaremos o poder momentaneamente, mas vamos primeiro olhar para diferentes maneiras de criar
Um host ainda é necessário para executar a lógica do JavaScript, mas os dados e as instruções
podem ser trocados entre o host e o cliente sem fio, eliminando a necessidade de um cabo de dados
Figura 8.2. Como o Uno, essas placas têm microcontroladores restritos, mas ambos podem se
comunicar sem fio.
A placa Blend Micro, por exemplo, pode ser usada sem fio com JohnnyFive por
UAU! e-book
www.wowebook.org
Machine Translated by Google
fazendo uso do plugin blendmicroio I/O e usando o firmware BLEFirmata na placa. Você conhecerá outra
JavaScript incorporado
foram feitos para executar sistemas operacionais completos, mas tendem a ser eficientes em termos de
O fluxo de trabalho varia de plataforma para plataforma. Em alguns casos, o JavaScript que você
escreve pode ser compilado para outra coisa (código de nível mais baixo e eficiente) antes de ser atualizado
no dispositivo. Em outros casos, o microcontrolador da placa pode ser capaz de executar diretamente algum
subconjunto de JavaScript — o que significa que você escreve em JavaScript, mas pode não ter acesso a
todos os recursos da linguagem (figura 8.3). Revisitaremos plataformas JavaScript incorporadas e restritas
no capítulo 10.
Os computadores de placa única (SBCs) são capazes de executar uma operação real multitarefa
UAU! e-book
www.wowebook.org
Machine Translated by Google
sistema e fornecer uma gama de opções em termos de poder de processamento e suporte a
periféricos integrados. Eles podem fazer muito, incluindo a execução de Node.js, mas eles
consomem mais energia, são mais caros e fisicamente maiores do que outras placas de
Com os SBCs, as linhas podem ser confusas entre o computador e a placa de desenvolvimento:
alguns, como a popular série Raspberry Pi, combinam funcionalidade de computação generalizada
com E/S semelhantes a placas de desenvolvimento em uma placa. Isso conta como execução de
servindo como host para controlar a E/S)? As coisas ficam ainda mais complicadas porque você pode, por
exemplo, usar um Raspberry Pi para controlar um Arduino conectado a uma das próprias portas USB
hardware quanto o software são de código aberto) centrada no Node.js e no gerenciador de pacotes
npm (figura 8.4). Além dos tipos de E/S básicos nos quais você passou a confiar - digital, analógico,
2
PWM, IC e assim por diante - o Tessel 2 também possui alguns periféricos de alto nível, como
portas USB, Ethernet e - viva !-Wi-fi. (O Tessel 2 é o único modelo Tessel atualmente disponível, então
UAU! e-book
www.wowebook.org
Machine Translated by Google
O Tessel é uma peça de hardware interessante e útil. Com base no critério “pode executar um sistema
operacional real”, ele cairia na categoria de dispositivos SBC – ele vem com OpenWrt, uma
distribuição Linux comumente encontrada em roteadores, pré-instalada.
Depois de desenvolver projetos com JohnnyFive para o Uno, você encontrará muitas das
ergonomias com o Tessel familiar. De fato, a mecânica de trabalhar com o Tessel parecerá antiquada
se você estiver acostumado a desenvolver com ou para o Node.js em geral.
UAU! e-book
Tessel 2 é 3,3V www.wowebook.org
Machine Translated by Google
Tessel 2 é 3,3V
O Tessel 2 opera em 3,3 V. Você precisa projetar circuitos com isso em mente e certifique-se de usar
componentes compatíveis com 3,3 V. Conectar componentes de 5 V ou energia nos pinos do
Tessel 2 pode causar danos à placa. Não se preocupe: veremos os detalhes à medida que
avançamos.
1 Tesselação 2
Para preparar o Tessel para a aventura, você precisa conectá-lo ao seu laptop com um cabo USB,
assim como no Uno. Mas existem algumas grandes diferenças. Por um lado, o código JavaScript que
você escreverá será carregado e executado no próprio Tessel - o Tessel não precisa de um host
para pensar por ele. Além disso, o Tessel tem Wi-Fi, então você não precisa mantê-lo conectado ao
USB depois de configurado - você pode implantá-lo sem fio.
O Tessel oferece suporte à versão Long Term Support (LTS) do Node.js, que no momento da redação
deste artigo é a 6.11 (e quando você ler isso, provavelmente estará consideravelmente mais
avançada). Os exemplos de código neste livro assumirão pelo menos a versão 6.11 e os
scripts de exemplo farão uso dos recursos de linguagem disponíveis nessa versão. As versões do
Node.js mais recentes que o LTS atual podem não ser compatíveis com o Tessel.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Instale a interface de linha de comando (CLI) para controlar seu Tessel de seu computador.
Isso deve ser instalado como um pacote npm global inserindo o seguinte comando em seu terminal:
Depois que o módulo estiver instalado, você poderá usar o comando t2 em um terminal para
t2 vs. t2cli
O módulo npm é denominado t2cli, mas o comando que ele disponibiliza é t2.
Conecte um cabo USB da porta micro USB em seu Tessel a uma porta USB em seu computador.
Isso fornecerá energia ao Tessel e você deverá ver um LED piscando durante a inicialização (isso pode
levar cerca de 30 segundos).
$ t2 lista
$ t2 lista
UAU! e-book
www.wowebook.org
Machine Translated by Google
Yay! Mas Tessel02A397D5D8A4 não é muito cativante. Felizmente, é muito fácil renomear seu Tessel com
este comando:
t2 renomear <nome>
Decidi chamar meu Tessel de Sweetbirch. Você pode escolher seu próprio nome.
$ t2 renomear sweetbirch
Geralmente é fácil obter um Tessel em uma rede WiFi doméstica típica de 2,4 GHz com um único
comando. Mas atenção, os Tessels não são, neste momento, compatíveis com redes de 5 GHz.
Por fim, provisione o Tessel para que você possa enviar código para ele do seu computador por
Wi-fi:
provisão de $ t2
A saída do comando t2 list após o provisionamento deve mostrar o Tessel como disponível tanto em
uma conexão USB quanto em WiFi (LAN), conforme mostrado na listagem a seguir.
LAN Sweetbirch
Atualizações são lançadas de vez em quando para o firmware do Tessel. Certifique-se de ter a versão mais
$ t2 atualização
Certifique-se de que seu Tessel ainda esteja conectado ao USB e inicializado. Para obter o código de LED
piscando em seu Tessel, primeiro inicialize o projeto conforme mostrado na listagem a seguir.
$ t2 calor
O comando t2 init
Versões mais recentes do pacote t2cli npm exigem que você execute o comando t2 init em um diretório de
projeto antes que o código desse projeto possa ser implantado em seu Tessel. Você só precisa fazer isso uma
vez (por projeto). Se você esquecer de executar o t2 init, obterá uma ajuda
mensagem:
$ t2 executar index.js
WARN t2 init
AVISAR
UAU! e-book
www.wowebook.org
Machine Translated by Google
tessel.led[2].on(); 2
setInterval(função () {
tessel.led[2].toggle();
tessel.led[3].toggle(); }, 100); 3
Agora você pode executar o código LEDblinking no Tessel usando o comando t2 run <file>, como
na listagem a seguir. Depois que o código for implantado e iniciado, você deverá ver dois dos
LEDs integrados do Tessel piscando rapidamente.
a bandeira da lan
Os scripts JohnnyFive que registram no REPL (com console .log()) funcionam melhor se o
UAU! e-book
www.wowebook.org
Machine Translated by Google
script é implantado em uma conexão LAN (WiFi). O sinalizador lan para o comando t2 run
especifica que a conexão WiFi deve ser usada (versus a conexão USB com fio).
Existem algumas coisas de aparência familiar no código hellotessel.js, mas alguns detalhes são
exclusivos do Tessel (em comparação com o controle do Uno com JohnnyFive).
Observadores atentos podem notar que isso é curioso: você nunca instalou nenhuma biblioteca
do tipo npm ou a disponibilizou de outra forma para o código em seu computador. A documentação
da API de hardware do Tessel 2 (http://mng.bz/Ror5) explica esta declaração de requisição:
Quando você requer ('tessel') dentro de um script que é executado no Tessel 2, ele carrega
uma biblioteca que faz interface com o hardware do Tessel 2, incluindo pinos, portas e LEDs...
Uma peça importante do quebra-cabeça aqui é a frase “executado no Tessel 2”. É verdade: se você
tentasse executar o script hellotessel.js com o Node.js em seu próprio computador, não iria
muito longe — encontraria um erro sobre o módulo ausente. Você também não encontrará o
pacote tessel no npm. Em vez disso, o tessel é uma biblioteca de API JavaScript pré-instalada
no próprio Tessel e, portanto, disponível para scripts executados no Tessel 2.
Ligar e alternar os LEDs integrados do Tessel por meio do objeto tessel parece como trabalhar com
objetos JohnnyFive Led, mas não exatamente:
tessel.led[2].on();
tessel.led[2].toggle();
tessel.led[3].toggle();
O objeto tessel fornece acesso às portas e pinos na placa Tessel, expondo uma API de hardware
para trabalhar com eles. É uma API de nível inferior ao JohnnyFive: você pode ler e gravar dados
digitais, analógicos e seriais, mas não há objetos de nível superior que envolvam, digamos, um
sensor de temperatura. A documentação da API de hardware do Tessel 2 fornece muito mais
informações (http://mng.bz/Ror5).
UAU! e-book
8.3.3. Piscando um LED externo com o Tessel www.wowebook.org
Machine Translated by Google
8.3.3. Piscando um LED externo com o Tessel
1 Tesselação 2
1 LED padrão
1 resistor de 100 V
Fios de jumper
Honrando a tradição milenar do LED piscante “Hello World”, vamos mergulhar ainda mais no Tessel com
este primeiro circuito clássico. Em vez de piscar um LED onboard, este exemplo usa um LED
conectado externamente. Embora este experimento seja de escopo pedestre, ele apresentará o fluxo
Em vez de escrever scripts únicos e independentes como fez com o Uno, você estruturará cada
Se você tiver experiência em escrever software com Node.js, essa estrutura parecerá
familiar.
comandos:
mkdir t2blink
cd t2blink
npm init y
A execução do npm init normalmente o guiará por um conjunto interativo de perguntas para configurar seu projeto.
Adicionar o sinalizador y ignorará essas etapas e criará um arquivo package.json com as configurações padrão.
É uma maneira mais rápida de começar se você não estiver preocupado com os detalhes de configuração
específicos do seu projeto. Depois de executar npm init, você terá um arquivo package.json.
Embora você tenha construído um circuito básico de LEDblink antes, um pouco de aritmética é necessário
para ajustar a tensão de alimentação de 3,3 V de Tessel. O circuito é semelhante ao circuito de LED básico para
o Uno que você construiu no capítulo 3 (figura 8.5), mas você precisará de um resistor limitador de corrente
Figura 8.5. O circuito de LED básico original para o Uno. O Uno opera em 5,5 V,
enquanto o Tessel é um dispositivo de 3,3 V. O circuito precisa ser ajustado
para a voltagem diferente do Tessel.
De volta ao capítulo 3, você fez um cálculo para o resistor limitador de corrente necessário para um único LED
= 160 V
160 V não é um valor de resistência comum, então você arredondou para 220 V (que é um valor comum).
= 75 V
75 V não é um valor de resistência comum, mas 100 V é - um resistor de 100 V serve bem aqui! Faz
sentido que um valor de resistência mais baixo seja necessário do que no circuito de 5 V: há menos
Conecte o circuito conforme mostrado no diagrama de fiação do LED Tessel (figura 8.6).
Figura 8.6. Conecte o ânodo do LED à porta A de Tessel, pino 5, e seu cátodo à
conexão GND na porta A.
UAU! eBook
Escrevendo o código de LED
piscando www.wowebook.org
Machine Translated by Google
Escrevendo o código de LED piscando
No capítulo 2, o experimento blinkingLED para o Arduino Uno usando JohnnyFive usou o seguinte
código.
board.on('pronto', () => { 2
led const = new five.Led('13'); 3
led.blink(500); 4
});
4 pisca o LED
Não há muito que precise mudar para fazer isso funcionar com o Tessel. Você precisa levar em
conta duas coisas:
O Tessel precisa de suporte I/Olayer diferente para trabalhar com JohnnyFive. Você precisará
fazer com que seu objeto Board use tesselio para sua E/S (em vez da firmata padrão).
board.on('pronto', () => {
led const = new five.Led('A5'); 3
led.blink(500);
});
$ t2 executar index.js
Você deve ver uma saída semelhante à lista a seguir e o LED deve começar a piscar.
$ t2 executar index.js
INFORMAÇÕES Procurando seu Tessel...
INFORMAÇÕES Conectado a sweetbirch.
Figura 8.7. Os pinos do Tessel são divididos em duas “portas”, cada uma com 8 pinos de E/S.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os pinos são numerados de A0–A7 (na porta A) e B0–B7 (na porta B). Os dois pinos superiores em cada
2
porta física fornecem conexões de energia (GND e 3,3 V). Outros recursos, como IC, SPI e UART (serial
Figura 8.8. Tessel 2 pinos e suas características. Qualquer pino numerado pode ser usado
como E/S digital.
Embora todos os pinos possam ser usados como pinos de E/S digitais, a entrada analógica (ADC) está
disponível nos pinos A4 e A7 e em todos os pinos da porta B. Você também pode ver que alguns
pinos suportam interrupções (o que significa que eles seriam viáveis para “escutar” botões pressionados ou
para outros aplicativos que precisam detectar com precisão uma mudança de BAIXO para ALTO ou vice-versa).
digital para analógico (DAC). Não exploraremos esse recurso diretamente, mas ele está disponível
no Tessel.
Ei, espere! O exemplo de LED ainda mantém você amarrado. Em seguida, você começará a remover alguns
fios.
Primeiro, você desconectará o Tessel do seu computador, mas usará uma tomada para fornecer
poder.
1 Tesselação 2
1 LED
1 resistor de 100 V
Se o seu Tessel não veio com um adaptador USB DC, você pode usar um carregador USB de 5 V, como um
Como o conector de entrada CC do Arduino Uno, a microconexão USB do Tessel possui um regulador de
energia para regular a tensão de entrada para os 3,3 V necessários. O padrão de 5 V (tensão USB) é ideal
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os adaptadores de parede USB que fornecem alimentação de 5 V CC são amplamente difundidos. Eles são
Só para provar que pode, você adaptará um pouco o código de piscada do LED para fazer o LED pulsar.
Você pode fazer isso porque o LED está conectado a um pino compatível com PWM no Tessel.
led.blink(500);
led.pulse(500);
Agora, conecte seu Tessel à tomada em qualquer lugar que desejar, desde que esteja dentro do alcance
da mesma rede Wi-Fi em que seu computador está. Dê tempo para inicializar antes de tentar implantar
o código nele.
Agora, de volta ao seu computador, você pode tentar implantar de uma forma um pouco diferente.
Em seu diretório de trabalho, execute este comando:
t2 push index.js
O comando t2 push difere do comando t2 run. Com t2 run, o processo Node.js será executado no Tessel
somente até que o computador host elimine o processo (normalmente via CtrlC). Com t2 push,
o programa será enviado para o Tessel e será executado enquanto o Tessel tiver energia. Se você
Agora você tem um LED pulsando em algum lugar ali, mas isso não é muito empolgante.
É hora de criar algo um pouco mais funcional que também possa se conectar ao ecossistema Node.js disponível
no Tessel. Você pode usar o Tessel como uma estação meteorológica independente: lendo dados de um ou
mais sensores e servindo esses dados executando um servidor web local (figura 8.9).
Figura 8.9. Um Tessel serve como centro nervoso para uma miniestação meteorológica. Um
aplicativo Node.js em execução no Tessel lerá os dados do multissensor BMP180 e executará
um servidor da Web para que outros computadores na mesma rede Wi-Fi possam visualizar as
informações meteorológicas em um navegador da Web.
1 Tesselação 2
Fios de jumper
2
Há um recurso bacana dos sensores Adafruit I C usados no capítulo 7: eles funcionam tanto em 5
V quanto em 3,3 V. Cada uma de suas placas de fuga contém hardware regulador de tensão e pode
lidar com mudança de nível - ou seja, eles podem levar em conta os diferentes tensões de nível lógico
de microcontroladores de 3,3 V e 5 V. Você pode usar esses sensores tão facilmente com o Tessel quanto
com o Arduino Uno.
2
O circuito é direto: conecte o sensor BMP180 IC ao Tessel conforme mostrado na figura 8.10.
2
Figura 8.10. Conecte o sensor BMP180 IC à alimentação (pinos GND e 3,3 V da
porta A), SCL (A0) e SDA (A1).
mkdir t2weather
cd t2weather
npm init y
npm instalar salvar johnnyfive tesselio
board.on('pronto', () => {
UAU! e-book
www.wowebook.org
Machine Translated by Google
const weatherSensor = new five.Multi({
controlador: 'BMP180'
});
weatherSensor.thermometer.on('change', function () { 2 console.log(this.F); 3 });
});
Assim como no código LEDblinking anterior, a abstração de E/S dos componentes principais do
2
JohnnyFive faz com que esse código pareça quase idêntico a como você usaria um sensor IC
no Arduino Uno. Na verdade, a única diferença aqui é que você está passando uma opção de plug-
in de E/S diferente ao criar o objeto Board. Você não precisa mexer com os números dos
2
pinos porque a placa já sabe quais pinos suportam o IC no Tessel (e o padrão será a porta A).
weatherSensor.on('alterar', () => {
// Isso será invocado sempre que QUALQUER um dos sensores do multicomponente // tiver uma alteração
});
Com seu Tessel conectado via USB por enquanto, use t2 run para testar o script no
Tesselação:
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para fazer algo útil com as leituras do sensor — algo mais intuitivo e visual — você
aproveitará a capacidade do Tessel de oferecer suporte a pacotes npm e executar
códigos Node.js mais sofisticados — vamos ver como criar um aplicativo da web.
Para servir o conteúdo da web do Tessel, você precisará criar alguns arquivos adicionais. No
mínimo, você precisará começar com um documento HTML básico.
Crie um diretório chamado “app” dentro do diretório t2weather. Crie um arquivo index.html dentro
desse diretório, conforme mostrado na estrutura de diretório a seguir.
t2clima/
aplicativo
index.html
index.js
pacote node_modules.json
<!DOCTYPE html>
<title>Condições Atuais</title>
</head>
<body>
<h1>Condições Atuais</h1>
<p>Dados em breve!</p> </body>
</html>
Quando você executa o código no Tessel, o Tessel sabe que deve copiar e usar o script que você está
executando, bem como os módulos Node.js instalados para o projeto. Mas você precisa dizer explicitamente
se ele precisa usar ativos fora desses itens. Você pode fazer isso colocando um arquivo .tesselinclude
aplicativo/
Cada linha em um .tesselinclude é um glob, um padrão para arquivos correspondentes. Por exemplo, app/
corresponde a todos os arquivos no diretório app. Isso garantirá que o Tessel copie todos os arquivos no
t2clima/
.tesselinclude
aplicativo
index.html
index.js
pacote
node_modules.json
Em seguida, você abordará a criação de um aplicativo da web para mostrar os dados da estação meteorológica em duas etapas:
Isso servirá como uma página da web básica que será o recipiente para os dados da estação
meteorológica.
2. Você configurará um servidor socket.IO no Tessel (o servidor web) e se conectará a ele a partir do cliente
(a partir do JavaScript executado no navegador). Você também aprimorará o HTML com algum CSS
e marcação estruturada.
UAU! eBook
Configurando um servidor web
estático www.wowebook.org
Machine Translated by Google
Configurando um servidor web estático
Você começará de forma simples ativando um servidor da Web básico e estático no código do seu
aplicativo. Estático aqui significa que o servidor da Web fornecerá recursos (como HTML, imagens,
JavaScript e similares) sem executar nenhum processamento dinâmico do lado do servidor neles
- apenas fornecerá os arquivos solicitados de um diretório designado.
Comece instalando o express web framework. Verifique se você está no diretório t2weather e
execute o seguinte comando em um terminal:
board.on('pronto', () => {
const weatherSensor = new five.Multi({
controlador: 'BMP180'
}); 6
server.listen(3000, () => { 7
console.log(`http://${os.networkInterfaces().wlan0[0].address}:3000`); });
});
1 Requer Expresso
UAU! e-book
www.wowebook.org
Machine Translated by Google
4 Diz ao aplicativo para fornecer ativos estáticos fora do diretório app/
Não é necessário npm instalar os módulos os, path ou http porque eles estão embutidos no Node.js.
Experimente!
Agora você pode abrir um navegador da Web e visualizar a URL registrada no console (certifique-se
de usar a URL exibida em sua saída — não aquela mostrada na saída de exemplo anterior).
O endereço IP do Tessel
Seu Tessel precisa estar conectado à mesma rede que seu computador para que este experimento
funcione. Provavelmente será uma rede WiFi, conforme discutido na seção de configuração,
embora o Tessel também tenha uma porta Ethernet.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Estar conectado à rede faz com que o Tessel receba seu próprio endereço IP, que você
precisará saber para acessar o servidor da Web em execução nele. A linha a seguir no código
index.js mostra isso para você:
console.log(`http://${os.networkInterfaces().wlan0[0].address}:3000`);
Você pode copiar e colar a saída disso de seu aplicativo de terminal na barra de URL de um
navegador. Visitar a URL de saída em um navegador renderizará o arquivo index.html atual
(figura 8.11).
Uma opção para um aplicativo da Web simples seria incluir os valores do sensor atual na marcação do documento
HTML que é servido. Essa é uma abordagem perfeitamente válida e segue um modelo HTTP tradicional: o
navegador é responsável por solicitar mais dados ao servidor, na forma de solicitação de documento completo
(página da web). O efeito colateral é que o usuário teria que recarregar a página no navegador para ver novas
leituras.
A API WebSocket é um padrão da Web que permite que um cliente (um navegador) e um servidor troquem
mensagens assíncronas em um único soquete TCP. Cada um pode enviar mensagens para o outro, permitindo a
WebSocket é suportado por muitos, mas não todos, navegadores. Para ajudar a preencher as lacunas, você
UAU! e-book
www.wowebook.org
Machine Translated by Google
use Socket.IO, uma API que usa WebSocket quando pode (quando o navegador oferece suporte), mas que
possui uma longa lista de outros transportes alternativos para emular o comportamento do WebSocket.
Com o Socket.IO, quando as leituras do sensor mudam, o servidor de soquete pode “enviar” os novos
dados para o cliente (supondo que o cliente esteja ouvindo e faça algo útil com os dados atualizados). O
efeito líquido é que você pode atualizar as leituras do sensor no navegador com frequência, sem recarregar
a página.
board.on('pronto', () => {
const weatherSensor = new five.Multi({
controlador: 'BMP180',
frequência: 5000 3
});
UAU! e-book
www.wowebook.org
Machine Translated by Google
server.listen(3000, () => { console.log(`http://$
{os.networkInterfaces().wlan0[0].address}:3000`);
});
});
Diminuir a frequência do sensorread para cada cinco segundos mantém o desempenho dentro
limites e estabelece um limite razoável para a frequência com que o cliente receberá novos
dados pelo soquete. A cada cinco segundos é a frequência máxima com que o servidor de
soquete acionará atualizações, porque o evento climático só será acionado se as leituras do sensor
mudarem.
});
});
});
O servidor de soquete não será muito útil se não houver também um cliente que o aproveite. Primeiro,
você precisa preparar o HTML para exibir os valores do sensor adicionando alguma marcação
estruturada, conforme mostrado na listagem a seguir.
<!DOCTYPE html>
<html lang="en">
<cabeça>
<script src="/socket.io/socket.io.js"></script> 1
<link rel="stylesheet" href="style.css" type="text/css" /> 2 <title>Condições Atuais</title>
</head>
<corpo>
<main role="main"> 3
<h1>Condições Atuais</h1>
<div class="linha">
<div class="col">
<div class="dados">
<h2>Temperatura</h2> <span class="datavalue"
id="temperature">. 4 <small class="dataunit">F</small>
</div>
</div>
<div class="col">
<div class="dados">
<h2>Pressão</h2>
<span class="datavalue" id="pressure">. <small class="dataunit">mBar</small>
</div>
</div>
</div>
</main>
</body> </
html>
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Inclui o cliente socket.io JavaScript
<script src="/socket.io/socket.io.js"></script>
No index.js, você iniciou o socket.io fornecendo a ele uma instância de servidor — ele disponibiliza o código
Você fará essa folha de estilo agora. Dentro do diretório t2weather, navegue até o subdiretório app e crie
html {
fontfamily : "Helvetica Neue", "Helvetica", "Arial", sem serifa;
}
.linha {
exibição: flexível;
justificar conteúdo : centro;
largura máxima: 48rem;
margem: automática;
}
.row .col {
margin : auto; padding : 2rem; }
h1, h2 {
margem: 0;
textalign : centro;
}
h2 {
tamanho da fonte: 1,5 rem;
}
UAU! e-book
www.wowebook.org
Machine Translated by Google
pequeno {
cor: #999;
tamanho da fonte: 0,65em;
}
.dados {
preenchimento: 1,5 rem;
cor de fundo: #eee;
raio da borda: 10px;
tamanho da fonte: 3rem;
}
.datavalue {
intensidade da fonte: Negrito; }
.connected { /* Torna a cor da fonte verde para mostrar que a atualização de websockets funciona
*/
cor: #093;
}
CSS flexbox
O CSS aqui faz uso do modo de layout “caixa flexível”, também conhecido como flexbox. O Flexbox
permite que você organize e posicione elementos sem a confusão de flutuações e margens
colapsadas. O Flexbox é cada vez mais bem suportado, mas se você estiver usando o Internet
Explorer, as coisas podem parecer um pouco estranhas (no entanto, os navegadores Edge suportam
o flexbox). Se tudo isso é bobagem, não se preocupe. O CSS aqui apenas estiliza a página da
Web e não é crítico para entender a funcionalidade do projeto.
t2clima/
.tesselinclude
aplicativo
index.html
estilo.css index.js
pacote
node_modules.json
Agora, finalmente, o pivô. O cliente precisa se conectar ao servidor de soquete, ouvir eventos
relevantes (clima, neste caso) e responder a eles de alguma maneira útil.
Volte para index.html e adicione o seguinte código ao arquivo, logo antes da tag de fechamento do
corpo (</body>).
UAU! Listagem
de e-books 8.21. index.html www.wowebook.org
Machine Translated by Google
Listagem 8.21. index.html
<script>
window.addEventListener('DOMContentLoaded', function () { 1
var socket = io(); 2
socket.on('clima', updateData); 3
});
função atualizarDados (dados) { 4
['temperatura', 'pressão'].forEach(function (dataPoint) { document.getElementById(dataPoint).innerHTML
=
dados[dataPoint].toFixed(2);
});
document.querySelectorAll('.datavalue').forEach(function (el) {
el.classList.add('conectado');
});
}
</script>
exibição da página
Quando o DOM for carregado, você precisa criar um cliente Socket.IO e dizer a ele para invocar um retorno
window.addEventListener('DOMContentLoaded', function () {
var soquete = io();
socket.on('clima', updateData); });
A função io, para inicializar um cliente Socket.IO, é disponibilizada globalmente por meio da inclusão do
script /socket.io/socket.io.js.
A função updateData pega o objeto de dados atualizado e atualiza o DOM da página para incluir os novos
// `data` é um objeto contendo uma função de propriedades `temperature` e `pressure` updateData (data) { ['temperature',
'pressure'].forEach(function (dataPoint) {
document.getElementById(dataPoint).innerHTML = data[dataPoint].toFixed(2);
});
document.querySelectorAll('.datavalue').forEach(function (el) {
el.classList.add('conectado');
});
}
Primeiro, os elementos HTML com IDs de temperatura e pressão são atualizados - seus
O conteúdo HTML é definido para o valor dos sensores de temperatura e pressão, respectivamente:
Os valores do sensor são formatados de forma que dois dígitos sejam exibidos após o decimal.
adicionada aos elementos #temperature e #pressure (o CSS estiliza isso como texto verde) para mostrar
});
Para evitar dependências excessivas do cliente, o JavaScript em index.html usa a API DOM do
navegador diretamente, por exemplo, document.querySelectorAll(). Mas muitas pessoas estão mais
Você pode usar jQuery se quiser. Para fazer isso, você precisa adicionar uma tag <script> para incluí -la.
O uso do código CDNhosted (https://code.jquery.com/) é recomendado para que você não precise
UAU! e-book
www.wowebook.org
Machine Translated by Google
O script index.html atualizado ficaria mais ou menos assim:
$(função(){
var soquete = io();
socket.on('clima', updateData);
});
function updateData (data) { $
('#temperature').html(data.temperature.toFixed(2));
$('#pressure').html(data.pressure.toFixed(2));
$('.datavalue').addClass('conectado');
}
Está pronto! Você pode posicionar o Tessel, conectado à energia da parede, em qualquer lugar
dentro do alcance da sua rede sem fio. Então, mais uma vez, no seu computador, digite este comando:
Lembre-se, ao implantar um projeto com execução t2, o Tessel ainda tem alguma
dependência do seu computador: o processo só é executado no Tessel desde que não seja
encerrado no seu computador. Com t2 push, o Tessel pode atingir autonomia total.
Anote o endereço IP atual do seu Tessel e a porta do servidor da web. Se você precisa ser
UAU! e-book
www.wowebook.org
Machine Translated by Google
lembrado, execute t2 run index.js novamente e copie o endereço IP registrado e a combinação de porta em
algum lugar que você possa acessar. Ao implantar via t2 push, você não poderá mais ver a saída do console.log.
$ t2 push index.js
$ t2 push index.js
INFORMAÇÕES Implantadas.
Dê ao Tessel alguns segundos para terminar de ativar o servidor da web e começar e, em seguida, visualize a
página da web da estação meteorológica (no endereço IP do Tessel, porta 3000) em seu navegador.
Mesmo que seu Tessel perca energia, ele começará a executar o script da estação meteorológica assim que
Faça parar
Você pode usar t2 erase para fazer o Tessel parar de executar o programa da estação meteorológica.
Resta um fio: uma conexão de parede que fornece energia para o Tessel e seu
o circuito.
Existem inúmeras opções para projetos de energia, como energia de parede, alcalina ou
UAU! e-book
www.wowebook.org
Machine Translated by Google
baterias domésticas recarregáveis, muitas formas de baterias de íons de lítio ou painéis solares.
As opções podem parecer esmagadoras. Vamos decompô-lo um pouco.
Primeiro, o que exatamente precisa ser alimentado? Para um projeto como a estação
meteorológica, o próprio Tessel (placa de desenvolvimento, microcontrolador, processador)
precisa ser alimentado e, posteriormente, o Tessel fornece energia a 3,3 V para a placa de breakout
BMP180. Nesse caso, é natural pensar em fornecer energia para a placa dev e assumir que a placa dev
servirá como fonte de energia para o restante do circuito e seus componentes.
Esse é um bom conceito quando o circuito do projeto requer pouca energia, mas é diferente quando
os projetos contêm motores ou outros componentes que consomem muita corrente. De volta ao
capítulo 6, o circuito do robô rover continha dois motores CC e exigia mais corrente do que os
pinos do Arduino Uno podiam fornecer diretamente. Esse projeto incluía uma fonte de energia secundária
para acionar os motores: uma bateria alcalina de 9 V (figura 8.13).
Figura 8.13. A configuração de motores duplos para o robô no capítulo 6 usou uma fonte de
alimentação externa ao Uno para alimentar os motores CC: uma bateria de 9 V.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Em qualquer caso, tudo o que você selecionar para fornecer energia ao seu projeto precisa alimentar todo
o projeto - às vezes toda a energia fluirá pela placa de desenvolvimento, às vezes não, dependendo do que
estiver no circuito.
Para sua primeira incursão na liberdade totalmente alimentada por bateria, usaremos um banco de
energia USB. Talvez você já tenha um em mãos: esses pequenos pacotes de energia costumam ser usados
para fornecer energia extra para celulares e tablets em movimento. Eles fornecem uma corrente constante
de 5 V via USB e são fáceis de carregar com carregadores de parede USB. Eles são ótimos como uma
bateria extra para o seu dispositivo móvel, mas também são ótimos para alimentar projetos que podem
Capacidade de carga
A quantidade de “suco” em uma determinada bateria é medida em termos de corrente ao longo do tempo.
A capacidade de uma bateria é medida em amperes-hora em sua tensão nominal ou, no contexto de
baterias domésticas, miliamperes-hora (mAh). Uma bateria de 1,5 V com capacidade de 500 mAh deve ser
capaz de fornecer, a 1,5 V, uma corrente constante de 100 mA por 5 horas. Ou uma corrente constante de
Claro, não é tão simples assim. A capacidade real de uma bateria varia com base em muitas variáveis:
taxa de descarga (taxas de descarga mais altas resultam em capacidade total mais baixa), temperatura
ambiente (baterias não gostam de frio), tempo decorrido desde que a bateria foi carregada (baterias
As baterias de 1,5 AA do consumidor podem variar em capacidade de 400 a mais de 3000 mAh,
O mais robusto da minha coleção atual de bancos de energia USB fornece 8000 mAh (8 Amp horas). No
extremo oposto, algumas das minhas baterias menores de polímero de lítio (LiPo) têm apenas algumas
centenas de mAh.
As necessidades de energia do Tessel (não é uma placa particularmente de baixa potência) e os motores
exigem uma bateria de maior capacidade como aquele tijolo USB, enquanto um projeto que combina um
Arduino Nano (uma pequena e eficiente placa Arduino) e um sensor de temperatura de baixa potência
UAU! e-book
O que você precisará www.wowebook.org
Machine Translated by Google
O que você precisará
1 Tesselação 2
3 pinos de cabeçalho fêmea ou um comprimento de fio de núcleo sólido (núcleo sólido de calibre 22 é ideal)
(opcional)
Fazendo algumas pequenas alterações, o robô que você construiu com o Arduino Uno no capítulo 6 pode ser liberado
1. Solde algumas conexões ao Tessel para disponibilizar uma fonte de alimentação de 5 V para os motores
(opcional)
Alimentando os motores
No capítulo 6, os motores do robô itinerante foram alimentados por uma bateria de 9 V. A tensão operacional de 3,3 V
do Tessel é muito baixa para alimentar os motores e, além disso, as restrições de corrente nos pinos
seriam problemáticas. Mas as placas Tessel fornecem acesso à alimentação de 5 V com corrente suficiente para
fazer o trabalho (figura 8.14). O truque é acessá-lo - você precisará soldar um pouco.
Figura 8.14. O Tessel pode fornecer energia de 5 V dos pinos de alimentação destacados aqui.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A opção mais flexível é soldar conectores fêmeas aos três pinos de alimentação no Tessel,
resultando em “soquetes” reutilizáveis nos quais você pode conectar cabos de jumper (8.15).
Soldar pinos de cabeçalho fêmea (figura 8.16) é um pouco diferente de soldar em cabeçalhos
de separação macho: você vira a placa de cabeça para baixo e solda os pinos na parte inferior.
Use um pedaço de fita para manter os pinos no lugar na parte superior, para que não caiam da
placa ao invertê-la.
Figura 8.15. A soldagem de pinos de cabeçalho fêmea aos pinos de alimentação de 5 V fornece
slots reutilizáveis úteis para fios de jumper.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 8.16. Para soldar conectores fêmea na placa, vire a placa e solde na parte
inferior. Você precisará de um pedaço de fita para prender os pinos no lugar
enquanto solda.
Como alternativa, você pode soldar comprimentos de fio aos pinos +5 V e GND (figura 8.17).
No entanto, isso resulta em fios permanentemente conectados.
Figura 8.17. Soldar fios de núcleo sólido aos pinos de alimentação também é uma opção.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se isso parecer muito incômodo, você pode optar por usar duas fontes de alimentação para este
projeto: a bateria de 9 V existente para o trilho de alimentação do motor e a bateria USB para alimentar
o Tessel - um diagrama de fiação para cada um é fornecido no próximo seção.
Os pinos de alimentação de 3,3 V do Tessel não fornecem nem a tensão nem a corrente exigida
pelos motores. Não tente alimentar os motores diretamente dos pinos de 3,3 V do Tessel.
Retire a parte superior do chassi do robô Unopowered (figura 8.18) para que você possa acessar o
interior e altere o circuito para usar o Tessel em vez do Uno. Se você soldou as conexões à
alimentação de 5 V do Tessel, monte o circuito conforme mostrado na figura 8.19. Se você optou
por continuar usando a bateria de 9 V, conecte o circuito conforme a figura 8.20.
Figura 8.18. Substituindo o Uno no capítulo 6 do bot itinerante por um Tessel, fazendo alguns
ajustes de fiação e conectando uma bateria USB ao Tessel, você pode criar um bot itinerante
sem fios.
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 8.20. O circuito rover usando duas fontes de energia: 3,3 V do Tessel e uma bateria
de 9 V para os motores.
UAU! e-book
www.wowebook.org
Machine Translated by Google
mkdir t2rover
cd t2rover
npm init e npm
install salvar johnnyfive tesselio keypress
O pacote keypress é usado para capturar a entrada do teclado, para que o bot possa ser direcionado
Copie os dois scripts de robô para o diretório t2rover — index.js e Rover.js (ou volte ao capítulo 6
para encontrar a fonte). Abra o arquivo index.js em um editor de texto e faça o
UAU! e-book
www.wowebook.org
Machine Translated by Google
seguintes alterações:
É isso! Seu bot está pronto para funcionar, sem fio. Posicione a placa Tessel no lugar do bot itinerante
onde o Uno estava anteriormente. Conecte a fonte de alimentação USB (e bateria de 9 V, se estiver
usando uma) e use fita adesiva ou velcro para prendê-la ao chassi do robô.
Certifique-se de que o Tessel esteja totalmente inicializado e visível na LAN (use a lista t2 para garantir).
Você deve ser capaz de controlar seu robô a partir do seu computador usando as teclas de seta, e o rover
deve ser capaz de se movimentar muito mais amplamente do que quando estava conectado a um
Cabo USB.
Por meio dos experimentos deste capítulo, você viu como pode começar a libertar seus projetos de
amarras físicas. Você já passou do básico. É hora de dar a você mais ferramentas para inventar seus
O rover baseado em Arduino Uno usava níveis lógicos de 5 V e os motores recebiam 9 V de energia de
uma bateria. Lembre-se, há duas fontes de energia aqui - uma para a lógica do driver do motor e outra
na lógica de 3,3 V porque 3,3 V HIGH é suficiente para registrar como um nível ALTO lógico para o dispositivo
do driver do motor de 5 V - muitas vezes você pode usar a lógica de 5 V com 3,3 V porque a faixa de tensões
A lógica de 3,3 V às vezes é compatível com componentes que possuem níveis lógicos de 5 V. A faixa de
tensão que é interpretada como ALTA para dispositivos de nível lógico de 5 V geralmente abrange 3,3 V. Ou seja,
um sinal de +3,3 V (ALTO do dispositivo de 3,3 V) será interpretado como ALTO no dispositivo de 5 V
Você notará que os motores não são tão rápidos com 5 V quanto com 9 V. Isso era de se esperar.
RESUMO
Existem dois motivos principais pelos quais os projetos exigem conexões com fio: troca de dados e
comunicação e energia.
Usar JohnnyFive com Arduino Uno é um exemplo de configuração de hostclient. Um cabo deve existir entre
um computador host e o Uno o tempo todo. Alguns hardwares restritos, como o Photon Particle, podem
se comunicar sem fio com o JohnnyFive, mas um computador host ainda é necessário para pensar.
Tessel 2 é uma plataforma de código aberto que executa Linux e Node.js incorporados diretamente na própria
O Tessel 2 opera em 3,3 V. Ele tem duas portas de 8 pinos cada e suporta diferentes recursos em diferentes
pinos.
Na maioria das vezes, as únicas adaptações necessárias para escrever roteiros de JohnnyFive para o
Existem muitas opções para alimentar projetos. Até agora você usou energia de
parede, pilhas alcalinas e um banco de energia USB. As baterias USB são úteis porque
têm várias aplicações, incluindo carregar dispositivos móveis, e são fáceis de carregar.
usar.
UAU! e-book
www.wowebook.org
Machine Translated by Google
As possibilidades infinitas de criar seus próprios mashups usando eletrônicos de consumo de baixa
tutoriaistensão pré-existentes
Configuração de saída
1 Tesselação 2
6 resistores de 100 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 tábua de pão de tamanho normal
Fios de jumper
1 multímetro
Kit de ferramentas de hardware para o capítulo 9 (fio sólido 22AWG opcional não mostrado)
Você já foi muito além do mundo lightupanLED e pode estar ansioso para começar a
construir coisas com eletrônicos que não foram construídos antes, para traçar seu próprio
curso. Vamos fazer um tour pelo arco de um projeto de exemplo inteiro - remixar um
conjunto de interruptores de tomada controlados remotamente - desde o início,
passando pela prototipagem, solução de problemas, iteração e melhoria. Em vez de
confiar em esquemas, instruções e software pré-existentes, você abrirá seu próprio caminho
em algumas partes do projeto.
Os projetos neste capítulo irão expor você a mais complexidade de software do que
experimentos anteriores. Dependendo do seu nível de conhecimento em JavaScript, isso
pode atingir um ponto ideal ou pode parecer mais do que você deseja morder agora. Se for demais,
UAU! e-book
www.wowebook.org
Machine Translated by Google
tudo bem: é sempre válido juntar projetos de componentes preexistentes
apoiar.
Projetos do mundo real têm altos e baixos. É preciso um toque de coragem para se lançar em
projetos mais elaborados com incógnitas. Fazer funcionar no final é docemente recompensador, e
espero que você aprenda a saborear o mergulho.
Um dos momentos mais eletrizantes (com o perdão do trocadilho miserável) durante o crescimento
de minha experiência em eletrônica foi quando percebi que tinha conhecimento básico suficiente
para mexer com os eletrônicos de consumo existentes: para torná-los melhores ou para inventar
mashups criativos - coçando qualquer coceira do inventor que possa surgir. Por que projetar, comprar
peças e construir laboriosamente um circuito se você tem uma bugiganga eletrônica sem uso
espalhada pela casa que já executa a mesma função?
Perambular por uma sala para ligar (ou desligar) várias lâmpadas individuais pode ser cansativo, especialmente
controlados sem fio para tomadas elétricas podem ser úteis. Por cerca de US$ 20, você pode comprar um
Figura 9.1. Conjuntos de tomadas com controle remoto são baratos e amplamente disponíveis
em lojas de ferragens e home centers. A unidade de controle remoto é alimentada por uma
bateria de baixa voltagem.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Com o controle remoto operado por bateria em mãos, você pode ligar ou desligar cada um dos
interruptores plugados (e, por sua vez, as lâmpadas plugadas neles), individualmente. Este é
um passo à frente de ter que dar uma volta física ao redor da sala. Mas há algumas coisas que
poderiam ser melhoradas.
Não é possível - pelo menos com o modelo que tenho - ligar ou desligar todos os interruptores
(e, portanto, suas luzes) ao mesmo tempo. Cada um deve ser trocado individualmente.
Mais interessante, não seria bom poder acionar as luzes de outras maneiras, possivelmente
automatizadas? Talvez você queira que as luzes se acendam quando escurece, ou de outro
cômodo da sua casa, ou usando alguma outra forma de entrada que você sonhou.
Boas notícias! O circuito dentro desses pequenos controles remotos é de baixa complexidade e
potência - baixa voltagem, baixa corrente. Eles são fáceis de entender e provavelmente não
vão te machucar terrivelmente se você estragar alguma coisa. Vamos hackear. Usando a coragem
do controle remoto, você montará seu próprio dispositivo personalizado.
Embora o circuito em muitos produtos eletrônicos de consumo alimentados por bateria e de baixa
tensão seja benigno, cada dispositivo é diferente e você precisa usar o bom senso.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A menos que você seja um eletricista qualificado, não abra ou altere os componentes de saída do
sistema de controle remoto - mantenha seus hackers confinados à unidade de controle remoto. As
tomadas são conectadas à parede e tenho como política nunca chegar perto da rede elétrica em
minhas explorações eletrônicas - isso me mantém fora do hospital.
Remova as baterias dos eletrônicos quando estiver trabalhando com eles. E sempre, sempre dê aos
capacitores um amplo espaço. Eles podem manter a carga por muito tempo, mesmo quando não
estão conectados à energia.
Você precisará desmontar o conjunto do controle remoto. Sua unidade de controle remoto pode ser um
pouco diferente, mas para desmontar o controle remoto que tenho, removi dois pequenos
parafusos. Dentro do estojo, encontrei apenas algumas coisas (figura 9.2):
Os botões físicos que podem ser pressionados, todos juntos em uma cama flexível de plástico
Uma pequena placa de circuito contendo os contatos dos botões, contatos da bateria e um LED
de status (entre outras coisas, como o transmissor de rádio)
UAU! e-book
www.wowebook.org
Machine Translated by Google
Cada botão tem um pad correspondente abaixo dele na placa de circuito, que se parece com um
padrão em zigue-zague. Quando o botão sobreposto é pressionado, ele faz uma conexão entre
os dois lados diferentes do zigue-zague, completando o circuito. Você mesmo pode conectar o
circuito, agindo como um único botão pressionado, usando um fio jumper e tocando uma
extremidade em cada lado do zigue-zague (figura 9.3).
Figura 9.3. Quando um botão é pressionado, ele faz contato com ambos os lados dos
contatos em zigue-zague abaixo dele. Você pode reproduzir esse efeito conectando os
dois lados com um jumper.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Um lado do ziguezague é conectado ao terra. Você precisa determinar qual é o lado para
poder conectar seus próprios “botões” corretamente (ou seja, não ao contrário). A
melhor maneira de fazer isso é com um multímetro, mas se você não quiser comprar um
multímetro agora, pode tentar tocar os fios do LED em cada lado dos contatos do
botão e ver quando ele acende - seja qual for o lado do cátodo do LED está tocando
nesse ponto é o lado do terra (figura 9.4). Lembre-se de que você corre o risco de
sacrificar o LED se ele receber muita corrente ou se recusar a ser conectado ao contrário.
Figura 9.4. Sem multímetro? Você pode usar um LED para descobrir qual lado dos contatos do
botão é o lado do terra. Um LED é um diodo - ele só permitirá que a corrente flua se estiver
alinhado corretamente no circuito. Quando acende, significa que seu cátodo está no lado terra do
botão.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Masterização de multímetros
Um multímetro, que pode medir tensão, corrente e resistência, é uma ferramenta essencial para a caixa
UAU! e-book
www.wowebook.org
Machine Translated by Google
Em nosso experimento atual, você pode determinar qual lado dos contatos do botão está conectado
ao terra observando a diferença de potencial de tensão entre os dois lados do zigue-zague. Para
fazer isso, defina o multímetro para uma configuração de tensão CC. Escolhi 20 V - o dispositivo
deve operar em torno de 3 V com base em sua bateria. A configuração de 20 V pode exibir
leituras de tensão de até 20 V; a tensão do dispositivo é um pouco alta demais para usar minha
configuração de 2 V.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Com o multímetro definido para uma configuração de tensão CC apropriada, a leitura será positiva
quando a ponta de prova de aterramento estiver no lado do aterramento dos contatos do botão.
Ao tocar as pontas de prova do multímetro em cada lado dos contatos do botão, você verá uma leitura de
tensão no dispositivo. Se o número for negativo, troque as sondas. Depois de ver uma leitura positiva -
a minha era de cerca de 2,5 V - você encontrou o lado positivo (conexão da ponta de prova vermelha) e o
Os controles podem parecer intimidadores no início, mas os multímetros são ótimos amigos para
é bom: http://mng.bz/9f03.
A próxima etapa pode exigir alguma engenhosidade, dependendo das especificidades da placa de circuito
do seu dispositivo: você precisa conectar fios a cada lado dos ziguezagues do botão (dois fios por botão).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se tiver sorte, você pode soldar fios diretamente nos botões de contato (figura 9.5). No
meu caso, a placa de circuito impresso (PCB) do controle remoto - uma placa fabricada
especificamente para este produto com conexões serigrafadas e traços conectando
diferentes elementos - tornou isso desafiador. Embora os contatos do botão
fossem eletricamente condutivos, a solda não aderiria a eles. Por mais que eu tentasse,
tudo o que consegui foi espalhar solda em meus fios e fazer uma bagunça. Prender os
fios às almofadas usando fita isolante era frustrante e meticuloso e ficava desmoronando em mim.
Figura 9.5. Uma configuração ideal seria soldar os fios diretamente em cada lado de
cada botão de contato.
Finalmente, vasculhando com meu multímetro, consegui encontrar furos na placa de circuito
que correspondiam aos contatos dos botões. Esses orifícios ainda não continham solda, mas
serviam como pontos de ancoragem através dos quais eu poderia inserir fios em uma placa
de ensaio subjacente (figura 9.6).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Descobriu-se que cada botão na placa de circuito tinha sua própria conexão separada com o terra (fios
azuis — os seis primeiros na figura 9.6). Mas todos os botões foram conectados por meio de rastros a
uma única fonte de alimentação positiva compartilhada (fio amarelo — na parte inferior da figura 9.6).
Para ativar qualquer um dos botões, era necessário completar o circuito conectando a conexão de
Quando você está desbravando novas trilhas e inventando suas próprias coisas, é provável que você tenha
pelo menos um ponto em cada projeto em que as coisas não saiam como o esperado (provavelmente
mais, para ser honesto). Pode ser uma decepção. Seja um problema ao soldar um fio a uma conexão ou um
componente que não se encaixa em uma placa de ensaio, você precisará ser engenhoso e atencioso
para resolvê-lo.
Tente não se apressar ou ficar confuso - é mais fácil aconselhar do que fazer, é claro! É tudo parte da
experiência. Tente usar a ferramenta certa para o trabalho, mesmo que isso signifique deixar seu projeto
de lado por alguns dias enquanto espera que a ferramenta ou peça certa encomendada on-line chegue
pelo correio. Mesmo que você tenha os materiais necessários à mão, às vezes é uma boa ideia fazer
uma pausa.
Fica melhor! À medida que avança, você aprenderá a prever certas pegadinhas. Você também estará
construindo seu conjunto de ferramentas, então terá mais opções para recorrer quando precisar corrigir uma
falha ou solucionar problemas. E você aprenderá quanto tempo realmente leva para construir um projeto de
UAU! e-book
www.wowebook.org
Machine Translated by Google
zero: pode demorar mais do que você pensa!
Figura 9.7. Se desejar, você pode conectar um ou mais de seus botões com fio a um
botão de pressão para testá-lo.
Até agora, este foi um exercício interessante para entender como as coisas funcionam, mas você deve
ter percebido que não realiza nada de útil. Ainda requer toques de dedos humanos para operar os
controles. Em vez disso, vamos projetá-lo para que você possa controlar o dispositivo com base em
qualquer entrada ou lógica que desejar.
Ao fazer interface com circuitos em outros eletrônicos, é melhor manter as fontes de alimentação e os
componentes do circuito do dispositivo de destino isolados de sua placa de desenvolvimento e circuito.
Você não gostaria que caprichos de corrente ou tensão no controle remoto danificassem os
componentes eletrônicos no circuito da placa de desenvolvimento ou vice-versa. Você deseja que
sua placa de desenvolvimento e os dispositivos conectados a ela sejam capazes de controlar o fluxo
de corrente através do controle remoto (fazendo e desconectando conexões para diferentes botões),
mas não deseja realmente conectar-se ao circuito do controle remoto (figura 9.8). .
Figura 9.8. Para cada botão no controle remoto, você deseja pressionar e soltar o botão usando
o Tessel como um controlador semelhante a um interruptor. Você deseja que a aplicação de corrente
nos pontos 1 e 2 (o lado de entrada) faça com que a corrente flua entre os pontos 3 e 4 (a saída,
lado remoto), mas você não deseja que os dois circuitos sejam conectados fisicamente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
Como você viu com alguns outros componentes, um fotoacoplador tem muitos nomes alternativos: você
Seu primeiro experimento com o controle remoto do controle remoto (oh, está ficando meta!)
novos caminhos.
Nesta primeira iteração, você fará com que possa controlar cada botão liga/desliga — pressionando botões
componentes relacionados no meu caso - pode ser útil começar com um pedaço do circuito e garantir que
funcione. Em seguida, você pode criar um código menos polido para verificar se as coisas estão se
Esse processo de prototipagem pode ajudá-lo a validar sua abordagem e solucionar problemas em
Protótipo do hardware
Conecte o primeiro conjunto de botões liga e desliga conforme mostrado na figura 9.10. Fios amarelos
devem UAU!
e-book www.wowebook.org
Machine Translated by Google
conecte-se às conexões de botão positivo, preto ao negativo (no meu caso, todos os fios amarelos se
conectam à mesma fonte positiva compartilhada). Certifique-se de que o ponto indicador do pino 1 nos
fotoacopladores esteja orientado corretamente. Conecte o pino 2 de ambos os fotoacopladores ao terra.
Conecte o pino 1 do primeiro fotoacoplador ao pino A0 no Tessel através de um resistor de 100 V e o pino
2 ao GND. O resistor limitador de corrente é necessário aqui porque há um LED dentro do fotoacoplador.
Conecte o pino 5 do fotoacoplador ao fio positivo do botão liga/desliga do primeiro interruptor e o pino 4
ao fio terra desse botão.
Conecte o segundo fotoacoplador de maneira semelhante, mas conecte-o ao pino A1 no lado Tessel
(fonte) e aos fios positivo e terra do botão de desligar do primeiro interruptor.
Prototipando o software
Aqui está algo a considerar. O que significa “pressionar um botão” no controle remoto?
A conexão que o pressionamento do botão faz não permanece conectada para sempre, nem é um sinal
instantâneo - pense em um dedo humano pressionando e soltando o botão. Sobre
UAU! e-book
www.wowebook.org
Machine Translated by Google
meu controle remoto, na verdade, eu notei no passado que se eu pressionasse um botão muito rápido -
liberando-o muito rapidamente - o interruptor nem sempre respondia. Há um pouco de pressandhold envolvido.
Você pode imitar isso com software ativando a conexão de um botão por meio do
fotoacoplador e mantendo-o ligado por um período de tempo, digamos meio segundo, antes de desligá-lo
novamente. Isso provavelmente é mais fácil de conceituar observando o código real. Vamos.
cd remoteswitches
npm init y
Em vez de usar uma classe de componente JohnnyFive de nível superior, como Led, você escreverá
valores digitais - HIGH (1) ou LOW (0) - nos pinos A0 e A1 diretamente. Um pino pode ser
board.pinMode('A0', five.Pin.OUTPUT);
board.digitalWrite('A0', 1); // define HIGH (3,3V no Tessel) board.digitalWrite('A0', 0); // define LOW (0V)
Para “pressionar” o botão que liga o primeiro interruptor, você deve definir o pino A0 HIGH – “ligar” o
Após 500 milissegundos, você definirá A0 LOW novamente, interrompendo a conexão do circuito e
“soltando” o botão.
UAU! e-book
www.wowebook.org
Machine Translated by Google
const board = new five.Board({ io: new Tessel() });
const switchPins = { 1
em: 'A0',
desligado: 'A1'
};
duração do pressionamento constante = 500; 2
board.on('pronto', () => {
board.pinMode(switchPins.on, five.Pin.OUTPUT); 3
board.pinMode(switchPins.off, five.Pin.OUTPUT);
setTimeout(() => {
placa.digitalWrite(pino, 0);
}, pressioneDuração); 5
};
const ligar = function () {
pressButton(switchPins.on);
};
const desligar = function () {
pressButton(switchPins.off);
};
board.repl.inject({ 6
ligar: ligar,
desligar: desligar
});
});
1 Esses dois pinos são conectados ao lado da fonte dos dois fotoacopladores.
2 botões “pressiona e segura” por 500 milissegundos para garantir a ativação do interruptor
5 Em seguida, defina um tempo limite para pressDuration (500 ms) antes de definir o pino
BAIXO novamente.
Experimente. Implante o código no Tessel pela LAN (você precisa implantar pela LAN para que o
REPL funcione):
UAU! e-book
www.wowebook.org
Machine Translated by Google
$ t2 executar index.js lan
indefinido
>> desligar()
indefinido
Ao fazer isso, você deve “pressionar” os botões liga e desliga no controle remoto e ligar e desligar a
tomada de parede associada.
Quando estiver mais confiante de que seu primeiro circuito está fazendo o que você espera,
expanda-o conforme mostrado na figura 9.11. Certifique-se de prestar atenção à orientação de cada
fotoacoplador.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora que você poliu o circuito, é hora de polir o código. Em vez de ter uma coleção heterogênea de
cada uma das três combinações de chave liga/desliga em um componente personalizado chamado
instanciar um objeto RemoteSwitch para cada um dos três pares liga/desliga (ou quantos pares de
Classes de componentes integrados como Led e Motor fazem parte do núcleo do JohnnyFive. A criação de
uma nova classe de componente requer alterações na própria base de código do JohnnyFive. Por
outro lado, os plug-ins de componentes podem ser criados sem fazer nenhuma modificação no
Crie um novo arquivo no diretório remoteswitches chamado RemoteSwitch.js para conter o módulo de
plug-in. A estrutura do módulo começará conforme mostrado na listagem a seguir. Esta estrutura
de esqueleto segue algum plug-in do componente JohnnyFive
convenções para torná-lo modular e flexível.
}());
};
Em vez disso, ele usa uma referência de objeto JohnnyFive como um argumento para sua
função exportada. Dessa forma, o plug-in pode funcionar em cima de qualquer objeto JohnnyFive
que esteja em jogo quando for incluído. O objeto JohnnyFive passado pode conter uma placa
configurada com o plug-in Tessel I/O, ou pode ter um Arduino com uma camada Firmata I/O, ou talvez
outra coisa - dessa forma, o plug-in não precisa se preocupar com logística ou validação
números de pinos ou qualquer coisa. O objeto JohnnyFive passado cuidará disso, deixando você livre
para lidar com a lógica em questão.
O plug-in precisa ter um construtor que possa ter algumas opções, executar qualquer configuração
necessária e se registrar no JohnnyFive. A instanciação de um RemoteSwitch ficará assim quando
terminar:
const switch1 = new RemoteSwitch({ pins: { on: 'A0', off: 'A1' } });
UAU! e-book
www.wowebook.org
Machine Translated by Google
Você trabalhará nesse construtor a seguir.
Codificando o plug-in
// opts.pins deve conter duas propriedades, `on` e `off`, // definindo seus números de pin,
respectivamente
this.pins = opts.pins;
this.duration = 500;
this.isOn = indefinido; 3
this.isActive = false; 4
this.io.pinMode(this.pins.on, this.io.MODES.OUTPUT); 5
this.io.pinMode(this.pins.off, this.io.MODES.OUTPUT);
} // ...
}());
};
1 Este padrão (padrão) garante que a função seja chamada com a palavra-chave “new”.
2 Registra o componente
5 Configura os pinos liga e desliga do switch para serem pinos de saída digital.
UAU! e-book
www.wowebook.org
Machine Translated by Google
function RemoteSwitch (opts) { /* já escrevemos isso */ };
}
pino const = (turnOn) ? este.pins.on : este.pins.off; 4
this.io.digitalWrite(pin, 1);
setTimeout(() => {
this.io.digitalWrite(pino, 0);
this.isActive = false; 5
this.isOn = !!turnOn; 6
}, this.duration);
};
RemoteSwitch.prototype.on = function () {
this.toggle(true);
};
RemoteSwitch.prototype.off = function () { this.toggle(false); };
}());
};
5 O interruptor não está mais ativo; isActive deve ser falso novamente
Você notará que tudo gira em torno do método de alternância. O único argumento de alternância,
turnOn, define o que acontece. Se for verdadeiro, o interruptor será ligado. Se for falso, o interruptor
será desligado. Se estiver ausente (indefinido), o switch mudará de qualquer estado em que esteja
atualmente. Para oferecer suporte a essa funcionalidade, o estado atual do switch é armazenado na
propriedade isOn.
Para evitar que o controle remoto tente enviar dois sinais ao mesmo tempo, a propriedade isActive é
usada como sinalizador. toggle não gravará em nenhum pino se isActive for verdadeiro.
UAU! Listagem
de e-books 9.5. index.js refatorado www.wowebook.org
Machine Translated by Google
Listagem 9.5. index.js refatorado
board.on('pronto', () => {
const switch1 = new RemoteSwitch({
pinos: { on: 'A0', off: 'A1' }
});
const switch2 = new RemoteSwitch({
pinos: { on: 'A2', off: 'A3' }
});
const switch3 = new RemoteSwitch({
pinos: { on: 'A4', off: 'A5' }
});
board.repl.inject({ switch1: switch1,
interruptor2: interruptor2,
interruptor3: interruptor3
});
});
Experimente:
Uma vez em execução, você pode interagir com os objetos switch no REPL:
No momento, o método toggle nas instâncias RemoteSwitch não fará nada se isActive
for true — ou seja, não permitirá várias ativações de switch simultâneas. O
UAU! e-book
www.wowebook.org
Machine Translated by Google
a desvantagem é que, como está escrito atualmente, os comandos para alternar serão efetivamente
descartados e ignorados se acontecerem enquanto a opção já estiver ativa. Digamos que, por algum motivo,
você queira piscar o interruptor várias vezes e tenha o seguinte código em index.js para tentar fazer isso:
O interruptor alternaria uma vez conforme o esperado, com certeza. Mas as nove chamadas
subseqüentes para alternar aconteceriam imediatamente depois - enquanto o switch ainda está ativado
desde a primeira chamada (e, portanto, enquanto isActive é verdadeiro). Eles seriam ignorados.
Você pode corrigir isso lançando um enfileiramento FIFO simples (primeiro a entrar, primeiro a sair —
análogo a “as chamadas são atendidas na ordem em que são recebidas”) para alternar comandos que
chegam enquanto o switch está ativo. Isso requer apenas algumas linhas de código.
Enquanto estiver lá, você também pode adicionar algum suporte de retorno de chamada aos métodos
do RemoteSwitch, conforme mostrado na listagem a seguir. Isso é consistente com outros componentes do
J5 e possibilita o registro de uma função a ser chamada quando o comando switch (on/off/toggle)
for concluído. No momento, isso é molho, mas será útil mais tarde.
this.pins = opts.pins;
this.duration = opts.duration || 500;
this.isOn = indefinido;
this.isActive = false;
esta.fila = []; 1
this.io.pinMode(this.pins.on, this.io.MODES.OUTPUT);
this.io.pinMode(this.pins.off, this.io.MODES.OUTPUT);
}
}
pino const = (turnOn) ? este.pins.on : este.pins.off;
this.io.digitalWrite(pin, 1);
setTimeout(() => {
this.io.digitalWrite(pino, 0);
this.isActive = false;
this.isOn = !!turnOn;
if (typeof callback === 'function') { 4 callback();
}
if (this.queue.length) { 5
this.toggle.apply(this, this.queue.shift());
}
}, this.duration);
};
};
RemoteSwitch.prototype.off = function (callback) {
this.toggle(falso, retorno de chamada);
};
retornar RemoteSwitch;
}());
};
6 funções de manipulador liga e desliga recebem um argumento de retorno de chamada e o passam para
alternar.
Agora, se você adicionar o seguinte código ao index.js, ele deve funcionar conforme o esperado:
UAU! e-book
www.wowebook.org
Machine Translated by Google
A chave deve alternar 10 vezes, com base no software que escrevemos. Vale a pena notar, no
entanto, que pode haver limitações de hardware que impedem que isso realmente aconteça. Por
exemplo, os componentes eletrônicos do seu controle remoto podem não permitir que um interruptor
seja alternado com tanta frequência.
Até agora, você invadiu a eletrônica de consumo, construiu um pequeno protótipo e o expandiu
para um circuito mais polido com um plug-in de componente JohnnyFive personalizado para saída
(interruptores).
Você pode acionar seus componentes do RemoteSwitch com alguns dos dispositivos de entrada
que você já viu. Você pode usar um fotoresistor e acionar os interruptores quando escurecer na sala.
Você pode usar um sensor de movimento ou proximidade para ativá-los quando seu gato passar (e
desligá-los automaticamente após um determinado período de tempo). Mas o que acontece quando
você deseja controlar os interruptores com um tipo de entrada que não é suportada pelo JohnnyFive? O
que então?
UAU! e-book
www.wowebook.org
Machine Translated by Google
O problema é que, na época em que me deparei com o APDS9960, não havia suporte
JohnnyFive preexistente para ele. Não há classe de componente para sensores de gesto.
Isso significa que você precisa criar esse suporte! Quando o software preexistente não
existe para algo que você deseja usar, você tem duas opções: substituir outra peça de
hardware que tenha suporte ou criar esse suporte você mesmo.
1. Defina os objetivos e o
escopo 2. Reúna informações e faça pesquisas sobre o
APDS9960 3. Crie um protótipo rápido de prova
de conceito 4. Defina a superfície da API e o
ciclo de vida do plug-in 5. Escreva
o código do plug-in 6. Teste se
o plug-in funciona 7 . Termine o projeto, integrando o plugin APDS9960 com seu RemoteSwitch
do início do capítulo
UAU! e-book
www.wowebook.org
Machine Translated by Google
Antes de conectar fios, soldar ou inserir código, a primeira coisa a fazer é perguntar a si mesmo o que você
Você deseja criar um plug-in de componente JohnnyFive para o sensor de gestos no APDS9960.
Uma API razoável consistente com outros componentes do JohnnyFive incluiria a exposição de eventos
O que não está no escopo? Dada a complexidade do sensor de gestos do APDS9960 sozinho, não
tente lidar com o suporte para seus outros sensores. Da mesma forma, para economizar tempo de
desenvolvimento e dores de cabeça, você irá em frente e codificará muitas das configurações padrão e
suporte a recursos que poderiam ser gerenciados posteriormente de outra maneira, como por meio de
Projetar o código para ser usado em várias plataformas de hardware é uma boa meta, assim como
manter a flexibilidade para o futuro em mente. Escrever um módulo que esteja em conformidade com as
plataforma cruzada. Estar atento sobre como as constantes são gerenciadas, prestar atenção à
consistência da superfície da API e manter os métodos modulares ajudará a tornar o software mais fácil de
Você escreverá este suporte de sensor de gestos com base no Tessel. Não há razão para pensar que não
funcionaria em outras plataformas compatíveis com JohnnyFive (3,3 V), mas você não gastará tempo
Com seus objetivos e escopo definidos, é hora de coletar informações. Há muitas perguntas para
responder:
Configuração e configuração— Quais etapas precisam ser executadas para inicializar o dispositivo,
definir padrões e habilitar os recursos necessários?
Dados— Que tipo de dados são produzidos pelo dispositivo? Como você interpreta e processa os
dados?
UAU! e-book
www.wowebook.org
Machine Translated by Google
Sua primeira parada na jornada de descoberta é ler o guia e a documentação de conexão
APDS9960 do SparkFun (http://mng.bz/MapU). A placa de breakout do SparkFun para o
APDS9960 cuida de algumas das tarefas de nível de hardware para você - jumpers e conexões de
2
energia. A placa resultante pode ser conectada como outros componentes IC que você
encontrou. Mas há uma adição: uma conexão com um pino com capacidade de interrupção.
Voltaremos a isso. Outro detalhe muito importante é que este dispositivo opera em 3,3 V — tudo
bem para o Tessel, mas não tente conectá-lo a um Arduino de 5 V.
Ao revisar o suporte de software e firmware existente para o APDS9960, você pode obter uma
grande vantagem. Shawn Hymel, da SparkFun, criou uma biblioteca Arduino de código aberto
completa e excelente (somente para Arduinos de 3,3 V!) que oferece suporte a todos os recursos
do dispositivo (http://mng.bz/8gE7). É excelente: legível e exaustivamente comentado. A
referência cruzada entre a biblioteca do Arduino e a folha de dados fornece alguns outros
detalhes sobre como trabalhar com o dispositivo.
Antes que os dados de gesto possam ser gerados, o hardware APDS9960 precisa ser inicializado e
ter seu modo de gesto ativado. Este é, conceitualmente, um processo de duas etapas.
Figura 9.13. Nesta representação de máquina de estado parcial simplificada de seu plug-in,
uma instância de objeto de plug-in começa em um novo estado. Por meio de um método
de configuração, ele se move para um estado inicializado, no qual o dispositivo APDS-9960
é inicializado, mas não detecta ativamente os gestos. Um método enable ativa o modo de
gesto no dispositivo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para usar uma metáfora muito desleixada e imprecisa: configurar é como ligar o chip e inicializá-lo, enquanto
habilitar é como iniciar um aplicativo específico de gesto no dispositivo. Embora sua implementação
suporte apenas a detecção de gestos, o que significa que a habilitação sempre ocorrerá logo após a
configuração sem a intervenção do usuário, manter essas duas fases distintas facilitará a adição posterior
Quais registradores e quais valores precisam ser escritos durante a configuração e habilitação? Todas essas
informações estão na folha de dados; requer tempo, paciência e atenção aos detalhes para organizar tudo.
do gesto. Quando o dispositivo detecta movimento e começa a produzir dados, ele puxa o pino de
interrupção para BAIXO, sinalizando que um gesto foi detectado. Ou seja, a voltagem no pino Tessel
conectado ao pino de interrupção da placa de breakout mudará de 3,3 V para 0 V. A chamada borda
descendente de HIGH para LOW é o sinal de que seu software deve ler os dados de gesto do
dispositivo.
Os dados que representam um gesto são compostos por uma coleção de conjuntos de dados de 4
bytes, cada um contendo 1 byte (um valor de 0 a 255) para cada direção (para cima, para baixo,
esquerda, direita). Ao analisar a maneira como esses valores mudam para cada direção no
conjunto de amostras do conjunto de dados, é possível derivar uma direção geral do gesto.
Quando o dispositivo detecta movimentos de gestos, ele puxa a interrupção LOW e começa a armazenar
conjuntos de dados em registros de memória. Existem 128 bytes de espaço no dispositivo para isso – até
32 leituras de 4 bytes cada – e os dados são colocados nesses registradores de maneira FIFO (firstin,
Figura 9.14. Existem 128 bytes de FIFO RAM, começando no endereço de memória 0xFC, disponíveis
para armazenar dados de gestos. Neste exemplo, há três conjuntos de dados disponíveis na fila FIFO.
Um conjunto de dados é composto de quatro bytes, cada um representando dados para uma direção
diferente — para cima, para baixo, para a esquerda e para a direita.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Quando o dispositivo de controle - seu Tessel - lê os bytes de dados desses registradores, ele
libera espaço e mais dados podem ser inseridos na FIFO RAM. Este ciclo continua - o controlador lê, o
dispositivo coloca mais dados no FIFO - até que não haja mais dados de gesto entrando e o FIFO seja
esvaziado. Então os dados podem ser processados pelo dispositivo de controle (figura 9.15).
Tecnicamente, o dispositivo acionará uma interrupção ao detectar dados de gesto porque você o
configurará para fazer isso como parte da etapa de habilitação. O APDS9960 é altamente configurável
e a interrupção por gesto é um recurso opcional. Ainda mais tecnicamente, ele disparará uma
interrupção após quatro conjuntos de dados (amostras) terem sido colocados na FIFO RAM.
Precisamente quando essa interrupção dispara é, sim, também configurável.
Figura 9.15. A máquina de estado do plug-in ganha mais detalhes à medida que a pesquisa continua.
Quando uma interrupção é detectada, a instância do plug-in entra em uma fase de ciclo de leitura e,
em seguida, em uma fase de processamento antes de retornar ao estado ativado de escuta ativa.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Antes de abordar a implementação do plug-in, uma verificação de sanidade é necessária. Você vai
2
estabelecer uma área de trabalho, conectar o chip e certificar-se de que pode estabelecer
comunicação IC com ele. Isso fará com que você se sinta mais confiante ao entrar nas fases de
desenvolvimento mais detalhadas.
A fiação da placa de conexão APDS9960 é fácil, embora você precise soldar os pinos de cabeçalho
nela primeiro. Conecte-o como mostrado na figura 9.16. O pino de interrupção está conectado ao
pino A2 no Tessel, que é um pino com capacidade de interrupção.
UAU! e-book
www.wowebook.org
Machine Translated by Google
gesto mkdir
cd gesto npm
init e npm install
johnnyfive tesselio
Copie também o arquivo RemoteSwitch.js para o diretório de gestos. Você vai usá-lo novamente
mais tarde.
Para criar os diagramas de fiação usados neste livro, usei o software Fritzing de código aberto
(http://fritzing.org/home/), que está disponível nas plataformas Mac, Windows e Linux. Ele vem
com uma variedade de peças, incluindo placas e componentes com os quais você pode construir
diagramas. Além disso, fabricantes de peças como SparkFun e AdaFruit geralmente fornecem peças
Fritzing para seus produtos. Consegui encontrar uma peça para o APDS 9960 no repositório
Fritzing_Parts do SparkFun, por exemplo (http://mng.bz/Hsa2).
(www.autodesk.com/products/eagle/freedownload).
KiCad EDA é outra opção para plataforma cruzada, esquema de código aberto e software de design
de PCB (http://kicadpcb.org/).
Se você está interessado em experimentar a simulação de circuitos eletrônicos - não placas de alto nível
- você pode tentar o iCircuit App ($ 9,99), disponível para iOS, Android e Windows (desktop e telefone). Este
Em vez disso, é um mecanismo de simulação ao vivo que permite ver o que realmente acontece conforme
Um dos muitos registradores no APDS9960 é um registrador DEVICE_ID somente leitura, com endereço
0x92 (p. 25 do datasheet). Ao ler um byte desse endereço, você deve sempre obter o valor 0xAB (figura
9.17). Isso não é útil para a operação posterior do chip, mas é uma maneira conveniente de garantir
2
que a comunicação do IC esteja funcionando e que você esteja, de fato, conectado a um APDS9960.
UAU! e-book
www.wowebook.org
Machine Translated by Google
board.on('pronto', () => {
board.i2cConfig({ endereço: 0x39 });
board.i2cReadOnce(0x39, 0x92, 1, data => { if (data[0] !== 0xAB) { // O registro DEVICE_ID deve retornar 0xAB
});
});
2
1 Inicia as comunicações IC com endereço escravo 0x39. Este é o APDS
2
Endereço IC codificado do 9960.
UAU! e-book
www.wowebook.org
Machine Translated by Google
2 Lê 1 byte do registrador 0x92 do dispositivo no endereço 0x39
2
Interface IC padrão
2
Tessel tem duas interfaces IC. JohnnyFive, via tesselio, usará automaticamente o da porta A se
não for informado nas opções passadas para board.i2cConfig().
2
Recursos de IC no JohnnyFive
2
A implementação subjacente real desses métodos utilitários de IC - que também, sem
2
surpresa, incluem a capacidade de gravar em um dispositivo IC - depende do plug-in de E/S
ativo. No caso do Tessel, isso é tratado pelo tesselio; para o Arduino, seria a Firmata fazendo
o trabalho pesado aqui.
Depois de ver com sucesso a mensagem registrada “Connected to APDS9960!” é hora de seguir
em frente e construir o próprio plug-in do componente.
// Dependências
const Emitter = require('events').EventEmitter;const util = require('util');
* @param {Object} opts Opções: pin, endereço * pin denota conexão de pino de
interrupção
*
// Estende a classe EventEmitter do Node.js para que nosso objeto possa emitir eventos
util.inherits(APDS9960, Emissor);
APDS9960.prototype.readGesture = função () { };
APDS9960.prototype.processGesture = function () { };
retornar APDS9960;
}());
};
Figura 9.18. A máquina de estado do plug-in agora está completa. O próximo passo
é implementá-lo.
Você obterá algumas constantes definidas primeiro, pois existem muitas delas. Mas não entre em pânico. As
constantes em APDS9960.js definem endereços de registro, máscaras de bits, valores padrão e alguns outros
Descobrir quais registradores precisam ser escritos para configurar e habilitar o dispositivo é um
quando disponíveis).
A Figura 9.19 mostra alguns dos registradores nos quais as definições de configuração são gravadas
durante a configuração e habilitação. Alguns valores de registradores são definidos como um valor
padrão simples e sensível, como GPENTH, que é definido como a representação binária de 40. Outros
são desativados — GOFFSET_U é definido como 0x00. E alguns são bitmasks, definindo vários
Por exemplo, o registrador no endereço 0xA3 (GCONF2), contém configuração para três
features (figura 9.20).
Figura 9.20. Diferentes faixas de bits dentro do registro GCONF correspondem a diferentes
configurações. Os dois bits nas posições 6 e 5 definem o ganho do gesto, por exemplo. O bit 7
não é usado.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Mais uma vez, indico o excelente artigo do MDN sobre operadores bitwise e bitmasking (http://mng.bz/
CLvy).
const REGISTROS = {
ENABLE: 0x80, // Habilita diferentes sensores/recursos (p.20)
WTIME : 0x83, // Valor de configuração do tempo de espera (p.21)
PPULSE: 0x8E, // Contagem e duração do pulso de proximidade (p.23)
CONFIG2 : 0x90, // Segundo registro de configuração (p.24), para aumento de LED DEVICE_ID: 0x92, // Contém ID do
dispositivo (0xAB) (p.25)
GPENTH : 0xA0, // Limiar de proximidade de entrada para gestos (p.27)
GEXTH : 0xA1, // Sair do limite de proximidade para gestos (p.28)
GCONF1 : 0xA2, // Gesture config 1: mascaramento de detecção de gesto (p.28)
GCONF2 : 0xA3, // G config 2: ganho, drive de LED, tempo de espera por gesto (p.29)
GOFFSET_U: 0xA4, // Deslocamento do gesto (para cima) (p.30)
GOFFSET_D: 0xA5, // Deslocamento do gesto (para baixo) (p.30)
GULSE: 0xA6, // Contagem e duração do pulso do gesto (p.31)
GOFFSET_L: 0xA7, // Deslocamento do gesto (esquerda) (p.30)
GOFFSET_R: 0xA9, // Deslocamento do gesto (direita) (p.31)
GCONF4 : 0xAB, // Gesture config 4: interrupções, habilitação do modo (p.32)
GFLVL : 0xAE, // Gesture FIFO level: # of datasets in FIFO (p.32)
UAU! e-book
www.wowebook.org
Machine Translated by Google
GSTATUS : 0xAF, // Status do gesto; bit 0 indica dados disponíveis (p.33)
GFIFO_U : 0xFC, // 1º registrador FIFO em (RAM)—leia os dados daqui (p.33)
};
const SINALIZADORES = {
GFIFOTH : 0b10000000, /* Limiar FIFO: acionar interrupção após 4 conjuntos de dados em FIFO (GCONF1 <7:6>
p.28) */ GGAIN : 0b01000000, /* Controle de ganho de gesto: 4x (GCONF2 <6:5> p.29 ) */ GLDRIVE : 0b00000000, /*
Intensidade do LED do gesto: * 100mA (GCONF2 <4:3> p.29) */ GWTIME :
0b00000001, /* Tempo de espera do gesto:
2,8 ms (GCONF2 <2:0> p.29) */ GPLEN : 0b11000000, /* Comprimento do pulso do gesto: 32ÿs
(GPULSE <7 :6> p.31) */ GPLEN : 0b00001001, /* Contagem de pulso do gesto: 10
(9 + 1) (GPULSE <5:0> p.31) */ GVALID : 0b00000001, /* O valor do registro GSTATUS indica
dados válidos se o bit 0 for 1 */
};
};
para ele por um LED infravermelho embutido. Os detalhes da configuração desse LED – quanta energia é
usada para acioná-lo, quantas vezes ele pulsa e quanto tempo cada pulso dura por ciclo de detecção –
de gestos.
util.inherits(APDS9960, Emissor);
APDS9960.prototype.resetGesture = function () {
this.gestureData = {
cru: [],
deltas: {}, moves: { // Um
gesto pode ter movimentos em mais de um eixo vertical : false,
horizontal: falso,
para cima: falso,
para baixo: falso,
esquerda: falso,
certo: falso
}, valid:
false, // A decodificação do gesto foi bem-sucedida?
direção: indefinida
};
};
2 A interrupção passará de ALTO para BAIXO para ativar; começa com um valor ALTO (1)
2
3 Prepara o endereço IC para passar para i2cConfig
2
4 Também retém o endereço IC no objeto do componente
REGISTERS[rKey], [SETUP_DEFAULTS[rKey]]);
}
if (typeof callback === 'function') { callback.call(this);
}
};
APDS9960.prototype.enable = função () {
UAU! e-book
www.wowebook.org
Machine Translated by Google
// Configure o tratamento de interrupção
this.io.pinMode(this.pin, this.io.MODES.INPUT); // As interrupções do dispositivo estão ativas em nível BAIXO—
quando o pino for BAIXO, devemos agir
this.io.digitalRead(this.pin, dados => {
if (dados !== this.interruptState && dados === 0) {
this.readGesture();
}
this.interruptState = dados;
});
REGISTERS[rKey], [ENABLE_VALUES[rKey]]); }
};
6 Assim como a configuração, escreve a configuração para recursos específicos do modo de gesto
Com esse código de inicialização e configuração definido, vamos atacar a verdadeira essência do plug-
in: ler e processar dados de gestos. Quando o pino de interrupção fica BAIXO, readGesture é invocado,
this.io.i2cReadOnce(this.address,
REGISTERS.GFIFO_U, (fifoLevel * 4), rawData => { for (var i = 0; i < rawData.length; i += 4)
{ this.gestureData.raw.push({ up : rawData[i],
UAU! e-book
www.wowebook.org
Machine Translated by Google
para baixo : rawData[i + 1],
esquerda: rawData[i + 2],
direita: rawData[i + 3]
});
}
return this.readGesture(); // Continue lendo os dados...
});
});
} else { // Não há (mais) dados para coletar sobre este gesto this.processGesture();
this.decodeGesture();
this.resetGesture();
}
});
};
Lembre-se de que cada conjunto de dados tem quatro bytes (um byte para cada direção),
portanto, o número total de bytes a serem lidos do FIFO é fifoLevel * 4. readGestures usa o
método i2cReadOnce mais uma vez, desta vez lendo fifoLevel * 4 bytes de um único byte. Em
seguida, itera sobre cada conjunto de dados completo e insere bytes individuais
correspondentes a cada direção na estrutura de dados brutos para processamento posterior. Em
seguida, chama a si mesmo (recursivamente) novamente para ver se há mais dados disponíveis para leitur
UAU! e-book
www.wowebook.org
Machine Translated by Google
Este ciclo se repete até que o valor do registro GSTATUS indique que nenhum dado válido foi deixado para
Os métodos em seu plug-in APDS9960 distinguem entre processamento e decodificação de dados de gestos
(figura 9.22).
Figura 9.22. processData executa aritmética em dados; decodeData deriva a direção do gesto dos resultados
calculados e dispara eventos. Por fim, o objeto de dados do gesto é redefinido na instância para que esteja
pronto para coletar dados do próximo gesto.
APDS9960.prototype.processGesture = função () {
const raw = this.gestureData.raw;
const direçãoDelta = função (el1, el2, dir1, dir2) {
var el2r = ((el2[dir1] el2[dir2]) * 100) / (el2[dir1] + el2[dir2]);
var el1r = ((el1[dir1] el1[dir2]) * 100) / (el1[dir1] + el1[dir2]);
retornar el2r el1r;
};
const excedeThreshold = raw.filter(amostra => {
return (sample.up > GESTURE_THRESHOLD_OUT && sample.down
> GESTURE_THRESHOLD_OUT && sample.left >
GESTURE_THRESHOLD_OUT && sample.right >
GESTURE_THRESHOLD_OUT); });
2 Filtra as amostras para incluir apenas aquelas com leituras que excedem o
limite
Por fim, a etapa de decodificação na listagem a seguir converte os deltas calculados pelo método
processGesture em direções derivadas para o gesto geral. Em seguida, ele dispara um evento
correspondente — para cima, para baixo, para a esquerda ou para a direita — ou, se não puder
determinar uma direção de gesto simples e clara, disparará um evento de gesto genérico, conforme
UAU! Listagem
de e-books 9.14. Decodificando dados
de gestos www.wowebook.org
Machine Translated by Google
Listagem 9.14. Decodificação de dados de gesto
this.gestureData.direction = (this.gestureData.movements.left) ?
'esquerda direita';
}
}
// Emite um evento direcional se houver uma direção
if (this.gestureData.direction)
{ this.emit(this.gestureData.direction, this.gestureData); }
Agora você pode editar index.js para adicionar algum código de teste rápido, conforme mostrado
na listagem a seguir. Antes de chegar à grande etapa de combinação - conectar os interruptores
remotos - você pode testar diferentes eventos de furto de direção e registrá-los no console.
www.wowebook.org
Machine Translated by Google
board.on('pronto', () => {
gesto const = new gesto ({ pin: 'A2'});
gesto.on('direita', () => console.log('direita'));
gesto.on('esquerda', () => console.log('esquerda'));
gesto.on('para cima', () => console.log('para cima'));
gesto.on('para baixo', () => console.log('para baixo'));
});
Execute index.js no Tessel (t2 run index.js lan) e tente mover sua mão sobre a parte superior
do sensor de gestos — a melhor distância é de cerca de 20 cm (oito polegadas).
board.on('pronto', () => {
gesto const = new gesto ({ pin: 'A2'});
const switch1 = new RemoteSwitch({ pins : { on: 'A3', off: 'A4' } });
gesto.on('direita', () => switch1.on());
gesto.on('esquerda', () => switch2.on());
});
Até agora tudo bem. Mas um dos objetivos declarados no início não era a capacidade de ligar ou
desligar todos os interruptores de uma só vez? A boa notícia é que você está prestes a fazer isso
acontecer. A outra notícia é que você precisa dar mais um passo para que isso aconteça.
Listagem 9.17. Um par de botões gerenciados por uma instância RemoteSwitch tem
uma fila
Mas, infelizmente, há uma falha: o enfileiramento é gerenciado individualmente para cada par de
switches. Diferentes instâncias de RemoteSwitch não têm ideia umas das outras; consulte a listagem
a seguir.
É bastante provável que o switch2 e o switch3 tentem ativar enquanto o switch1 ainda está
ocupado - o equivalente a apertar vários botões no controle remoto ao mesmo tempo.
Isso provavelmente não é bom. O RemoteSwitch foi projetado de forma que cada par de switches
não se conheça. Isso é um bom aceno para a abstração de hardware, mas nossa realidade é que
vários pares de switches estão compartilhando o mesmo transmissor em um único controle remoto.
dispositivo.
Hooboy, outro ponto de inflexão do projeto. Você poderia separar RemoteSwitch e reescrevê-lo
para lidar com vários conjuntos de switches e suas filas misturadas. Ou você pode escrever algum
código para gerenciar vários pares de switches dentro da lógica específica do aplicativo.
Ambas as opções têm desvantagens. Seria tedioso adaptar o RemoteSwitch sem quebrar sua
API existente ou complicá-la demais (essa opção pareceria mais atraente se você estivesse
começando do zero). Despejar a lógica relacionada em seu código de aplicativo principal seria
feio e perturbador. Depois de refletir um pouco, optei por uma terceira opção pragmática -
embora ligeiramente remendada - que tira vantagem de um Johnny
Cinco mixins chamados Collection.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Classes de coleção incorporadas como Motors (que você viu no capítulo 6) usam o mixin Collection no JohnnyFive,
que fornece recursos para gerenciar vários componentes em um único objeto semelhante a um contêiner. Você
pode usar alguns dos recursos oferecidos por este mixin para criar um componente que pode gerenciar vários
objetos RemoteSwitch. Depois de concluído, você poderá escrever um código como o da lista a seguir de dentro do
if (this.queue.length) { write.apply(this,
this.queue.shift());
}
});
};
// Os métodos de protótipo aceitam o argumento `idx` opcional para designar qual // switch ativar. Se não for
fornecido, todos os interruptores serão afetados.
RemoteSwitches.prototype.toggle = function (idx, turnOn) { if (typeof idx !== 'undefined' && this[idx])
{
write.call(this, this[idx], turnOn);
} outro {
this.each(whatSwitch => write.call(this, whichSwitch, turnOn));
}
};
Combine os dois circuitos — controle remoto e gesto — conforme mostrado na figura 9.23.
Os lados de saída dos fotoacopladores devem ser conectados aos contatos do botão do
controle remoto. Observe que os fotoacopladores agora estão conectados a pinos diferentes no
Tessel para abrir espaço para o APDS9960.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se você usar uma breadboard de tamanho normal, conforme mostrado na figura 9.23, certifique-se de conectar
os trilhos de alimentação conforme mostrado no meio do comprimento da placa: as conexões do trilho de alimentação
têm uma interrupção no meio.
Você pode pensar em uma breadboard de tamanho normal como duas breadboards de meio tamanho juntas.
Finalizando o software
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para abrir espaço para as conexões APDS9960, as conexões para os fotoacopladores precisam diminuir
alguns pinos (consulte a figura 9.23) — esses números de pinos atualizados são contabilizados na
board.on('pronto', () => {
gesto const = new gesto ({ pin: 'A2'});
interruptores const = new RemoteSwitches([
new RemoteSwitch({ pins : { on: 'A3', off: 'A4' } }), new RemoteSwitch({ pins: { on: 'A5', off: 'A6' } }),
new RemoteSwitch({ pins: { on: 'A7', off: 'B0' } }) ]);
2 Você pode, é claro, alterar quais gestos correspondem a qual comportamento do switch.
Isso foi muito trabalho! Mas há alguns resultados sólidos aqui. Você definitivamente esculpiu mais alguns
entalhes triunfantes em seu pólo de experiência em hackers eletrônicos. É claro que ainda há fios
indo para todos os lugares, algo que você abordará daqui a pouco quando examinarmos diferentes tipos
Falando em fatores de forma, você tem dado muita atenção ao Arduino Uno e ao Tessel, usando ambos
com o JohnnyFive. Mas há muito mais opções de hardware controlado por JavaScript por aí. É
RESUMO
Eletrônicos de consumo de baixa voltagem operados por bateria podem muitas vezes ser
reaproveitados em peças e componentes para seus próprios projetos (desde que você tenha cuidado!).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os componentes do fotoacoplador podem ajudar a isolar os circuitos desses componentes
A invenção requer engenhosidade, mas também persistência e paciência. Muitas vezes requer
Folhas de dados podem ser extremamente densas em dados, mas são vitais e, com o tempo, você
aprenderá os truques e poderá encontrar informações importantes dentro deles – como endereços
UAU! e-book
www.wowebook.org
Machine Translated by Google
Esta parte do livro explora alguns outros ambientes nos quais você pode usar JavaScript para
Tutoriais
Você começará no capítulo 10 examinando ambientes JavaScript e semelhantes a JavaScript em dispositivos
plataformas Highlights . No capítulo 11, voltaremos nossa atenção para hardwares mais robustos:
as computadores de placa única de uso geral (SBCs) que possuem recursos de E/S integrados. Você colocará
Sair O
Capítulo 12 fornece uma amostra de algumas outras partes do ecossistema IoT e examina o que é possível em um
navegador da web. Você usará um serviço de nuvem para empacotar e implantar um aplicativo JohnnyFive em um
BeagleBone Black e explorará a vanguarda da Web Bluetooth e da Web física com o dispositivo Espruino Puck.js.
Quando terminar esta parte do livro, seu kit de ferramentas JavaScript on Things estará bem abastecido e
você estará pronto para partir por conta própria no mundo corajoso e inspirador do JavaScript e dos sistemas
embarcados.
UAU! e-book
www.wowebook.org
Machine Translated by Google
DestaquesElemento Kinoma
Criando texto e formas com os visores LCD do Nokia 5110 e o Espruino Graphics
Biblioteca de suporte
Na primeira metade deste livro, os fundamentos da eletrônica foram demonstrados usando um Arduino
Uno conectado — uma configuração de hostclient. Nos últimos capítulos, no entanto, você conheceu o
Tessel 2, que tem a capacidade de executar o Node.js nativamente em seu sistema operacional OpenWrt
Agora vamos dar uma olhada em uma terceira classe de plataformas controladas por JavaScript:
hardware embarcado restrito com suporte nativo para JavaScript (ou, geralmente, algo parecido
com JavaScript). Para realizar essa façanha com recursos de hardware tão limitados, essas plataformas
Esses dispositivos estão evoluindo rapidamente, entrando (e saindo) do mercado mais rapidamente do
que pode ser capturado na impressão. Neste exato momento, a plataforma Espruino – veremos em
breve o Espruino Pico – parece estar mantendo um impulso robusto (figura 10.1). O Elemento
,
Kinoma - também no convés para nossas investigações - está em pré-lançamento há algum tempo.
Embora o tempo de execução incorporado do Kinoma tenha sido considerado um pioneiro no suporte à
A obsolescência é praticamente garantida para informações de hardware e software IoT comprometidas para
impressão, e é por isso que este capítulo se concentra mais em tarefas e quebra-cabeças comuns em
plataformas JavaScript incorporadas. Produtos e plataformas específicos vêm e vão, mas há várias etapas de
pesquisa comuns que podem ajudá-lo a se atualizar rapidamente em qualquer produto que você escolher.
1 bico espruim
1 Elemento Kinoma
1 cabo USB 2.0 A para USB A fêmea (também conhecido como cabo de extensão USB)
2
1 placa multissensor Adafruit BMP180 IC
1 resistor de 100 V
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 placa de magnetômetro Adafruit HMC5883L (bússola)
Fios de jumper
O Espruino Pico tem menos memória e menos poder computacional que o Tessel 2.
Não há WiFi nem suporte para periféricos USB, então por que usá-lo? Porque ele se destaca em outras
coisas: é mais barato, é minúsculo, é confiável e tem baixo consumo de energia - marcas registradas de
firmware que vem pré-flash nos dispositivos Espruino. Espruinotheinterpreter suporta a maioria dos
recursos JavaScript, mas não todos eles. Você não pode omitir ponto e vírgula, por exemplo, e expressões regulares
É importante diferenciar JavaScript e JavaScriptesque de Node.js: isso não é Node.js, então você não pode usar
UAU! e-book
www.wowebook.org
Machine Translated by Google
Em vez disso, o Espruino fornece sua própria API JavaScript para interagir com a E/S do
hardware (www.espruino.com/Reference#software). Você tem experiência suficiente agora que
os aspectos da API provavelmente soam familiares - há uma função analogRead, por exemplo,
que usa um número de pino como argumento. Existem também módulos Espruinoespecíficos que
encapsulam o comportamento de componentes eletrônicos específicos, como você verá.
Antes de examinar o Pico com mais profundidade, você vai configurá-lo e dar uma olhada em
um script Hello World LED piscando.
Figura 10.2. O Pico tem 18 pinos (duas fileiras de 9 cada) em um passo de 0,1 polegada
- compatível com breadboard. Eles precisarão ser soldados nos pinos de cabeçalho. Uma
extremidade da placa Pico é moldada para que possa ser conectada diretamente a uma porta USB.
O Pico se conecta diretamente a uma porta USB. Algumas versões do Pico têm uma conexão micro
USB adicional, mas você pode ficar preso apenas com a conexão USB A. Isso pode ser conveniente,
porque você pode conectar seu Pico diretamente ao seu computador, mas se quiser usar o Pico em
uma breadboard - o que é necessário quando você deseja experimentar qualquer um dos pinos de E/
S - fica um pouco complicado. . O Pico foi projetado para se conectar a um conector USB A
fêmea. Você pode usar o tipo de cabo comercializado como um cabo de extensão USB para obter
as conexões USB A para USB A fêmea de que o Pico precisa (figura 10.3).
Figura 10.3. Você pode usar um cabo de extensão USB para conectar seu Pico ao seu
computador, permitindo que o Pico seja colocado em uma breadboard. A extremidade USB do
Pico se encaixa em uma conexão USB A fêmea.
UAU! e-book
www.wowebook.org
Machine Translated by Google
As coisas estão evoluindo rápido o suficiente na família Espruino que incluir instruções exaustivas de configuração
aqui seria uma tolice. Em vez disso, vá para https://espruino.com para obter
iniciado.
2. Instale o aplicativo Espruino IDE Chrome (e o navegador Chrome se você não o tiver
instalado).
Para experimentar o Pico, você usará o IDE baseado na web do Espruino (aplicativo do Chrome) - isso significa que
UAU! e-book
www.wowebook.org
Machine Translated by Google
No lado esquerdo da interface do aplicativo, você verá uma área de console semelhante a
um terminal. Uma vez conectado a um Pico, você pode digitar expressões aqui diretamente, como
um interpretador Node.js ou JohnnyFive REPL. No lado direito está uma área onde você
pode compor scripts.
Vamos tentar com o piscar obrigatório de um LED. Para esta experiência, você usará um
dos LEDs integrados do Pico, para poder conectar o Pico diretamente à sua porta USB ou
colocá-lo em uma breadboard com um cabo de extensão USB: a escolha é sua.
Uma variedade de variáveis está disponível em nível global nos scripts Espruino, pertencentes
aos recursos e pinos da plataforma. Isso inclui as variáveis LED1 e LED2 para os LEDs vermelho
e verde embutidos no Pico, respectivamente (figura 10.5).
Figura 10.5. Este experimento fará com que os LEDs internos do Pico - um vermelho,
um verde - pisquem alternadamente. O acesso aos LEDs é feito através das variáveis
globais LED1 e LED2.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Abra o aplicativo Espruino IDE Chrome e conecte-se ao Pico. Digite o código mostrado
na listagem a seguir na área de composição de código da tela (lado direito) e clique
no ícone Send to Espruino no centro (figura 10.6).
} outro {
digitalWrite(LED1, 0);
digitalWrite(LED2, 1);
}
ledStatus = !ledStatus;
setTimeout(toggleLED, 500); 2
}
alternarLED(); 3
UAU! e-book
www.wowebook.org
Machine Translated by Google
3 Inicia a alternância
Figura 10.6. Inserindo o código de piscada do LED no Espruino IDE (tamanho da fonte aumentado
para visibilidade)
Este exemplo usa a função digitalWrite do Espruino para alternar entre os LEDs HIGH e LOW. Depois
de implantar o código no Pico, você deve ver os LEDs vermelho e verde do Pico piscando, um de cada
vez. Você também verá alguma saída no lado esquerdo do IDE
janela.
Agora que você começou a trabalhar, vamos voltar um pouco. Como você sabe que o Pico tem dois
LEDs embutidos (vermelho e verde), e como você sabe que existem variáveis LED1 e LED2? Até
agora, convenções como digitalWrite sendo um nome para uma função que escreve níveis lógicos em
saídas digitais provavelmente parece sensata. Mas ainda pode parecer um tanto mágico ou aleatório.
Por onde começar?
Há uma série de etapas de investigação que você pode aplicar ao enfrentar uma nova plataforma
para avançar rapidamente. Você os abordará para aprender especificamente sobre o Pico agora, mas
poderá reutilizá-los para avaliar diferentes plataformas incorporadas no futuro:
Antes mesmo de colocar as mãos em uma nova placa ou plataforma de desenvolvimento, você provavelmente
desejará ter uma noção geral do que ela pode fazer.
Muitas vezes, os principais detalhes são resumidos no site do fabricante ou do fornecedor. No caso do Pico, uma
lista de recursos que a página do Pico nos dá: é um dispositivo de 3,3 V, pequeno em formato (33 mm x 15 mm),
alimentado por um microcontrolador STM32F401CDU6 (não, meu gato não basta caminhar sobre o meu teclado;
ST — o fabricante — tem convenções de nomenclatura pouco românticas, mas bastante precisas) e usa um
Também na lista de recursos principais estão pontos sobre o consumo de energia (figura 10.7).
Mesmo que os números específicos citados aqui não atinjam o alvo, você pode ver que eles estão fazendo barulho por
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
Existem 22 pinos GPIO no dispositivo, incluindo 3 interfaces IC e 3 interfaces SPI
(hardware) - nada mal para algo tão pequeno. Se você clicar no
datasheet do microcontrolador (http://mng.bz/i7r8), verá que tem que
agradecer à família STM32F401D/E (há uma seção sobre interfaces de
comunicação na página inicial).
Um par de outros recursos saltam para fora. Um deles é um bom aceno para a onipresença da lógica de
5 V - "Todo GPIO é tolerante a 5 volts (compatível com Arduino)" - uma gentileza para aqueles de nós
que precisam alternar muito entre os dois. A saída sempre será de 3,3 V, mas a entrada de 5 V não dará o
Pico azia.
Outro detalhe digno de nota: embora 18 pinos (duas fileiras de 9) estejam em uma protoboard padrão
de 0,1ÿ de pino, 8 pinos em uma extremidade curta estão separados por apenas 0,05ÿ (figura 10.8). Você
não usará esses pinos em suas explorações, pois eles não se encaixam facilmente em uma
placa de ensaio, mas existem calços físicos que você pode obter para tornar isso possível.
Figura 10.8. Oito dos pinos de E/S do Pico estão em um passo de 0,05 polegada: muito estreito para
encaixar em breadboards.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Concedido, esta lista particular de recursos não menciona que este é um dispositivo com JavaScript,
o que é uma espécie de chave, mas você certamente pode obter isso na página inicial do Espruino
(www.espruino.com ).
Tanto o Espruino Pico quanto o Kinoma Element são baseados em microcontroladores da família
ARM Cortex M. Assim como os MCUs ATmega são encontrados em todos os tipos de placas
hostclientclass compatíveis com Arduino (como o Arduino Uno e seus irmãos), os MCUs ARM
Cortex M são muito populares para a classe de plataformas embarcadas que incluem o
Elemento e o Pico. O site da ARM afirma que dezenas de bilhões de dispositivos foram
Os microcontroladores de 32 bits da família Cortex M superam os ATmegas de 8 bits enquanto ainda operam com
baixo consumo de energia (a maioria não é previsivelmente tão barata). Os tempos de execução de JavaScript
incorporado (ou semelhante a JavaScript) precisam de mais poder de processamento do que um ATmega de 8
UAU! e-book
www.wowebook.org
Machine Translated by Google
À medida que você continua a experimentar novas plataformas, é provável que continue a
encontrar variantes do Cortex M.
Outra coisa que é útil entender é o modelo financeiro e de licenciamento da plataforma. O hardware
ou software (ou ambos) é de código aberto ou são proprietários? Isso pode ser relevante se você estiver
pensando em usar uma plataforma comercialmente, estender hardware ou software ou fazer
contribuições para uma plataforma. (As plataformas Espruino são totalmente de código aberto.)
Talvez seja porque eu adoro mapas, mas encontrar e analisar o diagrama de pinagem de uma placa
geralmente é quando as coisas realmente se encaixam. Esses diagramas mostram quais pinos podem
fazer o quê: interfaces de comunicação, PWM, pinos de alimentação e assim por diante.
A partir do diagrama do Pico (figura 10.9), podemos notar algumas coisas (veja em tamanho maior e
com mais detalhes na página de documentação do Pico do Espruino: www.espruino.com/Pico). Por um
lado, os números dos pinos não são sequenciais; eles saltam um pouco e você encontrará os pinos A e
B em ambos os lados que usará. Você também pode ver que há suporte para PWM em quase
todos os pinos GPIO. Por fim, você pode ver quais pinos têm suporte de hardware para IC e SPI
2
e quais podem suportar ADC (conversão analógico-digital).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Uma combinação de layout de pino geral sensato (design de hardware) e diagramas de pinagem de alta
É compatível com o seu sistema operacional? O processo de configuração é opressor e tedioso? Isso
lugar – mas se você for o tipo de pessoa que tem um anexo ao seu próprio editor ou IDE para escrever
Tenha uma noção das construções de software de alto nível: existem plugins ou outros
UAU! e-book
www.wowebook.org
Machine Translated by Google
componentes modularizados? Existe uma API geral orientada para hardware? Espruino tem
ambos estes.
Percorrer alguns exemplos do Hello World é o próximo passo, e você já fez isso com o Pico. Ao
experimentar uma nova plataforma, descubra como realizar algumas tarefas comuns, como piscar
LEDs, ler dados de um sensor analógico, trabalhar com monitores e controlar dispositivos IC.
2
Idealmente, você terá experiência prática nesta etapa, obtendo uma noção de como realmente é
interagir com a plataforma durante o desenvolvimento.
Depois de entender o quadro geral e ver (e experimentar) alguns exemplos aplicados, acessar a
documentação de referência pode ajudar a preencher os detalhes.
Se você olhar a documentação da API do Espruino (10.10), verá classes JavaScript familiares —
String, Math, Boolean, JSON — junto com classes específicas do Espruino relevantes
para coisas de hardware: I2C, SPI, WLAN. A seção Globals lista funções de hardware como
digitalWrite() disponível para scripts Espruino, e também alguns recursos globais padrão de JavaScript
Há também uma página que lista os módulos disponíveis para Espruino e como usá-los
(www.espruino.com/Modules). Mais sobre isso à medida que exploramos o Pico mais profundamente.
À medida que aprende mais sobre uma plataforma e ganha experiência com ela, você passará de
uma fase de aprendizado, em que procura exemplos, conceitos e tutoriais pré-configurados, para uma
fase de referência, em que busca detalhes sobre como realizar tarefas específicas.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Em seguida, você dará uma volta no Pico e fará alguns experimentos. Primeiro, você revisitará o
multissensor meteorológico BMP180, mas o combinará com um componente de tela LCD Nokia
5110 para construir uma miniestação meteorológica independente e de boa aparência.
1 bico espruim
Como você está usando o Web IDE, trabalhar com módulos Espruino é tão fácil quanto usar uma
instrução require() no código Espruino com o nome do módulo que você procura.
Esses módulos fornecem suporte encapsulado para diferentes tipos de componentes. E, huzzah,
existe um módulo existente para o seu confiável multissensor de temperatura e pressão BMP180. O
módulo é chamado de BMP085 porque também é compatível com o sensor BMP085 similar. Depois
que o módulo for importado, você pode usar a API fornecida para
interagir com o sensor BMP180. Vamos ver o que isso parece.
Este experimento registrará a temperatura atual (em Celsius) e a pressão (em pascal)
2
conforme obtido do sensor IC BMP180.
O código necessário para registrar as leituras de um BMP180 não é muito denso, como você verá na
2
Listagem 10.2. Ele faz uso do I2C1 global exposto para configurar uma interface IC que passa para o
Como você viu, JohnnyFive fornece várias construções para executar ações contínuas e periódicas,
como leituras de sensores - board.loop, por exemplo. Mas você não está usando JohnnyFive aqui.
Em vez disso, você seguirá a convenção Espruino, que usa setInterval para E/S repetida.
2 2
1 Configura a primeira interface IC do Pico (I C1), usando os pinos B6 para SCL e
B7 para SDA
10.11).
Para construir isso, você vai querer colocar o Pico em uma placa de ensaio de tamanho normal e usar
A configuração pode parecer um pouco absurda no momento. “Por que colocar o sensor BMP180 tão longe
do Pico?” você pode estar se perguntando. Há um método para essa loucura: a lacuna resultante permitirá
a expansão desse circuito para acomodar o componente Nokia 5110 LCD em experimentos futuros.
Se esta é a primeira vez que você usa uma protoboard de tamanho normal, observe que na verdade são
duas protoboards de meio tamanho unidas de ponta a ponta, em termos de conexões elétricas. Uma
pegadinha com breadboards de tamanho normal é que os trilhos de alimentação têm uma interrupção
Figura 10.12. Não se esqueça! Os trilhos de alimentação em uma breadboard de tamanho normal têm
uma quebra no meio da placa.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Implantando o código
Insira o código da listagem 10.2 no lado direito do IDE e clique no ícone de seta para
cima Enviar para Espruino para executar o código no Pico. A pressão e a
temperatura registradas aparecerão no lado do console/terminal (esquerdo) da janela
IDE (figura 10.13).
Figura 10.13. Depois que o script BMP180 for carregado no Pico, você deverá ver o
log de saída no lado esquerdo da tela uma vez por segundo.
UAU! e-livro
10.3.2. O Pico e o Nokia 5110 LCD www.wowebook.org
Machine Translated by Google
10.3.2. O Pico e o Nokia 5110 LCD
1 bico espruim
1 resistor de 100 V
Fios de jumper
A tela de 48x84 pixels do Nokia 5110 (figura 10.14) foi originalmente usada na popular família de
telefones Nokia 51xx, que data do final da década de 1990 (ótimos telefones, a propósito — eles eram
conhecidos por sua durabilidade, excelente duração da bateria e facilidade de uso). usar). As unidades
Nokia 5110 LCD podem ser encontradas online por apenas US$ 6, mas são mais fáceis de
encontrar por cerca de US$ 10 cada. Eles são pequenos componentes excelentes: 48x84 pixels não é
um espaço infinito, mas é muito mais do que o 16x2 que vimos até agora. Há espaço para desenhar, animar e
Figura 10.14. O Nokia 5110 LCD tem resolução de 48x84 pixels e uma interface SPI fornecida por seu
driver Phillips Semiconductor PCD8544. O visor é mostrado aqui com o lado direito para cima.
UAU! e-book
www.wowebook.org
Machine Translated by Google
A exibição é controlada por um driver Philips Semiconductor chamado, dessa maneira nada
memorável que esses componentes costumam ter, o PCD8544. O PCD8544 fornece uma
Você começará criando um cronômetro visual de contagem regressiva usando o Nokia 5110 sozinho e,
em seguida, o combinará com o BMP180 para criar uma pequena estação meteorológica.
Diferentes módulos PCD8544/Nokia 5110 possuem diferentes pinagens! Verifique a rotulagem dos pinos
de sua placa antes de tentar seguir o diagrama de fiação na figura 10.15. as conexões
deve ser serigrafado no quadro.
Vale notar que a pinagem do módulo SparkFun é diferente da assumida no tutorial “Pico LCD Display
Hello World” no site do Espruino (http://mng.bz/604s), mas o layout documentado pelo SparkFun
O diagrama de fiação neste capítulo é baseado na versão SparkFun do Nokia 5110 e assume uma
Consulte a tabela 10.1 para obter informações específicas sobre quais pinos dos módulos LCD se conectam no Pico.
Deixe o BMP180 conectado do experimento anterior - você o usará novamente em um minuto - e conecte o Nokia
5110 a uma seção livre da breadboard de tamanho normal, conforme mostrado na figura 10.15 (e resumido na
tabela 10.1).
Figura 10.15. Diagrama de fiação para a adição de um componente Nokia 5110 LCD
ao circuito
pino do módulo LCD Função de pino do LCD Conectar ao pino Pico Cor do fio no diagrama
UAU! e-book
www.wowebook.org
Machine Translated by Google
Se você estudar a figura 10.15, notará alguns detalhes que indicam clareza e estética, tanto no próprio
Por exemplo, observe as conexões de energia (fios vermelhos). O LED de luz de fundo do BMP180 e do
Nokia 5110 agora compartilha uma das conexões de alimentação positiva. A energia do LED da luz
de fundo do LCD é conectada por meio de um resistor de 100 V - é um LED, portanto, esse valor de resistor
Lembre-se de que os trilhos de energia da placa de ensaio de tamanho normal têm uma
interrupção em suas conexões no meio do lado mais comprido da placa de ensaio (uma placa de ensaio de
tamanho normal é realmente equivalente a duas placas de meio tamanho coladas uma na outra). Daí o
pequeno fio terra extra neste diagrama: ele conecta a energia do terra à outra metade do trilho de
Ao trabalhar com diagramas de circuitos, muitas vezes você verá recursos feitos para manter a aparência
do circuito “organizado”, como aquela conexão de aterramento dividida. Ainda outro exemplo na figura
10.15 é o fio laranja para o D/C do Nokia 5110 (modo de dados/comando); a conexão é dividida em
dois segmentos para que não tenha que se sobrepor visualmente a outros componentes ou
fios. Outras conexões são interligadas através do entalhe central da breadboard antes de usar fios
Existem muitas maneiras de obter o mesmo circuito resultante. Cada uma das conexões multifio
pode ser feita com um único fio, se você quiser economizar tempo ou fios necessários.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para conhecer o Nokia 5110 e as capacidades gráficas do Espruino, este experimento
cria um cronômetro de 10 segundos que mostra seu progresso usando uma barra de
progresso animada no LCD (figura 10.16). Você pode, é claro, ajustar a duração do cronômetro
no código. O cronômetro é iniciado pressionando o botão integrado ittybitty do Pico.
Para escrever um programa para o timer, você usará o módulo Espruino PCD8544. O código
primeiro configura algumas variáveis e cria uma função de inicialização para configurar o timer
(10.3), conforme mostrado na listagem a seguir.
var lcd;
var progress = 0; // Progresso atual do timer var frameDuration = 200; //
ms (5fps) var timerSeconds = 10;
onInit(); 5
Em seguida, você precisa encontrar uma maneira de um usuário ativar o cronômetro. Você pode
usar o botão onboard do Pico como um gatilho para iniciar o cronômetro fazendo uso de alguns
recursos globais do Espruino: a função setWatch(função, pino, opções) e o pino BTN virtual.
A função setWatch() fornece um comportamento semelhante a uma interrupção, permitindo que você
registre um retorno de chamada que é invocado quando o valor do pino observado muda.
Na listagem 10.4, setWatch() é usado para monitorar o BTN continuamente. Antes de iniciar o
cronômetro, o código garante que não haja outro cronômetro em execução e, em seguida, redefine
o progresso do cronômetro e dá o pontapé inicial.
// variáveis
function onInit() { /* ... */ }
setWatch (função (e) {
if (!timerAtivo) {
progresso = 0;
setInterval(desenho, frameDuration); 1
timerAtivo = verdadeiro;
}
},
BTN, 2
{ repetir: verdadeiro }); 3
O cronômetro é executado invocando repetidamente uma função chamada draw em um intervalo calculado.
Mas o que é a função desenhar? Você precisará escrevê-lo! As tarefas da sua função de desenho serão
incluem incrementar o progresso do temporizador e renderizar seu progresso proporcional na tela LCD.
O objeto retornado pelo método connect do módulo PCD8544—atribuído em seu código à variável lcd—
fornece alguns métodos específicos do LCD como flip(), que pega o conteúdo atual de um buffer e os
exibe na tela, e setContrast()—que método faz o que parece que faria. Além disso, o
A função draw na Listagem 10.5 usa o método drawRect(x1, y1, x2, y2) para desenhar o contorno de uma
caixa que representa a duração total do cronômetro. Em seguida, fillRect(x1, y1, x2, y2) é usado para
desenhar uma barra de progresso preenchida em uma largura representativa do tempo decorrido até o
momento. A única matemática real que a função de desenho precisa fazer é determinar a largura desse
retângulo preenchido — quantos dos 84 pixels horizontais disponíveis do LCD representam a proporção
do tempo decorrido. Isso é calculado e atribuído à variável rightEdge. Para resumir: um retângulo vazio - o
// ...
função desenhar () {
progresso++;
if (progresso > timerLength) { 1
clearInterval();
timerAtivo = false;
}
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Se o cronômetro terminar, desligue-o e pare
3 Usa drawRect(x1, y1, x2, y2) para desenhar uma caixa vazia centralizada verticalmente, oito px
de altura
4 Usa fillRect(x1, y1, x2, y2) para desenhar uma caixa preenchida representando o progresso
até agora
Cole o código do timer no lado direito do Espruino IDE, conecte-se ao Pico e carregue o código.
Pressione o botão do Pico para iniciar o cronômetro.
Você pode fazer ajustes no código, se desejar. Você pode alterar a duração do cronômetro ou
fazer com que o LCD exiba uma mensagem quando o cronômetro estiver completo, por exemplo.
10.3.3. Construindo um dispositivo meteorológico com baixo consumo de energia com o Pico
Figura 10.18. Usando o suporte gráfico do Espruino para criar formas e desenhar strings
de texto
Assim como com o timer, você começará configurando algumas variáveis e uma
função de inicialização, mostrada na Listagem 10.6. As leituras de pressão no BMP180 são
consideravelmente mais precisas se você ajustá-las para a altitude local (em metros).
O método getSeaLevel, disponível em objetos retornados pela função connect() do módulo
BMP085, fornece uma maneira prática de executar essa correção de altitude. Observe que
o método getPressure é usado aqui para ler a pressão e a temperatura ao mesmo
tempo. Certifique-se de ajustar o valor da variável de altitude na próxima listagem
para sua altitude local (em metros).
function onInit () {
clearInterval();
I2C1.setup({ scl: B6, sda: B7});
var bmp180 = require('BMP085').connect(I2C1); SPI1.setup({ sck: B3, mosi: B5 });
lcd = require('PCD8544').connect(SPI1, B13, B14, B15, função
() { 1
setInterval(função () {
bmp180.getPressure(função (leituras) {
draw(readings.temperature, WOW! eBook
www.wowebook.org
Machine Translated by Google
bmp180.getSeaLevel(leituras.pressão, altitude)); 2
});
}, 1000);
});
}
onInit(); 3
Assim como no timer, você precisa escrever a função draw. O código na Listagem 10.7 faz uso de
mais métodos de desenho de formas da biblioteca Graphics: drawLine(x1, y1, x2, y2) e drawCircle(x,
y, radius) (figura 10.18). Ele também se vale de alguns métodos para derivação de dimensões:
getWidth() e getHeight(), por exemplo, que retornam a área utilizável do display, em pixels, para os
eixos x e y, respectivamente.
Por fim, stringWidth(str) calcula a largura em pixels da string fornecida, usando as configurações
de fonte atuais.
Vamos falar de fontes. Há uma pequena fonte de bitmap disponível cujos caracteres têm 4 x 6 pixels
de tamanho. Para usar a fonte bitmap, use o método setFontBitmap() para tornar essa fonte ativa.
Neste exemplo, no entanto, você usará uma fonte vetorial. A fonte vetorial pode ser usada em vários
tamanhos - ela é dimensionada. O método setFontVector(size) definirá a fonte ativa para
Há muitos números na seguinte função de desenho. É um pouco meticuloso, mas tudo aqui é
aritmética de pixel não sofisticada para posicionar elementos de texto e formas. Observe que a
string “mb” na função de desenho (a abreviação de milibares) é “handkerned”, porque
descobri que desenhar a string de uma só vez naquele tamanho de fonte juntava as letras de
maneira ilegível.
// Calcula a largura em pixels do valor da temperatura na fonte de 18px var tempWidth = lcd.stringWidth(tempString);
Coloque todo o código do gadget de previsão do tempo no lado do código do Espruino IDE e use
o ícone Send to Espruino para executar o código no Pico. Ele mostrará a temperatura e a
pressão até que seja desconectado da porta USB do seu computador.
Mas você pode fazer um pouco melhor! No lado esquerdo do IDE, digite o comando save() e
pressione Enter. Isso piscará o código para o Pico. Agora, sempre que o Pico tiver energia, ele
retomará a execução desse código. Experimente conectando o Pico a uma fonte de energia
USB, como um carregador de telefone.
Para enxaguar e repetir o processo de exploração da plataforma, daremos uma breve olhada
em outra plataforma JavaScript incorporada: o Kinoma Element.
O Element é uma pequena plataforma IoT movida a JavaScript com 16 pinos programáveis (figura
10.19). Como o Espruino Pico, é barato - um Element custará cerca de US $ 20 ou talvez um pouco
mais. Também como o Pico, ele não possui os sinos e assobios de seus irmãos mais robustos (e caros)
- você não encontrará USB, Ethernet, SDCard ou outros periféricos integrados - mas possui os bits
básicos necessários para produtos IoT em um pequeno pacote eficiente. Além disso, possui
suporte Wi-Fi integrado.
Para rodar JavaScript nativamente com apenas 512 KB de RAM, o Element utiliza uma tecnologia
chamada XIP (execute in place). O Element executa o FreeRTOS, um sistema operacional de
código aberto simplificado e mínimo. A tensão de operação da placa é de 3,3 V.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O Element vem embalado em um gabinete, o que o torna menos parecido com uma placa e mais com um
dispositivo acabado (o design do gabinete também é de código aberto). Em vez de ter pinos de alimentação
dedicados, você configura qualquer um dos 16 pinos do elemento (8 em cada lado da placa) como 3,3 V ou terra
conforme necessário.
Kinoma usa seu próprio mecanismo JavaScript (licenciado pela Apache), XS6, que, com pequenas
exceções, afirma ser compatível com ES6. Observe que o software IDE do Element está disponível para Mac e
O layout dos pinos do elemento é bastante simples (figura 10.20). É um dispositivo mais simples que o Pico
2
em termos de suporte a recursos de E/S; por exemplo, existem duas interfaces IC, mas não há suporte para
SPI. Por outro lado, é menos complexo descobrir quais pinos fazem o quê, e a numeração é fácil de seguir.
A configuração e o fluxo de trabalho são semelhantes aos do Pico, pois há um IDE para configurar,
criar e implantar. Se você tiver um elemento em mãos, pode acessar o guia de início rápido para obter detalhes
Projetos de código para o Element, desenvolvidos no Kinoma Code IDE (figura 10.21), podem ser
implementados via USB ou WiFi b/g/n. A configuração envolve obter o Elemento em sua rede Wi-Fi
local. Ele receberá seu próprio endereço IP.
Os projetos de aplicativos para o Elemento têm alguma estrutura para eles. Por exemplo, cada
um deve conter um arquivo project.json, que define um ponto de entrada — o script que será
executado no dispositivo. O ponto de entrada padrão é main.js.
Assim como o Espruino, o Kinoma fornece alguns objetos globais para ajudá-lo a interagir
com o hardware, e há a noção de módulos para o encapsulamento do comportamento do
componente. Os módulos Kinoma para controlar componentes de hardware são
conhecidos como BlinkingLight Libraries (BLLs) e envolvem a interação com o hardware
por meio de um módulo de pinos (embutido). Você pode usar instruções de estilo CommonJS para
obter outros arquivos JS em seus projetos e quaisquer módulos BLL integrados ou
personalizados (mas lembre-se, isso não é Node.js: você não pode usar módulos npm).
UAU! e-book
10.4.4. Exemplos e tutoriais www.wowebook.org
Machine Translated by Google
10.4.4. Exemplos e tutoriais
O site da Kinoma tem alguns exemplos de código para o elemento: http://mng.bz/1BaB.
Observando o código de exemplo blinkingLED (http://mng.bz/5t61), fica imediatamente
evidente que a estrutura dos projetos Kinoma é mais formal do que a de algumas outras
plataformas (figura 10.22). Piscar um LED envolve um arquivo project.json para definir o
projeto, um main.js (ponto de entrada) para inicializar a placa e configurar o pino para o LED e
um módulo led.js BLL que fornece o suporte lógico para piscar por meio de um método
de alternância. (O arquivo .project e o arquivo XML no projeto parecem ser para construção
específica do Kinomasite e suporte de metadados.)
Figura 10.22. A fonte para um projeto de exemplo de Kinoma com LED piscando. A
estrutura de um projeto Kinoma é mais envolvente do que a de um projeto Espruino.
Você também precisará trazer seu próprio LED e resistor para a festa, pois não há nenhum LED
onboard evidente que você possa usar. O código dentro do arquivo main.js deste projeto assume que
você está usando os pinos 9 e 10 (terra), mas não há nenhum diagrama de fiação fornecido.
Você aprenderá mais sobre a aparência do código em um script Kinoma main.js daqui a pouco.
Os módulos Kinoma fornecem a API para interação de hardware. O módulo mais imediatamente
relevante é o Pins, que fornece suporte básico de E/S para os tipos de coisas que você esperaria: entrada
e saída digital e analógica; modulação por largura de pulso (PWM); serial (IC, por exemplo). Você
2
pode encontrar um guia do programador no site Kinoma WOW! e-book
www.wowebook.org
Machine Translated by Google
(http://mng.bz/w1lR).
1 Elemento Kinoma
1 tábua de pão
Fios de jumper
O Element, com seu Wi-Fi integrado e bibliotecas de utilitários da web, se presta a atuar como um
Neste experimento, você dará uma olhada no processo de alto nível de criação de um projeto com o
2
Element, criando um BLL personalizado para suportar o magnetômetro HMC5883L IC (bússola).
você usará o módulo WebSocket disponível da Kinoma para executar um servidor WebSocket no elemento
que pode emitir alterações quando a direção da bússola muda. Por fim, você construirá um
documento HTML que se conectará ao servidor WebSocket do Element e será atualizado conforme
O módulo HMC5883L será conectado a uma breadboard. Ao girar a protoboard, você pode alterar a
Socket.IO usa WebSockets para navegadores com suporte a WebSockets e recorre a outros métodos para
Neste exemplo, você usará WebSockets propriamente dito: o aplicativo não funcionará em navegadores que não
oferecem suporte a WebSockets. A falta de suporte a WebSockets é extremamente rara nos navegadores
Construindo o circuito
Coloque o HMC5883L em uma breadboard e conecte-o ao Element conforme a figura 10.24. Os pinos SDA e SCL da
placa breakout conectam-se aos pinos 13 e 14 do Elemento, que, conforme mostrado na pinagem da figura 10.20,
2
possuem suporte para I C. Qualquer pino do Elemento pode ser configurado como alimentação ou terra; pinos 11 e
12 são usados aqui por causa de sua proximidade com os pinos do IC.
2
Estruturando o projeto
UAU! e-book
www.wowebook.org
Machine Translated by Google
Um arquivo HMC5883L.js, que é o módulo Kinoma BLL personalizado para a bússola
Um arquivo index.html, que é o código do lado do cliente — você o visualiza em um navegador da web
Figura 10.25. A estrutura para o projeto Element live-compass. O arquivo main.js fornece
lógica de aplicativo e um servidor WebSocket, contando com o suporte do BLL em
HMC5883L.js para interagir com o magnetômetro. O arquivo project.json define o
projeto, usando convenções Kinoma. Index.html é executado em um navegador da Web
em seu computador e mostra cabeçalhos de bússola atualizados ao vivo.
Primeiro, crie o arquivo package.json e insira alguns metadados, conforme mostrado na listagem a seguir.
{
"id": "compass.websockets.lyza.com", 1 "título": "hmc5883L",
"Elemento": {
"principal": "principal" 2
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os módulos de aplicativo do projeto Kinoma - main.js neste caso - têm uma estrutura geral.
Eles precisam exportar uma função padrão que implemente alguns manipuladores de eventos, como onLaunch()
}, sucesso => {
se (sucesso) {
// Configure um servidor WebSocket // leia os cabeçalhos
da bússola e emita as alterações } else {
1 Este é o módulo interno de Pins, do qual depende muito dos aplicativos Kinoma.
3 Esta é uma função conveniente para formatar cabeçalhos de bússola (ainda não utilizada).
Depois que o módulo HMC5883L personalizado estiver pronto, você voltará e preencherá os espaços em branco
em main.js.
UAU! eBook
Um BLL personalizado paraHMC5883L
o www.wowebook.org
Machine Translated by Google
Um BLL personalizado para o HMC5883L
/* ... */
this.compass.writeByteDataSMB(registers.CRB, 0x40);
this.compass.writeByteDataSMB(registers.MODE, 0x00);
};
z: int16(bytes[2], bytes[3])
};
return toHeading(data.x, data.y); 5
UAU! e-book
www.wowebook.org
Machine Translated by Google
};
2
1 writeByteDataSMB() é fornecido pela API Kinoma IC; ele lê de um endereço de registro
específico.
2 readBlockDataSMB(), novamente da API, é usado para obter seis bytes do registrador READ
como uma matriz.
3 Os dados HMC5883L consistem em dois bytes para cada um dos três eixos.
4 int16() é uma função utilitária para criar um inteiro de 16 bits a partir de dois bytes (a
implementação não é mostrada).
Esse tipo de pedigree complexo é normal no software de código aberto, mas, como lembrete,
sempre verifique suas licenças e certifique-se de honrá-las. Além disso, dê gritos de inspiração
para o seu trabalho.
A Listagem 10.10 mostra apenas uma parte do BLL concluído. A versão completa do 5883L BLL
pode ser encontrada no repositório de códigos do livro. Você precisará dele se quiser construir
este experimento: coloque-o no mesmo diretório que os outros arquivos do projeto.
Com o BLL configurado, os bits em main.js que dependem do BLL podem ser preenchidos.
Conforme mostrado na listagem a seguir, o manipulador onLaunch configura o sensor de bússola
no elemento passando um objeto de configurações para Pins.configure ().
UAU! e-book
www.wowebook.org
Machine Translated by Google
/* ... */
var principal = {
aoLaunch () {
Pins.configure({ bússola: {
requer: 'HMC5883L', 1
pinos: {
bússola: {sda: 13, relógio: 14},
aterramento: { pino: 12, tipo: 'Ground' }, potência: { pino: 11, tipo:
'Potência' }
}
},
}, sucesso => { } ); 2
}
};
Você também passa uma função de retorno de chamada como um segundo argumento para Pins.configure().
Nesse retorno de chamada, primeiro você precisa ativar um servidor WebSocket, conforme mostrado na listagem a
seguir. Este código usa a API do Kinoma WebSocketServer integrado (o WebSocketServer era necessário na
listagem 10.9).
/* ... */
var principal = {
aoLaunch () {
Pins.configure({ /* ... */
}, sucesso => {
se (sucesso) {
clientes const = new Set(); 1
const wss = new WebSocketServer(80); 2
deixe últimoResultado = 0; 3
O código na Listagem 10.12 emite uma leitura inicial da bússola quando um cliente se conecta,
mas como as leituras da bússola são obtidas em primeiro lugar e como o cliente recebe
atualizações quando as leituras mudam? Os últimos bits de código para main.js, mostrados
na listagem a seguir, cuidam dessas coisas.
/* ... */
var principal = {
aoLaunch () {
Pins.configure({ /* ... */
}, sucesso => {
if (sucesso) { /* ... */
}
últimoResultado = resultado;
});
}
});
}
};
UAU! e-book
www.wowebook.org
Machine Translated by Google
Pins.repeat('/compass/read', 500, resultado => { });
Aqui, /compass/read é um “caminho” para a função de leitura no módulo BLL. A linha de código aqui invoca
repetidamente a leitura a cada 500 ms e uma função de retorno de chamada recebe o resultado da última
Por fim, você precisará de uma página HTML para servir como um cliente WebSocket e mostrar os
rumos da bússola em tempo real. Esta página pode ser visualizada em um navegador.
Listagem 10.14. Código do cliente (página HTML) para mostrar a direção da bússola
<!doctype html>
<html lang="en">
<cabeça>
<meta charset="utf8">
<title>Direção da bússola ao vivo</title>
<estilo> #bússola
{1
textalign: center; fontsize: 2em;
<script>
window.addEventListener('load', function () { 2 var ws = new WebSocket('ws://10.0.0.17:80'); 3
<body> <div
id="compass"> <label
for="direction">Direção da bússola</label><div id="direction">...
</div>
</div>
</body> </
html>
UAU! e-book
www.wowebook.org
Machine Translated by Google
2 Ao carregar, conecta-se ao servidor WebSocket
3 Importante! Você precisa alterar isso para o endereço IP do seu próprio elemento.
4 Quando novos dados chegam, atualiza o HTML no elemento #direction para exibir o novo título
O código é implantado no elemento por meio do Kinoma Code IDE. Observe que o arquivo index.html
não é fornecido pelo elemento neste exemplo. Em vez disso, você abre esse arquivo em um navegador
assim que o elemento estiver executando o aplicativo de bússola. Consulte o guia de início rápido
do Element (http://mng.bz/84cS) para obter instruções passo a passo sobre como se conectar e
implantar código em seu Element a partir do Kinoma Code IDE, caso ainda não o tenha feito.
Depois que o código for implantado e executado, você poderá abrir o arquivo index.html em um
navegador e girar a placa de ensaio com a bússola anexada para ver a atualização da exibição em
tempo real.
RESUMO
A família de produtos de código aberto da Espruino inclui o Pico, uma placa de desenvolvimento
de tamanho diminuto. Os projetos Espruino podem fazer uso de módulos específicos do Espruino
para trabalhar com diferentes tipos de componentes.
O Elemento Kinoma é outro dispositivo JavaScript de código aberto. A criação de projetos para o
Element envolve o uso de módulos de componentes chamados BLLs (bibliotecas de luz
piscante).
Embora existam muitas opções de plataforma por aí, você pode acelerar seu processo de
aprendizado com novas plataformas seguindo algumas etapas: aprendendo sobre os detalhes
principais, encontrando hardware e informações de pinagem, entendendo o fluxo de trabalho,
experimentando exemplos e buscando a documentação da API.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Como o GPIO funciona no Raspberry Pi e algumas opções diferentes para controlá-lo com
JavaScript
Destaques
Adaptando um aplicativo da estação meteorológica JohnnyFive para funcionar em várias plataformas diferentes
Configurações
—Tessel 2, Raspberry Pi, Arduino e BeagleBone Black
Os computadores
computação Sign Outde
deplaca únicageral
propósito (SBCs)
comsão minúsculas usinas
as características dos de força que
sistemas combinam(figura
embarcados a
11.1). Esses computadores ittybitty reúnem uma série de periféricos e itens em um pequeno
pacote: várias portas USB, Bluetooth, WiFi, Ethernet - os recursos que você esperaria de um
computador desktop.
Mas eles têm vários recursos que se prestam bem a aplicativos incorporados: seu tamanho
reduzido, preço mais baixo, suporte a GPIO e eficiência relativa de energia (embora não
sejam tão miseráveis quanto as plataformas incorporadas mais simples, eles certamente exigem
menos suco do que seus irmãos de desktop).
Figura 11.1. Computadores de placa única (SBCs), da esquerda para a direita: módulo Intel
Edison com Arduino breakout, Raspberry Pi 2 Modelo B e BeagleBone Black
UAU! e-book
www.wowebook.org
Machine Translated by Google
Esta não é a primeira vez que você vê SBCs neste livro, mas vamos revisitar o que é um SBC, em termos gerais.
Não há uma definição formal do termo, mas as plataformas SBC tendem a fazer o seguinte:
Execute sistemas operacionais de alto nível; na maioria dos casos, você pode instalar um sistema operacional
Ofereça recursos de desktop de uso geral, como suporte para periféricos USB, monitores, som e assim por diante
Forneça opções de GPIO, embora às vezes sejam secundárias em relação a outros recursos da plataforma
O rolo compressor nesta categoria é a plataforma Raspberry Pi, uma família de SBCs que está desfrutando de
popularidade épica. Da mesma forma, passaremos a maior parte deste capítulo mergulhando no Node.js e no
Raspberry Pi 3 Modelo B. Mas também faremos um breve tour pela placa BeagleBone Black como um
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 cartão microSD e adaptador
1 Adafruit TCobbler, SparkFun Pi Wedge ou similar, ou uma variedade de fios de jumper macho
para fêmea
1 resistor de 100 V
Fios de jumper
1 BeagleBone Black
1 Arduino Uno
O Tessel 2 é quase uma categoria de dispositivo em si. Seus periféricos USB, recursos de rede e
sistema operacional de alto nível (OpenWrt Linux) parecem sugerir território SBC. No entanto, sua RAM
limitada e armazenamento em Flash, bem como sua falta de suporte a periféricos semelhantes a
desktops (como um monitor) são sinais de que ele foi projetado para aplicativos incorporados.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Então é um SBC? Eu tenderia a inclinar-me para um sim qualificado, mas se sua própria definição de SBC envolve
enfaticamente a capacidade de conectar um monitor e usá-lo como um computador de mesa, então não!
Os SBCs são certamente mais sofisticados do que seus irmãos devboard mais simples. Eles também podem ser,
correspondentemente, mais envolvidos para configurar e configurar fora da caixa. Em muitos casos, você estará
lidando com muitas opções de escolha nos reinos de software e hardware. Mas não entre em pânico: ir do zero
ao zoom em um Raspberry Pi 3 usando um cartão SD pré-flash com NOOBS (New OutofBox Software) para
Raspberry Pis pode ser incrivelmente simples. Mas você precisará arregaçar as mangas do Linux e passar
algum tempo em um terminal para obter um fluxo de trabalho confortável e centrado no Node.js.
Não fique nervoso. Se algo der errado ao seguir as etapas de configuração para qualquer um dos SBCs que
examinaremos - o Raspberry Pi 3 e o BeagleBone Black - você sempre poderá começar do zero sem causar danos
irreparáveis.
Houve um Big Bang de projetos e distribuições do Linux voltados para dispositivos embarcados e móveis nos
últimos anos. Por exemplo, o Tessel executa um Linux simplificado originalmente desenvolvido para roteadores:
OpenWrt.
À medida que nos aprofundarmos nos SBCs de alto desempenho, você verá que há decisões a serem tomadas
— a maioria das plataformas executará com prazer várias distribuições Linux diferentes.
Com o Raspberry Pi, ficaremos com a escolha padrão e mais comum: Rasp bian, um Linux baseado em
Debian. Para consistência, a exploração do BeagleBone Black no final do capítulo atualiza a placa com o Debian
Os lançamentos do Debian são nomeados em homenagem aos personagens de Toy Story. No momento em
que escrevo, o Debian estável está na versão 9 (Stretch), mas a maioria das plataformas embarcadas e SBC
ainda estão usando compilações da versão 8 (Jessie). Às vezes, vemos compilações da versão 7 (Wheezy),
UAU! e-book
11.1.1. A plataforma Raspberry Pi
www.wowebook.org
Machine Translated by Google
11.1.1. A plataforma Raspberry Pi
O Raspberry Pi (figura 11.2) está em todos os lugares que você olha. O que a plataforma Arduino é para placas
Com cada geração Pi numerada sequencial (1, 2 e 3 até agora), a plataforma tornou-se mais
poderosa, eficiente, estável e repleta de recursos. A exceção é a família Pi Zero, que é ainda menor e
mais barata, mas custa alguns recursos e desempenho.
Apesar de seu poder e flexibilidade, a plataforma Raspberry Pi nem sempre é a escolha ideal para
iniciantes em eletrônica. O grande número de coisas que você pode fazer com um Pi pode ser
uma distração, assim como a tarefa de lidar com a administração do Linux e outros detalhes de
configuração. É fácil sair pela tangente da pesquisa do Google, chafurdando por horas entre
fóruns e ideias e opções de projetos.
Por outro lado, você aprendeu o suficiente sobre o básico para que algumas dessas armadilhas em potencial não
pareçam mais tão assustadoras. Raspbian - o sistema operacional padrão baseado em Debian do Pi - é
amplamente usado, sensato e confiável. Como tantas pessoas usam o Pis, existem muitos recursos projetados
para ajudar até mesmo os iniciantes, e há uma vasta coleção de fóruns, wikis, Stack Overflow e postagens de blog,
Raspberry Pi é tratá-lo como um computador de mesa - conecte um mouse USB, um teclado USB e
Configuração sem cabeça - Se você não deseja dedicar tantos periféricos ao seu Pi, pode optar por tratá-lo
mais como um sistema integrado. Se essa noção agrada, a seção de configuração sem cabeça é para você!
Para uma configuração inicial, os kits iniciais do Pi, disponíveis em todos os principais varejistas de eletrônicos on-
line, são um ótimo, embora mais caro, caminho a percorrer (em vez de comprar a placa Pi e os
componentes de suporte separadamente). Aqui estão algumas coisas para procurar em um kit:
UAU! e-book
www.wowebook.org
Machine Translated by Google
adaptador de cartão para que você possa usar um leitor/gravador de cartão de tamanho padrão para atualizar
o conteúdo do cartão
Fonte de alimentação—A conexão de energia do Pi é micro USB, então você pode usar um
do Pi podem não ser atendidas por todos os carregadores de telefone: o site do Pi recomenda um
Hardware para fornecer acesso mais fácil aos pinos GPIO do Pi — Eles vêm na forma de Adafruit
Figura 11.4. Kit Raspberry Pi 3 Modelo B SparkFun construído com Pi Wedge, mostrado
aqui conectado a uma placa de ensaio. Também é mostrado um Adafruit T-Cobbler (à
direita), que fornece o mesmo tipo de funcionalidade que o Wedge.
Os kits podem oferecer outras vantagens úteis - o SparkFun inclui um leitor de cartão USB microSD,
por exemplo - mas eles têm a desvantagem de incluir coisas que você provavelmente já possui: breadboards,
Uma placa Raspberry Pi 3 Modelo B sozinha custa cerca de US$ 40, enquanto os kits completos
custam cerca de US$ 90. Os atuais kits iniciais do Pi 3 da Adafruit e SparkFun contêm todas as peças
necessárias para esta seção.
Os pinos do Pis são machos - se você se conectar diretamente a eles, precisará de fios de jumper
macho para fêmea e poderá acabar com um ninho de rato e frustração, porque não há
informações serigrafadas no próprio Pi.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Existem componentes de hardware de terceiros destinados a tornar o GPIO do Pi mais fácil
de trabalhar. O Pi Wedge da SparkFun e o TCobbler da Adafruit são dois exemplos: esses
breakouts organizam os pinos em agrupamentos mais intuitivos (com dicas serigrafadas) e
fornecem um fator de forma compatível com breadboard. Seu kit Pi pode vir com eles ou podem
ser adquiridos separadamente.
Adafruit TCobbler montado e SparkFun Pi Wedge (mostrado com cabo de 40 pinos conectado)
A FTDI fabrica chips que permitem comunicação serial assíncrona entre dispositivos
embarcados e computadores. Os chips FTDI traduzem os sinais TTL ou RS232 (RS 232 é outro
protocolo serial assíncrono) provenientes de um dispositivo em sinais USB que um
computador pode entender e vice-versa. As conexões FTDI podem ser usadas para
monitorar a saída serial de um dispositivo. Em alguns casos, eles também podem ser usados
para programar ou controlar o dispositivo.
O Pi Wedge da SparkFun inclui uma interface FTDI. Você também precisa de um cabo ou uma
placa breakout para conectar aos pinos FTDI (uma placa breakout SparkFun FTDI com
conector miniUSB é visível conectada ao Pi Wedge na figura 11.4).
UAU! e-book
www.wowebook.org
Machine Translated by Google
O que você precisará
Seguem-se as etapas para uma configuração Pi tradicional estilo desktop e uma configuração sem
cabeça. Você desejará escolher apenas uma dessas opções, mas não importa qual caminho seguir,
você precisará do seguinte:
1 Raspberry Pi 3 Modelo B
Além das peças listadas na seção anterior, você também precisará do seguinte:
1 teclado USB
1 mouse USB
1 monitor
Esta opção de configuração envolve conectar periféricos e energia e seguir as instruções na tela.
Coloque um cartão microSD pré-flash com NOOBS e ligue-o.
O NOOBS oferece a opção de instalar um dos vários sistemas operacionais. Vá em frente e selecione
a primeira opção - Raspbian. O processo UAU!
de instalação
e-book leva alguns minutos.
www.wowebook.org
Machine Translated by Google
Depois que o sistema operacional estiver instalado e configurado, você poderá inicializar no
ambiente PIXEL (Pi Improved Xwindows Environment, Lightweight). Configurar o WiFi é simples:
comece clicando no ícone WiFi na barra de menu superior direita (figura 11.5).
Figura 11.5. A área de trabalho PIXEL. Observe o ícone WiFi no canto superior direito.
Se você quiser fazer shell no seu Pi mais tarde, sem ter que trabalhar diretamente no Pi,
você precisa habilitar o SSH. Para fazer isso, use a opção de menu Preferências >
Configuração do Raspberry Pi. Navegue até a guia Interfaces e clique na opção Enabled ao lado de
SSH. Clique em OK para aplicar a alteração.
Por enquanto é isso! Se você tiver alguma dificuldade, acesse o Raspberry Pi Software Guide
(http://mng.bz/P8Hu), que é ilustrado e fácil de usar.
Se você já configurou seu Pi usando a abordagem de área de trabalho, pode pular este
conjunto de etapas. Você pode pular para a seção 11.8.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Além das peças listadas no final da seção 11.1, você precisará do seguinte:
1 cartão microSD
1 adaptador de cartão SD
1 cabo Ethernet
Como você está sem cabeça, precisará configurar o Pi para poder se comunicar com ele de
Primeiro, você precisará criar um cartão SD inicializável que permitirá o ssh para o Pi por meio de uma
conexão Ethernet com fio. Em seguida, você fará o shell e configurará o WiFi no comando
linha.
Você precisará colocar um sistema operacional em um cartão microSD para que o Pi possa inicializar:
UAU! e-book
www.wowebook.org
Machine Translated by Google
Quando o download grande estiver concluído, descompacte o arquivo zip resultante. Se tudo der certo,
você deve terminar com um arquivo IMG (uma imagem de disco inicializável).
resultante é grande e seu utilitário de descompactação padrão pode não estar à altura da tarefa
de descompactá-lo (o meu não estava). Conforme sugerido lá, tente o Unarchiver para Mac ou 7Zip para
1. Instale o aplicativo gratuito Etcher (https://etcher.io/), disponível para Windows, Mac ou Linux. Isso
permitirá que você pegue o arquivo Raspbian IMG e grave-o no cartão microSD.
3. Inicie o Etcher e siga as etapas para colocar o arquivo IMG no cartão microSD
(figura 11.7).
Figura 11.7. O Etcher é um utilitário direto: selecione o arquivo de imagem do disco, selecione a unidade
(muitas vezes ele seleciona automaticamente para você) e pronto.
UAU! e-book
www.wowebook.org
Machine Translated by Google
1. Quando o Etcher terminar - leva vários minutos para criar a imagem do disco - o
novamente e abra a partição de inicialização (essa pode ser a única partição que você pode ver).
2. Crie um arquivo vazio chamado “ssh” – sem extensão – e coloque-o no nível superior da inicialização.
4. Instale o SO:
endereço (via DHCP), mas você precisará descobrir qual é esse endereço IP. Existem muitas
maneiras de esfolar este gato. Google “scanner IP” ou “scanner LAN” e você encontrará uma
infinidade de utilitários gratuitos para várias plataformas, ou você pode usar uma ferramenta de
linha de comando. Eu uso o LanScan para Mac (figura 11.8). A ideia é determinar qual IP foi
Figura 11.8. Usando LanScan para Mac, posso ver que a interface Ethernet
do Raspberry Pi recebeu o endereço IP 192.168.1.13.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O nome de usuário padrão no Raspberry Pi é pi e a senha é framboesa. É uma boa ideia alterar
a senha do usuário pi. Você pode fazer isso (quando conectado como o usuário pi) digitando
passwd no prompt de comando e seguindo as instruções na tela
instruções. Faça isso. Faça isso agora.
Configurando WiFi no Pi
A última etapa é configurar o WiFi para o seu Pi para que você não precise usar uma conexão
Ethernet com fio. Isso envolve mexer com a configuração wpa_supplicant do Pi.
Às vezes, isso pode ser complicado e frustrante se você tentar editar o arquivo de configuração
diretamente. Descobri que a maneira mais segura é usar o utilitário de linha de comando
wpa_cli:
$ sudo wpa_cli
3. Procure redes sem fio disponíveis para garantir que seu Pi possa ver o WiFi desejado
rede. Para fazer isso, digite isto:
> digitalizar
> resultados_scan
Sua rede aparece? Caso contrário, verifique as configurações do seu roteador e certifique-se de que
é uma rede Wi-Fi compatível (não 5 GHz). Se isso acontecer, sim! Continuar.
4. Execute cada um dos seguintes comandos para adicionar, configurar e ativar o desejado
> salvar_config
$ ifconfig wlan0
Se estiver tudo bem, você deverá ver um endereço IP atribuído (figura 11.9).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Você pode desconectar a conexão Ethernet, se quiser. O Pi agora se conectará automaticamente à rede
Não é muito difícil recomeçar se o seu Pi estiver se comportando mal ou se você se sentir confuso ou preso.
Desligue o Pi, ejete o microSD e atualize-o novamente com o sistema operacional desejado: NOOBS para uma
configuração visual amigável; Raspbian; ou qualquer outro sistema operacional compatível de sua escolha.
Inicializar a partir desse cartão SD atualizado lhe dará uma ardósia limpa.
Agora que você configurou um Pi com conectividade Wi-Fi, vamos aplicar as etapas de aprendizado da
Os SBCs realmente aumentam a aposta no poder de processamento, compatível com seus sinos e assobios
adicionais. Os microcontroladores da família Cortex M de 32 bits da ARM estão no centro de uma série de
plataformas que podem executar JavaScript incorporado. Com os SBCs completos, você estará dando mais
vários núcleos, aceleração de gráficos 3D, velocidades de clock mais altas e subsistemas complexos.
O Pi 3 possui uma CPU quadcore ARM (A8) de 64 bits rodando a 1,2 GHz. Isso está muito longe do ATmega de
Outras especificações observadas na página de informações do produto (figura 11.10) incluem 1 GB de RAM,
UAU! e-book
www.wowebook.org
Machine Translated by Google
Wi-Fi e Bluetooth integrados, 4 portas USB, saídas de vídeo e estéreo, interface HDMI
e muito mais (www.raspberrypi.org/products/raspberrypi3modelb/).
2
GPIOwise, é um saco misturado. Existem várias interfaces SPI e IC e muitos pinos em geral. Como
mencionado anteriormente, não há suporte para ADC e o PWM é limitado. Acessórios adicionais
e certos periféricos podem exigir conexões a alguns dos pinos, o que significa que você
pode não ter acesso de E/S a todos os 40 pinos, dependendo da sua configuração.
Por causa do mercado de uso geral do Pi 3, a lista de recursos principais em sua página de
produto não menciona que sua tensão de nível lógico GPIO é de 3,3 V, mas você deve saber que:
o Raspberry Pi 3 é um dispositivo de 3,3 V.
As pinagens Pi são complicadas. Para começar, há muitos pinos (40), muitos esquemas de
nomenclatura e numeração de pinos diferentes, e um determinado pino pode já estar
2
monopolizado por um componente, processo ou periférico. Grupos de conexões relacionadas,
como pinos SPI ou IC, também não são necessariamente adjacentes fisicamente. O site
pinout.xyz é um bom recurso para os detalhes minuciosos sobre as pinagens do Pi.
Como um exemplo das muitas faces de um único pino Raspberry Pi GPIO, o pino físico 33
(figura 11.11) é também conhecido como BCM 13 (número do pino Broadcom), por seu nome
funcional primário de PWM1 (é um dos pinos compatíveis com PWM), e como WiringPi pino 23.
Ele também possui vários aliases nomeados funcionalmente, como AVEOUT VID 9. E estará
disponível para uso GPIO? Não será se você tiver um monitor externo paralelo conectado ao Pi
- é um dos pinos necessários para isso. E pode não ser se você quiser usar uma interface de
depuração JTAG ou dispositivo SMI (Secondary Memory Interface); é um dos pinos usados
nesses tipos de conexões também.
expansão compatíveis com Arduino são chamadas de shields, as placas que se encaixam no Raspberry
Pi são normalmente chamadas de hats, e aquelas que se encaixam no BeagleBone Black são chamadas de
capes.
As possibilidades do que você pode fazer e como fazer são virtualmente ilimitadas na plataforma Pi - afinal, é um
computador completo. Vamos restringir isso um pouco, concentrando-nos nas opções de configuração e
configurar.
Neste ponto, você deve ter um Pi funcionando - seja configurado como um computador autônomo ou
um dispositivo sem cabeça. Você tem mais três etapas a seguir para obter a configuração e o fluxo
de trabalho sólidos:
Atualizando o software do Pi
Isso também pode levar vários minutos para fazer seu trabalho.
Atualizando o Node.js no Pi
Isso produzirá a versão atual do Node.js no Pi. No momento da escrita, a versão pré-instalada
do Node.js era v0.10.29, que é arcaica. Traga isso para LTS (LongTerm Support), para que não
1. Se você não acabou de executar uma atualização completa do sistema (como mostrado na seção anterior), primeiro
execute este comando:
2. Baixe e execute um script de configuração Node.js para a versão de destino executando este
comando:
No momento da escrita, o LTS era v6.x. Isso terá mudado quando você ler isso, então você pode
substituir a parte setup_6.x da URL pelo número da versão principal apropriada. Consulte
$ versão do nó
Gerenciando arquivos no Pi
Os arquivos e recursos JavaScript para seus projetos Pi serão executados no Pi e precisam existir no
sistema de arquivos do Pi. Existem, sem surpresa, muitas maneiras de colocar seus arquivos no Pi. Aqui
estão algumas opções:
Crie os arquivos no próprio Pi. Você pode usar um editor baseado em terminal, como vi ou nano.
Ou, se você tiver uma configuração de desktop para o seu Pi, poderá usar um editor GUI como o
aplicativo Leafpad pré-instalado. Ou você pode instalar qualquer número de aplicativos adicionais
de edição de texto.
Use um utilitário para copiar arquivos do seu computador para o Pi. Você pode usar a
ferramenta de linha de comando do Unix scp (cópia segura) para mover arquivos ou um
aplicativo GUI compatível, por exemplo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Configure um servidor de arquivos no Pi para que você possa acessá-lo como um compartilhamento
remoto de outros computadores em sua rede. Um dos muitos métodos possíveis para fazer isso é usar um
Uma maneira de facilitar o acesso aos arquivos do seu Pi é configurar um servidor de arquivos no próprio Pi.
As etapas a seguir configuram um compartilhamento Samba (SMB) chamado de projetos que podem ser lidos
e acessados pelo usuário pi. Depois de configurado, esse compartilhamento deve aparecer no Finder ou no
File Explorer do seu sistema como uma unidade de rede. Observe que estas instruções pressupõem uma
$pwd
/home/pi
$ mkdir projetos
4. Instale o Samba:
seguindo as indicações:
7. Edite o arquivo de configuração do Samba. Primeiro faça um backup para o seu diretório pessoal, apenas
em caso:
$ sudo cp /etc/samba/smb.conf ~/
UAU! e-book
www.wowebook.org
Machine Translated by Google
9. (Você pode usar um editor diferente, como o nano, se preferir, no lugar do vi.) Role
até o final do arquivo e adicione estas linhas, incluindo os espaços ao redor dos caracteres =:
[projetos]
caminho = /home/pi/projetos
usuários válidos = pi
somente leitura = Não
$ testparm
Agora você deve conseguir se conectar ao compartilhamento SMB de outros computadores na mesma rede
(usando Map Network Drive no Windows File Explorer ou Connect to Server ou CmdK em um Mac). A string
smb://user@host/sharename
Às vezes, os compartilhamentos do Samba podem ser imperfeitos e é possível que você precise
ajustar as permissões ou os metadados do usuário para que funcionem corretamente. Existem muitos fóruns
Criar um diretório chamado “projetos” dentro do diretório pessoal do usuário pi é uma das etapas na barra
lateral para configurar um servidor Samba. Mesmo se você não configurar um compartilhamento em
UAU! e-book
www.wowebook.org
Machine Translated by Google
o Pi, vá em frente e crie um diretório para encurralar seus próximos experimentos de código. O restante
do capítulo assumirá a existência de um diretório ~/projects (um diretório chamado “projects” dentro
1 Raspberry Pi 3 configurado
1 resistor de 100 V
1 tábua de pão
Fios de jumper
Devido às permissões conservadoras para interagir com GPIO no Raspbian, você provavelmente
precisará executar os exemplos de código a seguir usando sudo. Por exemplo,
$ sudo ./blink.sh
ou
$ sudo nó index.js
UAU! e-book
www.wowebook.org
Machine Translated by Google
Sem sudo, você pode obter erros de permissão como estes:
Tente usar o sudo apenas com comandos que o exijam, como ao executar esses scripts.
Não use o sudo para instalar módulos npm ou criar arquivos ou coisas do tipo. Você pode
acabar criando coisas com permissões instáveis se fizer isso. Em caso de dúvida, tente fazer
algo primeiro sem sudo e veja se funciona.
Cada um dos exemplos a seguir usa a mesma configuração de circuito físico: o ânodo do
LED deve ser conectado ao pino físico 7 do Pi (pino 7 do WiringPi, pino 4 do BCM). O
cátodo deve ser conectado a um pino GND.
Os diagramas de fiação são mostrados para conexões directtoPi (figura 11.12), T Cobbler
da Adafruit (figura 11.13) e Pi Wedge da SparkFun (figura 11.14).
Figura 11.12. Diagrama de fiação para conectar o LED diretamente aos pinos do Pi,
usando fios jumper macho-fêmea
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para cada pino que você deseja usar, você precisa fazer o seguinte:
UAU! e-book
www.wowebook.org
Machine Translated by Google
1. Exporte o pino. Isso é feito escrevendo o número PIN no arquivo em /sys/class/
gpio/export usando o esquema numérico BCM. Isso criará um diretório para o pino
(<pin_directory>).
2. Configure o pino, como escrevendo o valor 'in' ou 'out' para /sys/class/gpio/<pin_directory>/
direction.
3. Interaja com o pino, como lendo o arquivo /sys/class/gpio/
<pin_directory>/value ou gravando um valor nele.
4. Limpe. Cancele a exportação do pin escrevendo o número do pin no arquivo em /sys/class/
gpio/unexport.
Isso provavelmente é mais fácil de entender por exemplo. Piscar um LED conectado ao pino físico
7, BCM GPIO 4, uma única vez - ligando-o e desligando-o novamente - pode ser feito usando um
script de shell, conforme mostrado na listagem a seguir.
Listagem 11.1. Um script bash para piscar um LED anexado uma vez
#! /bin/bash
# Exporte o pino para que possamos trabalhar com ele echo
"4" > /sys/class/gpio/export
# Defina o pino como um pino de saída
echo "out" > /sys/class/gpio/gpio4/direction
# Ligue o LED definindo o pino como HIGH ("1") echo "1" > /sys/class/gpio/
gpio4/value
# Não faça nada por um segundo
dormir 1
# Desligue o pino definindo-o como LOW ("0") echo "0" > /sys/class/
gpio/gpio4/value sleep 1
# Unexport o pino para limpar depois de nós mesmos echo "4" > /sys/
class/gpio/unexport
Para executar o script blink.sh, você precisa tornar o arquivo executável. Você deve ser capaz de
fazer isso executando este comando dentro do diretório ~/projects/blinksysfs:
$ chmod +x ./blink.sh
$ sudo ./blink.sh
isso com o Node.js usando o módulo interno fs, conforme mostrado na listagem a seguir.
var piscaCont = 0;
var ledStatus = false;
1 Observe que o número do pino e todos os valores escritos neste exemplo são strings.
$ sudo nó index.js
Você realmente precisa desexportar objetos no diretório gpio quando terminar ou será problemático para você
na próxima vez que quiser usar esse pino. Se você vir um erro como este
UAU! e-book
www.wowebook.org
Machine Translated by Google
ao tentar executar o script intermitente do Node.js, é provável que o pino não tenha sido exportado
corretamente:
Você poderia preencher um tomo enciclopédico com todas as coisas que pode fazer com o sysfs,
mas vamos seguir em frente. É bom saber sobre o sysfs, mas trabalhar diretamente com ele
WiringPi
WiringPi é um wrapper de abstração que tenta tornar a numeração de pinos mais sensata e expõe
uma API que é mais familiar ao estilo Arduino. Está escrito em C, mas as bibliotecas Ruby e Python
são populares. Há um pacote npm que fornece ligações Node.js: wirepi.
Se você quiser experimentar, crie um diretório em sua área ~/projects chamado blinkwiringpi.
Dentro desse diretório, execute este comando:
Em seguida, crie um arquivo index.js com o conteúdo mostrado na listagem a seguir. Nesse script,
o valor do status alterna entre 0 e 1, desligando e ligando o LED, respectivamente.
wpi.setup('wpi');
wpi.pinMode(ledPin, wpi.OUTPUT); 3
UAU! e-book
www.wowebook.org
Machine Translated by Google
var piscando = setInterval(() => {
wpi.digitalWrite(ledPin, status); 4
if (!estado) {
piscarContagem++;
if (contagem de piscadas >= total de piscadas) {
console.log('Todo piscando!'); clearInterval(blinker);
}
}
estado = +!estado; 5
}, 1000);
1 Mesmo pino físico de antes, mas usando números WiringPi, que na verdade são números
JavaScript (não Strings)
$ sudo nó index.js`
Para completar a extravagância piscante, voltaremos ao nosso velho amigo JohnnyFive. Assim como
o plugin tesselio JohnnyFive I/O torna possível usar JohnnyFive com o Tessel, o pacote npm raspiio
permite usar J5 no Raspberry Pi.
Dentro do diretório blinkj5, execute este comando para instalar os pacotes JohnnyFive e
raspiio:
Para seu próximo truque, você pegará um dos primeiros scripts de LED que já experimentou -
desde o capítulo 2 - e o adaptará para funcionar no Pi, conforme mostrado na listagem a seguir.
As únicas alterações necessárias são incluir e usar o plug-in raspiio para fornecer E/S e alterar o
número do pino do LED. É isso!
UAU! Listagem de
e-books 11.4. Piscando o LED com Johnny-Five www.wowebook.org
Machine Translated by Google
Listagem 11.4. Piscando o LED com Johnny-Five
led.blink(500, () => {
piscarContagem++;
});
});
O Raspiio oferece suporte a vários esquemas de numeração de pinos Pi. Os pinos passados como
valores numéricos JavaScript são automaticamente assumidos como números WiringPi. Mas você
também pode usar números de pinos físicos e nomes funcionais (como GPIO4). Veja a
Dado que existem inúmeras maneiras de controlar o hardware com um Pi, não há uma única
fonte de documentação da API. Em vez disso, usaremos JohnnyFive, Node.js e o plug-in raspiio I/
O, então você vai querer manter os sites de documentação para essas APIs ao seu alcance enquanto
exploramos.
Conforme visto na Listagem 11.4, adaptar os aplicativos JohnnyFive para funcionar em diferentes
plataformas (como migrar do Arduino Uno para o Raspberry Pi) pode ser bastante fácil.
Freqüentemente, é uma questão de selecionar o plug-in de E/S correto e atualizar alguns números de pinos no c
UAU! e-book
www.wowebook.org
Machine Translated by Google
Nos próximos experimentos desta seção, você adaptará o aplicativo meteorológico de atualização ao
vivo BMP180 criado originalmente para o Tessel no capítulo 8 (figura 11.15). De acordo com sua
exploração de SBCs e do Raspberry Pi 3 especificamente, você implementará a estação
meteorológica primeiro no Pi 3 e, posteriormente, fará com que funcione em
um Arduino Uno.
Figura 11.15. O mini aplicativo meteorológico fornece dados de temperatura e pressão atualizados
ao vivo que podem ser visualizados em um navegador em qualquer computador na mesma rede.
1 Raspberry Pi 3 configurado
1 tábua de pão
Fios de jumper
Código do servidor—Isto inclui o código JohnnyFive para lidar com E/S e sensor de leitura
UAU! e-book
www.wowebook.org
Machine Translated by Google
data, um servidor web estático (usando express) e um servidor socket.IO que emite eventos que
representam atualizações de dados meteorológicos (os clientes socket.IO podem escutar esses eventos).
Código do cliente—Isso está na forma de uma única página HTML—index.html—que será atendida
conecta ao servidor socket.IO como um cliente, para que possa receber e exibir dados
Esse padrão – manipulação de E/S e servidor da Web combinado com um front-end baseado em navegador
– pode ser reutilizado para criar muitos tipos diferentes de aplicativos de IoT. É um padrão útil para se ter
no bolso de trás.
Construindo o circuito
Primeiro, você precisa construir o circuito conectando o breakout BMP180 ao seu Pi. Assim como o LED
piscando, os detalhes dependerão da sua configuração. Diagramas de fiação são fornecidos para
conexões diretas ao Pi (figura 11.16), SparkFun Pi Wedge (figura 11.17) e TCobbler da Adafruit
(figura 11.18).
Figura 11.16. Diagrama de fiação para o BMP180, mostrando conexões diretas com o Pi
UAU! e-book
www.wowebook.org
Machine Translated by Google
UAU! e-book
www.wowebook.org
Machine Translated by Google
2
Raspiio e IC
UAU! e-book
2 2
www.wowebook.org
Machine Translated by Google 2 2
O BMP180 é I C. Raspiio suporta IC muito bem, mas para habilitá-lo você precisará reiniciar
(se ainda não o fez) após instalar o raspiio. (Dica: sudo reboot é um recurso útil
comando.)
Testando o BMP180
Antes de adaptar o software da estação meteorológica do Tessel, você criará um script básico
para registrar os dados de temperatura e pressão do BMP180 no console. Isso confirmará que
2
a combinação de Raspbian, raspiio, IC e BMP180 está trabalhando em harmonia:
1. Estabeleça uma área de trabalho. Crie um diretório chamado “clima” dentro do seu Pi's
diretório de projetos:
$ mkdir tempo
board.on('pronto', () => {
const bmp180 = novo cinco.Multi({
controlador: 'BMP180'
});
bmp180.on('alterar', () => {
var temperatura = bmp180.thermometer.fahrenheit.toFixed(2);
var pressão = bmp180.barometer.pressure.toFixed(2); console.log(`${temperatura}°F | ${pressão}kPa`);
});
});
Na listagem anterior, observe que você não precisa designar quais pinos o BMP180 é WOW! e-
book
www.wowebook.org
Machine Translated by Google
conectado na instanciação do componente Multi sensor (atribuído à variável bmp180). O
2
Raspiio “sabe” onde estão os pinos compatíveis com IC no Raspberry Pi e cuida da configuração
da interface para você! Isso é útil.
$ sudo nó index.js
Você deve ver o registro de dados de temperatura e pressão no console, algo como o seguinte.
77,54 °F | 98,05kPa
Agora você fará algumas alterações específicas do Pi. Crie uma nova área de trabalho, um
diretório chamado “piweather”. Copie os arquivos de origem do aplicativo meteorológico original
do repositório GitHub do livro para esse diretório, mas omita .tesselinclude. Você deve terminar
com uma estrutura semelhante à seguinte.
piweather/
aplicativo
index.html
estilo.css
index.js
pacote.json
$ rm rf node_modules
Comece editando package.json. Ele deve conter, em parte, um objeto de dependências, que deve
ser semelhante ao mostrado na listagem a seguir, embora os números de sua versão possam ser
diferentes. Remova a dependência tesselio, pois você não precisará dela para a versão Raspberry Pi.
"dependências": {
"expresso": "^4.14.1",
"johnnyfive": "^0.10.4",
"socket.io": "^1.7.3", 1
"tesselio": "^0.9.0" 2
}
instalação de $npm
Em seguida, adicione uma nova dependência—raspiio—usando o sinalizador save para gravar a alteração
Atualizando index.js
UAU! e-book
www.wowebook.org
Machine Translated by Google
1. Substitua esta linha,
com este:
app.use(express.static(path.join(__dirname, '/app')));
board.on('pronto', () => {
const weatherSensor = new five.Multi({
controlador: 'BMP180',
frequência: 5000 });
server.listen(3000, () => {
console.log(`http://${os.networkInterfaces().wlan0[0].address}:3000`);
});
});
Nenhuma alteração é necessária em app/index.html porque é um código do lado do cliente — ele é executado
$ sudo nó index.js
Depois que o código do servidor for inicializado, ele desconectará a URL onde você pode acessar a
exibição do tempo de outros computadores na mesma rede que o Pi (conforme mostrado na listagem a
seguir). Aponte o navegador do seu computador para o URL registrado para ver o tempo
estação em ação.
Fazer o aplicativo de clima funcionar em outras plataformas com suporte do JohnnyFive é igualmente
simples. É um trabalho rápido fazer o aplicativo meteorológico funcionar em um Arduino Uno conectado ao
1 Arduino Uno
1 tábua de pão
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 placa multissensor BMP180
Fios de jumper
instalação de $npm
Conecte o Uno ao seu computador e execute o aplicativo. Você não precisará sudo aqui: WOW! e-
book
www.wowebook.org
Machine Translated by Google
$ node index.js
Lembre-se, o Raspberry Pi 3 é um computador “real”, então não há motivo para você não usá-lo como
host em uma configuração hostclient, com seu próprio Arduino conectado, assim como você faz com
seu próprio computador.
1 Raspberry Pi 3 configurado
1 Arduino Uno
1 tábua de pão
Fios de jumper
1. Copie a versão Arduino Uno do código do aplicativo meteorológico - novamente, sem o diretório
node_modules - para o Pi.
2. Instale as dependências:
instalação de $npm
4. Execute o aplicativo:
$ node index.js
(Você não precisa usar o sudo aqui, pois não está usando o GPIO do Pi.)
UAU! e-book
www.wowebook.org
Machine Translated by Google
Não há nenhuma razão técnica para que você não possa implantar a versão Tessel 2 do aplicativo
de clima no Tessel a partir do Pi (em vez de seu próprio computador). Primeiro, no entanto, você
precisará instalar o t2cli no Pi e provisionar o Tessel a partir dele, conforme detalhado na
página “Instalar o Tessel 2” do Tessel (http://tessel.github.io/t2start/).
O Pi não é o único jogo na cidade - há uma série de outras plataformas SBC. Para ter uma noção
das semelhanças e diferenças entre eles, vamos fazer um breve tour pelo BeagleBone Black (figura
11.20), um dos SBCs da família BeagleBoard.
Black supera o Pi em termos de recursos GPIO e é mais eficiente em termos de energia em modo inativo.
Outra distinção importante é que, embora as várias distribuições Linux que você pode executar no
Raspberry Pi sejam de código aberto, seu hardware não é. Os Pis são fabricados exclusivamente
Recursos principais
Como mencionado momentos atrás, a CPU do BeagleBone Black é singlecore e roda a 1,0 GHz, que é
mais lenta que os 1,2 GHz do Pi 3. Ambos são chips ARM v8, portanto, não são muito diferentes
no geral. Se você obtiver a rev C, obterá 4 GB de RAM (as versões mais antigas têm 512 MB). Como o
Pi, o BeagleBone Black possui um slot microSD, mas também possui 4 GB de armazenamento flash eMMC
integrado. Ele tem uma única porta USB, uma interface miniHDMI e uma interface Ethernet (figura
11.21).
UAU! Recursos
e pinagens do eBook GPIO www.wowebook.org
Machine Translated by Google
Recursos e pinagens do GPIO
O BeagleBone Black possui uma miscelânea de GPIO. São 92 (noventa e dois!) pinos.
Há suporte de hardware para 4 UARTs, 65 pinos de E/S digitais com capacidade de interrupção, 8 pinos
PWM e 7 entradas analógicas. Enquanto o Pi é um computador que também faz GPIO, o BeagleBone
O BeagleBone Black básico não possui WiFi integrado, mas você pode adicionar suporte usando um adaptador
de terceiros. Você pode encontrar uma lista de adaptadores WiFi suportados na página BeagleBone Black do
Outra abordagem de rede permite que você envie ssh para seu BeagleBone Black por meio de uma conexão
USB. Isso pode exigir que você instale alguns drivers ou ajuste alguma outra configuração; consulte
a página “Getting Started” no site da BeagleBoard para obter mais detalhes (http://beagleboard.org/
gettingstarted).
Os pinos do BeagleBone Black são dispostos em dois conjuntos de cabeçalhos de expansão com 46 pinos em
cada. Com a conexão de alimentação CC da placa na parte superior, o cabeçalho de expansão P9 está à
esquerda, P8 à direita (e quanto ao que aconteceu com P1–P7: não faço ideia). Tal como acontece com o
Pi, muitos dos pinos do BeagleBone Black podem desempenhar várias funções.
Você usará outro plug-in JohnnyFive I/O para controlar o GPIO do BeagleBone Black. A Figura 11.22 mostra
os pinos suportados pelo plug-in beagleboneio JohnnyFive I/O e seus recursos. Para fazer referência a um
pino com beagleboneio, você prefixa o número físico do pino com o número do cabeçalho, como P9_11 para o
pino 11 em P9. Você usará apenas a interface IC, portanto não precisará fornecer nenhum número de pino
2
— o beagleboneio saberá automaticamente usar os pinos P9_19 (SCL) e P9_20 (SDA).
Os pinos de entrada analógica no BeagleBone Black aceitam apenas tensões de entrada de até 1,8 V.
É importante observar que os recursos dos pinos mostrados na figura 11.22 não são indicativos de todos
UAU! e-book
www.wowebook.org
Machine Translated by Google
do suporte de hardware que o BeagleBone Black fornece nesses pinos, mas o
suporte que o plug-in beagleboneio fornece (para scripts JohnnyFive).
Por exemplo, não há suporte serial UART/TTL mostrado aqui, mas o BeagleBone Black tem
vários UARTs. Às vezes, a busca por um diagrama de pinagem relevante pode ser complicada
pela realidade de que o que os pinos realmente fazem depende de como você os está usando.
Você planeja usar seu BeagleBone Black em outros contextos, não JohnnyFive?
Você vai querer procurar um diagrama de pinagem mais completo. Existem muitos outros
diagramas de pinagem do BeagleBone Black disponíveis na web. O BeagleBone Black tem uma
colheita abundante de 96 pinos, cada um capaz de desempenhar mais de cinco ou seis papéis
diferentes e referenciados por diferentes convenções de nomenclatura. Isso pode
levar a alguns diagramas bastante esmagadores. Não se apresse e seja paciente: não é você - é
realmente muita informação para assimilar visualmente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Uma maneira de configurar o BeagleBone Black espelha de perto a configuração do Raspberry Pi 3 anterior
A placa vem com o Ångström, uma distribuição Linux embarcada, mas este processo de configuração
o substitui pelo Debian. Para obter mais detalhes sobre como criar um microSD inicializável (as etapas são
imagens.
3. Em vez de inicializar repetidamente a partir do cartão SD, o que você deseja fazer é atualizar a imagem do
sistema operacional para o armazenamento flash eMMC integrado. Isso requer uma etapa adicional,
um pouco meticulosa, aqui: um arquivo de configuração precisa de uma edição simples. Depois de
atualizar o cartão SD com a imagem do Debian, pode não ser legível pelo seu computador (não foi com o
meu). Em vez disso, você pode inicializar o BeagleBone Black diretamente do cartão SD, uma vez, para
2. Conecte o BeagleBone Black diretamente ao seu roteador com um cabo Ethernet e, em seguida,
conecte o BeagleBone Black à energia. Levará um ou dois minutos para o BeagleBone Black
4. Do seu computador, em um terminal, ssh no BBB com o usuário debian (ssh é ativado por padrão
Há uma senha padrão para esse usuário, que será exibida para você no primeiro login.
(ou use seu editor preferido se não gostar do vi). Na parte inferior do arquivo, localize a seguinte linha
#cmdline=init=/opt/scripts/tools/eMMC/initeMMCflasherv3.sh
Salve e saia do arquivo. Descomentar essa linha permitirá que o BeagleBone Black execute um script
4. Agora desligue o BeagleBone Black. Com o cartão SD ainda inserido, mantenha pressionado o
botão BOOT/USER (figura 11.23) e reconecte a energia. Continue segurando o botão por mais
alguns segundos até que todos os LEDs integrados fiquem acesos por um momento. Então você
pode soltar o botão.
$ lsb_release a
ID do Distribuidor: Debian
Descrição: Debian GNU/Linux 8.7 (jessie)
Lançamento: 8.7
Codinome: jessie
UAU! e-book
www.wowebook.org
Machine Translated by Google
9. Para ver qual versão do Node.js você possui, execute este comando:
$ versão do nó
Eu tenho v4.8.0.
10. Você pode atualizar a versão do Node.js se quiser, mas a v4.8.x é boa o suficiente para oferecer
Exemplos e tutoriais
Em seguida, você levará o BeagleBone Black para um giro Hello World, estilo LED, usando Johnny Five e o
plug-in beagleboneio. Há um LED integrado que você pode acessar, portanto, este é um esforço rápido (sem
necessidade de circuitos).
Conecte-se ao seu BeagleBone Black via SSH e crie uma área de trabalho (um diretório de projetos ou
board.on('pronto', function () {
var led = new five.Led(); 2
led.blink(500);
});
2 Nenhum número de pino é fornecido aqui: o beagleboneio usará automaticamente o LED integrado.
$ sudo nó index.js
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora você deve ver um dos LEDs azuis do BeagleBone Black piscando a cada
500 ms.
Documentação da API
Mais uma vez, você está seguindo a rota JohnnyFive aqui. A documentação do plug-in
beagleboneio contém informações vitais sobre suporte a pinos e detalhes de uso do plug-in (https://
github.com/julianduque/beagleboneio).
1 tábua de pão
Fios de jumper
Até agora, o padrão geral de adaptação para o aplicativo de clima está se tornando familiar:
UAU! e-book
www.wowebook.org
Machine Translated by Google
O BeagleBone Black vai exigir apenas mais alguns truques rápidos de você.
Acontece que o BeagleBone Black, por padrão, já tem um servidor rodando na porta 3000. E
não tem WiFi, então não tem interface de rede wlan0. Para contabilizar isso, edite o código
para server.listen() da seguinte maneira.
server.listen(4000, () => { 1
console.log(`http://${os.networkInterfaces().eth0[0].address}:4000`); 2 UAU! e-book www.wowebook.org
Machine Translated by Google
});
$ sudo nó index.js
Manter os detalhes de I/O sequestrados para plug-ins de I/O torna os aplicativos JohnnyFive relativamente
portáveis entre plataformas. Detalhes aparecem, como a indisponibilidade da porta 3000 no BeagleBone Black,
mas no geral não é tão ruim mover coisas entre plataformas. Se desejar, você também pode executar a
variante compatível com Arduino do aplicativo de clima, usando o BeagleBone Black como host. Os SBCs oferecem
RESUMO
Os computadores de placa única (SBCs) adicionam vários recursos e itens de uso geral, mas usam mais
energia e são mais complicados de configurar e administrar do que plataformas mais restritas.
O Raspberry Pi 3 é a plataforma Raspberry Pi de terceira geração e pode ser usado para computação de uso
geral, bem como para aplicativos incorporados. Raspbian é um sistema operacional Linux baseado em Debian
Etapas comuns de configuração para desenvolvimento de SBCs e Node.js incluem atualização (ou
Sysfs é um pseudosistema de arquivos Linux que permite a interação com componentes e hardware
Existem inúmeras maneiras de hackear hardware em um Raspberry Pi, com estruturas e bibliotecas para
WiringPi é uma abstração popular para Raspberry Pi GPIO. Está escrito em C, mas existem bibliotecas para
ele em várias outras linguagens. Outros frameworks não baseados em WiringPi (incluindo o plugin
UAU! e-book
www.wowebook.org
Machine Translated by Google
porque sua clareza de emulação do Arduino pode ser menos confusa do que outros esquemas de
numeração.
troca de plug-ins de E/S e a atualização dos números dos pinos. Muitas vezes, essas são as
O Raspberry Pi também pode ser usado em uma configuração de hostclient, atuando como o host.
O BeagleBone Black é um SBC de código aberto com recursos no mesmo estádio, em geral, como
UAU! e-book
www.wowebook.org
Machine Translated by Google
Usando um serviço baseado em nuvem (resin.io) para implantar e gerenciar um aplicativo em uma frota de
dispositivos Tutoriais
Destaques
Construindo a Web física com o protocolo Eddystone aberto e Bluetooth Low
Configurações Controle de hardware de uma página da web usando Web Bluetooth e Puck.js
Sair
1 Espruino Puck.js
Fios de jumper
UAU! e-book
www.wowebook.org
Machine Translated by Google
Este capítulo abre algumas grandes perspectivas. No entanto, essa grandeza de escala esbarra em um
espaço limitado. Os tópicos apenas abordados aqui são especialidades inteiras; há o suficiente para
aprender sobre cada um para encher livros, prateleiras ou até mesmo bibliotecas inteiras:
segurança; o processo de padrões da web; as complexidades da arquitetura Bluetooth e Bluetooth LE
(BLE); provisionamento e gerenciamento de frotas de Dispositivos IoT em escala.
Como tal, este capítulo não marca o fim de uma jornada de aprendizado, mas sim um trampolim
para as aventuras subsequentes. Sua primeira metade abre as cortinas do mundo das ofertas de
serviços IoT baseados em nuvem. A segunda metade usa o chapéu de um futurista, avançando
nos limites do que podemos fazer na web e em um navegador hoje e no que pode estar por vir amanhã.
O código neste capítulo não está pronto para um ambiente de produção. Segurança,
desempenho, degradação elegante e diligência de acessibilidade são sacrificados aqui em busca de
clareza e brevidade.
UAU! e-book
12.1. IOT E A NUVEM www.wowebook.org
Machine Translated by Google
12.1. IOT E A NUVEM
A noção já vaga de serviços de nuvem IoT é ainda mais confusa pelo fato de que alguns
produtos de empresas de IoT não se limitam a software. De fato, algumas empresas combinam
plataformas físicas de hardware com seus serviços em nuvem, criando um pacote de
cima para baixo (figura 12.1).
A Particle, por exemplo, fabrica a placa Electron, que possui conectividade 2G/3G integrada.
Você implanta seu código e lê dados de um determinado Electron usando redes celulares
— dependendo dos serviços de nuvem proprietários da Particle para essa implantação
e I/O, naturalmente. Nesse caso, a empresa - Particle - está fornecendo o hardware (o
dispositivo Electron), o software (você programa suas placas de partículas usando sua API) e
a infraestrutura de nuvem (você implanta em sua frota de dispositivos Particle usando suas
ferramentas centralizadas baseadas na web) .
UAU! e-book
www.wowebook.org
Machine Translated by Google
Outro exemplo dessa chamada oferta de produto end-to-end é a plataforma ARTIK da Samsung. Você pode usar
um dos “módulos” de hardware ARTIK autônomos - suas placas das séries 5, 7 e 10 são todas SBCs compatíveis que
acompanham o Fedora Linux - mas o hardware em si é apenas uma parte de seu ecossistema integrado.
Eles esperam que você opte por usar seus serviços de nuvem também.
Este é um oceano profundo para mergulhar. Pode ser opressor se você não tiver pontos de referência
familiares para traçar sua viagem, e há uma quantidade dolorosa de jargões e jargões de negócios. Em uma tentativa
de moderar esse novo ataque, não iniciaremos um projeto do zero, mas adaptaremos nossa velha amiga, a mini
Usaremos o mesmo código de aplicativo da estação meteorológica, com alguns pequenos ajustes, mas, em vez de
trabalhar diretamente no dispositivo para gerenciar o sistema operacional e executar o código do aplicativo, usaremos
deixe o resin.io fazer esse trabalho para nós.
1 cabo Ethernet
1 tábua de pão
Fios de jumper
Linux IoT provisionados e conectados à Internet. Isso é um bocado - há um pouco daquele jargão sobre o qual eu avisei
- então vamos descompactá-lo abordando-o do ponto de vista dos problemas que serviços como o resin.io estão
Lembre-se do capítulo 11 que os SBCs (como o BeagleBone Black) são tipicamente capazes de
UAU! e-book
www.wowebook.org
Machine Translated by Google
executando vários tipos de Linux, mas que a compensação por essa flexibilidade é que a instalação
e a administração do Linux podem adicionar alguma sobrecarga (e dor de cabeça) a um fluxo de trabalho
desenvolvimento preferido (como seu laptop) pode ser uma tarefa árdua. Gerenciar configurações e
configurações do ambiente pode ser uma dor de cabeça. Você pode ter vontade de trabalhar de
(como Git para controle de versão) e colaborando com outros desenvolvedores. Conseguir tudo isso
aos poucos pode levar tempo e energia, ou pode até atrapalhar você completamente.
Agora imagine que seu aplicativo de IoT precisa ser executado não apenas em um BeagleBone (ou Pi ou
outro SBC), mas em uma frota inteira deles, possivelmente espalhados geograficamente por estados,
correta do código para cada dispositivo, monitorar dispositivos quanto a falhas, enviar SO ou
atualizações de segurança — fazer tudo isso manualmente não vai funcionar bem.
Depois, há todos os requisitos para produtos de software e hardware usados por pessoas reais: análise
(quanto uso um determinado dispositivo está recebendo?), segurança (vamos garantir que estamos
carregando a frequência cardíaca desse usuário por meio de uma conexão segura !), e
assim por diante.
Há muita coisa acontecendo aqui. Para realizar muito disso, o resin.io (e alguns outros serviços
Conteinerização — A ideia-chave aqui é que você deseja que o mesmo aplicativo seja executado
da mesma maneira em cada um de seus dispositivos. O Resin.io usa contêineres do Docker para
e receber atualizações de aplicativos. Para fazer isso, baixe uma imagem de disco personalizada de
resin.io e inicialize cada dispositivo a partir dela. Assim que um dispositivo for provisionado
com sucesso, ele aparecerá no painel da web para o aplicativo resin.io associado, como você
verá em breve.
Você não pode balançar um gato na internet hoje em dia sem encontrar alguém que está
UAU! e-book
www.wowebook.org
Machine Translated by Google
dizendo algo (geralmente vago, mas quase sempre elogioso) sobre contêineres. Você lerá que os contêineres são a melhor
solução para implantação de aplicativos, para segurança, para desempenho, para garantir a paz mundial e assim por
diante, mas o que é mais difícil de rastrear é uma explicação do que diabos é um contêiner e o que é, em termos reais,
sim.
Um contêiner serve para encapsular e isolar um aplicativo e os bits e bobs necessários para funcionar corretamente
(dependências, configurações e afins). Um único servidor ou dispositivo de computação pode executar vários contêineres
separados ao mesmo tempo sem que eles interfiram entre si. Da mesma forma, o mesmo contêiner pode ser
implantado em vários computadores diferentes e, como o contêiner contém todas as coisas necessárias para definir o
ambiente do aplicativo, bem como todas as suas dependências, você pode ter certeza de que o aplicativo se comportará
conteinerização específica e da empresa que a criou. O Docker é, de longe, a tecnologia de contêiner mais popular do setor.
Depois que um projeto resin.io e seus dispositivos são configurados, você pode desenvolver seu aplicativo iterativamente.
Quando você envia alterações para seu Git remoto resin.io, o resin.io reconstrói o contêiner do seu aplicativo com o código
atualizado e implanta esse contêiner em todos os dispositivos conectados e provisionados para esse aplicativo, onde
Figura 12.2. Os dispositivos que executarão o aplicativo são provisionados com a instalação e
inicialização de uma imagem personalizada do sistema operacional resin.io em cada um. O push do
código do aplicativo para um controle remoto resin.io Git específico do projeto aciona a reconstrução do
contêiner do aplicativo e sua reimplantação em dispositivos provisionados conectados.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Atualizando a velocidade
O código para seu aplicativo resin.io será gerenciado em um repositório Git — você precisará ter o Git
instalado em seu computador. A seção “Instalando o Git” no site do gitscm documenta como fazer
isso em várias plataformas diferentes (https://git scm.com/book/en/v2/
GettingStartedInstallingGit).
Embora as instruções para criar um aplicativo resin.io incluam todos os comandos do Git necessários
para colocar um aplicativo em funcionamento em um BeagleBone Black, um conhecimento prático do
Git deve fazer parte da caixa de ferramentas mental de todo desenvolvedor. Leva alguns minutos
para aprender o básico do Git (embora, honestamente, uma vida inteira para dominar). O GitHub
tem um tutorial interativo (https://try.github.io/levels/1/challenges/1) e há vários outros recursos
educacionais on-line sobre o Git, muitos deles gratuitos.
Em seguida, crie um aplicativo. Você será solicitado a fornecer um nome e um tipo de dispositivo
para seu aplicativo. Você pode nomeá-lo como quiser - eu chamei o meu de beagleweather. Para
UAU! e-book
www.wowebook.org
Machine Translated by Google
No campo Device Type, selecione BeagleBone Black na longa lista de opções (figura
12.4).
Nenhum BeagleBone Black disponível? Você pode usar um Raspberry Pi, se quiser.
Você precisará usar a versão Pi do código do aplicativo meteorológico (encontre-o na
pasta do capítulo 11 do repositório GitHub do livro) - com o plug-in raspiio I/O - mas, caso
contrário, as etapas devem ser as mesmas. Ah, e, claro, certifique-se de selecionar
Raspberry Pi 3 em vez de BeagleBone Black como o tipo de dispositivo para seu aplicativo resin.io.
UAU! e-book
www.wowebook.org
Machine Translated by Google
resin.io é um Linux leve. Ele pode executar o contêiner Docker do seu aplicativo e também cuidar de
tarefas de manutenção, como provisionar o dispositivo e ficar de olho nas atualizações implantadas.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Depois de definir seu aplicativo resin.io, você pode fazer o download da imagem do sistema
operacional gerada (há um link fornecido, conforme mostrado na figura 12.5) e instalá-la em seus
dispositivos (ou, no nosso caso, em um único dispositivo) . Consulte a seção 11.2.3 no capítulo 11
BeagleBone Black. Continue segurando o botão até que os LEDs comecem a piscar loucamente.
Solte o botão.
Figura 12.6. Mantenha pressionado o botão BOOT/USER do BeagleBone Black para inicializar a
partir do cartão SD.
UAU! e-book
www.wowebook.org
Machine Translated by Google
De volta ao seu próprio computador, você deve ver o dispositivo aparecer no painel do seu
aplicativo resin.io após alguns instantes. No painel, você poderá acompanhar o progresso do dispositivo
Primeiro você precisa estabelecer uma área de trabalho. Crie um diretório para conter o projeto
$ git calor
UAU! e-book
www.wowebook.org
Machine Translated by Google
Para implantar seu aplicativo, você precisa ser capaz de enviar o branch master do seu repositório para
resin.io. Você precisará adicionar um controle remoto Git específico do resin.io para poder enviar para
o resin.io mais tarde. O Resin.io mostra convenientemente o comando exato que você precisa executar
para configurar esse controle remoto: localize-o no canto superior direito do painel do seu aplicativo.
Você pode ver todos os controles remotos do seu repositório executando este comando:
$ git remoto v
Em seguida, copie os arquivos de origem do aplicativo de clima BeagleBone original para o novo diretório
O sistema operacional resin.io básico para seu aplicativo que agora está sendo executado em seu
BeagleBone Black consiste em um Linux simplificado e também contém algumas ferramentas úteis de
suporte. Mas você ainda precisa criar o contêiner do Docker que será executado no(s) dispositivo(s) do seu aplicativo
diga-lhe como se comportar e o que fazer.
permite o uso de certas variáveis úteis dentro do arquivo) e adicione o conteúdo mostrado na listagem a
CÓPIA DE . ./
# server.js será executado quando o contêiner for inicializado no dispositivo CMD ["npm", "start"]
2 Você precisará definir um script npm start que inicia seu aplicativo.
Dentro dos Dockerfiles resin.io, você pode especificar muitos detalhes sobre dispositivos, recursos
e distribuições e versões do Linux. Há muito o que abordar aqui, mas se você estiver curioso sobre
essas coisas, a documentação do resin.io é completa (https://docs.resin.io/
raspberrypi/nodejs/gettingstarted/).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Isso informa ao construtor para executar o comando npm start assim que o contêiner for iniciado.
Você ainda não tem um script de início, mas pode facilmente adicionar um editando package.json.
Edite o campo scripts em package.json para que fique parecido com a listagem a seguir.
"scripts": {
"start": "node index.js", "test": "echo \"Erro:
nenhum teste especificado\" && exit 1"
},
Agora, quando o processo de compilação executar o comando npm start, ele terá o mesmo efeito que a
O REPL do JohnnyFive e o resin.io não se dão bem. Você pode desabilitar o REPL facilmente, adicionando
A porta existente definida para o servidor web (4000) em server.listen() funcionaria bem, mas há um truque muito
Comprometendo-se e empurrando
Adicione e confirme os arquivos do projeto no Git (certifique-se de estar no nível superior do projeto
UAU! e-book
www.wowebook.org
Machine Translated by Google
diretório):
A primeira vez que você fizer isso, levará vários minutos (depois é mais rápido). Você pode
acompanhar o progresso em seu painel resin.io (figura 12.8). Você poderá visualizar o aplicativo
em um navegador em seu computador em seu endereço IP local.
Para iterar em seu aplicativo, você pode fazer alterações em seu repositório local, confirmar e
enviar com a frequência necessária.
Você tem construído muitas interfaces baseadas na Web para seus gadgets, mas até agora só
conseguiu visitar seus aplicativos da Web na mesma rede. O Resin.io tem um recurso
interessante que gera uma URL pública para um dispositivo, permitindo acesso externo à porta
80 desse dispositivo (agora você sabe por que mudou o número da porta!).
Para habilitar URLs públicos para o aplicativo como um todo, vá para a seção Ações do WOW! e-
book
www.wowebook.org
Machine Translated by Google
painel do seu aplicativo (figura 12.9).
Figura 12.9. Habilite URLs públicos para seu aplicativo na guia Ações do aplicativo.
Em seguida, acesse uma visualização específica do dispositivo navegando até a seção Devices e
clicando no nome do dispositivo que deseja gerenciar — rednight no meu caso (figura 12.10).
Figura 12.10. Consulte a URL pública de um dispositivo navegando até a guia Ações específica
do dispositivo.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vá para a seção Ações novamente - essas são ações apenas para este dispositivo, em
vez de todo o aplicativo. Você deve ser capaz de ver — e, para ajudar, clicar — na URL
pública de seu aplicativo em execução no BeagleBone Black (figura 12.11).
com a E/S do BeagleBone Black e o sensor conectado. É possível interagir com hardware,
diretamente, de dentro do próprio navegador?
A resposta é complexa – uma combinação de “depende” e “em alguns navegadores”, com uma boa
dose de “espere e veja só mais um pouco”.
A web é, sem dúvida, uma plataforma com muito mais capacidade física do que há alguns anos.
Não faz muito tempo que você tinha que criar um aplicativo nativo para poder acessar os serviços de
localização de um dispositivo móvel ou sua câmera, ou enviar notificações push. Agora
tudo isso pode ser feito no navegador.
A plataforma web é uma (vasta) coleção de tecnologias e APIs. Claro, existem as estrelas
principais - HTML, ECMAScript e CSS (embora, tecnicamente, CSS não seja uma coisa, mas
uma coleção de módulos) - mas também há dezenas e dezenas de outras peças: Web
Workers, WebGL, XMLHttpRequest, Web Audio, WebSocket, WebRTC (eu poderia continuar o dia
todo). Diferentes tecnologias e APIs estão em diferentes estágios no
UAU! e-book
www.wowebook.org
Machine Translated by Google
processo de padronização, e alguns ainda não estão tecnicamente no caminho dos padrões.
A Web Bluetooth API permite a interação com dispositivos Bluetooth Low Energy (BLE) por
meio do Generic Attribute Profile (GATT). Há um grupo comunitário ativo para Web Bluetooth no
W3C (o World Wide Web Consortium, o principal órgão que desenvolve padrões da Web) e é
implementado em algumas versões do Chrome, Opera e do navegador Android. Mas ainda não é um
padrão nem está na trilha dos padrões (embora esteja indo nessa direção geral). É complicado.
Mas, para que isso não pareça sombrio, essas lutas não são atípicas dos padrões propostos. É difícil
prever onde o Web Bluetooth estará em seis meses ou dois anos. E você pode — e vai — usá-lo hoje
no Chrome.
O Web Bluetooth não é a única API da Web relacionada a hardware na cidade (embora tenha as
implementações de navegador mais completas neste momento). O Grupo de Trabalho de Dispositivos
e Sensores do W3C (https://www.w3.org/2009/dap/) tem a tarefa de criar APIs que “interagem com o
hardware do dispositivo, sensores, serviços e aplicativos, como câmera, microfone, sensores de
proximidade, catálogos de endereços nativos, calendários e aplicativos de mensagens nativos.”
estendida por APIs específicas de componentes. Um exemplo disso é a API Ambient Light Sensor
(também um rascunho, https://www.w3.org/TR/ambientlight/), que define uma interface — baseada
em Sensor — para interagir com sensores de luz ambiente. Se você analisar os detalhes das
especificações, não será nenhuma surpresa que um dos editores das APIs genéricas e de outros
sensores seja Rick Waldron, o inventor do JohnnyFive. Certamente há aspectos do encapsulamento
de comportamento de componente da API que estão em harmonia com a forma como JohnnyFive
abstrai o comportamento.
conectado tanto quanto definir uma API de nível superior para interagir com componentes.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Como tal, as primeiras implementações do Sensor de luz ambiente dependem da presença de
hardware integrado (normalmente a câmera de um dispositivo) e do navegador expondo esse
hardware de acordo. O sensor de luz ambiente está disponível (atrás de uma bandeira - você
deve ativá-lo explicitamente nas configurações do navegador) no Chrome e no Microsoft Edge.
Examinamos a Web física brevemente no capítulo 1. O cenário imaginado ali era de um ponto de
ônibus ativado por um sinalizador. O beacon transmite constantemente uma URL que corresponde
a uma página onde as próximas chegadas de ônibus podem ser rastreadas (figura 12.12).
Figura 12.12. Com a Web física, os beacons Bluetooth Low Energy (BLE) anexados
ou incorporados a um objeto físico transmitem uma URL pertinente à interação com
esse dispositivo. Os usuários próximos podem detectar e interagir com dispositivos,
abrindo suas páginas da Web associadas em um navegador.
Ou diga que você está caminhando por um jardim de esculturas. Algumas das obras têm um
farol próximo ou sobre elas, transmitindo uma URL para uma página da web com informações
sobre aquela peça e seu artista. Ao passear, você pode ver os beacons perto de você e optar por
interagir com um deles, visitando a URL que está anunciando.
Android e iOS, permitem que você encontre qualquer beacon perto de você.
Espruino fabrica um dispositivo que permite que você experimente - hoje! agora mesmo!—com o Web Bluetooth
e a Web física. O Puck.js é um dispositivo em forma de botão que executa o interpretador Espruino e se
comunica usando BLE (figura 12.13). Você aproveitará isso para colocar em prática o Web Bluetooth e a Web
física.
Figura 12.13. Puck.js é um dispositivo beacon BLE que, como o Pico, executa o
interpretador Espruino JavaScript.
(vermelho, verde, azul). O LED vermelho também pode ser usado como um sensor de luz ambiente.
O Puck.js é um dispositivo de 3,3 V alimentado por uma bateria coincell. É aproximadamente comparável
a um Pico, embora um pouco mais restrito: velocidade de clock mais lenta, um pouco menos de memória
Puck.js tem uma capa de silicone flexível. A coisa toda pode funcionar como um botão grande,
Figura 12.15. Um detalhe da pinagem Puck.js de Espruino.com. O pino D11 pode detectar
2 entradas capacitivas. O suporte IC, SPI e USART está disponível em qualquer pino (há
2
suporte para uma interface de hardware cada, mas suporte de software ilimitado para IC e
SPI).
Puck.js+Quick+Start. Você precisará desmontar o dispositivo para remover uma aba protetora da bateria.
O que acontece depois disso depende do sistema operacional da sua plataforma de desenvolvimento e do estado de
UAU! e-book
www.wowebook.org
Machine Translated by Google
Web Bluetooth no momento. O Chrome no Mac OS é compatível com isso — é fácil. Os usuários do
Linux podem ter uma etapa extra e podem precisar habilitar um sinalizador ou dois no Chrome. O suporte
Web Bluetooth no Windows (no Chrome) é potencialmente iminente (meados de 2017). Consulte
o Guia de primeiros passos para obter informações atualizadas.
Se você acompanhou os experimentos do Pico no capítulo 11, talvez já tenha instalado o IDE do
aplicativo Espruino Chrome. Se não, não se preocupe, porque você pode realmente trabalhar com
Puck.js usando o IDE baseado na web em https://www.espruino.com/ide (não requer
instalação). O Web IDE (figura 12.16) é uma imagem cuspida do aplicativo Chrome
VAI.
Você não poderá usar o IDE baseado na Web em https://www.espruino.com/ide se não tiver suporte
Web Bluetooth. Em vez disso, você precisará instalar o Web IDE (consulte o Guia de introdução do
Puck.js para obter detalhes: http://www.espruino.com/Puck.js+Quick+Start).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Lembre-se também do capítulo 11 que a autoria do código Espruino envolve o uso de módulos
Espruino - comportamento encapsulado e suporte que podem ser importados para scripts Espruino.
Uma vez conectado, o Puck.js executará qualquer comando digitado no lado esquerdo da interface
IDE, semelhante a um REPL ou console.
O código escrito no lado direito do IDE pode ser carregado usando o ícone sendto Espruino.
Dados e comandos podem ser enviados e recebidos do Puck.js via Web Bluetooth.
Isso é feito no contexto de execução do navegador, contando com uma pequena biblioteca
JavaScript do lado do cliente fornecida pelo Espruino. (Este método é exclusivo do Puck.js, ao
contrário de outras placas Espruino.)
Inicie o IDE e conecte-se ao seu Puck.js para que você possa experimentar um piscar de LED Hello
World e cutucar alguns dos recursos do Puck.js.
Tente digitar alguns dos seguintes comandos no lado esquerdo do IDE. Depois de pressionar Enter, o
comando será enviado por BLE para Puck.js e será executado lá:
Tente os comandos anteriores com os outros dois LEDs: LED2 (verde) e LED3 (azul).
O LED vermelho também serve como um sensor de luz ambiente. Certifique-se de que todos os
LEDs estejam desligados (LEDx.reset()) e tente Puck.light() para retornar uma leitura de luz
1 Puck.js
Como você viu, você pode controlar o Puck.js usando o IDE: enviando comandos ou escrevendo um script
Mas há outra maneira: você pode controlar o Puck.js a partir do seu próprio código no navegador. Neste
experimento, você construirá uma página da Web que permite ao usuário ligar e desligar o LED vermelho do
Figura 12.17. O LED do Puck.js pode ser controlado por meio de uma página da Web em um navegador
compatível com Bluetooth.
O JavaScript da página precisará emparelhar com Puck.js e se comunicar com ele (enviar
comandos) usando Web Bluetooth.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O Espruino facilita essa parte para você, fornecendo uma pequena biblioteca do lado do cliente (um
arquivo JavaScript) que você pode usar em nossa página. A biblioteca abstrai os detalhes da Web Bluetooth
API, oferecendo uma interface simples que você pode usar para emparelhar e interagir com o Puck.js.
Essa biblioteca do lado do cliente pode ser encontrada em https://www.puckjs.com/puck.js. Você o incluirá
Se você está curioso sobre como o Web Bluetooth funciona nos bastidores, você pode ler a fonte do
js.com/puck.js.
A biblioteca JavaScript de puckjs.com fornece utilitários para conectar e se comunicar com Puck.js,
mas você ainda precisará escrever sua própria lógica específica para lidar com cliques de botão e enviar
Primeiro você precisa estabelecer uma área de trabalho - crie um diretório chamado ledtoggle. Em
Em seguida, crie um ponto de entrada de aplicativo em index.js, que ativa um servidor da Web estático
UAU! e-book
www.wowebook.org
Machine Translated by Google
Agora é hora de criar a página HTML do aplicativo. Para isso, crie um diretório app no
projeto e adicione index.html com o conteúdo mostrado na listagem a seguir.
<html>
<cabeça>
altura: 4em;
margem: 2em;
cor de fundo: #eee; borda: 1px sólida #ccc;
<button id="offButton">DESATIVADO</button>
<script src="https://www.puckjs.com/puck.js"></script> 2 <script> 3
// ... TBD
</script> </
body> </html>
A página HTML não faz nada sozinha: ela tem algum CSS e inclui o script do site
puckjs.com que permite que você se comunique com o Puck.js usando Web Bluetooth.
Ele também tem a marcação para os botões ON e OFF, mas eles ainda não fazem nada.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Vamos falar sobre manipuladores de cliques para os botões ON e OFF. Quando um botão é clicado,
você precisa enviar um comando para o Puck para ligar ou desligar o LED vermelho. Como você
viu na seção 12.4.4, este é o comando que o Puck.js precisa executar para ligar o LED vermelho:
LED1.set();
Esse é o comando que você precisa enviar para o Puck.js a partir do navegador, usando a
biblioteca do cliente puck.js como um mensageiro. O comando precisa ser enviado para Puck.js como
uma string, incluindo o caractere \n (quebra de linha). Esta é a string de comando resultante:
'LED1.set();\n'
Para enviar isso para Puck.js, você usará o método write() no objeto Puck, que está disponível
globalmente no JavaScript da sua página porque você incluiu a biblioteca puck.js do lado do
cliente (figura 12.18).
Puck.write('LED1.set();\n');
UAU! e-book
www.wowebook.org
Machine Translated by Google
O que significa Puck.js?
Há um objeto Puck no navegador, um objeto Puck diferente para o qual você pode enviar comandos no
puck.js — Uma biblioteca JavaScript do lado do cliente, fornecida pela Espruino, usada no
navegador para comunicação com um dispositivo Puck.js via Web Bluetooth (BLE)
Objeto Puck—Confusamente, esta é uma das duas coisas (totalmente diferentes) dependendo de onde
No IDE ou scripts executados diretamente no Puck.js—É a classe global Espruino Puck (http://
hardware específica para Puck.js—ou seja, funcionalidade que não está disponível em outras
placas Espruino (como usar Puck.light() para obter uma leitura do sensor de luz ambiente do
Puck.js)
acesso a alguns métodos de comunicação com Puck.js via Web Bluetooth (como Puck.write()
e Puck.connect()). Lembrando que todos os comandos enviados são avaliados no próprio Puck.js,
no interpretador Espruino.
Isso significa que em um script de navegador — supondo que a biblioteca cliente puck.js esteja incluída — a
Puck.write('Puck.light();\n');
Puck.write() é executado no contexto do navegador, o que significa que se refere ao objeto fornecido
pela biblioteca incluída puck.js. Mas o comando que ele envia via write() é avaliado no próprio
Puck.js: o objeto Puck em Puck.light() é uma referência ao objeto Espruino Puck global. Ufa!
A listagem a seguir define o que acontece entre as tags <script> em index.html: os ouvintes de evento de
UAU! e-book
www.wowebook.org
Machine Translated by Google
window.addEventListener('load', () => {
if ('bluetooth' em window.navigator) {
const onButton = window.document.getElementById('onButton'); const offButton =
window.document.getElementById('offButton'); onButton.addEventListener('click', () => Puck.write('LED1.set() ;
\n'));
offButton.addEventListener('click', () => Puck.write('LED1.reset();\n'));
} outro {
const mEl = window.document.getElementById('mensagem');
mEl.innerHTML = "Parece que seu navegador não suporta Bluetooth!";
}
});
significa que implementa corretamente o que é necessário para Puck.js. Há uma verificação mais correta e
JavaScript que fornece o objeto Puck. Infelizmente, essa função não está exposta ao objeto Puck - não está
em nenhum escopo ao qual você tenha acesso - portanto, você não pode invocá-la diretamente.
Experimente! Inicie o servidor da Web usando o node index.js e abra um navegador da Web compatível
Ao clicar pela primeira vez em um botão, você verá um pop-up de solicitação de emparelhamento,
semelhante à figura 12.19. Assim que o emparelhamento estiver concluído, você poderá clicar em ON e
Figura 12.19. Você será solicitado a emparelhar com Puck.js quando clicar em um botão pela primeira vez.
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 Puck.js
A Web física é composta de beacons usando um formato específico — Eddystone — para transmitir uma
URL associada, e essas transmissões podem ser captadas por aplicativos em execução
em dispositivos móveis.
O Puck.js pode servir como um sinalizador compatível com a Web física com bastante facilidade. Para fazer isso
Instale um aplicativo utilitário de descoberta da Web física ou habilite esse recurso no Chrome, em
um dispositivo móvel.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Faça o Puck.js começar a se anunciar como um beacon compatível.
O protocolo de Eddystone
Eddystone é um protocolo de beacon BLE aberto criado pelo Google. Os Web beacons físicos usam
esse formato para transmitir sua URL associada e os aplicativos clientes detectam esses beacons
Eddystone.
Eddystone é direto. Existem apenas alguns tipos de informações - tipos de quadros - que um sinalizador
Eddystone falante pode enviar, sendo o mais pertinente
EddystoneURL.
O comprimento máximo de um URL EddystoneURL é 17. Isso é apertado. Mas não é tão restritivo
quanto parece. Um byte separado também é usado para manter uma representação do prefixo do
esquema da URL (https://www., http:// e assim por diante) — esses caracteres não contam para os 17.
Além disso, domínios de nível superior comuns ( .com, .org e similares) podem ser representados
com um único caractere, deixando 16 caracteres livres. Supõe-se que os desenvolvedores
usarão encurtadores de URL (como https://goo.gl) para minimizar os tamanhos de URL.
A URL https://www.lyza.com tem 20 caracteres em seu formato normal, mas requer apenas 5 dos
17 bytes disponíveis.
Configurar o Puck.js como um Web beacon físico compatível com Eddystone é incrivelmente
require("ble_eddystone").advertise("https://www.lyza.com");
(Sinta-se à vontade, é claro, para substituir a URL do meu domínio por qualquer outra que desejar.)
Desconecte o IDE do seu Puck.js para que ele possa começar a transmitir em Eddystone
formatar.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Você pode detectar seu beacon da Web física Puck.js com dispositivos que executam Android
ou iOS (figura 12.20); as instruções podem ser encontradas no site da Web
física (https://google.github.io/physicalweb/tryphysicalweb). Uma vez configurado, seu
dispositivo móvel deve ser capaz de ver seu beacon Puck.js.
Figura 12.20. Suporte físico da Web por meio do widget do Chrome no iOS. Puck.js
está configurado para transmitir a URL https://www.lyza.com usando o protocolo
Eddystone.
UAU! e-book
www.wowebook.org
Machine Translated by Google
É hora de sair com um estrondo (bem, um ding, pelo menos). Nosso último experimento combinará
Web Bluetooth, Web Audio e dados enviados de Puck.js.
1 Puck.js
Este experimento reproduz um som (de alta qualidade) e exibe um alerta visual em um navegador sempre que
o botão Puck.js emparelhado é pressionado. Pense nisso como uma campainha baseada na web. Ele aproveita
a API de áudio da Web - mais uma bela API da Web - para carregar e reproduzir um som de carrilhão (domínio
público).
A lógica do aplicativo usa a biblioteca puck.js do lado do cliente para se conectar ao Puck.js via Web Bluetooth,
configura o Puck.js para monitorar seu botão onboard e analisa os dados — saída de string que significará o
Comece estabelecendo uma área de trabalho. Crie um diretório (“campainha”) e instale express como uma
Crie index.js, o servidor web estático. Você pode reutilizar o código da listagem 12.5, que executará um servidor
Crie um diretório de aplicativos dentro da campainha. Adicione um arquivo index.html com o seguinte
contente.
<html>
<cabeça>
.ding {
cor de fundo: #e60a62;
transição: todos os 0,1s de saída fácil;
}
botão {
largura: 100%;
altura: 100%; borda: 5px
sólido #e60a62;
fontfamily: "Times New Roman";
texttransform: letras minúsculas;
fontvariant: smallcaps;
cor de fundo: transparente;
tamanho da fonte: 3em;
peso da fonte: 600; cursor: ponteiro; }
<body>
<button id="goButton">Ligue</button> <script src="https://
www.puckjs.com/puck.js"></script> <script src="PuckChime.js "></script> <script>
Figura 12.21. No momento, index.html mostra um botão muito grande, mas não tem
nenhuma funcionalidade.
UAU! e-book
www.wowebook.org
Machine Translated by Google
O botão (#goButton) terá um manipulador de evento de clique que ativará a campainha. Você pode estar
se perguntando por que essa etapa de clique extra é necessária - por que não ativar a campainha
no carregamento da página? Por motivos de privacidade e permissões, é necessário que haja uma ação
explícita na interface do usuário antes que o emparelhamento Bluetooth seja permitido pelo navegador
— se você tentar fazer isso sem a entrada ativa do usuário, receberá um erro.
O arquivo index.html contém um pedaço de CSS. Parte do estilo é formatar o grande botão Turn It
On, mas também há estilos para fazer a tela piscar quando a campainha toca e para desativar o botão
Turn It On (a classe .active) quando a campainha é tocada
ativado.
Agora você pode preencher o conteúdo <script> com o código na listagem a seguir. Este código
window.addEventListener('load', () => {
const onButton = window.document.getElementById('goButton');
onButton.addEventListener('click', function () {
var carrilhão = new PuckChime();
chime.init().then(() => { 1
onButton.classList.add('ativo'); 2
});
});
});
1 Assim que a promessa chime.init() for resolvida, você saberá que o BLE Puck.js
UAU! e-book
www.wowebook.org
Machine Translated by Google
carrilhão foi configurado com sucesso.
2 Você não precisa mais do botão, então você pode adicionar a classe ativa para fazê-la
desaparecer.
A lógica da campainha BLE é mais complicada do que enviar comandos de uma linha para Puck.js em
manipuladores de eventos de clique, como na página da web de controle de LED anterior.
Faz sentido encapsular o código em uma classe, PuckChime, dentro de um novo arquivo,
classe PuckChime {
construtor () {
aquecer () {
/**
* estabelecer conexão com Puck.js
* redefinir Puck.js
* envie o comando para Puck.js: observe o botão embutido para pressionamentos * invoque `chime()` como
confirmação auditiva/visual quando for bem-sucedido
*/
}
conectar () {
/**
* conecte-se ao Puck.js com BLE
* adicione um manipulador de eventos para eventos `data` do Puck.js */
enviar (cmd) {
// formata e envia `cmd` para Puck.js
}
reiniciar () {
// envia um comando `reset` para Puck.js e espera 1,5 segundos para que ele "pegue"
}
watchButton () {
/**
* envie um comando para Puck.js para observar o pressionamento de seu botão
* e registra (por Bluetooth) uma string quando o botão é pressionado */
}
UAU! e-book
www.wowebook.org
Machine Translated by Google
* Manipulador de eventos `data` para blocos de dados recebidos de Puck.js * anexar `data` ao
buffer * analisar o buffer em linhas (dividido em
`\n`)
* envie cada linha (`cmd`) para `parseCommand()` */
chime () { // toca
um som de carrilhão e faz um carrilhão visual
}
}
construtor () {
this.connection = null; 1
this.dataBuffer = ''; 2
this.sound = new Sound('/chime.mp3'); 3
}
aquecer () {
return this.connect().then(() => {
return new Promessa((resolver, rejeitar) => { this.reset()
.then(this.watchButton.bind(this))
.then(() => {
this.chime(); 4
resolver();
});
});
});
}
O construtor prepara um som — chime.mp3 — instanciando um objeto Sound. Se Sound parece uma aula
mágica que surgiu do nada, e chime.mp3 um arquivo de origem misteriosa, você está certo! Aguarde; mais
O método init retorna uma promessa que resolve quando as seguintes etapas são concluídas:
é redefinido 3. Puck.js
Somente quando todas essas coisas estiverem concluídas, a Promessa retornada por init() é resolvida;
chime() também é invocado como uma confirmação (a campainha tocará uma vez quando estiver pronta para
funcionar).
Continuando, os métodos connect(), send(cmd), reset() e watchButton() se comunicam com Puck.js, cada um
retornando uma promessa. Esses métodos dependem do código de comunicação puck.js do lado do
de dados do Puck.js
reset()—Envia um comando reset para Puck.js e também espera 1,5 s para que Puck.js esteja pronto
conectar () {
return new Promise ((resolver, rejeitar) => {
Puck.connect(conexão => {
this.connection = conexão;
this.connection.on('data', this.parseData.bind(this)); resolve(this.connection);
});
UAU! e-book
www.wowebook.org
Machine Translated by Google
});
}
enviar (cmd) {
cmd = `\x10${cmd}\n`;
return new Promise ((resolver, rejeitar) => {
this.connection.write(cmd, () => { resolve(cmd); });
});
}
reiniciar () {
return new Promise((resolver, rejeitar) => { this.send('reset()').then(() =>
{ setTimeout(resolver, 1500); });
});
}
watchButton () {
const cb = "function() { Bluetooth.println('CHIME'); LED1.set();
setTimeout(() => LED1.reset(), 250);}";
const opts = "{repeat:true,debounce:250,edge:'rising'}";
const cmd = `setWatch(${cb},BTN,${opts});`;
return this.send(cmd);
}
Vamos dar um zoom no comando enviado por watchButton()—é um pouco confuso como
formatado—e entender melhor o que está acontecendo com o envio e recebimento de
dados e comandos do Puck.js.
Como você viu no exemplo de LED controlado pela web na seção 12.4.5, os comandos precisam
ser formatados como strings antes de enviá-los ao Puck.js a partir do navegador. No experimento
de LED mais simples, isso foi feito com chamadas individuais para Puck.write() (veja a figura
12.18).
Nesse caso mais complexo, em que os dados estão indo em ambas as direções, você está
estabelecendo uma conexão persistente (no método connect()). Depois que a conexão é
estabelecida, os comandos são enviados para Puck.js usando connection.write(). Os dados
são recebidos do Puck.js por meio de eventos de dados emitidos na conexão (figura 12.22), que são
manipulados pelo manipulador de eventos de dados registrados, parseData(). Nós vamos chegar a isso em
momento.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Os objetos PuckChime enviam dois comandos para Puck.js: um comando reset() durante a
fase de inicialização para limpar qualquer teia de aranha ou esquisitices de Puck.js e, em
seguida, um comando mais complexo em watchButton(). O comando construído nesse
método, isento de todas as suas restrições e ignorando as restrições de quebra de linha,
é mostrado expandido na listagem a seguir. Ele faz uso da função global
setWatch(<callback>, <pin>, [<options>]) do Espruino.
setWatch(
função () { 1
Bluetooth.println('CHIME'); 2 LED1.set(); 3
setTimeout(() => { 4
LED1.reset();
}, 250);
},
BTN, 5
{
repetir: verdadeiro, 6 debounce: 250, 7
borda: 'subindo' 8
}
);
7 Reduz o pino (botão) para 250 ms para evitar o acionamento várias vezes por pressionamento ou
O retorno de chamada registrado no Puck.js para pressionamentos de botão desconecta uma string via Bluetooth
Os dados são emitidos do Puck.js sempre que algo é emitido no Bluetooth. Isso acontece quando
Bluetooth.println('CHIME') é executado no callback do buttonwatching, mas nem tudo que vem do Puck.js será
um comando CHIME. Por exemplo, várias linhas de depuração e saída de versão são geradas (automaticamente)
logo após o estabelecimento de uma conexão. Essas linhas não são relevantes para sua lógica, então o
parseCommand(cmd) garante que você tenha uma correspondência real para a string CHIME.
Antes de alimentar os comandos em parseCommand(), porém, você deve analisar os “comandos” dos outros
dados recebidos. Os dados vêm em blocos, então cabe ao manipulador parseData() manter um buffer simples e
quebrar os dados da string recebida em linhas — delimitadas por caracteres \n (quebra de linha). Essas linhas
são passadas para parseCommand() para ver se elas representam, de fato, um comando válido — CHIME
parseData (dados)
{ this.dataBuffer += dados;
var cmdEndIndex = this.dataBuffer.indexOf('\n');
while (~cmdEndIndex) { var cmd = this.dataBuffer.substr(0, cmdEndIndex).replace(/\W/g, '');
this.parseCommand(cmd);
this.dataBuffer = this.dataBuffer.substr(cmdEndIndex + 1);
cmdEndIndex = this.dataBuffer.indexOf('\n');
}
}
parseCommand (cmd) {
if (cmd.match('CHIME')) {
this.chime();
}
}
UAU! e-book
www.wowebook.org
Machine Translated by Google
1 1 é o único valor que produzirá 0 (falso) diante do operador NOT bit a bit (~).
3 Passa esta linha para parseCommand() para ver se significa alguma coisa
carrilhão () {
window.document.body.classList.add('ding');
this.sound.play();
window.setTimeout(() => {
window.document.body.classList.remove('ding'); }, 500);
No mesmo diretório da fonte PuckChime.js hospedada, você também pode encontrar o arquivo
de som chime.mp3 - ou sinta-se à vontade para usar seu próprio arquivo de som (não se esqueça de
atualizar a instanciação Sound no construtor do PuckChime se você der um nome de arquivo diferente).
classe Som {
constructor (url) { // Contexto no qual
carregar () {
return new Promessa((resolver, rejeitar) => {
if (this.buffer) { resolve(this.buffer); }
var request = new window.XMLHttpRequest();
request.open('GET', this.url, true);
request.responseType = 'arraybuffer';
request.onload = () =>
{ this.context.decodeAudioData(request.response, soundBuffer => { this.buffer = soundBuffer;
resolve(this.buffer);
});
};
request.send();
});
}
/**
* Carregue um AudioBuffer e crie um AudioBufferSourceNode para reproduzi-lo.
* Conecte o AudioBufferSourceNode ao destino (saída)
*/
jogar () {
this.load().then(buffer => {
// Cria um novo AudioBufferSourceNode que pode reproduzir som de // um buffer (objeto AudioBuffer)
const source = this.context.createBufferSource();
source.buffer = buffer;
// Conecta o AudioBufferSourceNode ao destino
// (por exemplo, os alto-falantes do seu laptop)
source.connect(this.context.destination);
source.start(0);
});
}
}
Experimentando a campainha
UAU! e-book
www.wowebook.org
Machine Translated by Google
index.js — Um servidor web simples.
app/index.html—Inclui estilo e marcação para o grande botão Turn It On, bem como um manipulador
de evento de clique para o botão inicializar a campainha (objeto PuckChime).
Ele também inclui a biblioteca JavaScript cliente Puck.js para comunicação com Puck.js, bem como
PuckChime.js.
app/chime.mp3 (ou outro arquivo de som de sua escolha)—O som tocado quando a campainha é
pressionada.
$ node index.js
Abra seu navegador para localhost:3000. Também pode ser útil abrir o console do Web
Inspector em seu navegador para ver quaisquer mensagens ou erros registrados. Ao clicar no botão
Ativar, você verá uma solicitação de emparelhamento pop-up (figura 12.23).
Após o emparelhamento, o processo de inicialização leva alguns segundos — você verá alguns
registros no console. Você saberá que está pronto e bem-sucedido se ouvir o som da campainha
tocar e ver a tela piscar rapidamente em rosa (figura 12.24).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Este experimento de campainha BLE é uma boa ilustração de onde estão as fronteiras no mundo
dos dispositivos físicos e do JavaScript. O Puck.js executa o interpretador Espruino, que é quase, mas
não totalmente, JavaScript completo — otimizações estão em vigor para possibilitar a execução de
JavaScript em hardware tão restrito. Web Bluetooth funciona em alguns navegadores, mas existem
algumas deficiências. No momento em que escrevo, você precisa reparar a cada recarga de página, o
que é uma chatice. E você pode achar que ele é intermitentemente não confiável de maneiras
complicadas de depurar.
Mas o próprio fato de o Puck.js existir e de o Web Bluetooth ser implementado em alguns navegadores
é notável, e é um grande salto em relação a apenas 12 ou 18 meses atrás. A popularidade
contínua e o crescimento do plug-in I/O do JohnnyFive, que completou cinco anos em 2017, é uma
indicação de que o interesse nessas áreas por parte dos desenvolvedores de JavaScript continua
forte. Esse crescente interesse na fusão de JavaScript e outras tecnologias da Web com
dispositivos físicos também é refletido na explosão de opções Node.jscapable gerenciadas em nuvem
para hardware IoT, especialmente na classe SBC de dispositivos capazes de executar Linux.
Construir competência em hacking eletrônico não significa plantar uma bandeira profunda e
inflexivelmente. O JavaScript não precisa ser seu martelo, sua abordagem única dogmática.
Em vez disso, pode servir como um paradigma para exploração, uma lente familiar através da qual
se examina o desconhecido. O JavaScript pode realmente levá-lo até onde você precisa ir. Mas para
outros casos, uma mente aberta e curiosa é inestimável.
Portanto, encorajo você não apenas a continuar aprendendo por meio do JavaScript, mas também, à
medida que se sentir mais confortável, a explorar mais. Leia mais sobre como diferentes protocolos
seriais funcionam, aprofunde-se na manipulação bit a bit, aprenda a escrever firmware baseado em C. E
UAU! e-book
www.wowebook.org
Machine Translated by Google
embora seja falso dizer que C é fácil, é certamente acessível: muitos acharam a linguagem de
programação Arduino (que, falando de forma grosseira, é basicamente C++ com alguns recursos
extras de controle de hardware adicionados) uma porta de entrada útil para a proficiência em C++.
Funileiro. Construir. Pergunte. Leia sobre tecnologia. Quebre as coisas de propósito. Saiba que,
mesmo que esta seja sua primeira vez construindo circuitos e trabalhando com E/S física, você pode
descobrir como construir as coisas que você sonha. Feliz hacking!
RESUMO
A conteinerização é uma abordagem que isola os aplicativos e suas dependências dos caprichos
das variações do ambiente e é uma escolha popular para implantação de aplicativos de IoT.
A Web Bluetooth API ainda não está nos padrões oficiais da web, mas existem
implementações em vários navegadores. Alguns de seus recursos ainda não foram resolvidos e
os modelos de segurança e permissões permanecem controversos.
O Espruino fornece uma pequena biblioteca JavaScript do lado do cliente que usa Web Bluetooth
para se comunicar com o Puck.js.
A API de sensor genérico e outras APIs de sensor baseadas nela, como a API de sensor de luz
ambiente, estão em seus primeiros dias de definição de padrões, mas estão em desenvolvimento
ativo.
Para participar da Web física, um dispositivo BLE pode anunciar uma URL usando o protocolo
Eddystone aberto. Usuários próximos com software de descoberta compatível podem navegar e
interagir com esses beacons.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Índice
[SÍMBOLO][ A ][ B ][ C ][ D ][ E ][ F ][ G ][ H ][ I ][ J ][ K ][ L ][ M ][ N ][ O ][ P ][ Q ][ R ][
Tópicos
S ][ T ][ U ][ V ][ W ][ X ][ Y ]
Tutoriais
SÍMBOLO
Ofertas e promoções
# personagem
= personagem
Destaques
Oh símbolo
Configurações
>> e << operadores de deslocamento de bits
Apoiar
A
sensores de adafruit
nd terceiro
função ajusteTempo()
LED de alerta
altDisplay
variável de altitude
horas de amp
Ampères (ampères)
entrada analógica
sensores analógicos
conversão analógico-digital
nd
fotoresistores, 2
frequência
escala
limite
UAU! e-book
www.wowebook.org
Machine Translated by Google
tensões em circuitos
AnalogFirmata
função analogRead
ânodo
definições de configuração
constantes
trabalhando com
escrevendo plugins
Documentação da API
para plataformas
para Puck.js
para Raspberry Pi 3
formulários
construindo em Tessel
código de ajustes
plataforma arduino
método hostclient
JohnnyFive
linguagem de programação
fluxo de trabalho
arduino uno
pinos digitais
UARTs
Microcontrolador ATmega328P
B
força eletromotriz traseira
largura de banda
baterias
visão geral
terminais de bateria
não pare
nd
deslocamento de bits, 2
UAU! e-book
nd
www.wowebook.org
Machine Translated by Google
nd
módulo ble_eddystone
Blend Microboard
nd
método piscar, 2
blinkCount
blinkMax
criando HTML
BMP180 multissensores
Pico e
implantação de código
testando
variável bmp180
Objeto Board.Fn
freqüência de placa.loop
Pranchas
desenvolvimento
Bocoup
tábuas de pão
circuitos de alimentação
UAU! e-book
www.wowebook.org
Machine Translated by Google
quadros de fuga
visão geral
método de brilho
navegadores
botões
níveis lógicos
conectando
testando
retornos de chamada
capacitores.
capas
cátodo
função centro()
nd
função change(), 2
chassis
função checkIfSupported()
função chime.init()
nd terceiro
circuitos
prédio
divisores de corrente
UAU! e-book
www.wowebook.org
Machine Translated by Google
para Raspberry Pi 3
para robôs
circuitos paralelos
circuitos servo
atual
lei de ohm
problemas com
diagramas de
alimentando
alimentando motores em
resistência
sem solda
Veja também circuitos GPS; ; circuitos de motores; ; circuitos paralelos; ; circuitos em série; ;
método clear()
clientes
fechar função
circuito fechado
nuvem, IoT e
bateria coincell
aulas de cobrança
UAU! e-book
www.wowebook.org
Machine Translated by Google
Mixin de coleção, controlando vários switches com
bússola
plug-ins de componentes
configurar função
configurando
APDS9960
Elemento Kinoma
declinações magnéticas
plataformas
nd
Puck.js, 2
Raspberry Pi 3
sem cabeça
gerenciando arquivos em
tradicional
atualização de software
atualizando o Node.js em
Tessel
conectando
encontrando
instalando a CLI
provisionamento
renomear
nd
método connect(), 2
nd
função console.log(), 2
construtores, implementando
atual
lei de ohm
problemas com
divisores de corrente
limitadores de corrente
cortar fios
evento de dados
troca de dados
pinos de dados
adaptador DC
declinações, magnético
função padrão
você valoriza
objeto de dependências
implantação de código
trança de dessoldagem
nd terceiro
placas de desenvolvimento, 2 , 3
diagramas
de circuitos
UAU! e-book
www.wowebook.org
Machine Translated by Google
de hardware, para Kinoma Element
de pinagem
dados digitais
comunicação paralela de
comunicação serial de
entradas digitais
níveis lógicos
pinos digitais
conectando LED a
no arduino uno
nd
função digitalWrite, 2
LEDs de escurecimento
diodos
visão geral
para Raspberry Pi 3
exibe
Dockerfile.template
nd
botão para baixo, 2
Função E.getTemperature()
facilita a função
funções facilitadoras
erro de BUSY
nd
protocolo Eddystone, 2
fluxo elétrico
pressão elétrica
eletroímã
componentes eletrônicos
sistemas embarcados
PT (ativar) pino
invólucros
Espruino API
configurando
aplicativo gravador
interface eth0
função eval()
cabeçalhos de expansão
Expressar
farads
firmware
protocolos de firmware
UAU! e-book
www.wowebook.org
Machine Translated by Google
memória flash
flexbox
função flip()
flutuando
tensão direta
nd terceiro
tipos de quadro
quadros
parâmetro de frequência
frequência, ajustando
software fritzing
módulo fs
registro GCONF
redução de marcha
Veja GPIO.
genuíno
dados de gesto
decodificação
em processamento
sensores de gesto
integrando
plug-ins.
UAU! e-book
www.wowebook.org
Machine Translated by Google
função getHeight()
método getPressure
método getSeaLevel
função getWidthIO
Repositórios Git
inicializando
GoButton
características do Puck.js
Características do Raspberry Pi 3
registro GSTATUS
H
Drivers Hbridge, controlando motores com
hardware
JavaScript e
prototipagem
kits de ferramentas
placas de desenvolvimento
componentes eletrônicos
componentes de entrada
poder
ferramentas
implementando construtores
UAU! e-book
www.wowebook.org
Machine Translated by Google
integração de sensores de gesto
fios de conexão
nd
método hostclient, 2
EU
camadas de E/S
nd
pinos de E/S, 2
plug-ins de E/S
2
CI (Circuito InterIntegrado)
método i2cRead
Método i2cReadOnce
função init(), 2 , 3
entradas
componentes
Classes de sensores
instalando
Tessel CLI
sinais invertidos
UAU! e-book
www.wowebook.org
Machine Translated by Google
opção inverterPWM
propriedade da opção io
Scanner IP
propriedade isActive
propriedade isOn
linguagem JavaScript
Assinado
método hostclient
JohnnyFive nd
incorporado, 2
configurando
Referência da API
configuração
características principais de
exemplos e tutoriais
gerenciamento
fluxo de trabalho
BMP180 multissensores e
hardware e
Elemento Kinoma
novas plataformas
UAU! e-book
www.wowebook.org
Machine Translated by Google
configuração de
características principais de
exemplos e tutoriais
diagramas de pinagem
fluxo de trabalho
pico
rodando em SBCs
Plataforma JohnnyFive
para Raspberry Pi 3
Classes de botão
definições de configuração
constantes
fios jumper, 2
quadros-chave
Referência da API
configurando
características principais de
exemplos de
diagramas de hardware
gerenciando
diagramas de pinagem
tutoriais
fluxo de trabalho
nd
eu
Scanner LAN
função lcd.clear()
LCDs
completando conexões
conectando
monitores paralelos
UAU! e-book
www.wowebook.org
Machine Translated by Google
LDR (resistor dependente de luz)
nd terceiro
Função LED.reset()
Função LED.set()
Método led.stop
piscando
com JohnnyFive, 2º
com sysfs
com Tessel
criando circuitos
em circuitos paralelos
em circuitos em série
LEDs RGB
circuitos de alimentação
mudança de nível
carga, circuito
lógica
seção de loop
MCUs (microcontroladores)
animação metronômica
microcontrolador
mensagens MIDI
escudos modulares
módulos
nd
interruptores momentâneos, 2
arquivo motortest.js
motores
direção de controle de
robôs de controle
robôs de condução
UAU! e-book
www.wowebook.org
Machine Translated by Google
SN754410 conexões de energia
velocidade de controle de
visão geral
alimentando
robôs e
ferramenta multímetro
banda multiplicadora
pacote nanotimer
terminal negativo
Netduino
Node.js
atualizando no Raspberry Pi 3
margem de ruído
UAU! e-book
www.wowebook.org
Machine Translated by Google
fazer temporizadores visuais de contagem regressiva com
Pico e
ligação ao Pico
valores numéricos
lei de ohm
ohms
ON luzes LED
função onLaunch()
função onQuit()
circuito aberto
OpenWrtName
optoisoladores
optoacopladores
saídas
construção de robôs
base do chassi
robôs e motores
componentes
LEDs
LEDs RGB
motores
UAU! e-book
www.wowebook.org
Machine Translated by Google
controlando com JohnnyFive
visão geral
servos
P
package.json, atualizando dependências
embalagem
nd terceiro
circuitos paralelos, 2 , 3
comunicação paralela
interface paralela
função parseCommand()
método parseData()
pcDuino
fotocélula
fotocondutor
fotorresistor.valor
nd
fotoresistores, 2
frequência de ajuste
escala de ajuste
limite de ajuste
Classes de sensores
tensões em circuitos
produção física
UAU! e-book
nd
www.wowebook.org
Machine Translated by Google
nd
Web física, 2
Puck.js e
protocolo Eddystone
bico, spruin
BMP180 multissensores e
implantação de código
ligação ao Pico
efeito piezoelétrico
piezos
tocando músicas
nd
função pinMode(), 2
pinagem
diagramas
do Elemento Kinoma
em Puck.js
em Raspberry Pi 3
alfinetes
alta impedância de
microcomputadores
visão geral.
Função Pins.configure()
plataformas
plugins
codificação
sensores de gesto
símbolo de polaridade
Terminal positivo
energia potencial
poder, 2
circuitos
trilhos de força
função process.exit()
método processGesture
em processamento
prototipagem
hardware
prova de conceito
Programas
mudar de projeto
placas de prototipagem
Função puck.connect()
Puck.js, Espruino
Documentação da API
UAU! e-book
www.wowebook.org
Machine Translated by Google
configuração de
características principais de
recursos GPIO
Web física e
protocolo Eddystone
pinagens
tutoriais
criando HTML
fluxo de trabalho
nd
Função Puck.light(), 2
Função puck.write()
Q
fila
Raspberry Pi
UAU! e-book
nd
www.wowebook.org
Machine Translated by Google
nd
Plataforma Raspberry Pi 3, 2
construindo circuitos
testando BMP180
Documentação da API
configuração
gerenciando arquivos no Pi
atualização do software Pi
atualizando o Node.js no Pi
características principais de
recursos GPIO
chapéus
Configurando WiFi no Pi
kit
pinagens
configuração tradicional
tutoriais
WiringPi
função de leitura
lerGesto
nd
evento pronto, 2
comando de reinicialização
adicionando em circuitos
desmontando
Remotos
Componente RemoteSwitch
escrevendo plugins
retornos de chamada
plugins de codificação
fila
módulo RemoteSwitch
renomeando tessel
solicitar pacote
nd
exigir declaração, 2
função require()
botão de reset
método reset()
resina.io
comprometendo e empurrando
criando aplicativos
resistência
lei de ohm
nd
visão geral, 2
resistores
UAU! e-book
www.wowebook.org
Machine Translated by Google
pulldown, botões de fiação com
Raspberry Pi 3
LEDs RGB
robôs
alimentando motores
controle de motores de
robôs de condução
motores e
RX (receber)
S
satélites
salvar bandeira
função salvar()
nd
SBCs (computadores de placa única), 2
UAU! e-book
www.wowebook.org
Machine Translated by Google
Raspberry Pi 3
kit
configuração tradicional
escala, ajustando
esquemas
prefixo do esquema
campo de scripts
sensores
leitura de dados.
comunicação em série
assíncrono
UARTs
noções básicas de
de dados digitais
síncrono
2
eu C
2
fazendo bússola digital com magnetômetro IC
SPI
dados seriais
circuitos em série
LEDs em
UAU! e-book
www.wowebook.org
Machine Translated by Google
função server.listen()
método setContrast()
nd
setInterval, 2
nd
função setTimeout, 2
método de configuração
seção de configuração
nd
função setWatch(), 2
escudos
curtos-circuitos, evitando
função showRemaining()
caderno de desenho
esboços
Motorista SN754410
habilitar conexões
conexões lógicas
conexões de energia
diodo de amortecimento
UAU! e-book
www.wowebook.org
Machine Translated by Google
Socket.IO, exibindo dados ao vivo com
Programas
prototipagem
implementando construtores
pavio de solda
juntas soldadas
de solda
kits de montagem
ferro de solda
velocidade, de motores
PadrãoFirmataPlus
nd
função start(), 2
função stop()
descascando fios
comuta
orquestrando
projetos de prototipagem
construindo circuitos
hardware de prototipagem
software de prototipagem
UAU! e-book
www.wowebook.org
Machine Translated by Google
remoto, controlando com plug-ins de componente JohnnyFive
SPI
TCobbler, Adafruit
comando de apagar t2
comando de lista t2
nd
comando de execução t2
comando de atualização t2
comando de versão t2
linhas terminais
nd
Tessel 2 plataforma, 2
alimentando motores
leds piscando
construindo aplicativos em
capacidades de
configurando
conectando Tessel
UAU! e-book
www.wowebook.org
Machine Translated by Google
conectando Tessel à rede WiFi
encontrando Tessel
instalando a CLI
provisionamento Tessel
renomeando tessel
explorando pinos
implantações push
configurando
implantação push t2
atualizando
usando Socket.IO
pacote tesselio
testando
BMP180 multissensores
botões
limite, ajustando
componentes de passagem
função tick()
arquivo timeradvanced.js
temporizadores
acreditar
minúsculos computadores.
alternar método
faixa de tolerância
ferramentas
nd
transdutores, 2
Botão Ligar
função desligar()
função ativar()
tutoriais
encontrando
para Puck.js
interpolação
TX (transmitir)
EM
atualizando
index.js
dependências package.json
Programa Raspberry Pi 3
código rover
Tessel
Enviando
esboços de piscar
URL, público
EM
UAU! e-book
www.wowebook.org
Machine Translated by Google
Botão de verificação
saída virtual
tensão
em circuitos
lei de ohm
EM
Waldron, Rick
método watchButton()
comprometendo e empurrando
estações meteorológicas
construindo circuitos
testando BMP180
rodas
redes wi-fi
UAU! e-book
www.wowebook.org
Machine Translated by Google
Configurando no Raspberry Pi 3
conectando Tessel a
bobinas de fio
fios
troca de dados
camadas de E/S
plug-ins de E/S
opções de comunicação
JavaScript embutido
Tessel
implantações push
configurando
usando Tessel 2
fiação
diagrama de fiação
WiringPi
interface wlan0
fluxo de trabalho
em plataformas
Elemento Kinoma
de arduino
Puck.js
UAU! e-book
www.wowebook.org
Machine Translated by Google
método write()
e bandeira
UAU! e-book
www.wowebook.org
Machine Translated by Google
Lista de Figuras
Capítulo 1. Unindo JavaScript e hardware
Figura 1.2. O sistema de ventilação automática precisa receber entrada de um sensor de temperatura e
Figura 1.3. O ventilador automático precisa de um cérebro. Uma opção popular é um microcontrolador, que
microcontrolador do ventilador estão conectados em um sistema com alimentação e circuitos. Não se estresse se o
os símbolos são novos para você - você aprenderá sobre circuitos à medida que continuamos nossa jornada.
Figura 1.5. Placas de desenvolvimento baseadas em microcontroladores tornam mais conveniente a conexão
Figura 1.6. Uma placa de ensaio fornece uma grade conectada eletricamente na qual prototipar
Circuitos eletrônicos.
Figura 1.7. Memória de programa não volátil (EEPROM e Flash) e placas de fácil utilização
por energia e circuitos. E a coisa toda está escondida dentro de uma caixa bem chique, porque,
Figura 1.10. Para que o computador host e o hardware cliente se comuniquem neste método, eles
ambos precisam usar uma API comum.
Figura 1.13. À medida que o host executa a lógica do JavaScript, as instruções e os dados são
Figura 1.14. A plataforma Espruino combina pequenas placas de hardware com um IDE
ambiente de desenvolvimento.
Figura 1.15. O Tessel 2 é uma plataforma open source que roda Node.js nativamente.
Figura 1.16. Vários computadores de placa única (SBCs): Intel Galileo, Gen 2 (superior), Raspberry
Figura 1.18. Neste exemplo de aplicação da Web física, um sinal de parada de ônibus usa um BLE
beacon para transmitir um URL uma vez por segundo (1); um humano nas proximidades pode procurar
beacons disponíveis em seu dispositivo e selecionar aquele correspondente ao ponto de ônibus (2); o dispositivo do
motorista de ônibus agora pode buscar a URL transmitida pelo beacon e exibi-la no
navegador (3).
Figura 1.19. Algumas placas de desenvolvimento típicas baseadas em microcontroladores, no sentido horário de cima
à esquerda: um Tiva CSeries LaunchPad da Texas Instruments, um Arduino Uno R3, um Adafruit
Figura 1.20. Esta placa Arduino Uno é alimentada pelo AVR ATmega 328P, um processador de 8 bits
microcontrolador.
Figura 1.22. Componentes comuns como esses irão ajudá-lo a construir componentes eletrônicos funcionais
circuitos.
Figura 1.24. Esta caixa de equipamento compacta tem espaço na parte superior para ferramentas e armazenamento para
Figura 2.1. O Arduino Uno é a placa mais popular do Arduino e a que seremos
UAU! e-book
www.wowebook.org
Machine Translated by Google
explorar ao longo dos próximos capítulos.
Figura 2.4. Alguns dos pinos de alimentação do Arduino Uno. Estes são alimentados sempre que a placa
é alimentado.
Figura 2.5. Os LEDs padrão têm um ânodo (terminal positivo) e um cátodo (terminal negativo
Figura 2.6. Iluminando um LED com um Uno. Conectando a energia (3,3 V) ao terra (GND)
com o LED completa o circuito, removendo quaisquer lacunas e permitindo que os elétrons fluam
através.
circuitos, a energia flui do positivo para o negativo. A energia flui para a extremidade do ânodo (positivo)
Figura 2.9. Na primeira vez que você iniciar o Arduino IDE, ele criará um novo esboço vazio
para você.
Figura 2.10. É difícil para seus LEDs conectá-los diretamente a um pino de E/S digital Uno de 5V.
Figura 2.11. O minúsculo LED de montagem em superfície ao lado do pino 13 acende (laranja) sempre que o pino 13
Figura 2.13. O esboço carregado deve fazer o LED integrado piscar a cada 500 ms.
Figura 2.14. A primeira etapa para definir a configuração do hostclient com o Uno é carregar um esboço Firmata que
UAU! e-book
www.wowebook.org
Machine Translated by Google
Capítulo 3. Como construir circuitos
Figura 3.1. Penhascos mais altos fornecem mais “tensão”, ou seja, potencial elétrico. Tensão é como
“pressão” elétrica, empurrando as cargas (água-viva) de alto potencial de energia para um local de menor potencial.
Figura 3.3. A corrente, o fluxo de eletricidade, pode ser medida contando quantas cargas
(água-viva) passam por um ponto específico em um penhasco durante um período de tempo definido.
Recomendado
Figura 3.4. Os habitantes da cidade adicionam resistência ao circuito canalizando águas-vivas que caem
Figura 3.6. O novo cookie de assinatura dos habitantes da cidade mostra a relação entre
Figura 3.7. Mordendo a borda do biscoito impresso com o fator, o cookieeater Tutoriais
quer descobrir, eles podem ver rapidamente a equação que precisam resolver. Por exemplo, se
Destaques
Figura 3.8. Um problema comum da lei de Ohm do mundo real: qual valor do resistor é necessário para
Configurações fornecer um LED com 20 mA de corrente em um circuito com uma tensão de alimentação de 6 V?
suporteFigura 3.9. Um curto-circuito não tem carga para moderar a corrente. Uma ilustração comum de um curto-circuito de
é passar um fio diretamente do terminal positivo para o negativo de uma bateria
Sair (não
faça isso na vida real).
Figura 3.11. Esquema do circuito de LED simples. Os esquemas são concisos e padronizados
espaço.
Figura 3.12. Diagrama de fiação do circuito de LED simples, mostrando um layout físico específico
para implementar o circuito a partir de seu esquema. Este diagrama foi criado no código aberto
Figura 3.13. Um circuito em série tem apenas um caminho possível para as cargas (água-viva) fluirem UAU! e-
book
www.wowebook.org
Machine Translated by Google
completamente - não há ramos. A corrente é a mesma em qualquer ponto de um circuito em série,
Figura 3.15. Os pinos em lados opostos do botão estão sempre conectados eletricamente, enquanto os pinos
que compartilham um único lado são conectados apenas quando o botão é pressionado.
Figura 3.16. Um botão de pressão conectado a uma breadboard, abrangendo o entalhe central. Quando não
pressionado, os pares de pinos na parte superior e inferior do botão são conectados eletricamente
(horizontalmente). Quando pressionados e mantidos, os pares de pinos nos lados esquerdo e direito do
Figura 3.18. Diagrama de fiação do circuito de LED adaptado com um botão de pressão
Figura 3.19. À medida que a eletricidade passa por um LED, alguma voltagem é usada ou diminuída. O
quantidade de tensão usada é chamada de tensão direta do LED. Ele varia entre cerca de 1,8 V
O mesmo circuito de LEDs em série pode ser visto de uma perspectiva diferente. À medida que a corrente
da água-viva passa pelo LED, 1,8 V é “consumido”, reduzindo a tensão restante para 3,2 V
(reduzindo a inclinação). Esses 3,2 V são então usados pelo resistor limitador de corrente. Quando
a água-viva atinge o ponto de menor potencial elétrico, toda a tensão no circuito foi
sido contabilizado.
Figura 3.21. Cada um dos dois LEDs diminui um pouco da tensão no circuito e, novamente, o
Figura 3.22. Os dois LEDs são ligados em série com um resistor de 100 V. Há apenas um único
caminho através deste circuito quando o botão é pressionado: através do primeiro LED, através do
Figura 3.24. Em um circuito paralelo, há mais de um caminho, ou ramificação, que a corrente pode seguir. Em
Neste exemplo, existem duas ramificações: cada uma tem seu próprio LED e resistor.
Figura 3.25. Porque as duas ramificações neste circuito paralelo têm a mesma resistência (100 WOW! eBook
www.wowebook.org
Machine Translated by Google
V), metade da corrente irá para um ramo e metade para o outro.
Figura 3.27. Cada ramificação de um circuito paralelo isoladamente atua como seu próprio circuito em série. Nós
pode usar a lei de Ohm para verificar se esse ramo também consumirá 50 mA.
Figura 3.28. A corrente total que entra no circuito é de 100 mA (ponto A). Ele se divide igualmente em duas
D é novamente 100 mA. Em um circuito paralelo, a tensão fornecida é constante para cada ramo, mas
a corrente varia.
Figura 3.30. A fiação de LEDs em paralelo permite que você conecte mais em um único circuito porque
Figura 3.31. Alimentar o circuito de LED paralelo com uma bateria de 9 V envolve a troca
Figura 4.1. O ventilador de temperatura controlada do capítulo 1 usou uma temperatura analógica
Figura 4.2. Um sensor analógico como um sensor de temperatura (topo) transduz mudanças em
temperatura em um sinal analógico suave. Uma entrada digital como um interruptor de inclinação (inferior)
pode ter apenas dois valores de saída discretos: um quando orientado normalmente (desligado, BAIXO, 0 ou
Figura 4.3. O sinal de saída de um sensor de temperatura analógico varia em tensão ao longo do tempo
Figura 4.4. ADC é suportado pelo microcontrolador ATmega328P em pinos específicos (feitos
disponível como A0A5 no Uno). Os ADCs convertem sinais analógicos em valores digitais discretos.
Figura 4.5. À medida que as condições de luz mudam, a resistência do fotoresistor muda. Isto
torna-se mais condutivo - isto é, menos resistivo - quando mais luz o atinge. Quando é
Figura 4.6. Com um circuito como este, não haverá nenhuma variação de tensão significativa no pino WOW!
e-book
www.wowebook.org
Machine Translated by Google
A0.
Figura 4.8. Em um circuito em série, a tensão pode diferir em pontos diferentes. Cada componente usa
Figura 4.9. A lei de tensão de Kirchoff afirma que somar todas as tensões em um circuito sempre produz 0. Ou
Figura 4.10. As tensões em diferentes pontos em um circuito em série variam com base na quantidade de tensão
Figura 4.12. Um divisor de tensão fornece uma nova tensão mais baixa em Vout, disponível em pontos
entre dois resistores, R1 e R2. Existem várias maneiras de desenhar um divisor de tensão
Figura 4.13. Quando R1 e R2 têm a mesma resistência em um circuito, Vout é metade de Vin, como
Figura 4.14. Vout é 1/5 (20%) da tensão de alimentação porque R1 fornece 80% do total
resistência no circuito.
Figura 4.16. Diagrama de fiação para o circuito divisor de tensão do fotoresistor. O fio jumper
conectada a A0 precisa ter sua outra ponta conectada a Vout, entre o fotoresistor (R1) e o resistor de 4,7 kV (R2).
Figura 4.19. Um resistor pulldown “puxa” o pino digital para nível lógico BAIXO quando o
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 5.1. Os LEDs emitem uma única cor e estão ligados ou desligados.
Figura 5.3. Perdemos a capacidade de discernir piscadas individuais quando um LED está se movendo
rapidamente.
Figura 5.5. Apenas alguns dos pinos digitais do Arduino Uno suportam PWM. eles estão marcados
com ~.
Figura 5.6. inOutSine é uma das dezenas de opções de funções de easing disponíveis em
Figura 5.7. A animação de pulso fará um loop metronomicamente entre dois quadros-chave básicos
Figura 5.9. Deslocar um número de 10 bits para a direita por 2 resulta em um número de 8 bits.
Figura 5.10. A operação XOR compara cada dígito binário, produzindo um 1 se o binário
Figura 5.11. Os LEDs RGB de catodo comum têm três LEDs componentes (vermelho, verde, azul)
Figura 5.13. Módulos LCD paralelos 16x2 estão disponíveis em muitos fabricantes. Eles
Figura 5.18. Potenciômetros são resistores variáveis. Eles vêm em várias formas e tamanhos.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 5.19. Diagrama de fiação mostrando as conexões de energia da breadboard para o LCD
Figura 5.23. Alguns piezos têm fios condutores e outros têm pernas. Piezos têm dois pinos: +
e.
Figura 6.2. A corrente elétrica através de um fio cria um campo magnético em um ângulo reto para
fluxo de corrente.
Figura 6.3. A corrente através da bobina cria um campo magnético que magnetiza o ferro
núcleo do eletroímã.
Figura 6.5. Um eletroímã em um eixo entre dois ímãs fixos vai querer
Figura 6.6. Os eletroímãs de um motor com escovas são conectados a um anel dividido chamado
as escovas de posição (B) são conectadas à fonte de alimentação e as “escovas” alternam as polaridades
no comutador conforme ele gira abaixo deles, alterando a polaridade dos eletroímãs
Figura 6.7. Quando um motor é girado por uma força externa, uma corrente elétrica é gerada.
Figura 6.8. Quando um motor é conectado a uma fonte de alimentação, a corrente flui do negativo (baixo
potencial) em direção ao positivo (potencial mais alto). O fluxo de corrente faz com que o motor gire.
Quando o fluxo de corrente é removido do motor, a inércia faz com que o motor continue
girando brevemente. Durante este tempo, o motor atua como um gerador, gerando eletricidade com
Figura 6.9. No circuito desprotegido mostrado aqui, o fluxo de corrente é controlado com um botão WOW! e-
book
www.wowebook.org
Machine Translated by Google
botão (interruptor). Quando o interruptor é pressionado e mantido, a corrente flui como esperado,
Figura 6.10. Ao soltar o botão (interruptor aberto), o motor continua girando por um tempo. Durante este tempo
potencial negativo - centenas de volts, digamos - que é muito, muito menor do que os +9 V de
a bateria.
Figura 6.11. Diodos são componentes semicondutores que permitem apenas que a corrente flua em um
direção.
Figura 6.12. Diagrama de circuito de um motor básico controlado por botão, incluindo um
diodo protetor
Figura 6.13. Se um diodo flyback for usado em um circuito com um indutor como um motor, ele pode
fornecer um caminho para a tensão negativa reprimida que está tentando seguir o caminho errado. Ele pode encaminhá-lo
Figura 6.14. Um MOSFET e seu símbolo de circuito. Uma pequena tensão aplicada ao pino gate (G) fará uma
Figura 6.16. Um servo e suas partes básicas. Os chifres vêm em diferentes formas e tamanhos: discos,
Figura 6.17. Um servo (com chifre anexado) posicionado em um ângulo mínimo, um ângulo neutro,
e um ângulo máximo. Diferentes servos têm diferentes faixas de ângulo da vida real.
Figura 6.18. Os capacitores vêm em vários pacotes e tamanhos diferentes; capacitores eletrolíticos
capacitores e capacitores cerâmicos são bastante comuns. Cuidado: alguns, mas não todos,
Figura 6.20. Os fios de servo vêm em várias cores e possuem conectores diferentes. Lá
deve ser um fio vermelho - ele se conecta a Vcc (fonte de alimentação). O fio mais escuro - preto ou
marrom - é moído. O fio restante é o fio de sinal - abreviado aqui como S - para
Figura 6.21. Um robô básico precisa de um chassi (corpo). Dois ou mais motoredutores se conectam ao WOW!
e-book
www.wowebook.org
Machine Translated by Google
rodas ou trilhos para impulsionar o bot. Claro, você também precisará de circuitos, um cérebro
Figura 6.22. Um circuito Hbridge contém quatro interruptores, com o motor no centro.
Diferentes combinações de estados de comutação podem direcionar a corrente através do motor em diferentes
instruções.
Figura 6.23. Ativando diferentes interruptores em uma Hbridge, um motor pode ser feito para girar em
Figura 6.24. Fechar os dois interruptores em ambos os lados do Hbridge causa “disparo”—
um curto-circuito!
Figura 6.25. Drivers de motor baratos, como este Texas Instruments SN754410, oferecem
controle lógico sobre circuitos Hbridge internos. Eles também incluem outros componentes, como
diodos, tornando o controle do motor mais simples e menos sujeito a erros. O SN754410 é um H duplo
Figura 6.26. A placa inferior do chassi Peewee Runt Rover, com lateral anexada
suportes e breadboard. Se você estiver usando um chassi diferente, parecerá um pouco diferente, claro
curso.
Figura 6.27. A placa superior do chassi Peewee Runt Rover, mostrada com engrenagem anexada
motores, rodas, suporte para placa de desenvolvimento e Arduino Uno. Certifique-se de que os fios dos motores estejam
orientado para o interior do chassis. Os fios do motor podem passar por baixo do Uno
Figura 6.29. O SN754410 precisa ser conectado a uma fonte de alimentação do motor em VCC2
(pino físico 8) e a alimentação lógica em VCC1 (pino físico 16). os dois permitem
os pinos devem ser conectados diretamente a 5 V para defini-los como ALTO. Existem também quatro pinos GND
Figura 6.30. Fiação das conexões de energia do SN754410 na placa de ensaio do robô
Figura 6.31. Cada um dos dois drivers de motor tem dois pinos de entrada e dois pinos de saída.
Figura 6.32. O primeiro controlador de motor: dois pinos de entrada e dois pinos de saída. vamos usar um
dos pinos de entrada para controlar a direção do motor e o outro para controlar sua velocidade.
Figura 6.33. Quando a primeira entrada é definida como ALTA e a segunda entrada é definida como BAIXA, o
motor WOW! e-
book www.wowebook.org
Machine Translated by Google
vai virar para a frente.
Figura 6.34. Quando a primeira entrada é BAIXA e a segunda é ALTA, o motor gira na
Figura 6.35. Com a direção definida como LOW (reversa) no pino 1A e um ciclo de trabalho de 25% no pino 2A
Figura 6.36. Com a direção definida como HIGH (para frente) no pino 1A e um ciclo de trabalho de 25% no pino
Figura 7.1. Com um sensor analógico simples como o TMP36, você pode obter um valor para um único
ponto de dados (temperatura) por amostragem da tensão do sinal em diferentes pontos no tempo (A, B, C).
Figura 7.3. Na comunicação serial (topo), um bit é enviado de cada vez sequencialmente. Em contraste,
Figura 7.4. Para que os dispositivos troquem dados usando comunicação serial, eles precisam saber
como falar um com o outro.
Figura 7.5. A troca de dados seriais assíncronos: cada um dos dois dispositivos conectados pode
transmitir dados (TX) para e receber dados (RX) do outro componente. Observe que um
o TX de um dispositivo se conecta ao RX do outro e vice-versa. Uma placa de fuga de GPS como
Figura 7.6. Um quadro de dados seriais assíncronos. Um único bit de início é seguido por 5 a 9 bits de dados. Um
bit de paridade pode ser usado para detecção de erro. Em seguida, um ou dois bits de parada indicam o
final do quadro.
Figura 7.7. A estrutura do quadro de dados de 9600/8N1: bit de início, 8 bits de dados, sem bit de paridade, um
parar um pouco
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 7.8. Um UART é um hardware especializado para comunicação serial assíncrona e
conversão paralelo-serial.
Figura 7.9. Antes de poder usá-lo em uma breadboard, o GPS precisa ter alguns pinos de cabeçalho
soldado a ele.
Figura 7.11. Um ferro de solda comum e barato. Os baratos normalmente não têm
Figura 7.12. Seu ferro de solda precisa de um suporte para segurá-lo quando não estiver em uso e protegê-lo
Figura 7.13. Principais coisas que você precisa para começar a soldar
Figura 7.14. Proteja seus componentes antes de soldar. Uma terceira mão é uma ferramenta conveniente
por esta.
Figura 7.15. Coloque a ponta do ferro de solda na almofada de conexão de metal e o pino para aquecer
Figura 7.16. O pino aquecido fará com que a solda derreta e flua ao redor da junta.
Figura 7.17. Uma conexão bem soldada se assemelha a um pequeno vulcão de solda.
Figura 7.19. Em uma configuração SPI simples - um mestre, um escravo - apenas três fios
pode ser usado para troca de dados: uma linha de relógio compartilhada (SCK) gerenciada pelo mestre, mestre
Figura 7.20. Quando mais dispositivos são adicionados, pelo menos uma linha adicional—slaveselect (SS)
— é necessário, embora algumas configurações de SPI exijam uma linha SS por dispositivo escravo.
Figura 7.21. Não importa quantos dispositivos estejam conectados juntos, com I2C existem
Figura 7.22. A placa de fuga da bússola, como a fuga de GPS, precisará ser soldada
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 7.24. Diagrama de fiação, etapa 1. Os fios na placa de ensaio com a bússola
breakout board são organizados para abrir espaço para sensores que serão adicionados posteriormente.
ser conectado a um barramento I2C (via pinos SDA e SCL) ou, com alguns pinos fazendo dupla função
conforme observado na imagem, uma configuração SPI de quatro fios (via pinos CS, SDO, SDA e SCL).
Figura 8.1. Este esboço do capítulo 1 descreve as comunicações teóricas hostclient para
um widget de fã automático. Em seus experimentos até agora, o Arduino Uno atuou como um fino
Figura 8.2. Como o Uno, essas placas possuem microcontroladores restritos, mas ambos podem
variantes de JavaScript e tempos de execução semelhantes a JavaScript. Exploraremos tanto o Pico como o
Figura 8.5. O circuito de LED básico original para o Uno. O Uno opera em 5,5 V, enquanto
o Tessel é um dispositivo de 3,3 V. O circuito precisa ser ajustado para a tensão diferente do
Tessel
Figura 8.6. Conecte o ânodo do LED à porta A do Tessel, pino 5, e seu cátodo ao GND
conexão na porta A.
Figura 8.7. Os pinos do Tessel são divididos em duas “portas”, cada uma com 8 pinos de E/S.
Figura 8.8. Tessel 2 pinos e suas características. Qualquer pino numerado pode ser usado como E/S digital.
Figura 8.9. Um Tessel serve como centro nervoso para uma miniestação meteorológica. Um Node.js
servidor web para que outros computadores na mesma rede Wi-Fi possam ver o clima
UAU! e-book
www.wowebook.org
Machine Translated by Google
informações em um navegador da web.
Figura 8.10. Conecte o sensor BMP180 I2C à alimentação (GND e pinos 3,3 V da porta A),
Figura 8.11. Nada chique! Navegando para o endereço IP e a porta do Tessel em um navegador
Figura 8.12. Os valores de temperatura e pressão são atualizados em tempo real no seu navegador, via
websockets.
Figura 8.13. A configuração de motores duplos para o robô no capítulo 6 usou uma fonte de energia externa
Figura 8.14. O Tessel pode fornecer energia de 5 V dos pinos de alimentação destacados aqui.
Figura 8.15. A soldagem de pinos de cabeçalho fêmea aos pinos de alimentação de 5 V fornece slots reutilizáveis úteis
Figura 8.16. Para soldar conectores fêmea na placa, vire a placa e solde no
fundo. Você precisará de um pedaço de fita para prender os pinos no lugar enquanto solda.
Figura 8.17. Soldar fios sólidos aos pinos de alimentação também é uma opção.
Figura 8.18. Substituindo o Uno no robô itinerante do capítulo 6 por um Tessel, fazendo um par
de ajustes de fiação e conectando uma bateria USB ao Tessel, você pode criar uma rede de fios
A alimentação de 5 V do Tessel precisa alimentar ambos os trilhos de alimentação - certifique-se de conectar o positivo
colunas dos trilhos de alimentação juntas usando um fio jumper adicional (vermelho) (próximo ao topo).
Figura 8.20. O circuito do rover usando duas fontes de energia: o Tessel de 3,3 V e um de 9 V
Figura 9.1. Conjuntos de tomadas com controle remoto são baratos e amplamente disponíveis em
lojas de ferragens e home centers. A unidade de controle remoto é alimentada por uma bateria de baixa voltagem.
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 9.3. Quando um botão é pressionado, ele faz contato com os dois lados do ziguezague
contatos abaixo dela. Você pode reproduzir esse efeito conectando os dois lados com um
fio jumper.
Figura 9.4. Sem multímetro? Você pode usar um LED para descobrir qual lado da
os contatos do botão são do lado do terra. Um LED é um diodo - ele só permitirá que a corrente flua se
está alinhado corretamente no circuito. Quando acende, isso significa que seu cátodo está no
Figura 9.5. Uma configuração ideal seria soldar os fios diretamente em cada lado de cada botão
almofada de contato.
Figura 9.7. Se desejar, você pode conectar um ou mais de seus botões com fio a um push
Figura 9.8. Para cada botão do controle remoto, você deseja pressionar e soltar o
botão usando o Tessel como um controlador switchlike. Você deseja que a aplicação de corrente
entre os pontos 1 e 2 (o lado da entrada) faz com que a corrente flua entre os pontos 3 e 4 (o
saída, lado remoto), mas você não quer que os dois circuitos sejam conectados fisicamente.
Figura 9.9. A corrente aplicada ao lado de entrada de um fotoacoplador ativa um infravermelho interno
sensor. O SparkFun oferece um breakout board que facilita o trabalho com o chip.
Figura 9.13. Nesta representação simplificada da máquina de estado parcial do seu plug-in, um plug-in
instância do objeto começa em um novo estado. Por meio de um método de configuração, ele se move para um estado inicializado
estado, em que ponto o dispositivo APDS9960 é inicializado, mas não detecta ativamente gestos.
Figura 9.14. Existem 128 bytes de FIFO RAM, começando no endereço de memória 0xFC,
disponível para armazenar dados de gestos. Neste exemplo, há três conjuntos de dados disponíveis no
UAU! e-book
www.wowebook.org
Machine Translated by Google
Fila FIFO. Um conjunto de dados é composto de quatro bytes, cada um representando dados para um
Figura 9.15. A máquina de estado do plug-in ganha mais detalhes à medida que a pesquisa continua. quando um
interrupção é detectada, a instância do plugin entra em uma fase de ciclo de leitura e, em seguida, um processamento
Figura 9.18. A máquina de estado do plug-in agora está completa. O próximo passo é implementá-lo.
Figura 9.19. Uma amostra dos registradores APDS9960 que são gravados durante a configuração e
habilitar
Figura 9.20. Diferentes faixas de bits dentro do registro GCONF correspondem a diferentes
configurações. Os dois bits nas posições 6 e 5 definem o ganho do gesto, por exemplo. O bit 7 não é usado.
Figura 9.21. O ciclo de leitura começa verificando se o bit 0 no registrador GSTATUS está
1. Em caso afirmativo, GFLVL é lido para ver quantas amostras estão disponíveis (0101, ou seja, 5) e, em seguida,
o número indicado é lido no FIFO. O ciclo continua até que GSTATUS<0> seja
0.
Figura 9.22. processData executa aritmética nos dados; decodeData deriva a direção do gesto
dos resultados calculados e dispara eventos. Por fim, o objeto de dados do gesto é redefinido na instância para que
e os circuitos de botão/fotoacoplador.
Figura 10.1. Duas plataformas JavaScript incorporadas: Espruino Pico e Kinoma Element
Figura 10.2. O Pico tem 18 pinos (duas fileiras de 9 cada) em um passo de 0,1 polegada—breadboard
compatível. Eles precisarão ser soldados nos pinos de cabeçalho. Uma extremidade da placa Pico é moldada
Figura 10.3. Você pode usar um cabo de extensão USB para conectar seu Pico ao seu computador,
permitindo que o Pico seja colocado em uma breadboard. Os slots de extremidade USB do Pico em um USB A
UAU! e-book
www.wowebook.org
Machine Translated by Google
conexão feminina.
Figura 10.5. Este experimento fará com que os LEDs internos do Pico - um vermelho, um verde -
piscar alternadamente. O acesso aos LEDs é feito através das variáveis globais LED1 e LED2.
Figura 10.6. Inserindo o código LEDblink no Espruino IDE (tamanho da fonte aumentado para
visibilidade)
Figura 10.8. Oito dos pinos de E/S do Pico estão em um passo de 0,05 polegada: muito estreito para encaixar
breadboards.
Figura 10.12. Não se esqueça! Os trilhos de energia em uma breadboard de tamanho normal têm uma quebra no meio do caminho
Figura 10.13. Depois que o script BMP180 for carregado no Pico, você deverá ver o log de saída no lado
Figura 10.14. O Nokia 5110 LCD tem resolução de 48x84 pixels e uma interface SPI
Figura 10.15. Esquema elétrico para a adição de um componente Nokia 5110 LCD ao
o circuito
Figura 10.17. A saída do gadget meteorológico mostrará a temperatura e a pressão do ar, bem
formatado.
Figura 10.18. Usando o suporte gráfico do Espruino para criar formas e desenhar strings de texto
Figura 10.23. Detalhe da exibição do navegador, mostrando a direção da bússola. A direção da bússola
irá atualizar, ao vivo, sem a necessidade de recarregar o navegador. Neste caso, o título atual foi
Figura 10.25. A estrutura para o projeto Element livecompass. O arquivo main.js fornece
lógica de aplicativo e um servidor WebSocket, contando com o suporte do BLL em HMC5883L.js para
Figura 11.1. Computadores de placa única (SBCs), da esquerda para a direita: módulo Intel Edison com
Figura 11.2. Raspberry Pi 2 Modelo B (esquerda), Raspberry Pi Zero (primeiro plano central) e
Figura 11.4. Kit Raspberry Pi 3 Modelo B SparkFun construído com Pi Wedge, mostrado aqui
conectado a uma placa de ensaio. Também é mostrado um Adafruit TCobbler (à direita), que fornece
Figura 11.5. A área de trabalho PIXEL. Observe o ícone WiFi no canto superior direito.
página de download.
Figura 11.7. O Etcher é um utilitário direto: selecione o arquivo de imagem do disco, selecione a unidade (é
Figura 11.8. Usando LanScan para Mac, posso ver que a interface Ethernet do Raspberry Pi
UAU! e-book
www.wowebook.org
Machine Translated by Google
foi atribuído o endereço IP 192.168.1.13.
Figura 11.9. Depois de configurar o WiFi, o Pi agora tem dois endereços IP - um para a Ethernet
Figura 11.11. pinout.xyz é um site inteiramente dedicado às informações de pinagem do Raspberry Pi.
Figura 11.12. Diagrama de fiação para conectar o LED diretamente aos pinos do Pi, usando macho
Figura 11.15. O mini aplicativo meteorológico fornece dados de temperatura e pressão atualizados ao vivo
Figura 11.16. Diagrama de fiação para o BMP180, mostrando conexões diretas com o Pi
Figura 11.22. Recursos de pino BeagleBone Black disponíveis através do plug-in beagleboneio JohnnyFive I/O
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 12.2. Os dispositivos que executarão o aplicativo são provisionados pela instalação e inicialização
uma imagem personalizada do sistema operacional resin.io em cada um. Enviando o código do aplicativo para um projeto específico
resin.io Git remoto aciona a reconstrução do contêiner do aplicativo e sua reimplantação para
Figura 12.4. Detalhe da etapa de criação do aplicativo mostrando a lista de tipos de dispositivos suportados
Dispositivo BeagleBone Black. O dispositivo, chamado automaticamente de “rednight” pelo resin.io, está no meio
Figura 12.6. Mantenha pressionado o botão BOOT/USER do BeagleBone Black para inicializar a partir do SD
cartão.
Figura 12.7. Detalhe do painel do aplicativo resin.io mostrando onde encontrar o comando
Figura 12.9. Habilite URLs públicos para seu aplicativo na guia Ações do aplicativo.
Figura 12.10. Veja a URL pública de um dispositivo navegando até as Ações específicas do dispositivo
aba.
Figura 12.11. O aplicativo da estação meteorológica, rodando em um BeagleBone Black, acessado por uma resina
Figura 12.12. Com a Web física, beacons Bluetooth Low Energy (BLE) conectados ou
incorporado em um objeto físico transmite uma URL pertinente à interação com esse dispositivo.
Os usuários próximos podem detectar e interagir com dispositivos, abrindo suas páginas da Web associadas em um
navegador.
Figura 12.13. Puck.js é um dispositivo beacon BLE que, como o Pico, executa o interpretador Espruino
JavaScript.
Figura 12.15. Um detalhe da pinagem Puck.js de Espruino.com. O pino D11 pode detectar
entrada capacitiva. O suporte I2C, SPI e USART está disponível em qualquer pino (há suporte para
uma interface de hardware cada, mas suporte de software ilimitado para I2C e SPI).
UAU! e-book
www.wowebook.org
Machine Translated by Google
Figura 12.16. IDE baseado na web do Espruino
Figura 12.17. O LED do Puck.js pode ser controlado por meio de uma página da Web em um Web Bluetooth
navegador.
Figura 12.18. O JavaScript executado pelo navegador chama o método write() no Puck
objeto fornecido pela biblioteca puck.js. Essa biblioteca usa Web Bluetooth para enviar a string para
Puck.js sabe que o comando está completo, é quase como digitar em um REPL virtual e apertar Enter.
Figura 12.19. Você será solicitado a emparelhar com Puck.js quando clicar em um botão pela primeira vez.
Figura 12.20. Suporte físico da Web por meio do widget do Chrome no iOS. Puck.js está configurado
Figura 12.21. No momento, index.html mostra um botão muito grande, mas não tem nenhum
funcionalidade.
Figura 12.22. Para as comunicações bidirecionais no exemplo da campainha, a biblioteca do cliente puck.js é
Os comandos podem ser enviados para Puck.js pela conexão e qualquer saída para Bluetooth por
Figura 12.24. Quando o botão do Puck.js é pressionado, o som da campainha toca e a tela
pisca em rosa choque - pode-se até chamá-lo de pank, é tão brilhante - momentaneamente.
UAU! e-book
www.wowebook.org
Machine Translated by Google
listas de reprodução
História
Lista de mesas
Capítulo 3. Como construir circuitos Tópicos
Ofertas e promoções
Destaques
Tabela 6.1. Controle de direção do driver do motor para o motor 1
Sair
UAU! e-book
www.wowebook.org
Machine Translated by Google
recomendado
Lista de Listagens
aylists
Capítulo 1. Reunindo JavaScript e hardware
temperatura
Listagem 1.1. Pseudocódigo para a história lógica do ventilador acionado por
Apoiar
UAU! e-book
www.wowebook.org
Machine Translated by Google
.
Listagem 4.5. Saída de registro de dados do fotoresistor
UAU! e-book
www.wowebook.org
Machine Translated by Google
Listagem 5.13. Solicitando dados da API Dark Sky
UAU! e-book
www.wowebook.org
Machine Translated by Google
Capítulo 7. Comunicação serial
UAU! e-book
www.wowebook.org
Machine Translated by Google
Listagem 8.9. Executando o código LEDblink no Tessel
UAU! e-book
www.wowebook.org
Machine Translated by Google
Listagem 9.7. Testando a conexão com o APDS9960
Listagem 9.17. Um par de botões gerenciados por uma instância RemoteSwitch tem uma fila
UAU! e-book
www.wowebook.org
Machine Translated by Google
Listagem 10.7. Renderizando a exibição do clima
Listagem 10.14. Código do cliente (página HTML) para mostrar a direção da bússola
Listagem 11.1. Um script bash para piscar um LED anexado uma vez
UAU! e-book
www.wowebook.org
Machine Translated by Google
Listagem 12.1. Dockerfile.template
UAU! e-book
www.wowebook.org