Exploring Arduino 101 200.en - PT
Exploring Arduino 101 200.en - PT
Exploring Arduino 101 200.en - PT
você pode descobrir por que ele é chamado de H-ponte? Observe que o motor no com-
combinação com os quatro interruptores forma um maiúscula H. Embora o diagrama
mostra-lhes como interruptores, os componentes de comutação são realmente
transistores,
semelhantes aos que utilizou no exercício anterior. Alguns circuitos adicionais, incluindo diodos de
proteção, também é construída no circuito integrado da H-ponte.
O H-ponte tem quatro principais estados de funcionamento: aberto, travagem, para a frente, e
para trás. No estado aberto, todos os interruptores estão abertos e o motor não irá girar. No estado para a
frente, dois interruptores diagonalmente opostas estão envolvidos, fazendo com que a corrente flua de
9V, através do motor, e para baixo para terra. Quando o
BeawareofoneextremelyimportantconsiderationwhenusingH-bridges.Whatwouldhappenifbothswitchesontheleftorbothswit
Itwouldcauseadirectshortbetween9Vandground.Ifyou'veevershorteda9Vbatterybefore, youknowthatthisisnotsome-thingyo
inrarecircumstances, couldburstorleak.Furthermore, ashortcoulddestroytheH-bridgeorotherpartsofthecircuit.AnH-
bridgeisararescenariowhereyoucouldpotentiallydestroyapieceofhardwarebyprogrammingsomethingwrong.Forthisexperim
HDriver.Thischiphasabuilt-inthermalshutdownthatshouldkickinbeforeashortcircuitdestroysanything, butit'sstillagoodideato
Toensurethatyoudon'tblowanythingup,sempredisablethechipbefore
flippingthestatesofanyoftheswitches.Thisensuresthatashortcannotbecreatedevenwhenyouquicklyswitchbetweenmotordire
oneforcontrollingthetoptwogates, oneforcontrollingthebottomtwogates, andoneforenablingthecircuit.
Com as considerações anteriores em mente, é hora de construir o circuito. O chip ponte-H que você
usa é o motorista SN754410 Quádruplo Half-H. Two Half-H
condutores são combinadas em um controlador completa-H, tal como o mostrado na Figura 4-5.
Para este exercício, basta usar dois dos quatro pilotos Half-H para conduzir um motor DC. Se você
quiser fazer um carro de RC, por exemplo, você poderia usar este chip para controlar dois motores
DC (um para as rodas da esquerda e um para as rodas direita). Antes de realmente obtê-lo prendido
acima, dê uma olhada no pin-out e mesa lógica da folha de dados do item (veja a Figura 4-6).
2 parte II ■Controlar o Seu
Pin numeração em circuitos integrados (ICs) começa sempre no pino superior esquerdo
e vai em torno da parte anti-horário. Fritas sempre terá algum tipo de indicador para mostrar o pino que
é Pin 1, de modo que você não ligar o IC na cabeça para baixo. Em partes através de buracos (que é o
que você vai usar exclusivamente neste capítulo), um semi-círculo em uma extremidade do chip indica
o topo do chip (onde o pino 1 está localizado). Alguns chips podem ter um pequeno círculo marcada ao
lado de um pino sobre o invólucro de plástico, além de, ou em vez do semi-círculo.
■ G■ND (pinos 4, 5, 12, e 13): Os quatro pinos no meio conectar a um terreno compartilhado entre
seus 9V e 5V suprimentos.
■ V■
CC2 (Pin 8): V fornece a corrente do motor, de modo que o ligar ao
CC2
V■ 9V.
■
(Pin 16): V
poderes lógica do chip, para que você conectá-lo a 5V.
CC1 CC1
■ 1■Y e 2A (pinos 3 e 6):Estas são as saídas do controlador para a esquerda. Os fios do motor ligar
a estes pinos.
■ 1■A e 2A (pinos 2 e 7): Os estados dos interruptores à esquerda são con-trolada por estes pinos,
então eles estão ligados à I / O pinos no Arduino para alternar.
■ 1■,2EN (Pin 1):Este pino é usado para ativar ou desativar o driver esquerda. Ele é ligado a um
pino de PWM no Arduino, de modo que a velocidade pode ser controlada dinamicamente.
■ 3■,4EN (Pin 9):Este pino é usado para ativar ou desativar o driver correto. Porque
você não vai estar usando o driver correto, você pode desativá-lo, ligando este pino
diretamente para GND.
Para referência, confirme sua fiação com a Figura 4-7. Mantenha o potenciômetro
com fio, como era antes.
Bateria
Potenciômetro
motor DC
Você pode confirmar que o circuito está a funcionar antes de programá-lo enganchando
-se o pino de permitir a 5V, ligando um dos UMA pinos para a terra, ea outra UMA
fixar a 5V. Você pode inverter a direção, trocando o que oUMA pinos estão conectados.
ATENÇÃO shoulddisconnectthe9VbatterywhileswappingtheUMApinsto
ensurethatyoucan'tpossiblycauseanaccidentalshortcircuitwithintheH-ponte.
4 parte II ■Controlar o Seu
Seguindo o diagrama lógico da Figura 4-6, você pode rapidamente descobrir como
é preciso controlar os pinos para alcançar os resultados desejados:
■ P■ara interromper o fluxo de corrente através do dispositivo, defina o pino de baixo habilitar.
■ P■ara definir as opções para a rotação em uma direção, definir um alto, outro baixo.
■P■ara definir comutadores para a rotação no sentido oposto, de comutação que é elevado e
que é de baixo.
■ P■ara fazer com que o motor pare imediatamente, defina ambos os interruptores baixa.
NOTA waysdisablethecurrentflowbeforechangingthestateoftheswitches
toensurethatamomentaryshortcannotbecreatedastheswitchesflip.
Primeiro, você deve desenvolver as funções que com segurança executar o anteriormente
movimentos descritos. Criar um novo esboço Arduino e começar a escrever o seu
novas funções:
{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
HIGH); analogWrite (PT, a taxa);
Capítulo 4 ■Usando transistores e condução Motors 5
// Pára freio
motorvoid ()
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
LOW); digitalWrite (PT, HIGH);
void loop ()
{
val = analogRead (POT);
// Ir forwardif (val>
562)
{
velocidade = map (val, 563, 1023, 0, 255); para a frente
(velocidade);
// Ir backwardelse if (val
<462)
{
= velocidade de mapa (Val, 461, 0, 0, 255); reversa
(velocidade);
// brakeelse
{
freio();
}
}
são convertidas em valores digitais entre 0 e 1023. Consultar a Figura 4-8 para melhor
compreender o esquema de controle e comparar isso com o código de ciclo anterior.
Quando o potenciómetro se encontra dentro dos 100 unidades que rodeiam o ponto
central, a freiofunção é chamada. Conforme o valor aumenta de potenciómetro 562para
1023, A velocidade aumenta a frente. Da mesma forma, a velocidade de aumento no
inverso
direção entre valores potenciômetro de 462e 0. omapafunção deve
parece familiar para você a partir do capítulo anterior. Aqui, ao determinar o
velocidade reversa, observe a ordem das variáveis: 461é mapeado para 0e 0é
mapeado para 255; amapafunção pode inverter o mapeamento, quando as variáveis são passados em
ordem decrescente. Colocar o loop juntamente com as funções e oconfiguração, Você recebe
um programa completo que se parece com o mostrado na Listagem 4-3. Certifique-se de que o
seu programa corresponde a um aqui e carregá-lo em seu Arduino.
void setup ()
{
pinMode (PT, OUTPUT); pinMode (MC1,
OUTPUT); pinMode (MC2, OUTPUT); freio (); //
Inicializar com motor parado
void loop ()
{
val = analogRead (POT);
// Ir forwardif (val>
562)
{
Capítulo 4 Usando transistores e condução Motors
■ 7
// Ir backwardelse if (val
<462)
{
= velocidade de mapa (Val, 461, 0, 0, 255); reversa
(velocidade);
// brakeelse
{
freio();
}
}
{
digitalWrite (PT, LOW); digitalWrite
(MC1, HIGH); digitalWrite (MC2,
LOW); analogWrite (PT, a taxa);
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
HIGH); analogWrite (PT, a taxa);
// Pára freio
motorvoid ()
{
digitalWrite (PT, LOW); digitalWrite
(MC1, LOW); digitalWrite (MC2,
LOW); digitalWrite (PT, HIGH);
Será que tudo funciona como esperado? Se não, certifique-se de que você fio o seu
circuito corretamente. Como um desafio adicional, pegue um segundo motor DC e um
gancho
-lo para a outra metade do chip ponte-H. Você deve ser capaz de conduzir dois
motores em simultâneo com o mínimo esforço.
8 parte II ■Controlar o Seu
DrivingServoMotors
motores de corrente contínua servir como excelentes motores de acionamento, mas eles não são tão ideal
para trabalhos de precisão, porque nenhum feedback ocorre. Em outras palavras, sem o uso de um encoder
externo de algum tipo, você nunca vai saber a posição absoluta de um motor DC. servo motores, ou
servos, em contraste, são os únicos que você comandá-los para rodar para uma posição angular particular
e eles ficam lá até que você diga a eles para se mover para uma nova posição. Isto é importante para
quando você precisa mover o seu sistema para uma posição conhecida. Exemplos incluem a actuação
fechaduras de portas, movendo
UnderstandingtheDifferenceBetweenContinuousRotationandStandardServos
Você pode comprar ambos os servos de rotação padrão e contínuos. servos não
modificados ter sempre uma faixa fixa (geralmente de 0 a 180 graus), porque existe uma
potenciômetro em linha com o eixo de acionamento, que é usado para relatar a posição pres-ent.
servo- controlo é conseguido através do envio de um impulso de um determinado comprimento. O
comprimento do pulso, no caso de uma rotação do servo padrão, determina a posição absoluta que
o servo irá rodar para. Se remover o potenciómetro, no entanto, o servo é livre para rodar continuamente,
eo comprimento de impulso define a velocidade do motor, em vez.
Neste livro, você usa servos standard que giram para uma posição absoluta. Você
pode experimentar com servos rotação contínua, quer através da abertura de um
padrão servo e remover com cuidado o potenciômetro, ou através da compra
premodified servos configurado para rotação contínua.
UnderstandingServoControl
Ao contrário de suas contrapartes do motor DC, servo motores têm três pinos: Potência (usu-aliado
vermelho), terra (geralmente marrom ou preto), e de sinal (geralmente de cor branca ou laranja).
Estes fios são codificados por cores, normalmente na mesma ordem, e geralmente olhar como os
mostrados na Figura 4-9. Alguns fabricantes podem usar ordenação não-padrão, por isso sempre se
esqueça de verificar a folha de dados para garantir que está a fiação do servo corretamente.
A coloração pode variar ligeiramente entre servos, mas os esquemas de cores listados
anteriormente são os mais comuns. (Verifique a documentação do servo se você estiver
inseguro.) Como motores de corrente contínua, servos pode tirar um pouco de uma corrente
(normalmente
Capítulo ■Usando transistores e condução 8
mais do que o Arduino pode fornecer). Embora às vezes você pode executar um ou dois servos
diretamente da fonte de 5V do Arduino, você aprender aqui como usar uma fonte de alimentação
separada para os servos de modo que você tem a opção de adicionar mais
se você precisar.
Servos têm um pino de controle dedicado, ao contrário de motores de corrente contínua, que instrui-los
que posição a quem recorrer. As linhas de alimentação e terra de um servo deve sempre ser
conectado a uma fonte de energia constante.
Servos são controlados usando larguras de pulso ajustável na linha de sinal. Para
um servo standard, o envio de um pulso 1ms 5V liga o motor para 0 graus, e enviando um pulso 2ms 5V
liga o motor a 180 graus, com comprimentos de pulso no meio de escala de forma linear. Um pulso
1.5ms, por exemplo, o motor gira a 90 graus. Uma vez que um pulso foi enviada, o servo se volta
para essa posição e estadias
lá até que outra instrução de pulso é recebido. No entanto, se você quer um servo para
"Segurar" a sua posição (resistir a ser empurrado e tentar manter a posição exata),
você apenas reenviar o comando uma vez a cada 20 ms. Os comandos de servo Arduino que serão,
posteriormente empregar cuidar do presente para você. Para entender melhor como funciona o controle
de servo, estudar o diagrama de tempo mostrado na Figura 4-10.
8 parte II ■Controlar o Seu
Note-se que em cada um dos exemplos na Figura 4-10 do impulso é enviado a cada 20ms.
Como o comprimento do pulso aumenta de 1 ms a 2 ms, o ângulo de rotação do
motor (mostrado à direita do gráfico de pulso) aumenta de 0 a 180 graus.
Como mencionado antes, servos pode desenhar mais corrente do que o Arduino pode
ser capaz de fornecer. No entanto, a maioria dos servos são projetados para funcionar em 5V, não 9V
ou 12V como um motor DC. Mesmo que a tensão é a mesma que a de um Arduino, você quer usar uma
fonte de energia separada que pode fornecer mais corrente.
Para fazer isso, você aprender aqui como usar uma bateria de 9V e um regulador linear para
gerar uma fonte de 5V a partir de sua bateria de 9V. Um regulador linear é um dispositivo
terrestres.
extremamente simples, que geralmente tem três pinos: tensão de entrada, tensão de saída, e
O pino terra está ligado tanto a base da alimentação de entrada e no chão da saída. No caso dos
reguladores lineares tensão, a tensão de entrada sempre deve ser maior do que a tensão de saída, e a
tensão de saída é ajustada a um valor fixo de acordo com o regulador de utilizar.
Usando todas essas informações, é hora de conectar um servo. Fazendo referência a Figura 4-12,
conectar o servo, o regulador de 5V, eo potenciômetro. Deixar o potenciômetro
ligado ao pino analógico 0, conectar o pino de controle servo ao pino 9, e garantir que o regulador de
5V fornece o poder do servo.
Enquanto fiação, tenha em mente algumas coisas importantes. Em primeiro lugar, garantir que você
ter a orientação correcta do regulador. Com a guia de metal no lado
mais distante de você, conectar a bateria ao pino mais à esquerda, o terreno para o pino central, ea linha de
alimentação do servo para o pino direita. Em segundo lugar, se estiver usando capacitores eletrolíticos
polarizados (como na Figura 4-12), certifique-se de colocá-los na direção correta. A faixa indica o
terminal negativo e deve ser ligado à terra comum. Certifique-se de que os pinos não tocam; caso contrário,
poderá provocar um curto. Depois que você está todo ligado, passar para a próxima seção para
aprender a programar o controlador servo.
8 parte II ■Controlar o Seu
capacitores de desacoplamento
Bateria
ItmakessensethatyouneedtouseanexternalsupplywithaDCmotorbecauseyouneedthehighervoltage, butwhydoesaservoneedane
supplyifitisatthesamevoltageastheArduino? TheArduinogeneratesthe5VusedforthelogiceitherdirectlyfromtheUSBorbyusingabuilt-
inlinearregulatorwiththeDCbarreljackasthesupplyvoltage.WhenyouuseUSB, amaximumof500mAisavailabletotheArduinoandallitsp
becausethatiswhattheUSBspecificationallows.Whenyouuseanexternalsupplyofsufficientcurrent, thebuilt-inregulatorcansupplyupto
Capítulo ■Usando transistores e condução 8
Servoshaveatendencytoconsumecurrentinburstsastheyturn.They
generallyconsumelittlecurrentwhilestationary,
andtheyconsumeseveralhundredmilliampsforafewmillisecondswhentheyareactuated.Thesecurrentspikescanrippleonthe5V
componentes, likeLEDs.Bykeepingthesupplyfortheservoonaseparaterail, youensurethatthisdoesnothappen.
Insufficientcurrentforaservomightalsocauseittobehaveerratically.
. Whenyoufinishthefinalprojectforthischapter, tryhookingtheservosup-plypinuptothebuilt-in5Vrail (Don'tworry;. Thiswon'td
WhentheservoispoweredoverUSB, youmayseetheservodoingallkindsofunexpectedmotionsduetoaninsufficientcurrentsuppl
thedegreeofthisbehaviordependsonthespecificationofyourparticularservo.
ControllingaServo
O Arduino IDE inclui uma biblioteca interna que torna o controle servos um
brisa. Uma biblioteca de software é um conjunto de código que é útil, mas não é sempre necessária
em desenhos. O Arduino IDE contém um número de bibliotecas para tarefas com-mon. A biblioteca servo
abstrai as rotinas de tempo que você precisa para escrever em seu próprio país para pulsar o pino
servo. Tudo que você tem a fazer é anexar um "objeto" servo a um pino especial e dar-lhe um ângulo
para girar para. A biblioteca cuida do resto, mesmo definindo o pino como uma saída. A maneira
mais simples para testar a funcionalidade do seu servo é mapear o potenciômetro diretamente a posições
servo. Virando o potenciômetro para
#include <Servo.h>
void setup ()
{
myServo.attach (SERVO);
8 parte II ■Controlar o Seu
void loop ()
{
val = analogRead (POT); // Leia Potval = map (val, 0, 1023, 0, 179); // Escalá-
lo para myServo.write gama servo (val); // Define o atraso de servo (15); //
Espera para o servo
BuildingaSweepingDistanceSensor
Para encerrar este capítulo, você aplicar seu conhecimento a partir dos últimos capítulos para
construir um sensor de distância varrendo light-up. O sistema consiste de um infravermelho
sensor (RI) distância montado sobre um servo motor e quatro LEDs. À medida que o servomotor
ciclos, ele roda o sensor de distância ao redor da sala, o que lhe permite determinar
aproximadamente onde os objetos estão perto e onde eles estão agora. Os quatro LEDs cor-responder a
quatro quadrantes do brilho de varredura e mudança dependendo de como próximo um objeto é
nesse quadrante.
NOTA oucanwatchademovideoofthesweepingdistancesensoronline:
www.exploringarduino.com/content/ch4.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthischapter.
Comece quente colando-o sensor de distância para o topo de um servo-motor, como mostrado
na Figura 4-13. Eu gosto de usar cola quente porque mantém bem e é bastante fácil de remover, se
você precisar. No entanto, você também pode usar super-cola, massa de vidraceiro, ou fita
PWM para controlar nesses dois pinos. Assim, foram escolhidas as outras quatro pinos PWM.
(Se você quer fazer este projecto com mais LEDs, use o Arduino Mega ou implementar uma
solução PWM software, algo que este livro não cobre.) Siga o diagrama de fiação na Figura 4-14
para confirmar que você tem tudo
com fio corretamente. Eu escolhi usar LEDs azuis, mas você pode usar qualquer cor que você
quiser. Depois de ter tudo cabeada, considere gravá-la para baixo, como mostrado na Figura 4-13.
8 parte II ■Controlar o Seu
distância do IR
sensor
Dissociação
capacitores
Bateria
void setup ()
{
myServo.attach (SERVO); // Fixe o ServopinMode (LED1,
OUTPUT); // Conjunto de LED para OutputpinMode (LED2,
OUTPUT); // Conjunto de LED para OutputpinMode (LED3,
OUTPUT); // Conjunto de LED para OutputpinMode (LED4,
OUTPUT); // Conjunto de LED para saída
void loop ()
{
// Varrer o Servo em 4 regiões e alterar o LEDsdist1 = readDistance (15); // Medida
Distância IR em 15 degreesanalogWrite (LED1, dist1); // Ajuste Brightnessdelay
LED (300); // Atraso antes próxima medição
Resumo
■O■s motores são cargas indutivas que devem utilizar uma protecção adequada e os circuitos de
energia para fazer a interface com segurança com o Arduino.
v elocidade do motor de corrente contínua e a direcção pode ser controlada com PWM e uma
■ ■
ponte-H.
Arduino Servo.
■ U■m regulador linear pode ser utilizado para criar uma fonte de 5V secundário a partir de uma
bateria de 9V.
fazendo Sounds
Arduino UnoUSB
cablePushbuttons (n5)
10kohms resistores (n5)
altifalante 150Ω
resistorJumper
wiresBreadboard10KΩ
potentiometer8Ω
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch5 .
91
9 parte II ■Controlar o Seu
Os seres humanos têm cinco sentidos. Como você deve ter adivinhado, você não vai ser a interface
o seu sentido do paladar com muitos produtos eletrônicos; lambendo seu Arduino é um pobre
idéia. Da mesma forma, cheiro não será geralmente entram em jogo. Na verdade, se você pode cheirar o
seu
eletrônica, algo provavelmente está queimando (e você deve parar o que está fazendo). Isso só deixa
os sentidos do tato, visão e som. Você já interligado com potenciômetros e botões que se aproveitam
de seu senso de toque, e você ter ligado LEDs que fazem interface com você sentido da visão. Agora, o que
acontece com os seus sentidos auditivos? Este capítulo se concentra no uso do Arduino para fazer
sons para que você possa mais facilmente recolher feedback dos seus projetos.
UnderstandingHowSpeakersWork
Antes que você possa fazer sons com o Arduino, você precisa entender o que são sons e como os seres
humanos percebem-los. Nesta primeira seção, você aprenderá sobre como as ondas sonoras são geradas,
suas propriedades, e como a manipulação dessas propriedades pode produzir música, vozes, e assim
por diante.
ThePropertiesofSound
O som é transmitido através do ar como uma onda de pressão. Como um objeto, como um alto-falante,
um tambor, ou um vibra sino, esse objeto também vibra o ar em torno dele. À medida que as partículas
de ar vibrar, transferem energia para as partículas em torno deles, vibrando estas partículas também.
Desta forma, uma onda de pressão é transferida da fonte para o tímpano, criando uma reação em
cadeia de vibrar par-tigos. Então, por que você precisa saber isso para entender como fazer sons
com o Arduino?
Você pode controlar duas propriedades dessas partículas vibrando com o seu Arduino:
frequência e amplitude. ofreqüência representa quão rapidamente as partículas do ar
vibrar e para trás, eo amplitude representa a magnitude da sua
vibrações. No sentido físico, sons de amplitude mais elevados são mais altos, e os sons de amplitude mais
baixos são mais silenciosos. sons de alta frequência são um tom mais alto (como uma soprano), e sons
de baixa frequência são um tom mais baixo (como baixo). Considere o diagrama na Figura 5-1, que mostra
representações senoidais de ondas sonoras de várias amplitudes e frequências.
capítulo fazendo
■ 9
Figura 5-1 mostra três notas de piano: baixo, médio e soprano C. Cada um
mostra as frequências dadas em ambas as amplitudes altas e baixas. Como exemplo, para entender
frequência e amplitude, foco no meio C. Oriente C tem uma frequência de 261,63 Hertz (Hz). Em
outras palavras, um alto-falante, uma corda de guitarra, ou
uma corda de piano iria completar 261.63 oscilações por segundo. Ao tomar o
recíproco desse valor, você pode encontrar o período da onda, que é fácil de ver na Figura 5-1. 1 /
261,63 milissegundos é igual a 3.822, que é a largura de uma oscilação completa no gráfico. Usando o
Arduino, você pode definir esse período para uma onda quadrada e, assim, ajustar o tom da nota.
HowaSpeakerProducesSound
Alto-falantes, bem como os motores que você aprendeu sobre no capítulo anterior, tirar proveito de forças
eletromagnéticas que transformam eletricidade em movimento. Tente segurar um pedaço de metal até
a parte traseira do seu alto-falante. Você notou alguma coisa interessante? O metal, provavelmente, varas
para a parte traseira de seu alto-falante, porque todos os alto-falantes têm um íman permanente
considerável montado na parte de trás. Figura 5-2
Usingtone () toMakeSounds
O Arduino IDE inclui uma função built-in para fazer facilmente sons de freqüências arbi-trário.
otom()função gera uma onda quadrada da frequência seleccionada no pino de sua escolha de
saída. o
tom()função aceita três
argumentos, embora o último é opcional:
■ O■terceiro (opcional) argumento define a duração do tom. Se o terceiro argumento não for
definida, o tom continua tocando até que você chamar
nenhum().
Porque tom()usa um dos temporizadores de hardware do ATMEGA, você pode iniciar uma
tom e fazer outras coisas com o Arduino ao mesmo tempo que continua a reproduzir o som de
fundo.
IncludingaDefinitionFile
Quando se trata de reprodução de música, um arquivo de definição que mapeia frequências notar
nomes se mostrou útil. Isso torna mais intuitiva para reproduzir clipes musicais simples. Para aqueles
familiarizados com partituras leitura, você sabe que as notas são indicadas por letras que representam o
seu campo. O Arduino IDE inclui um arquivo de cabeçalho que correlaciona cada uma dessas notas
com sua respectiva frequência. Em vez de dig-Ging através do Arduino diretório de instalação para
encontrá- lo, basta visitar o Explorando
Capítulo Arduino 5 página web, e fazer o download do arquivo de campo para o seu
desktop (www.exploringarduino.com/content/ch5 ). Você vai colocá-lo em sua direção
esboço tory depois que você criou.
Em seguida, abra o IDE Arduino e salvar o esboço em branco que é automaticamente
criado quando você abre o IDE. Como você provavelmente já percebeu, quando você salvar um
esboço, ele realmente salva uma pasta com esse nome e coloca um arquivo .ino dentro dessa pasta. Ao
adicionar outros arquivos para essa pasta, você pode incluí-los em seu programa, tudo ao mesmo
tempo manter seu código melhor organizado. Copie o arquivo pitches.h você salvou na área de trabalho
para a pasta criada pelo IDE; em seguida, fechar o Arduino IDE. Abra o arquivo .ino no Arduino IDE e
observe as duas abas que aparecem agora (veja a Figura 5-3).
9 parte II ■Controlar o Seu
Clique na guia pitches.h para ver o conteúdo do arquivo. Note-se que é apenas uma lista
de instruções de definição, que mapeiam nomes legíveis para valores de frequência dadas. Basta ter
o arquivo de cabeçalho no IDE não é suficiente, no entanto. Para garantir que o compilador realmente usa
essas definições ao compilar o seu
programa para o Arduino, você precisa dizer ao compilador para procurar o arquivo. fazendo
por isso é fácil. Basta adicionar esta linha de código para o início do seu arquivo .ino:
WiringtheSpeaker
Agora que você tem seu arquivo de campos de cabeçalho incluído, você está pronto para construir um
circuito de teste e escrever um programa simples que pode jogar um pouco de música. A
instalação elétrica é bastante simples e envolve apenas ligar um alto-falante para um pino do seu
Arduino saída. No entanto, lembre-se que você aprendeu nos capítulos anteriores sobre resistores
limitadores de corrente.
Tal como aconteceu com LEDs, que pretende colocar um resistor limitador de corrente em série
com o alto-falante para garantir que você não tente chamar muita corrente de um dos
pinos de I / O do Arduino. Como você aprendeu anteriormente, cada pino de I / O podem fornecer
apenas um máximo de 40 mA, então escolha uma resistência que o impede de superior a isso. o
capítulo Fazendo sons
■
alto-falante que vem com kit deste livro tem uma resistência interna de 8Ω (como a maioria dos alto-
falantes que você pode comprar); esta resistência vem dos enrolamentos de fio que formam o
electroiman. Lembre-se que a lei de Ohm estabelece que V = IR. Neste cenário, o pino de I / O é saída 5V,
e você não quer exceder 40 mA. Resolvendo para R, você achar que a resistência mínima deve ser:
R = 5V / 40mA = 125Ω. 8Ω já está contabilizada pelo alto-falante, para que o seu resistor-line in deve
ser de pelo menos 125Ω - 8Ω = 117Ω. O resistor comum mais próxima é 150Ω, então você pode usar
isso. Ao ajustar esse valor resistor, você pode alterar o volume do alto-falante. Para fazer isto tão
fácil quanto possível, você pode usar um potenciômetro em linha com o resistor de 150Ω, conforme
mostrado na Figura 5-4. No esquema, o símbolo R1 representa o 150Ω
resistor, e R2 é o potenciómetro.
dos pinos de extremidade se conecta ao resistor 150Ω. Quando o botão é girado toda a
caminho para o terminal sem ligação, toda a resistência do potenciómetro
é adicionado à resistência em série do resistor 150Ω, e diminui os volumes.
Quando o botão é girado todo o caminho em direção ao terminal final conectado, ele
acrescenta nenhuma resistência à série, eo orador é com o volume no máximo. Referenciando o esquema
na Figura 5-4, fio de seu alto-falante com o Arduino. Em seguida, confirme
Alto-falantes não têm uma polaridade; você pode conectá-los em qualquer direção.
Depois da fiação seu alto-falante com sucesso, você está pronto para fazer música!
MakingSoundSequences
Para reproduzir algumas músicas, você primeiro aprender sobre como usar matrizes para armazenar
vários valores facilmente. Você, então, implementar um loop simples para percorrer as matrizes de
notas e reproduzi-los no alto-falante.
usando Arrays
Uma matriz é uma sequência de valores que estão relacionados de alguma forma. Agrupando-os em
conjunto, é um formato ideal para percorrer. Você pode pensar em uma matriz como uma lista
numerada. Cada posição tem um índice que indica sua localização na lista, e cada índice tem um valor
que você deseja armazenar. Você usar uma matriz aqui para armazenar a lista de notas que você
quer jogar, na ordem em que você quer jogar.
Note-se que as matrizes são zero indexado. Em outras palavras, o primeiro número é a
posição 0, O segundo está na posição 1, e assim por diante. Você pode acessar os
elementos
em uma matriz em qualquer índice, colocando o índice do valor relevante em um colchete após o nome
da variável. Se você quiser definir o brilho de um LED conectado ao pino 9 para a terceira entrada
em uma matriz, por exemplo, você pode fazê-lo como este:
Em seguida, você vai usar matrizes (como mostrado nestes exemplos) para criar uma estrutura
que pode conter a sequência de notas que você quer jogar em seu alto-falante.
Para armazenar as informações sobre a música que você quer jogar, você pode usar duas matrizes do
mesmo comprimento. O primeiro contém a lista dos campos, ea segunda contém a lista de durações para
o qual cada nota deve jogar em milissegundos. Você pode então percorrer os índices dessas matrizes e
reproduzir a sua música.
// Nota Arrayint notas [] = {NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_E4,
NOTE_D4, NOTE_C4, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E3, NOTE_A4, 0
};
Note-se que ambas as matrizes têm o mesmo comprimento: 20 itens. Observe que alguns dos
são especificados como n0o. tEastes são restos musicais (batidas não reproduzidos). Cada pares de
notas
com uma duração da segunda matriz. Para aqueles familiarizados com a teoria da música, note que eu
fiz notas de um quarto 250ms e colcheias 125ms. A música está em "quatro por quatro" tempo, em
termos musicais.
Experimente esta sequência dada nota, em primeiro lugar; em seguida, tentar criar o seu próprio!
Completando o Programa
A última etapa é realmente adicionar a funcionalidade de reprodução para o esboço. Isto pode
ser conseguido com um simples
paraloop que passa por cada índice na matriz,
e reproduz a nota dada para a duração dada. Desde que você provavelmente não
quer ouvir isso uma e outra vez, você pode colocar a funcionalidade de reprodução
no configuração()função para que ele só acontece uma vez. Você pode reiniciar a reprodução
pressionando o botão Reset. Listagem 5-1 mostra o programa de reprodução completa.
// Nota Arrayint notas [] = {NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_A4, NOTE_E3, NOTE_A4, 0, NOTE_E4,
NOTE_D4, NOTE_C4, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E3, NOTE_A4,
0
};
void setup ()
{
// Tocar cada nota para a direita durationfor (int i
= 0; i <20; i ++)
{
tons (alto-falante, notas [i], tempos [i]);
atraso (vezes [i]);
}
}
void loop ()
{
// Pressione o botão Reset para jogar novamente.
}
1 parte II ■Controlar o Seu
Se você quiser fazer sua própria música, certifique-se de que as matrizes se manterem com
uma comprimento igual e que você alterar o limite superior na para()loop. Porque
a tom()função pode ser executado em segundo plano, é importante usar o demora()
função. Ao atrasar o código para uma quantidade de tempo igual à duração do
nota, você garante que o Arduino não joga a próxima nota até que a anterior não terminou jogando para
o tempo especificado.
UnderstandingtheLimitationsofthetone () função
o tom()função tem algumas limitações a ter em conta. Como a biblioteca de servo, tom()conta com um
timer de hardware que também é usado pela modulação por largura de pulso funcionalidade do
conselho (PWM). Se você usar
tom(), PWM não funciona
direito sobre os pinos 3 e 11 (em que não sejam o mega placas).
Lembre-se também que os / O pins Arduino I não são digital-analógico conversores
ers (DACs). Assim, eles saída somente uma onda quadrada com a frequência prevista, não uma onda
senoidal. Embora isso é suficiente para fazer sons com um alto-falante, você vai encontrá-lo
indesejável para a reprodução de música. Se você deseja reproduzir arquivos de onda, as opções
incluem o uso de um escudo música-playing (como o adafruit Onda
BuildingaMicroPiano
Reprodução de sequências de notas é ótimo para adicionar um feedback de áudio para projetos que
você já criou. Por exemplo, considere a substituição ou aumento de um LED com um som de
confirmação de confirmação verde. Mas, e se você quiser Dynami-camente controlar o som? Para encerrar
este capítulo, você construir um piano pentatônica simples. A escala pentatônica consiste de apenas
cinco notas por oitava vez dos habituais sete. Curiosamente, as notas de uma escala pentatônica tem
mínima Disso- tenção entre arremessos, o que significa que sempre soam bem juntos. Assim, faz
muito sentido usar notas pentatônicas para fazer um piano simples.
capítulo Fazendo sons
■
Para fazer o seu piano Arduino, você usar esta escala pentatônica: C, D, E, G, A.
Você pode escolher o oitava a ser usado conforme a sua preferência. Eu escolhi usar a quarta oitava de
cabeçalho do arquivo.
Em primeiro lugar, fio cinco botões para cima no seu Arduino. Tal como acontece com os botões no Capítu
"Entradas digitais, saídas e Pulse-Width Modulation" você usa 10k pull-down resistores com os botões.
Neste cenário, você não precisa Debounce as, mas-toneladas, porque a nota será só jogou enquanto o
botão desejado é pressionado. Fios os botões, como mostrado na Figura 5-6 e manter o alto-falante ligado
como você tinha
que anteriormente.
// Piano Pentatonic //
CDEGA
void setup ()
{
// Nenhuma configuração necessária
função Tone // define saídas
void loop ()
{
while (digitalRead (BUTTON_C)) Tom
(ALTO-FALANTE, NOTE_C), enquanto
(digitalRead (BUTTON_D)) Tom (ALTO-
FALANTE, NOTE_D), enquanto
(digitalRead (BUTTON_E)) Tom (ALTO-
FALANTE, NOTE_E), enquanto
(digitalRead (BUTTON_G)) tom (ALTO-
FALANTE, NOTE_G), enquanto
(digitalRead (BUTTON_A)) tom (ALTO-
FALANTE, NOTE_A);
}
capítulo ■Fazendo sons
Resumo
■A■lto-falantes criar uma onda de pressão que viaja através do ar e é por percebida como som
por suas orelhas.
■A■lterando corrente eléctrica induz um campo magnético que pode ser utilizado para criar
um som de um altifalante.
■ o■tom()função pode ser usada para gerar sons de FREQUEN-cies e durações arbitrárias.
■ o■volume das colunas pode ser ajustado usando um potenciômetro em série com um alto-
falante.
Capítulo
107
1 parte II ■Controlar o Seu
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch6 .
Além disso, todos os códigos podem ser
ewnwcwo.nwtirleayd.caosme/gmo/exploringarduinoem
a guia de transferência de código. O código está no capítulo 06 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
Talvez a parte mais importante de qualquer Arduino é sua capacidade de ser pro-
programado diretamente através de uma porta serial USB. Esta funcionalidade permite-lhe programar a
Arduino sem qualquer hardware especial, como um AVR ISP MKII. Normalmente, microcontroladores
dependem de um pedaço específico de hardware externo (tal como o MKII) para servir como
umprogramadorque se conecta entre o computador e o microcontrolador você está tentando
programar. No caso de o Arduino, esta pró-gramática é essencialmente incorporada à placa, em vez de ser
uma peça externa de
hardware. Além do mais, isso lhe dá uma conexão direta com o ATmega integrada Universal
Synchronous / Asynchronous Receiver e Transmissor
(USART). Usando esta interface, você pode enviar informações entre o computador host eo
Arduino, ou entre o Arduino e outros componentes de série habilitados (incluindo outra Arduinos).
Este capítulo abrange praticamente tudo que você poderia querer saber sobre con-
necting um Arduino ao computador via USB e transmissão de dados entre os dois. Arduinos
diferentes têm diferentes capacidades de série, de modo que este capítulo aborda cada um deles, e você
construir projetos de amostra com cada tecnologia comu-nicação de série para ficar familiarizado
com a forma de aproveitá-las da melhor forma possível. Note-se que, como um resultado disto, a lista de
peças inclui vários tipos de Arduinos. Dependendo de qual Arduino você está tentando aprender
sobre, você pode escolher quais seções para ler, que exemplos
para explorar, e que as peças da lista de peças que você realmente precisa para o seu
explorações Arduino.
UnderstandingtheArduino'sSerialCommunicationCapabilities
Como já aludido na introdução deste capítulo, as diferentes placas Arduino oferecer lotes de
diferentes implementações de série, tanto em termos de como o hardware implementa os
adaptadores USB-a- série e em termos de suporte de software para vários recursos. Em primeiro
lugar, nesta seção, você aprenderá sobre as diversas interfaces de hardware de comunicação de
série oferecidos em diferentes placas Arduino.
Capítulo USB e Serial Comunicação
■
As placas Arduino originais veio equipado com uma porta serial que você con-
conectado ao computador através de um cabo serial de 9 pinos. Hoje em dia, alguns computadores
ainda tem essas portas, embora você possa usar adaptadores para fazer DB-9 (o tipo de 9 pinos
conector) portas seriais de portas USB. Microcontroladores como o ATmega328P que você
encontra no Arduino Uno tem uma porta serial hardware. Ele inclui uma transmissão (TX) e receber o
pino (RX) que pode ser acessado nos pinos digitais 0 e
os dois. Uma opção é usar um circuito secundário integrado (IC) para facilitar a conversão entre os
dois (dentro ou fora da placa Arduino). Este é o tipo de interface presente em um Uno, em que um
IC intermediário facilita a comunicação USB-to-serial. Opção dois é optar por um microcontrolador que
tem um controlador USB construído em (como a do Arduino Leonardo 32U4 MCU).
ArduinoBoardswithanInternalorExternalFTDIUSB-a-SerialConverter
Como foi explicado, muitas placas Arduino (e clones Arduino) utilizam um circuito integrado secundário
para facilitar a conversão USB-to-serial. O chip "FTDI" é um chip popular que tem apenas uma função:
converter entre série e USB. Quando o computador se conecta a um chip FTDI, ele mostra-se no seu
computador como uma "porta serial virtual", que você pode acessar como se fosse uma porta DB9 com
fio para a direita em seu computador. A Figura 2/6 mostra a parte inferior de um Arduino nano, que
FTDI chip
Chapter6pageontheExploringArduinowebsite.
Em algumas placas, normalmente para reduzir o tamanho da placa, o chip FTDI é externo ao
placa principal, com um 6-pin padronizado "conector FTDI" esquerda para a conexão com um
cabo FTDI (Um cabo USB com um chip FTDI construído para o fim do
cabo) ou uma pequena placa de fuga FTDI. Figuras 6-3 e 6-4 mostram essas opções.
.
www.adafruit.com
Crédito: Indústrias Adafruit
Usando uma placa com um programador FTDI removível é grande se você estiver design-
ing um projeto que não precisará ser conectado a um computador via USB para ser executado. Isto irá
reduzir o custo se você estiver fazendo vários dispositivos, e irá reduzir o tamanho global do produto
acabado.
A seguir está uma lista de placas Arduino que usam um chip FTDI a bordo. Nota,
novas placas Arduino não usa um chip FTDI, de modo a maioria destes foram descontinuados. No
entanto, ainda existem muitos clones dessas placas disponíveis para a compra, assim que eles
são listados aqui para ser completo:
■ A■rduino Nano
■ A■rduino extrema
■ A■rduino NG
■ A■rduino Diecimila
■ A■rduino Duemilanove
A seguir está uma lista de placas Arduino que usam um programador FTDI externo:
■ A■rduino Pro
■ A■rduino Lilypad
■ A■rduino Fio
■ A■rduino Mini
■ A■rduino Ethernet
ArduinoBoardswithaSecondaryUSB-CapableATMegaMCUEmulatingaSerialConverter
O Arduino Uno foi o primeiro bordo para introduzir a utilização de um circuito integrado
outra do que o chip FTDI USB para tratar-se de série de conversão. Funcionalmente, ele funciona
exatamente da mesma maneira, com algumas pequenas diferenças técnicas. Figura 6-5 mostra o
conversor serial 8U2 do Uno (agora um 16U2 em revisões mais recentes).
■P■rimeiro, no Windows, placas com esta nova conversão solu-ção USB-to-serial exigir um
driver personalizado para ser instalado. Este controlador vem com o Arduino IDE quando
você baixá-lo. (Drivers não são necessários para OS X ou Linux.)
Capítulo ■USB e Serial Comunicação
E■m segundo lugar, a utilização desta segunda unidade microcontrolador (MCU) para a
■
Atmel 8U2 ou
chip 16U2
P■or último, porque o MCU secundário é totalmente programável (ele está executando uma
■
pilha firmware chamado LUFA que emula um USB-a-série conversor), você pode mudar o seu
firmware para fazer o Arduino mostrar-se como algo diferente de uma porta serial virtual, tais
como um dispositivo de joystick, teclado ou MIDI. Se você fosse fazer esse tipo de mudança, a
série USB-to-LUFA
A seguir está uma lista de placas Arduino que utilizam uma MCU secundário a bordo
para lidar com USB-a-série de conversão:
■ A■rduino Uno
ArduinoBoardswithaSingleUSB-CapableMCU
O Arduino Leonardo foi a primeira placa de ter apenas um chip que atua tanto como a MCU
programável pelo usuário e como a interface USB. O Leonardo (e
Em primeiro lugar, o custo é reduzido porque bordo menor número de peças são necessárias, e porque
um a menos etapa da programação de fábrica é necessária para produzir as placas. Em segundo lugar,
a placa pode mais facilmente ser usado para emular outros do que uma porta serial (como um teclado,
mouse ou joystick) dispositivos USB. Em terceiro lugar, a porta USART comum único no ATmega não
têm ser multiplexados com o programador USB, assim, a comunicação com o computador central e um
dispositivo de série secundário (tal como uma unidade de GPS) pode ocorrer em simultâneo.
A seguir está uma lista de placas Arduino que usam um único MCU USB com capacidade de:
■ A■rduino Esplora
■ A■rduino Leonardo
■ A■rduino Micro
ArduinoBoardswithUSB-HostCapabilities
Algumas placas Arduino pode se conectar a dispositivos USB como um host, permitindo-lhe con-
dispositivos NECT tradicionais USB (teclados, mouses, telefones Android) para um Arduino.
Naturalmente, deve haver drivers apropriados para apoiar o dispositivo que são con-necting para.
Por exemplo, você não pode simplesmente ligar uma webcam para um Arduino Devido
e esperar para ser capaz de tirar fotos sem trabalho adicional. A Devido presentemente
Capítulo USB e Serial Comunicação
■
suporta uma classe host USB que permite conectar um teclado ou mouse para os de vencimento em-
the-go porta USB para controlá-lo. O Arduino mega ADK utiliza o Android Open Acessório Protocol
(AOA) para facilitar a comunicação entre
ListeningtotheArduino
A função de série mais básica que você pode fazer com um Arduino é imprimir ao terminal de série
do computador. Você já fez isso em vários dos capítulos PREVI-ous. Nesta seção, você explora
a funcionalidade de forma mais aprofundada, e mais tarde no capítulo você construir alguns
aplicativos de desktop que respondem aos dados que você enviar em vez de apenas imprimi-lo
para o terminal. Este processo é o mesmo para todos os Arduinos.
UsingprintStatements
Para imprimir os dados para o terminal, você só precisa utilizar três funções:
■S■erial.begin (BAUD_RATE)
■S■erial.print ( "Mensagem")
■S■erial.println ( "Mensagem")
void setup ()
{
Serial.begin (9600); // Inicie porta serial com transmissão = 9600
}
void loop ()
{
int val = analogRead (POT); // Leia potentiometerint per = map (val, 0, 1023, 0,
100); // Converte em percentageSerial.print ( "Analog Reading:"); Serial.print
(Val); // Imprimir valueSerial.print analógico raw ( "Percentual:"); Serial.print
(per); // Percentagem impressão analógico valueSerial.println ( "%"); //
Impressão
% sinal e newlinedelay (1000); // Espere um segundo, em seguida, repita
UsingSpecialCharacters
Você também pode transmitir uma variedade de "caracteres especiais" ao longo de série, que
permitem que você alterar a formatação dos dados de série que pretende imprimir. Você indicar
esses caracteres especiais com um caractere de barra escape (
\), Seguido de um com-
caráter mand. Há uma variedade destes caracteres especiais, mas os dois de maior interesse são os
caracteres de tabulação e nova linha. Para inserir um caractere de tabulação, adicionar um\ tpara a
cadeia. Para inserir um caractere de nova linha, adicionar um
\ npara a cadeia. este
prova particularmente útil se você quiser uma nova linha a ser inserido no início de uma cadeia, em
de no final como a
vez Serial.println () função faz. Se, por
alguma razão, você realmente deseja imprimir\ nou \ tna seqüência, você pode fazê-lo
impressão \\ nou \\ t, Respectivamente. Listagem 6-2 é uma modificação do código anterior para
usar esses caracteres especiais para mostrar os dados em um formato tabular.
1 parte II ■Controlar o Seu
void setup ()
{
Serial.begin (9600); // Iniciar Porta Serial com Baud = 9600
}
void loop ()
{
Serial.println ( "\ nAnalog Pin \ tRaw Valor \ tPercentage");
Serial.println ( "----------------------------- ------------- "); for (int i = 0; i
<10; i ++)
{
int val = analogRead (POT); // Leia potentiometerint per = map (val, 0, 1023, 0,
100); // Converte em porcentagem
}
}
ChangingDataTypeRepresentations
TalkingtotheArduino
Que bom é uma conversa com o seu Arduino se ele só vai em um direc-ção? Agora que você entende
como o Arduino envia dados para o computador, vamos passar algum tempo discutindo como
enviar comandos do seu computador para o Arduino. Você provavelmente já percebeu que o monitor
serial Arduino IDE tem um campo de entrada de texto na parte superior, e um menu drop-down na
parte inferior.
Figura 6-8: Captura de tela do terminal serial destacando campo de entrada de texto e de fim de linha no menu
suspenso Opções
1 parte II ■Controlar o Seu
Primeiro, certifique-se de que o drop-down está definida para nova linha. O menu drop-down
determina o que, se alguma coisa, é anexado ao fim dos seus comandos quando você enviá-los para o
Arduino. Os exemplos nas seções seguintes assumem que
você tem nova linha selecionada, que apenas acrescenta um\ npara o final de qualquer coisa
que você enviar a partir do campo de entrada de texto na parte superior da janela do monitor de série.
Ao contrário de alguns outros programas de terminal, monitor serial do Arduino IDE
envia a sua cadeia de comando inteira de uma só vez (na taxa de transmissão que você
especificar) quando você pressiona a tecla ou botão Send Enter. Isso está em contraste com
outros terminais de série como massa de vidraceiro (ligadas a partir da página de conteúdo digital
deste capítulo no
ReadingInformationfromaComputerorOtherSerialDevice
Você começa usando o monitor serial Arduino IDE para enviar comandos manualmente para o Arduino.
Uma vez que está trabalhando, você vai aprender como enviar vários valores COM-mand de uma
vez e como construir uma interface gráfica simples para o envio de comandos.
A coisa mais simples que você pode fazer é ter o Arduino eco de volta tudo o que você enviá-lo. Para
alcançar este objetivo, o Arduino basicamente só precisa monitorar seu buffer de entrada serial e
imprimir qualquer personagem que ele recebe. Para fazer isso, você precisa implementar dois novos
comandos a partir da
Serialobjeto:
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600
}
void loop ()
{
// Só imprimir quando os dados é receivedif
(Serial.available ()> 0)
{
data = Serial.read (); // Leia byte de dataSerial.print (de
dados); // Byte impressão de dados
}
}
Quando você envia um caractere alfanumérico através do monitor serial, você não está real-
aliado passando uma "5", ou um "A". Você está enviando um byte que o computador interpreta como um
personagem. No caso da comunicação serial, o conjunto de caracteres ASCII é usado para representar
todas as letras, números, símbolos e comandos especiais que você pode querer enviar. O conjunto de
caracteres ASCII de base, mostrada na Figura 6-9, é um conjunto de 7 bits e contém um total de 128
personagens únicas ou comandos.
53. Você pode confirmar isso olhando para a tabela de referência ASCII na Figura 6-9.
1 parte II ■Controlar o Seu
.
Crédito: Ben Borowiec,www.benborowiec.com
Figura 6-9: tabela ASCII
No entanto, muitas vezes você vai querer enviar valores numéricos para o Arduino. Então, como
você faz aquilo? Você pode fazê-lo em algumas maneiras. Em primeiro lugar, você pode
simplesmente comparar os caracteres diretamente. Se você quiser virar um LED ligado quando envia
um
1, você pode
comparar os valores de caracteres como estei:f (Serial.read () == '1') . Observe
que as aspas simples ao redor do '1'indicam
que ele deve ser tratado como um personagem.
Uma segunda opção é converter cada byte de entrada para um número inteiro subtraindo
o caráter de valor zero, como este: int val = Serial.read () - '0' . Contudo,
isso não funciona muito bem se você pretende enviar números que são maiores do que
9,
porque eles vão estar vários dígitos. Para lidar com isso, o Arduino IDE inclui uma função
chamadaparseInt ()
útil que tenta extrair números inteiros de um
fluxo de dados serial. Os exemplos que se seguem elaborado sobre estas técnicas.
Antes de seu mergulho para analisar cadeias maiores de números de vários dígitos, começar por
escrever um esboço que usa uma comparação simples personagem para controlar um LED.
Capítulo USB e Serial Comunicação
■
Você vai enviar um 1para ligar um LED, e um 0para desligá-lo. Fio de um LED-se ao
pino 9 do seu Arduino como mostrado na Figura 6-10.
Eumsedeclaração.
Cada vez que um carácter é adicionado ao tampão, ele é comparado co'm0'ouumum '1'e
a ação apropriada seja tomada. Carregar o código na Listagem 6-4 e experiências com o envio
de uma0ou um 1de série do terminal.
1 parte II ■Controlar o Seu
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600 baudpinMode
(LED, OUTPUT);
void loop ()
{
// Agir apenas quando os dados está disponível no bufferif
(Serial.available ()> 0)
{
data = Serial.read (); // Leia byte de dados // sua
vez, levou onif (dados == '1')
{
digitalWrite (LED, HIGH);
Serial.println ( "LED ON");
}
// Sua vez, levou offelse
if (dados == '0')
{
digitalWrite (LED, LOW);
Serial.println ( "LED OFF");
}
}
Envio de um único caractere de comando é bom para controlar um único pino digital, mas o que se quer
realizar alguns esquemas de controle mais complexas? Esta seção explora o envio de vários valores
separados por vírgulas para comandar simultaneamente vários dispositivos. Para facilitar a testar este,
fio até um cátodo comum
Para controlar esse LED RGB, você envia três valores de 8 bits separados (0-255) para definir
o brilho de cada LED cor. Por exemplo, para definir todas as cores para cheia brilhante-ness, você
envia"255,255,255". Isto apresenta alguns desafios:
■V■ocê precisa ativar essa sequência de caracteres em números inteiros que você pode passar
para analogWrite ()funções.
■V■ocê precisa ser capaz de lidar com o facto de que os valores podem ser um, dois, ou três
dígitos.
Felizmente, o Arduino IDE implementa uma função muito útil para a identificação de
e extrair números inteiros: Serial.parseInt () . Cada chamada para esta função espera até
um valor não numérico entra no buffer serial, e converte os dígitos anteriores em um número inteiro.
Os dois primeiros são valores lidos quando são detectadas as virgulas, e o último valor é lido quando a
nova linha é detectada.
Para testar essa função para si mesmo, carregar o programa mostrado na Listagem 6-5 na
no seu Arduino.
void setup ()
{
Serial.begin (9600); // Porta Serial em 9600
void loop ()
{
// Continue trabalhando enquanto dados estão no bufferwhile
(Serial.available ()> 0)
Capítulo USB e Serial Comunicação
■
{
rval Serial.parseInt = (); // Integergval Primeira válido =
Serial.parseInt (); // Integerbval Segundo válido =
Serial.parseInt (); // Inteiro válido Terceira
}
}
}
O programa continua olhando para os três valores inteiros até que uma nova linha é
detectou. Uma vez que isto acontece, os valores que foram lidos são usados para definir a luminosidade
ness dos LEDs. Para usar isso, abra o monitor serial e entrar três valores entre 0 e 255 separados por
uma vírgula, como
"200,30,180". Tente misturar tudo
tipos de cores bonitas!
TalkingtoaDesktopApp
Eventualmente, você é obrigado a se cansar de fazer toda a sua comunicação de série através do
monitor serial Arduino. Convenientemente, praticamente qualquer ambiente de trabalho linguagem pro-
gramação que você pode pensar tem bibliotecas que permitem a interface com as portas seriais em
seu computador. Você pode usar a sua linguagem favorita de desktop programa-ming para escrever
programas que enviam comandos seriais para o seu Arduino
e que reage a dados em série a ser transmitido a partir do Arduino para o computador.
Neste livro, o processamento é a linguagem de programação de desktop de escolha
porque é muito semelhante à linguagem Arduino que você já tenha se tornado
familiar com. Na verdade, a linguagem de programação Arduino é baseado em processamento de!
Outros idiomas desktop populares (que bem documentados bibliotecas de série comu-nicação)
incluem Python, PHP, Visual Basic, C, e muito mais. Primeiro, você vai aprender a ler dados seriais
transmitidos em Processing, e então você vai aprender como você pode usar o processamento para
criar uma simples interface gráfica do usuário (GUI) para enviar comandos para o Arduino.
TalkingtoProcessing
saída com base em dados seriais transmitidos a partir do seu Arduino. Uma vez que isso é trabalho-
ing, você implementar a comunicação na direção oposta para controlar o seu Arduino a partir de
uma interface gráfica no seu computador.
Processamento de instalar
ção, e você deve ver um IDE que se parece com o mostrado na Figura 6-12.
Para sua primeira experiência com Processing, você usa um potenciômetro conectado ao Arduino para
controlar a cor de uma janela no seu computador. Fio-se o Arduino com um potenciômetro, consultando
a Figura 6-6 novamente. Você já sabe o código Arduino necessário enviar os valores analógicos do
potenti- ometer para o seu computador. O fato de que agora você está alimentando os dados seriais
em Processamento não tem qualquer impacto sobre a maneira como você transmiti-lo.
Listagem 6-6: Código Arduino para enviar dados para o computador-pot_to_processing / arduino_read_pot
void setup ()
{
Serial.begin (9600); // Iniciar Serial
}
void loop ()
{
val = map (analogRead (POT), 0, 1023, 0, 255); // Leia e mapear POTSerial.println (val); //
Enviar valuedelay (50); // Atraso de modo que não inundar // o computador
Agora vem a parte interessante: escrever um esboço de processamento para fazer algo
interessante com esses dados de entrada. O esboço na Listagem 6-7 lê os dados no buffer de
série e ajusta o brilho de uma cor na tela do seu computador com base no valor que recebe. Primeiro,
copie o código da Listagem 6-7 em um novo esboço de processamento. Você precisa mudar apenas uma
parte importante. O esboço de processamento precisa saber qual porta serial que esperar de dados para
chegar a. Esta é a mesma porta que você foi a programação do Arduino a partir. No
1 parte II ■Controlar o Seu
seguinte listagem, substitua "COM3"com o seu número de porta serial. Lembre-se que em Linux e
Mac será parecido com
/ Dev / ttyUSB0, por exemplo. Você pode copiar o
nome exato de dentro do Arduino IDE se não tiver certeza.
Listagem 6-7: Código de processamento para ler dados e mudam a cor na tela-pot_to_processing /
processing_display_color
void setup ()
{
tamanho (500.500); // Janela sizeport = new Serial (this, "COM3", 9600); //
Configurar serialport.bufferUntil ( '\ n'); // Configurar porta para ler até //
nova linha
draw void ()
{
fundo (0,0, brilho); // Atualiza a janela
}
Agora que você já viu isso funcionar, vamos percorrer o código para obter uma melhor
compreensão de como o esboço de processamento está funcionando. Ao contrário do
Arduino, a biblioteca de série não é importado automaticamente. chamando
processamento de
importação
port.bufferUntil ( '\ n') informa Processing para tamponar a entrada serial e não
fazer nada com as informações até que vê um caractere de nova linha.
Ao invés de loop (), Processamento define outras funções especiais. Este programa
usa desenhar()e serialEvent () . odesenhar()função é similar a Arduino de loop ();
ele é executado continuamente e atualiza a exibição. o fundo()função define o
cor da janela, definindo valores de vermelho, verde e azul (as três argumentos da função). Neste caso,
o
valor a partir do potenciômetro está controlando a intensidade azul e vermelho e verde estão definidos
para
0. Você pode mudar a cor que o seu
pote está ajustando simplesmente troca que argumento brilhoestá preenchendo. RGB
valores de cor são valores de 8 bits que variam0pdaera 255, Razão pela qual o
potenciômetro é mapeado para esses valores antes de serem transmitidos.
serialEvent () é chamado sempre que o bufferUntil () condição de que você
especificado na configuração()é cumprida. Sempre que um caractere de nova linha é
recebida, o serialEvent () função é acionado. A
informação em série de entrada é lido
como uma string com port.readStringUntil ( '\ n') . Você pode pensar em uma string como um
matriz de texto. Para usar a string como um número, você deve convertê-lo para um
ponto flutuante comflutuador()
número de . Isso define a variável de brilho, mudando a
cor de fundo da janela do aplicativo.
Para parar a aplicação e fechar a porta serial, clique no botão Parar na
IDE de transformação; é a praça localizada ao lado do botão Executar.
1 parte II ■Controlar o Seu
uggingdisplaythatgraphically
TheSudoGloveisacontrolglovethatdrivesRCcarsandcontrolsotherhardware.IdevelopedaProcessingdeb ors.Youcanlearnmoreaboutithere:
DownloadthesourcecodefortheProcessingdisplayhere: visual-depurador
/.YoucanalsofindthissourcecodeontheWileywebsiteshownatthebeginningofthischapter.
O próximo passo óbvio é fazer o oposto. Fio-se um LED RGB para o seu
Arduino, como mostrado na Figura 6-11 e carga sobre o mesmo programa de mais cedo
que você usou para receber uma seqüência de três valores separados por vírgula para definir o
intensidades de vermelho, verde e azul (Listagem 6-5). Agora, em vez de enviar uma série de três
valores do monitor serial, você seleciona uma cor usando um seletor de cores.
Listagem 6-8: Processamento de esboço para definir Arduino RGB Colors- processing_control_RGB /
processing_control_RGB
void setup ()
{
tamanho (640.256); // Tamanho do HSV imageimg = loadImage ( "hsv.jpg"); //
Carregar no fundo imageport = new Serial (this, "COM9", 9600); // Porta serial Aberto
draw void ()
{
fundo (0); // Preto BackgroundImage (img, 0,0); //
Imagem Overlay
anular mousePressed ()
{
cor c = get (mouseX, mouseY); // Obter a cor RGB, em que o mouse foi pressedString
cores = int (vermelho (c)) + "," + int (verde (c)) + "," + int (azul (c)) + "\ n"; // Extrair valores
de Colorprint (cores); cores // impressão para debuggingport.write (cores); // Envia valores
ao Arduino
Quando você executar o programa, você deve ver uma tela como a mostrada na
Figura 6-15 aparecer. Clique cores diferentes e os valores RGB serão transmitidos
ao Arduino para controlar a cor do LED RGB. Observe que o console serial também exibe os comandos
de serem enviados para ajudá-lo em qualquer depuração.
Depois de terminar a olhar para todas as cores bonitas, olhar para trás, o código e
considerar como ele está trabalhando. Como antes, a biblioteca de série é importado e um objeto de
série chamadaportaé criado. UMAPImagechamada de objeto imgTambém é criado. Isto irá manter a
imagem de fundo. No
configuração(), A porta serial é inicializado, o
janela de exibição está definido para o tamanho da imagem, ea imagem é importado para o
objeto imagem chamando img = loadImage ( "hsv.jpg") .
No desenhar()função, a imagem é carregada na janela com imagem (img, 0,0).
imgé a imagem que você quer desenhar na janela, e 0, 0são coordenadas onde
a imagem vai começar a ser desenhado0.,0é o canto superior esquerdo da janela do aplicativo.
1 parte II ■Controlar o Seu
representando vermelho, verde e azul. Estes valores também são impressos ao tratamento
console de modo que você possa ver o que está sendo enviado.
Certifique-se de que o Arduino está conectado e programado com o código de
Listagem 6-5. Execute o esboço de processamento (com a porta serial correta especificado) e
clique em torno do mapa de cores para ajustar a cor do LED conectado ao Arduino.
LearningSpecialTrickswiththeArduinoLeonardo (andOther32U4-
BasedArduinos)
O Leonardo, além de outros Arduinos que implementam MCUs que con-gar directamente para
USB, tem a capacidade única para emular dispositivos não seriais, como um teclado ou mouse. Nesta
seção, você aprenderá sobre como usar um Leonardo de
Capítulo ■USB e Serial Comunicação
emular estes dispositivos. Você precisa ser extremamente cuidadoso para implementar essas funções de
uma forma que não faz a reprogramação difícil. Por exemplo, se você escrever um esboço que emula
um mouse e continuamente move o ponteiro ao redor da tela, você pode ter problemas para clicar no botão
Upload no Arduino IDE! Nesta seção, você aprende alguns truques que você pode usar para evitar
estas circunstâncias.
DICA Ifyougetstuckwithaboardthat'stoohardtoprogramduetoitskeyboardor
mouseinput, holddowntheResetbuttonandreleaseitwhilepressingtheUploadbuttonintheArduinoIDEtoreprogramit.
Quando você conectar um Leonardo a um computador com Windows, você precisa instalar
motoristas, assim como você fez com o Arduino Uno no primeiro capítulo. Siga as mesmas
instruções emhttp://arduino.cc/en/Guide/ArduinoLeonardoMicro#toc8
para obter instruções específicas-Leonardo. (Estas instruções também estão ligados a partir da página
de conteúdo digital para este capítulo da
www.exploringarduino.com.)
EmulatingaKeyboard
Usando capacidade única do Leonardo para emular dispositivos USB, você pode facilmente transformar
o seu Arduino em um teclado. Emulando um teclado permite que você facilmente enviar comandos-
chave combinação para o seu computador ou tipo de dados diretamente em um arquivo que está
aberto no seu computador.
O Leonardo pode emular um teclado USB, enviando teclas e chave com-combinações. Esta seção
explora como usar ambos os conceitos. Primeiro, você escreve um
programa simples que registra os dados de alguns sensores analógicos em uma vírgula
separados por valor (.csv) formato que mais tarde você pode se abrir com planilhas do Excel ou o
Google para gerar um gráfico dos valores.
Em seguida, criar um circuito simples, como o mostrado na Figura 6-16. Ele irá acompanhar
ambos os níveis de temperatura luz e usando sensores analógicos que você já viu no capítulo
3, "Leitura Sensores analógicos." Além dos sensores, o circuito inclui um botão para virar a
funcionalidade de log on e off, e um LED que vai indicar se atualmente está registrando
dados.
1 parte II ■Controlar o Seu
os sensores e "tipos" esses valores em seu computador em um formato separado por vírgulas uma vez
por segundo. Um indicador LED permanece aceso enquanto você está registrando dados. Porque
você quer o Arduino estar constantemente polling o estado
Capítulo ■USB e Serial Comunicação
do botão, você não pode usar uma demora()função que esperar 1000ms entre cada
atualizar. Em vez disso, você usa omillis () função, que retorna o número de
milissegundos desde o Arduino foi a última reinicialização. Você pode fazer o Arduino enviar
cada vez que o função retorna um múltiplo de 1000 ms, de forma
dados millis ()
eficaz
a criação de um atraso não bloqueante de 1 segundo entre as transmissões. Para fazer isso, você
pode usar o operador de módulo (
%). Modulo devolve o resto de uma divisão. E se,
por exemplo, você executou 1,000% 1,000, Você teria que encontrar o resultado é 0
porque 1000/1000 = 1, com um resto de 0. 1500% 1000, Por outro lado, iria retornar
500 porque 1500/1000 é igual a 1, com um resto de 500. Se você tomar o módulo de millis ()
com 1000, O resultado é zero cada vez millis () alcances
um valor que é um múltiplo de 1000. Ao verificar isso com um E se()declaração,
pode executar um código, uma vez a cada segundo.
Examinar o código na Listagem 6-9 e carregá-lo para o seu Arduino Leonardo.
Certifique-se de que você selecionou "Arduino Leonardo" no menu Ferramentas> Board no Arduino
IDE.
const int TEMP = 0; // Sensor de Temp no pino analógico LUZ 0const int = 1; //
Sensor de luz no pino analógico 1const int LED = 3; LED // Red no pino
13const int BUTTON = 2; // O botão está ligado ao pino 2
void setup ()
{
pinMode (LED, OUTPUT); // Definir LED azul como
outputKeyboard.begin (); // Iniciar emulação de teclado
void loop ()
{
currentButton = estabilização (lastButton); // Leia estado filtrada por
if (lastButton == LOW && currentButton == HIGH) // Se ele foi pressionado ... correndo =
correndo!; // Alternar estado de execução
{
digitalWrite (LED, HIGH); // Vire o LED onif (millis ()% 1.000 == 0) // Se
o tempo é múltipla // de 1000ms
{
temperatura = int analogRead (TEMP); // Leia o brilho temperatureint = analogRead
(LUZ); // Leia o levelKeyboard.print luz (contador); // Imprimir o numberKeyboard.print
índice ( ","); // Imprimir um commaKeyboard.print (temperatura); // Imprimir o
temperatureKeyboard.print ( ","); // Imprimir um commaKeyboard.println (brilho); //
Brilho Print, newlinecounter ++; // Incrementa o contador
}
}
outro
{
digitalWrite (LED, LOW); // Se logger não está em execução, vire LED off
}
}
/*
* Função Debouncing
* Passe-o estado do botão anterior,
* E voltar o estado do botão filtrada por corrente.
*/
boolean debounce (boolean passado)
{
boolean atual = digitalRead (botão); // Leia o botão stateif (durar! = Atual) // Se é diferente
...
{
atraso (5); // Espere 5mscurrent = digitalRead (botão); // Leia de novo
}
voltar corrente; // Retorna o valor atual //
Antes de testar o registrador de dados, vamos destacar algumas das novas funcionalidades
que foi implementado neste esboço. Da mesma forma como você inicializado a comunicação serial, a
comunicação teclado é inicializado, colocando
!operador.
Enquanto o Arduino é em correndo modo, a etapa de registro é executado somente a cada
1000 ms utilizando a lógica descrita anteriormente. As funções do teclado funciona muito semelhante
funções de série.
às Keyboard.print () "tipos" a string dada em
Capítulo ■USB e Serial Comunicação
seu computador. Depois de ler os dois sensores analógicos, o Arduino envia os valores para
o computador como teclas. Quando você usa
Keyboard.println () ,
o Arduino emula pressionando a tecla Enter ou Return no teclado depois de enviar a string dada. Um
contador incrementar e ambos os valores analógicos são inseridos em um formato separado por
vírgulas.
Siga o vídeo de demonstração a partir da página web deste capítulo para ver este esboço em
açao. Certifique-se de que o cursor é posicionado activamente num documento de texto e, em seguida,
pressione o botão para iniciar o registo. Você deverá ver o documento começa a preencher com
dados. Segure a mão sobre o sensor de luz para alterar o valor ou espremer o sensor de temperatura para
ver o aumento de valor. Quando tiver terminado, pressione o botão novamente para parar o registro.
Depois de salvar o arquivo, você pode importá-lo para o aplicativo de planilha de sua escolha e
representar graficamente ao longo do tempo. Isso é mostrado no vídeo de demonstração.
Além de digitação como um teclado, você também pode usar o Leonardo para a UEM-final combinações
de teclas. Em computadores Windows, pressionando as teclas Windows + L bloqueia a tela do
computador (em Linux, você pode usar Control + Alt + L). Usando esse conhecimento emparelhado
com um sensor de luz, você pode ter o seu bloqueio de computador auto-maticamente quando você
desligar as luzes. OS X usa o Control + Shift + Eject ou teclas Shift + Poder de Controle + para
bloquear a máquina, que não pode ser imitado pelo Leonardo, pois não pode enviar um Eject ou
Power simulado pressione o botão. Neste exemplo, você aprende como bloquear um computador
Windows. É possível continuar a utilizar o mesmo circuito mostrado na Figura 6-16, embora apenas o
sensor de luz será utilizada neste exemplo.
Execute o esboço anterior em alguns níveis diferentes de luz e ver como a luz
mudanças de leitura do sensor. Usando essas informações, você deve escolher um limiar abaixo
do qual você vai querer o seu computador para bloquear. (No meu quarto, eu achei que com as
luzes apagadas o valor foi de cerca de
300, E foi cerca de 700com o
luzes acesas. Então, eu escolhi um valor limite5d0e0). Quando as gotas valor do sensor de luz
abaixo desse valor, a trancarcomando irá ser enviada para o computador. Você pode
querer ajustar esse valor para o seu ambiente.
Coloque o desenho na Listagem 6-10 no seu Arduino. Apenas certifique-se que você tem
o limite definido para um valor razoável, em primeiro lugar, por meio de testes que luz níveis no seu
quarto correspondem a vários níveis analógicos. Se você pegar um valor mal calibrado, pode bloquear o
computador assim que você enviá-lo!
1 parte II ■Controlar o Seu
int LUZ const = 1; // Sensor de luz no pino analógico 1const int THRESHOLD = 500; // Brilho
deve cair abaixo deste nível // para bloquear computador
void setup ()
{
Keyboard.begin ();
}
void loop ()
{
int brilho = analogRead (LUZ); // Leia o nível de luz
if (brilho <limiar)
{
Keyboard.press (KEY_LEFT_GUI);
Keyboard.press ( 'L'); atraso (100);
Keyboard.releaseAll ();
}
}
Depois de carregar o programa, tente virar as luzes apagadas. Seu computador deve
bloquear imediatamente. O seguinte vídeo de demonstração mostra isso em ação. este
esboço implementa duas novas funções do teclado: Keyboard.press () e
Teclado
EmulatingaMouse
Usando um joystick de dois eixos e alguns botões, você pode usar um Arduino
Leonardo para fazer seu próprio mouse! O joystick irá controlar a localização do mouse,
e os botões irá controlar a esquerda, meio e direito botões do mouse.
Capítulo ■USB e Serial Comunicação
Assim como com a funcionalidade do teclado, a linguagem Arduino tem algumas grandes funções
internas em que se torna mais fácil para controlar a funcionalidade do mouse.
Primeiro de tudo, se o seu circuito configurado com um joystick e alguns botões como
mostrado na Figura 6-17. Não se esqueça que seus botões precisa ter resistências de pull-down!
O
joystick irá se conectar aos pinos analógicas 0 e 1. (Joysticks são realmente apenas dois potenciômetros
ligados a um botão.) Quando você move o joystick todo o caminho na direção x, ele atinge o máximo do x
potenciômetro, eo mesmo vale
para a direção y.
O diagrama mostra um joystick SparkFun, mas qualquer vai fazer. (No vídeo descrito
após o anúncio, eu usei um joystick Parallax.) Dependendo da orientação do joystick, você pode precisar
de ajustar os limites da função de mapa ou trocar o X / Y no código abaixo.
// Faz um rato!
void setup ()
{
Mouse.begin ();
}
void loop ()
{
int xVal = readJoystick (X_AXIS); // Obter eixo x movementint yVal = readJoystick
(Y_AXIS); // Obter movimento do eixo y
{
int val = analogRead (eixo); // Leia analógico valueval = map (val, 0, 1023,
-10, 10); // Mapa da leitura
if (val <= 2 && val> = -2) // Criar zona morta para parar rato driftreturn 0;
{
// Se o botão for pressionado, clique se não tiver já sido clickedif (digitalRead
(pino) == HIGH)
{
if (! Mouse.isPressed (mouseCommand))
{
Mouse.press (mouseCommand);
}
}
// Solte o mouse se tiver sido clicked.else
{
Se (Mouse.isPressed (mouseCommand))
{
Mouse.release (mouseCommand);
}
}
}
UMA readJoystick () função foi criada para ler os valores do joystick e mapa
eles. Cada eixo possui um joystick gama de 1024 quando os valores lidos no conversor analógico-para-
digital (ADC). No entanto, os movimentos do mouse são relativos. Em outras palavras, a passagem de um
valor de 0 aMouse.move ()para cada eixo resultará em nenhum movimento nesse eixo. Passar um valor
positivo para o eixo-x irá mover o mouse para a
direita, e um valor negativo vai movê-lo para a esquerda. Quanto maior o valor,
mais o mouse se moverá. Assim, no readJoystick () função, um valor de
0-1023 é mapeado para um valor de -10para 10.
Um valor tampão pequeno em torno0é
adicionada onde o mouse não se move. Isso ocorre porque, mesmo quando o joystick está na posição
média, o valor real pode flutuar em torno de
512. Definindo
a parte de trás distância desejada a 0 depois de ser mapeado em um determinado intervalo, você
garantir que o mouse não irá se mover por conta própria, enquanto o joystick não está sendo
accionado. Uma vez que os valores são determinadMoosu,se.move ()é dada a x e y
valores para mover o mouse. Um terceiro argumento parMaouse.move ()determina o
movimento da roda de rolagem.
1 parte II ■Controlar o Seu
Para detectar os cliques de rator,eoasdButton ()função foi criada para que ele possa
ser repetido para cada um dos três botões de detectar. A função detecta o estado cur-rent do mouse com o
Mouse.isPressed ()comando e controla
a rato de acordo com o Mouse.press ()e Mouse.release ()funções.
NOTA owatchademovideoofthejoystickmousecontrollingacomputer
ponteiro, check-outwww.exploringarduino.com/content/ch6.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthisch
Resumo
■ A■rduinos diferentes facilitar uma conversão USB-to-serial usando tanto ICs dedi-cado ou built-in
funcionalidade USB.
■ S■eu Arduino pode imprimir dados para o seu computador através de seu número de série USB
conexão.
■V■ocê pode usar caracteres especiais em série para formatar a sua impressão em série
com novas linhas e tabs.
■T■odos os dados em série são transmitidos como caracteres que podem ser convertidos em
números inteiros em uma variedade de formas.
■V■ocê pode enviar listas de números inteiros separados por vírgulas e usar funções integradas
para analisá-los em comandos para o seu esboço.
■ V■ocê pode enviar dados do seu Arduino para um aplicativo de desktop Processing.
■V■ocê pode receber dados de um aplicativo de processamento em seu desktop para controlar
periféricos conectados ao seu Arduino.
■ U■m Arduino Leonardo pode ser usado para emular um teclado ou mouse.
Capítulo
registos de
deslocame
downloads de código, vídeos e outros conteúdos digitais para este capítulo pode ser encontrada em
www.exploringarduino.com/content/ch7.
Além disso, todos os códigos podem ser
ewnwcwo.nwtirleayd.caosme/gmo/exploringarduinoem
a guia de transferência de código. O código está no capítulo 07 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
1 parte II ■Controlar o Seu
145
1 parte II ■Controlar o Seu
Como você engole longe construção de novas e excitantes projectos com seu Arduino, você
pode já estar pensando: "O que acontece quando eu ficar sem pinos?" De fato, um dos projetos
mais comuns com o Arduino está usando a plataforma para colocar um enorme número de LEDs
piscantes sobre praticamente qualquer coisa. Ilumine o seu
quarto! Ilumine o seu computador! Acender seu cão! Ok, talvez não esse último.
Mas há um problema. O que acontece quando você quer começar a piscar 50 LEDs
(Ou controlar outras saídas digitais), mas você já usou de todos os seus pinos de I / O? Isso é
onde registos de deslocamento pode vir a calhar. Com registos de deslocamento, você pode
expandir os recursos de E / S do seu Arduino sem ter que pagar muito mais por um microcontrolador mais
caro com pinos de E / S adicionais. Neste capítulo, você aprenderá como registos de deslocamento
trabalhar, e você vai implementar o software e hardware necessários para fazer a interface seu Arduino
com registos de deslocamento com a finalidade de expandir as capacidades saída digital do seu
Arduino. Completando os exercícios deste capítulo irá familiarizá-lo com registos de deslocamento, e irá
ajudá-lo a tomar uma decisão design mais informado quando você está desenvolvendo um projeto
com um grande número de saídas digitais.
UnderstandingShiftRegisters
UMA registro de deslocamentoé um dispositivo que aceita um fluxo de bits em série e, simultaneamente,
envia os valores desses bits sobre os pinos de I / O em paralelo. Na maioria das vezes, estes são
utilizados para controlar um grande número de LED, tais como as configurações encontradas
Capítulo ■Registadores de deslocamento
SendingParallelandSerialData
Existem essencialmente dois caminhos para enviar vários bits de dados. Recorde-se que
o Arduino, como todos os microcontroladores, é digital; ele só entende 1s e 0s.
Então, se você quiser dados suficientes para controlar oito LEDs digitalmente (cada um ligado
ou off), você precisa encontrar uma maneira de transmitir 8 bits totais de informações. em
ante- capítulos ous, você fez isso de forma paralela, usando o digitalWrite ()
eanalogWrite ()comandos para exercer o controle sobre vários pinos de I / O. Para um exemplo de
transmissão de informação paralelo, suponhamos que você fosse para ligar oito LEDs com oito
saídas digitais; todos os bits devem ser transmitidos em pinos de E / S, independentemente mais ou
menos ao mesmo tempo. No Capítulo 6 ", USB e Serial
1 parte II ■Controlar o Seu
Comunicação, "você aprendeu sobre a transmissão em série, que transmite 1 bit de dados em tempo.
registos de deslocamento permitem converter facilmente entre técnicas de transmissão de dados
seriais e paralelas. Este capítulo concentra-se em série-paralelo
registradores de deslocamento, às vezes chamados de série em, paralelo out (SIPO) registos de
deslocamento. Com estes dispositivos acessíveis, você pode "relógio em" múltiplos bytes de dados em série, e
enviá-
las a partir do registo de deslocamento de forma paralela. Você também pode encadear registos de
deslocamento e, assim, controlar centenas de saídas digitais de apenas três Arduino I / O pins.
Workingwiththe74HC595ShiftRegister
A mudança específica registrar, você estará usando é o registro 74HC595 turno. Levar
um olhar para o diagrama de pin-out da folha de dados mostrado na Figura 7-2.
A seguir está uma repartição das funções dos pinos de registo de deslocamento:
■ O■pino SER é representado pela entrada de dados na Figura 7-1. Este é o pino onde você vai
alimentar em 8 bit valores sequenciais para definir os valores das saídas paralelas.
Você não vai estar usando os SRCLR ou OE pinos nestes exemplos, mas você
pode querer usá-los para o seu projeto, então vale a pena entender o que eles fazem. OE significa
habilitar a saída. O bar com o nome de pino indica que ele está ativo baixo. Em outras palavras, quando
o pino é mantido baixo, a saída será ativada. Quando é erguida, a saída será desativada. Nestes
exemplos, este pino estará ligado directamente ao solo, de modo que as saídas paralelas estão sempre
activados. Você poderia, alternativamente, ligue a um pino de I / O do Arduino para ligar
simultaneamente todos os LEDs ligado ou desligado. O pino SRCLR é o pino clara serial. Quando puxado
baixo, ele esvazia o conteúdo do registrador de deslocamento. Para seus propósitos deste capítulo,
você amarrá-lo diretamente para 5V para impedir que os valores de registo de deslocamento de ser
apagada.
o fluxo do programa. Suponha, por exemplo, que você deseja definir todos os outros LED
para o estado ON ,Q ,Q , ). Representada em binário, você quer a saída
(Q UMA Q G
C E
dos pinos paralelos sobre o registo de deslocamento para ficar assim: 10101010.
Agora, siga os passos para escrever para o registo de deslocamento acima. Em primeiro lugar, o trinco
pino é definido como baixo para que os estados do LED actuais não são alteradas, enquanto os novos
valores são deslocados. Em seguida, os estados do LED são deslocados para os registradores em
ordem sobre a borda do relógio a partir da linha DATA. Depois de todos os valores foram deslocados
dentro, o
pino de bloqueio está situado no alto de novo, e os valores são emitidas pelo registo de deslocamento.
ShiftingSerialDatafromtheArduino
Agora que você entende o que está acontecendo nos bastidores, você pode escrever o código Arduino
para controlar o registo de deslocamento desta forma. Tal como acontece com todas as suas
experiências anteriores, você usa uma função conveniente que está construído para o Arduino
IDE para transferir dados para o registo IC. Você pode usar o shiftOut () a função
facilmente mudar a 8 bits de dados em um pino de I / O arbitrária. Ele aceita quatro
parâmetros:
■ A■ordem bit
o DADOSe RELÓGIOfunções são definidas para os números de pinos para essas linhas.
MSBFIRSTindica que o bit mais significativo irá ser enviado primeiro (o mais à esquerda
bit quando se olha para o número binário para enviar). Você pode alternativamente enviar os dados
com oLSBFIRSTdefinindo, que começaria por transmitir os bits a partir do lado direito dos dados binários.
O último parâmetro é o número a ser enviada. Ao colocar um capital
Em seguida, você criar uma versão física do sistema que você acabou de aprender sobre
nas seções anteriores. Primeiro, você precisa para obter o registo de deslocamento com fio até o
Arduino:
Não se esqueça de usar resistores limitadores de corrente com os seus LEDs. referência do
diagrama mostrado na Figura 7-4 para configurar o circuito.
1 parte II ■Controlar o Seu
Agora, usando sua compreensão de como registos de deslocamento trabalhar, e sua compreensão
pé do shiftOut ()função, você pode usar o código na Listagem 7-1 para escrever o padrão de
alternância de LED para os LEDs anexados.
void setup ()
Capítulo Registadores de deslocamento
■
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
//Fazer nada
}
Recallfromthepin-outinFigure7-2thatthereisanunusedpincalled
Q '.Whentheoldestvalueisshiftedoutoftheshiftregister, Itisn'tdis-cardado; it'sactuallysentoutonthatpin.ByconnectingtheQ
H
'totheDATA
H
pinofanothershiftregister, andsharingtheLATCHandCLOCKpinswiththefirstshiftregister, youcancreatea16-bitshiftregistertha
ConvertingBetweenBinaryandDecimalFormats
Na listagem 7-1, as informações de estado LED foi escrito como uma cadeia binária de dígitos. Esta string
ajuda a visualizar quais LEDs será ligado e desligado. No entanto, você também pode escrever o
padrão como um valor decimal, convertendo entre os sistemas de base2 (binário) e Base10 (decimal). Cada
bit em um número binário (a partir da extremidade direita ou menos significativo, bit) representa um
poder cada vez maior de 2. Conversão de representações binárias para decimal representações é
muito simples. Considere o número binário de mais cedo exibido na Figura 7-5 com
Você deverá ver o mesmo resultado que quando você usou a notação binária.
ControllingLightAnimationswithaShiftRegister
No exemplo anterior, você construiu uma exposição estática com um registo de deslocamento. No
entanto, você provavelmente vai querer exibir informações mais dinâmica em seus LEDs. Nos próximos
dois exemplos, você usar um registrador de deslocamento para controlar um efeito de iluminação e
um gráfico de barras física.
Buildinga "LightRider"
O piloto da luz é um efeito puro que faz com que ele se parece com os LEDs estão perseguindo um ao
outro e para trás. Continuar a usar o mesmo circuito que usou anteriormente.
o shiftOut () função é muito rápido, e você pode usá-lo para atualizar a mudança
Capítulo ■Registadores de deslocamento
cadastre-se vários milhares de vezes por segundo. Devido a isso, você pode rapidamente atualizar as
saídas de registo de deslocamento para fazer animações de iluminação dinâmica. Aqui,
você ilumina cada LED, por sua vez, da esquerda para a direita, em seguida, da direita para a esquerda.
Veja vídeo de demonstração ligados no final desta seção para ver este circuito acabado em ação.
Primeiro você quer descobrir cada estado de animação de modo que você pode facilmente ciclo
por eles. Para cada passo de tempo, o LED atualmente iluminado desliga, ea próxima luz acende.
Quando as luzes chegar ao fim, a mesma coisa acontece em sentido inverso. O diagrama de
temporização na Figura 7-6 mostra como as luzes vão olhar
para cada passo de tempo eo valor decimal necessário para transformar esse LED específico.
void setup ()
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
for (int i = 0; i <14; i ++)
{
digitalWrite (TRINCO, LOW); // Trava baixo - começar sendingshiftOut (SER, CLK,
MSBFIRST, seq [i]); // Mudança mais sig. bit firstdigitalWrite (TRINCO, HIGH); // Trava
alta - parar sendingdelay (100); //Velocidade da animação
}
}
RespondingtoInputswithanLEDBarGraph
Utilizando o mesmo circuito, mas a adição de um sensor de distância IR, você pode fazer um gráfico
de barras que responde a quão perto você começa. Para misturar-se um pouco mais, tente usar
várias cores LED. O diagrama do circuito na Figura 7-7 mostra o circuito modi-
const int SER = 8; // Saída de série para mudar registerconst int TRAVA
= 9; // Mudança registar trava pinconst int CLK = 10; // Mudança
registar relógio pinconst int DIST = 0; // O sensor de distância no pino
analógico 0
void setup ()
{
// configura pinos como
outputspinMode (SER, OUTPUT);
pinMode (TRINCO, OUTPUT);
pinMode (CLK, OUTPUT);
void loop ()
{
distância int = analogRead (DIST); distância = map (distância,
minval, MAXVAL, 0, 8); distância = constranger (distância, 0,8);
digitalWrite (TRINCO, LOW); // Trava baixo - começar sendingshiftOut (SER, CLK, MSBFIRST,
vals [distância]); // Enviar dados, MSB firstdigitalWrite (trinco, HIGH); // Trava alta - parar
sendingdelay (10); //Velocidade da animação
Carregar o programa acima para o Arduino, e mover sua mão para trás e
outro na frente do sensor de distância, você deve ver a responder gráfico de barras, indo para
cima e para baixo, em paralelo com a mão. Se você achar que o gráfico paira muito em "all on"
ou "tudo fora", tente ajustar a
MAXVALe minval
valores para melhor atender as leituras do seu sensor de distância. Para testar os valores que
você está recebendo em várias distâncias, você pode inicializar uma conexão serial
naconfiguração()e chamada Serial.println (distância);
direito depois de executar a
analogRead (DIST);passo.
1 parte II ■Controlar o Seu
Resumo
III
Interfaces de comunicação
InThisPart
Capítulo 8: a I 2
C Bus
Capítulo 9: O Bus SPICapítulo 10: Interface com ecrãs de ais
crist líquidosCapítulo 11: Comunicação sem fio com XBee
rádios
Capítulo
a I2C Bus
downloads de código, vídeo e outros conteúdos digitais para este capítulo pode ser
encontrada em www.exploringarduino.com/content/ch8 .
Além disso, todos os códigos podem ser ewnwcwo.nwtirleayd.caosme/gmo/exploringarduinoem
a guia de transferência de código. O código está no capítulo 08 de download e individu-aliado
nomeado de acordo com os nomes de todo o capítulo.
163
1 parte III ■Interfaces de
2
bus C (pronuncia-se "olho quadrado ver" ou "olho Two Veja").
a I2bus C permite robusta de alta velocidade, comunicação de duas vias, entre
dispositivos enquanto usando um número mínimo de E / S pinos de I para facilitar a comunicação.
uma I2barramento C é controlada por um dispositivo principal (normalmente um microcontrolador), e
contém um ou mais dispositivos escravos que recebem informação do mestre. Neste capítulo, você
aprenderá sobre o I 2
protocolo C, e implementá-lo a com-
2
nicam com um digital I sensor de temperatura C capaz de retornar
medição
mentos como valores de grau em vez de valores analógicos como arbitrária. Você constrói sobre o
conhecimento dos capítulos anteriores, combinando o que você aprende neste capítulo para expandir
projetos anteriores.
NOTA ollowthestepsofthischapterwiththistutorialvideo:www.jeremyblum
.com / 2011/02/13 / arduino-tutorial-7-i2c-and-processamento /.YoucanalsofindthisvideoontheWileywebsiteshownatthebeginningofthi
2
HistoryoftheI Cbus
Eu2CHardwareDesign
sinal (SCL) e uma linha de dados bidirecional usado para o envio de informações e para trás entre
o mestre e os escravos (SDA). Observe, também, que a I 2
C
bus requer pull-up resistores em ambas as linhas de dados.
CommunicationSchemeandIDNumbers
a I2bus C permite que múltiplos dispositivos escravos para compartilhar as linhas de comunicação com um
único dispositivo mestre. Neste capítulo, o Arduino atua como o dispositivo mestre. O mestre de
rede é responsável por iniciar todas as comunicações. dispositivos escravos
Não é possível iniciar comunicações; eles só podem responder a pedidos que são
enviado pelo dispositivo mestre. Como vários dispositivos escravos compartilham as mesmas linhas
com- comunica-, é muito importante que somente o dispositivo mestre pode iniciar a comunicação. Caso
contrário, vários dispositivos podem tentar falar ao mesmo tempo e os dados iria ficar ilegível.
1 parte III ■Interfaces de
Todos os comandos e pedidos enviados a partir do mestre são recebidas por todos os dispositivos
2
no ônibus. cada I dispositivo escravo C tem um endereço de 7 bits único, ou número de identificação.
2
Quando comunicação é iniciada pelo dispositivo mestre, um ID do dispositivo é transmitido. Eu C
dispositivos escravos reagir aos dados no ônibus somente quando ela é dirigida pelo seu número de identificação.
Porque todos os dispositivos estão recebendo todas as mensagens, cada dispositivo na I2C
barramento deve ter um endereço exclusivo. alg2duinsspoesuitivos C têm endereços selecionáveis,
enquanto outros vêm do fabricante com um endereço fixo. Se você quiser ter vários números do
mesmo dispositivo em um ônibus, você precisa para identificar os componentes que estão
disponíveis com diferentes IDs.
Os sensores de temperatura, por exemplo, estão vulgarmente disponíveis com vários pré-
Eu programei2C aborda porque é comum a querer mais de um em um único I 2bus C. Neste capítulo,
você usa o sensor de temperatura TC74. Uma espiada
o TC74 folha de dados revela que ele está disponível com uma variedade de diferentes endereços.
Figura 8-2 mostra um trecho da folha de dados. Neste capítulo, você usa TC74A0-
5.0VAT, que é a 5V, T0-220 versão do IC com um endereço de 1.001.000.
Você pode comprar este IC especial com oito números de identificação diferentes;
2
conseqüentemente, você pode colocar até oito deles em um I C ônibus e ler cada um deles inde-
dentemente. Enquanto você estiver escrevendo programas para fazer a interface com este sensor de
temperatura mais adiante neste capítulo, certifique-se de estar ciente do ID do dispositivo que você
pediu para que você enviar os comandos certos!
Como se mostra na Figura 8-3, o AD7414 disponível em quatro versões, com dois
um pino de AS e dois sem. As versões com como pinos cada um pode ter três
possíveis números de identificação, dependendo se o pino como é deixado desconectado, está ligada
à VCC, ou está ligada a GND.
HardwareRequirementsandPull-UpResistors
2
Você deve ter notado na Figura 8-1 que a I padrão configuração do barramento C
requer resistores pull-up em ambos o relógio e linhas de dados. O valor para essas resistências
depende dos dispositivos escravos e quantos deles estão ligados. Neste capítulo, você usa resistores
4.7kΩ para ambos os pull-ups; este é um valor bastante normal que será especificado por muitas
fichas.
2
CommunicatingwithanI CTemperatureProbe
2
Os passos para se comunicar com diferentes I C dispositivos variam de acordo com o
2
requisitos do dispositivo específico. Felizmente, você pode usar o Arduino I C
biblioteca para abstrair a maioria do trabalho momento difícil. Nesta seção do capítulo, você
com o I 2
conversar C sensor de temperatura descrito anteriormente. Você aprende como
para interpretar as informações folha de dados à medida que avança de modo que você pode aplicar
esses conceitos para outros 2I
dispositivos C com relativa facilidade.
Os passos básicos para controlar qualquer2CI dispositivo são os seguintes:
3. mestre envia ler (1) ou escrever (0) bit, dependendo se ele quer escrever dados em um
I2registo do dispositivo de C ou se quer ler a partir de um do Grupo I2registros do dispositivo
C.
SettingUptheHardware
Para confirmar que o seu primeiro programa funciona como esperado, você pode usar o monitor
serial para imprimir as leituras de temperatura a partir de
sensor de temperatura para
um2 I
C
seu computador. Porque este é um sensor digital, imprime a temperatura no
graus. Ao contrário dos sensores de temperatura que você usou nos capítulos
anteriores, você não precisa se preocupar com a conversão de uma leitura analógica
para um real temperatura. Quão conveniente! Agora, ligar um senor temperatura para o
Arduino como mostrado na Figura 8-4.
Note que o SDA e SCL pinos são conectados aos pinos A4 e A5, respectivamente.
Lembre-se de mais cedo no capítulo que a SDA e SCL são os dois pinos utilizados
2
para se comunicar com I dispositivos de eles C transportar dados e sinais de relógio, res-
pectivamente. Você já aprendeu sobre pinos multiplexados em capítulos anteriores. No Arduino, pinos
A4 e A5 são multiplexados entre o conversor analógico-para-digital (ADC) e o hardware I
2
Interface C. Quando você inicializar o fio
2
biblioteca em seu código, os pinos conectar a I do ATmega C controlador, permitindo
-lo a se comunicar com o Fioobjeto a I2dispositivos C via os pinos. Ao usar a biblioteca Wire, você não
pode usar pinos A4 e A5 como entradas analógicas, porque eles são reservados para comunicação
com I
2
dispositivos C.
ReferencingtheDatasheet
Em seguida, você precisa escrever o software que instrui o Arduino para solicitar dados do I 2C sensor
de temperatura. A biblioteca Arduino fio faz com que este
razoavelmente fácil. Para usá-lo corretamente, você precisa saber como ler a folha de dados
para determinar o esquema de comunicação que este chip em particular usa. Vamos dissecar
o
esquema de comunicação apresentada na folha de dados usando o que você já sabe sobre como eu
2
C funciona. Considere os diagramas de folha de dados
mostrado nas Figuras 8-5 e 8-6.
Você pode ler e escrever para esta IC, como mostrado na folha de dados em
Figura 8-5. O TC74 tem dois registos, um que contém a temperatura actual no
Celsius e que contém informações de configuração sobre o chip (incluindo o estado de espera e estado
de dados pronto). Tabela 4-1 da folha de dados mostra isso. Você não fazer
Capítulo ■O I2C Bus
precisa mexer com a informação de configuração; você só quer ler a temperatura do dispositivo. As
tabelas 4-3 e 4-4 dentro Figura 8-6 mostram a forma como a informação sobre a temperatura é
armazenada dentro do registo de dados de 8 bits.
WritingtheSoftware
void setup ()
{
// Iniciar comunicação serial em 9600 baudSerial.begin
(9600);
// Criar um fio
objectWire.begin ();
void loop ()
1 parte III ■Interfaces de
{
// Enviar um pedido // Comece a falar com o dispositivo na
addressWire.beginTransmission especificado (temp_address); // Enviar
um pouco pedindo para registo zero, o registerWire.write dados (0); //
Wire.endTransmission transmissão completa ();
atraso (500);
}
Fio. ler()comando.
O programa na Listagem 8-1 também lida com a conversão da temperatura Celsius para
Fahrenheit, para aqueles que não são metricamente inclinado. Você pode encontrar a fórmula