Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arduino Simples e Divertido Explore o potencial do Arduino com os módulos da GBK Robotics Cláudio Vieira Oliveira e Humberto Zanetti Arduino Simples e Divertido Explore o potencial do Arduino com os módulos da GBK Robotics Copyright © 2016, Cláudio Luís Vieira Oliveira e Humberto Augusto Piovesana Zanetti Editoração, fotografias, ilustrações e revisão ortográfica: Cláudio Luís Vieira Oliveira e Humberto Augusto Piovesana Zanetti Capa: Claudia Baptistella Oliveira Todos os direitos reservados e protegidos pela Lei 9610 de 19/02/1998. Todas as informações contidas nesta obra são de exclusiva responsabilidade dos autores. Nenhuma parte desta obra pode ser reproduzida ou transmitida por qualquer meio, sem prévia autorização por escrito dos autores. O mesmo se aplica às características gráficas e à editoração eletrônica desta obra. Alguns nomes de empresas e respectivos produtos e/ou marcas foram citados apenas para fins didáticos, não havendo qualquer vínculo dos mesmos com a obra. Dentro dos códigos de programação, algumas palavras não foram acentuadas por questões técnicas relacionadas às linguagens de programação utilizadas. Os autores acreditam que todas as informações apresentadas nesta obra estão corretas. Contudo, não há qualquer tipo de garantia de que o uso das mesmas resultará no esperado pelo leitor, principalmente quando se tratar de códigos de programação. Caso seja(m) necessária(s), os autores disponibilizarão errata(s) no site www.profclaudio.com.br. Dados Internacionais de Catalogação na Publicação (CIP) O482a Oliveira, Cláudio Luís Vieira Oliveira Arduino Simples e Divertido / [texto de Cláudio Luís Vieira Oliveira e Humberto Augusto Piovesana Zanetti]. – Salvador: Asè Editorial, 2016. 252p. ISBN: 978-85-92861-14-8 1. Informática. 2. Arduino (Controlador Programável). I. Título. CDD: 005.133 Impresso no Brasil / Printed in Brazil À minha esposa Claudia, por tantos e tantos anos de companheirismo, comunhão e amor. À minha filha Franciele com muito amor. Aos meus pais Maria Creyde e Manoel pela dedicação e amor à família. Ao grande amigo Humberto pelo inúmeros projetos compartilhados. Cláudio Vieira Oliveira À minha esposa Flavia, por seu incentivo e dedicação. Ao meus pais, Alberto e Célia, e meus irmãos, Luis Gustavo e Pedro, por sempre acreditarem em mim. E ao meu grande amigo Cláudio, pela parceria nos projetos nesses anos. Humberto Zanetti Sobre os Autores Cláudio Luís Vieira Oliveira Mestre em Sistemas de Computação pela Pontifícia Universidade Católica de Campinas e bacharel em Análise de Sistemas pela Universidade Metodista de Piracicaba. Possui mais de 25 anos de experiência na área de Ciência da Computação. Coordenador de Curso e Professor da Faculdade de Tecnologia de Jundiaí (FATEC) e Professor na Faculdade de Tecnologia de Bragança Paulista (FATEC). Humberto Augusto Piovesana Zanetti Doutorando em Tecnologia pela Faculdade de Tecnologia da Universidade Estadual de Campinas (FT - UNICAMP) e Mestre em Ciência da Computação pela Faculdade de Campo Limpo Paulista (FACCAMP). Há 11 anos atuando no ensino técnico e superior. Atualmente professor na Escola Técnica Rosa Perrone Scavone (Itatiba, SP) e na Faculdade de Tecnologia de Jundiaí (FATEC). Na UNICAMP é integrante do LIAG (Laboratório de Informática, Aprendizagem e Gestão). Conheça Também... Escrito pelos mesmos autores, o livro Arduino Descomplicado – Como Elaborar Projetos de Eletrônica, publicado pela Editora Érica em 2015, apresenta os conceitos básicos e avançados que envolvem o Arduino, considerado o principal marco na história do hardware livre. O Arduino cria uma ponte entre os mundos das ideias, da eletrônica e computação, possibilitando que uma ideia saia do papel e se transforme em realidade de maneira rápida e simples. A prototipação rápida é um convite à experimentação. Este livro traz, ainda, a história da ferramenta e analisa conhecimentos de eletrônica básica. Orienta quanto à criação do primeiro projeto, destacando os principais compo- nentes e o processo de montagem do circuito. Discorre sobre entradas e saídas digitais e analógicas, portal serial, displays, sensores e módulos. Por fim, explica os conceitos de motores e servo-motores, Android e a documentação de projetos com o programa Fritzing. Índice Capítulo 1:.......................................................13 Introdução.......................................................13 Itens Necessários............................................17 Conceitos Básicos da Linguagem....................20 Capítulo 2:.......................................................35 Saídas Digitais.................................................35 Projeto 1: PISCA-PISCA....................................38 Projeto 2: SEMÁFORO......................................43 Projeto 3: SEQUENCIAL DE LEDS.....................47 Projeto 4: CONTADOR BINÁRIO........................52 Projeto 5: SEMÁFORO COMPLETO....................58 Projeto 6: BUZZER...........................................64 Projeto 7: O ROBÔ EMITE SONS.......................68 Capítulo 3:.......................................................71 Comunicação Serial.........................................71 Projeto 8: CONTROLE ATRAVÉS DA SERIAL......74 Projeto 9: CONTROLANDO O ROBÔ.................78 Capítulo 4:.......................................................83 Saídas PWM.....................................................83 Projeto 10: LED PULSANTE..............................84 Projeto 11: “SONO”.........................................88 Projeto 12: LED RGB........................................91 Capítulo 5:.......................................................93 Entradas Digitais.............................................93 Projeto 13: BOTÃO LIGA-DESLIGA....................94 Projeto 14: SELECIONANDO AS FUNÇÕES DO ROBÔ...............................................................99 Projeto 15: CONTADOR COM O DADO ELETRÔNICO..................................................104 Projeto 16: DADO ELETRÔNICO.....................110 Projeto 17: TIRO AO ALVO..............................116 Projeto 18: TIRO AO ALVO COM EFEITOS SONOROS......................................................123 Projeto 19: CONTADOR BINÁRIO COM BOTÃO129 Projeto 20: CONTADOR BINÁRIO COM ENCODER ......................................................................136 Capítulo 6:.....................................................145 Entradas Analógicas......................................145 Projeto 21: SENSOR CREPUSCULAR..............146 Projeto 22: SENSOR DE LUMINOSIDADE........150 Projeto 23: “DESPERTANDO O ROBÔ”............154 Projeto 24: TERMÔMETRO.............................159 Projeto 25: ACIONANDO RELÉS.....................164 Capítulo 7:.....................................................167 Display de LED..............................................167 Projeto 26: DISPLAY DE LED..........................168 Projeto 27: MEDIDOR DO NÍVEL DE ILUMINAÇÃO ......................................................................175 Projeto 28: DADO ELETRÔNICO COM DISPLAY DE LED................................................................181 Projeto 29: CONTADOR HEXADECIMAL..........185 Projeto 30: CONTADOR BINÁRIO E DECIMAL. 190 Capítulo 8:.....................................................197 Infravermelho................................................197 Projeto 31: INTERRUPTOR DE PROXIMIDADE.198 Projeto 32: SEMÁFORO ACIONADO POR PROXIMIDADE................................................205 Projeto 33: SENSOR DE DISTÂNCIA................209 Projeto 34: SENSOR DE DISTÂNCIA COM INDICAÇÃO SONORA......................................214 Projeto 35: CONTROLE REMOTO....................219 Projeto 36: CONTROLANDO O ROBÔ REMOTAMENTE..............................................227Capítulo 9:.....................................................233 ATtiny85........................................................233 Projeto 37: PROGRAMANDO O ATTINY85 ATRAVÉS DO ARDUINO.................................................235 Projeto 38: SEMÁFORO COM ATTINY85..........243 Projeto 39: TERMOSTATO COM ATTINY85......246 Projeto 40: CONTROLE DE ESTUFA COM O ATTINY85.......................................................250 Cláudio Vieira Oliveira e Humberto Zanetti Capítulo 1: Introdução O Arduino é uma versátil plataforma de prototipagem eletrônica, de hardware e software aberto, de baixo custo e muito fácil de usar, mesmo para pessoas que possuem pouco ou nenhum conhecimento de eletrônica. Quando falamos em Arduino devemos ter em mente três conceitos: hardware que é a placa que possui como componente central um microcontrolador da família ATmega; software que consiste em uma linguagem de programação e um ambiente de desenvolvimento derivados do Processing. O terceiro conceito é a comunidade, composta por um grande número de pessoas que compartilham os seus conhecimentos e projetos na Internet, disseminando a plataforma. 14 > Arduino Simples e Divertido Figura 1.1: Placa Arduino Uno R3 A placa Arduino é muito parecida com um computador de pequeno porte, sendo composta pelo microcontrolador, memória RAM, memória secundária (memória flash), clock e comunicação USB entre outras funcionalidades. Na Figura 1.1 temos o modelo mais popular dos Arduinos que é o Uno R3, porém, para os projetos deste livro qualquer outro modelo de Arduino pode ser usado sem restrições. O Arduino Uno R3 apresenta 14 pinos que podem ser utilizados como entradas ou saídas digitais (pinos 0 a 13), sendo que os pinos 3, 5, 6, 9, 10 e 11 também podem utilizar Pulse Width Modulation (PWM) para gerar um conjunto de valores inteiros entre 0 e 255. Os pinos de A0 a A5 correspondem às entradas analógicas, que recebem uma tensão entre 0 e 5V e o produzem em uma escala de 0 a 1023. Também temos os pinos 3,3V, 5V e GND (Terra) permitem alimentar os componentes dos circuitos conectados ao Arduino. Possui um microprocessador ATmega328, com uma memória RAM de 2KB, memória Flash de 32KB e clock de 16MHz. O ambiente de desenvolvimento do Arduino pode ser gratuitamente baixado dos sites www.arduino.cc ou www.arduino.org. Nestes sites e em muitos outros, também estão disponíveis as instruções para realizar a instalação em diversos sistemas operacionais, além de fóruns para tirar dúvidas e obter maiores informações. 15 http://www.arduino.org/ http://www.arduino.cc/ Cláudio Vieira Oliveira e Humberto Zanetti O ambiente de programação (Figura 1.2) é muito simples e intuitivo. Um programa, que no Arduino é chamado de sketch, apresenta duas funções básicas: setup() e loop(). Figura 1.2: Ambiente de Desenvolvimento do Arduino A função setup() deverá conter o código que irá executar apenas uma vez, quando o sketch iniciar. Normalmente colocamos nesta função as definições iniciais do programa. A função loop() irá executar continuamente as instruções que estão lá até 16 Arduino Simples e Divertido que outro sketch seja carregado na memória Flash do Arduino. É importante notar que no Arduino é possível armazenar e executar um sketch por vez, desta forma, sempre quando transferimos um sketch esse irá substituir o programa que estava anteriormente carregado na memória Flash. Também observe que como o sketch fica armazenado na memória Flash, mesmo quando desligamos o Arduino, o programa continua armazenado e irá entrar novamente em execução quando o Arduino for ligado novamente. 17 Cláudio Vieira Oliveira e Humberto Zanetti Itens Necessários Os seguintes módulos da GBK Robotics serão utilizados no desenvolvimento dos projetos deste livro: PL1 – Tiny Board PL2 – First Robot PL3 – Dado Eletrônico P4 – Switch P5 – Extensão P7 – Sensor de Luminosidade 18 Arduino Simples e Divertido P9 – Relé de 1 Canal P10 - Sensor de Temperatura P11 – Display Simples P12 - Sensor de Obstáculos P13 – LDR P14 – IR Receiver P15 – Buzzer P17 – Encoder 19 Cláudio Vieira Oliveira e Humberto Zanetti P20 – LED RGB Ânodo Comum P21 – Semáforo 20 Arduino Simples e Divertido Além dos módulos, os seguintes itens também serão necessários: 1 Arduino Uno R3 (ou qualquer outro modelo do Arduino) 1 ATtiny85 20 Cabos para conexão macho-fêmea 10 Cabos para conexão fêmea-fêmea 21 Cláudio Vieira Oliveira e Humberto Zanetti Conceitos Básicos da Linguagem Durante todo o livro serão apresentados vários projetos e seus respectivos códigos-fonte (ou programas que no Arduino chamamos de sketch), portanto essa seção terá como objetivo explicar alguns conceitos básicos da linguagem de programação utilizada no Arduino, a linguagem Wiring. Para aqueles que já conhecem alguma linguagem de programação, será muito fácil entender a Wiring. Aqueles que nunca programaram não devem se preocupar, pois em todos os projetos terão o detalhamento e explicação necessários para a compreensão do leitor. Esta seção terá como objetivo apresentar alguns conceitos fundamentais da linguagem, para que desde o primeiro projeto o leitor se sinta confortável ao ler os programas. Neste momento não será abordado todos os conceitos que envolvem a linguagem e nem ocorrerá um aprofundamento no assunto, mas em cada projeto, quando esses recursos apresentados ou novos recursos surgirem, será detalhado seu uso e funcionamento para cada projeto. Um dos recursos mais comuns utilizados pelos desenvolvedores é o comentário do código- fonte. O comentário é uma linha ou sentença que não será executada, que serve apenas para que 22 Arduino Simples e Divertido o próprio programador faça anotações e depois as leia. Será muito comum durante o livro nos depararmos com linhas assim: 23 Cláudio Vieira Oliveira e Humberto Zanetti // Isto é um comentário Outra particularidade da linguagem, que será notada desde o primeiro projeto, é o uso de ponto-e-vírgula no final de várias linhas de comandos. Quando temos um comando, sinalizamos o final dessa linha de comandos utilizando o símbolo “;”. Isto informa que essa linha está no fim e que a execução irá prosseguir na próxima linha. As funções setup() e loop() Em todos os projetos apresentados neste livro, você irá encontrar as funções setup() e loop(). Essas funções são obrigatórias para qualquer sketch em Arduino e separam dois blocos de código-fonte essenciais, que são delimitados por um conjunto de chaves { }. A primeira função, a setup(), é executada uma única vez. Ela é utilizada principalmente para fazermos a configuração inicial do nosso Arduino ou qualquer comando que quisermos que seja efetuado assim que a placa for iniciada. Já a função loop() é executada repetidamente, enquanto a placa estiver em funcionamento. Nessa função colocamos o núcleo do nosso código-fonte, as ações que devem se repetir durante o período em que o Arduino ficará ligado. 24 Arduino Simples e Divertido Portanto, a diferença entre as funções é que a setup() será executada apenas uma vez e no momento em que a placa for ligada, enquanto a função loop() sempre será executada, repetidas vezes, enquanto a placa estiver ligada. Toda vez que você reiniciar a placa ou carregar um programa, a função setup() é executada, e depois a função loop() inicia sua execução e repetição. Constantes e Variáveis Valores considerados constantes são aqueles pré-definidos e que não podem ser alterados como, por exemplo, o valor de PI (3,141516...). Nos projetos deste livro são utilizados dois conjuntos de valores constantes: Valores da tensão do pino:HIGH é um valor constante que indica 5 volts e LOW indica 0 volts no pino; Valores de estado de uso do pino: INPUT indica que o pino atuará como entrada e OUTPUT indica que o pino atuará como saída. Uma variável pode ser compreendida como uma representação de um dado ou valor, que pode ser alterado (por isso seu nome “variável”, que pode variar). Para os projetos em Arduino, o uso de variáveis é bastante comum, por exemplo, para indicar o número de um 25 Cláudio Vieira Oliveira e Humberto Zanetti determinado pino na placa ou o valor de um sensor. Para criar uma variável temos que definir o seu tipo de dado e seu identificador (nome). O tipo de dado a ser definido corresponde ao tipo de valor que a variável vai armazenar, por exemplo, se é um número inteiro (que denominamos como int em Wiring) ou um número real (que definimos como float) entre outros. A Tabela 1.1 mostra os principais tipos de dados usados no Arduino. Tabela 1.1: Tipos de Dados Tipo Especificação boole an Possui apenas o valor Verdadeiro (TRUE) ou Falso (FALSE). byte Armazena um número de 8 bits sem sinal que deve possuir um valor entre 0 e 255. char Armazena o valor de um caractere. Representamos o valor desse tipo usando aspas simples (‘ ’). int Representa o conjunto dos inteiros naturais positivos e negativos, incluindo o zero e abrangendo a faixa de -32.768 a 32.767. float Representa o conjunto de números reais, positivos e negativos. Chamados de números de ponto flutuante, na faixa de 3,4028235E+38 a -3,4028235E+38. Strin g Strings representam um conjunto ou cadeia de caracteres, como quando formamos uma palavra, mensagem ou frase. Representamos o valor desse tipo usando aspas duplas (“ “). O identificador é a referência desse valor, que podemos utilizar no decorrer do programa. 26 Arduino Simples e Divertido Esses identificadores podem conter números e letras maiúsculas ou minúsculas, devem sempre começar com uma letra, não podem ter acentos e nem pode haver espaços em sua definição. Podemos criar uma variável “vazia” (sem valor inicial) ou já definir um valor inicial para ela, utilizando o sinal de atribuição “=”. Abaixo podemos ver um exemplo de criação e inicialização de uma variável do tipo de dado inteiro, chamada “numero” e que recebe como valor inicial 10: int numero = 10; Estruturas Condicionais Em muitas situações é necessário programarmos linhas de comandos que devem ser executadas (ou não) dependendo de alguma situação. Por exemplo, acender algum LED somente se alguém apertar um botão. Veja que nesse caso, o LED só será aceso SE um botão for pressionado, caso contrário o mesmo deverá permanecer apagado. Esta condição a ser verificada, e que define qual conjunto de comandos será executado, é chamada de estrutura condicional ou de decisão. A estrutura condicional mais simples que temos é a if (“se” em português). Nela definimos uma expressão (a condição a ser verificada), que caso seja verdadeira, os comandos agrupados no bloco 27 Cláudio Vieira Oliveira e Humberto Zanetti (demarcados por “{}”) serão executados, caso contrário, nada será feito. A seguir vemos a definição da estrutura if: if (expressao) { comando 1; comando 2; ... } Podem ocorrer situações em que é necessário que também se faça algo, caso a expressão for falsa. Neste caso usamos uma estrutura auxiliar ao if, o else (“senão” em português). Essa estrutura vem logo após o fechamento do bloco do if, e o bloco que ele demarca só será executado na situação em que a expressão (definida no if) seja falsa. A estrutura if-else pode ser observada a seguir: if (expressao) { comando 1; comando 2; ... } else { comando 1; comando 2; ... } 28 Arduino Simples e Divertido Também é possível usar de maneira encadeada este conjunto de estruturas, no caso de querer verificar uma sequência de várias condições em cadeia. Podemos verificar uma condição e caso seja falsa, verificar uma outra, e assim por diante. Abaixo vemos a estrutura encadeada: if (expressao) { comando 1; comando 2; ... } else if { comando 1; comando 2; ... } else { comando 1; comando 2; ... } É importante notar que este encadeamento pode ser feito com quantas verificações forem necessárias, apenas sendo necessário conduzir a uma nova verificação (if) imediatamente depois de um else. Há uma estrutura condicional que permite fazer diversas comparações de valores sobre uma mesma variável, chamada switch-case (“escolha-caso” em português). Deve ser definido 29 Cláudio Vieira Oliveira e Humberto Zanetti qual será a variável (definida no switch) que será comparada e em cada case deve ser definido o valor a ser comparado. Se a variável apresentar algum valor definido em um dos “cases”, o bloco de comando associado será executado. A estrutura switch-case ainda conta com a opção de uso do default, que representa um “caso contrário”, ou seja, define os comandos que devem ser executados na situação em que o valor da variável não corresponde a nenhum dos “cases”. A estrutura switch-case é apresentada a seguir: switch (variavel) { case valor1: comando 1; comando 2; ... break; case valor2: comando 1; comando 2; ... break; ... case valorN: comando 1; comando 2; ... break; default: comando 1; 30 Arduino Simples e Divertido comando 2; ... break; } Note que o início dos blocos de cada case não utiliza “{}”. O bloco é iniciado a partir do “:” e se encerra quando o quando break (“parar” em português) for executado, encerrando assim toda a estrutura switch. Estruturas de Repetição Em muitas situações necessitamos que um conjunto de comandos seja executado repetidas vezes e para isso precisamos adotar estruturas de repetição, também chamadas de laços de repetição. Estas estruturas de repetição, assim como as condicionais, utilizam uma expressão para definir uma condição. Enquanto a condição for verdadeira ocorre a repetição e no momento em que a condição se torna falsa, a repetição é encerrada. Umas das estruturas de repetição é a while (“enquanto” em português), que delimita um bloco de comandos que serão repetidos, enquanto a condição verificada for verdadeira. O momento em que a condição se torna falsa, não há repetição e a execução continua na próxima linha do código-fonte. Podemos ver a estrutura while a seguir: 31 Cláudio Vieira Oliveira e Humberto Zanetti while (expressao) { comando 1; comando 2; ... } Caso precise que o bloco de comandos seja feito pelo menos uma vez antes de testar a condição, a qual determina a próxima repetição ou não, temos a estrutura do-while (“faça enquanto” em português). A estrutura do-while é apresentada abaixo: do { comando 1; comando 2; ... } while (expressao); Temos também uma estrutura de repetição cujo o objetivo é realizar um número determinado de repetições. A estrutura while descrita anteriormente encerra sua repetição no momento em que a condição se torna falsa, que pode vir na ocorrência de alguma mudança de valor em alguma variável, sem sabermos a princípio quantas repetições serão feitas até se encerrar. Para as situações em que devemos controlar a quantidade de repetições, existe uma estrutura adequada para isso, a estrutura for (“para” em português). Essa estrutura precisa, 32 Arduino Simples e Divertido além da condição, de um contador e definirmos como será incrementado essa contagem, separados por “;”. Abaixo vemos a estrutura for em detalhes: for (contador; condicao; incremento) { comando 1; comando 2; ... } O contador deve ser uma variável numérica inteira e geralmente se inicia em 0 ou 1. O incremento especifica de quanto em quanto a variável decontagem irá incrementar. A expressão que define a condição de repetição está relacionada ao limite da contagem. Por exemplo, se quisermos um ciclo com 10 repetições, iniciando o contador em 1, a expressão poderia ser “contador <= 10”, tendo um incremento de 1 no contador a cada repetição. Vetores e Matrizes No desenvolvimento de programas é muito comum utilizarmos um conjunto de valores, que se assemelham por terem o mesmo tipo de dado e mesmo contexto. Imagine que você tem a necessidade de guardar uma coleção de valores, como a temperatura de um termômetro, que será verificado de hora em hora, durante um dia inteiro. Com isso você teria 24 valores distintos, 33 Cláudio Vieira Oliveira e Humberto Zanetti sendo necessário armazenar em 24 variáveis diferentes. Se estes valores possuem o mesmo tipo (no caso o tipo numérico real) e um contexto (valores de temperaturas) podemos armazená- las em um conjunto único, que chamamos de vetor. Vetor é uma estrutura unidimensional que através de um único identificador, podemos armazenar vários valores de mesmo tipo, diferenciando esses valores através de índices, que representa sua posição dentro do vetor. Abaixo temos um exemplo de um vetor de 5 posições que armazena valores do tipo de dado inteiro. Figura 1.3: Exemplo de vetor No exemplo mostrado na Figura 1.3 temos o vetor chamado “vetor”, que é formado por 5 valores, sendo que seu índice sempre se inicia em 0. Esses índices podem ser compreendidos como endereços dos valores dentro do vetor. Por exemplo, o vetor no índice 0 referencia o valor 7, o vetor no índice 1 referencia o valor 3, e assim por diante. Para criar um vetor é bem parecido com a criação de uma variável, definindo seu tipo e seu identificador. Adicionamos a isso, a quantidade de posições que esse vetor terá. Abaixo vemos a linha de código que cria o vetor do exemplo: 34 Arduino Simples e Divertido int vetor[5]; Nesta linha podemos notar que o tipo é inteiro (int), o identificador é “vetor” e entre colchetes (“[]”) a quantidade máxima de valores que esse vetor pode armazenar. Também utilizamos colchetes para referenciar uma posição específica de um vetor. Por exemplo, a primeira posição seria vetor[0] e a última seria vetor[4]. Essa referência indica o valor que está localizada na posição, por exemplo, somando as 2 primeiras posições (vetor[0] + vetor[1]) seria equivalente a somar 7 + 3. É importante notar que os índices sempre começam em 0 (zero). Estes conjuntos de valores podem ter uma indexação de mais de uma dimensão, e quando isso ocorre chamamos a estrutura de matriz. A diferença para o vetor é que temos mais uma dimensão de índice, agora na vertical, como mostra o exemplo na Figura 1.4. Neste caso temos uma matriz 3 por 5 (3 linhas, 5 colunas) com valores do tipo inteiro: Figura 1.4: Exemplo de matriz 35 Cláudio Vieira Oliveira e Humberto Zanetti Assim como no vetor, declaramos a matriz utilizando os colchetes, mas agora definindo quais são suas dimensões, sendo definido primeiro a quantidade de linhas e depois a quantidade de colunas. Também utilizamos os colchetes para referenciar os valores dentro da matriz. Por exemplo temos o valor 1 na posição matriz[2][0] e o valor 2 na posição matriz[1][4]. Abaixo temos a linha de declaração da matriz do exemplo acima: int matriz[3][5]; Operadores Na linguagem de programação utilizada pelo Arduino temos quatro grupos de operadores sendo que cada grupo possui um conjunto de símbolos que representa a operação. O primeiro grupo de operadores são os aritméticos. São utilizados para fazer operações aritméticas simples, atribuição de valores e incremento (como já comentamos na estrutura de repetição for). A Tabela 1.2 apresenta os operadores aritméticos. Tabela 1.2: Operadores Aritméticos Símbolo Operação = atribuição + adição - subtração * multiplicação / divisão 36 Arduino Simples e Divertido ++ incremento -- decremento Os operadores relacionais são usados em expressões lógicas, como aquelas usadas em estruturas condicionais e de repetição, e resultam em um valor lógico (verdadeiro ou falso). A Tabela 1.3 resume o conjunto desses operadores. Tabela 1.3: Operadores Relacionais Símbolo Operação == igualdade != diferença > maior < menor >= maior ou igual <= menor ou igual O conjunto de operadores lógicos também são utilizados em expressões lógicas. Esses operadores são usados para formar novas proposições lógicas em conjunto com os operadores relacionais. Os operadores mais comuns desse tipo são o de conjunção (E), disjunção (OU) e negação (NÃO). A Tabela 1.4 apresenta esses operadores e seus respectivos símbolos usados na linguagem de programação. Tabela 1.4: Operadores Lógicos Símbolo Operação && E (AND) || OU (OR) ! NÃO (NOT) 37 Cláudio Vieira Oliveira e Humberto Zanetti Por fim, temos o conjunto de operadores bit-a-bit. Esses operadores têm como função a manipulação dos bits que compõem determinado dado armazenado, alterando assim seu valor. Por exemplo, vamos pegar o valor decimal 2 em binário, representado em 8 bits: 00000010. Podemos utilizar um operador bit-a-bit para deslocar o bit para esquerda, tornando a representação binária em 00000100, transformando esse valor para 4, na representação decimal. A Tabela 1.5 mostra o conjunto de operadores bit-a-bit. Tabela 1.5: Operadores Bit-a-bit Símbolo Operação & E (AND) | OU (OR) ~ NÃO (NOT) ^ OU exclusivo (XOR) << deslocamento de bit à esquerda >> deslocamento de bit à direita 38 Arduino Simples e Divertido Capítulo 2: Saídas Digitais Como já mencionado anteriormente o Arduino possui um conjunto de pinos que são utilizados como entradas ou saídas digitais (Figura 2.1). Figura 2.1: Entradas e Saídas Digitais Um sinal de digital é aquele apresenta exclusivamente dois valores 0 ou 1, LOW ou HIGH. Sendo muito útil para definirmos se algo deve ser ligado ou desligado, por exemplo, para controlar o acionamento de um relê que irá acender ou apagar uma lâmpada ou qualquer outro dispositivo elétrico ou eletrônico, entre muitas outras possibilidades. A definição se um determinado pino digital irá atuar como entrada ou saída é realizada através de programação, como veremos a seguir. Desta forma, quando precisamos utilizar um pino devemos identificá-lo através do respectivo número, isto é, entre 0 e 13, como também 39 > Cláudio Vieira Oliveira e Humberto Zanetti podemos observar na Figura 2.1. Em seguida, utilizamos a função pinMode para definir a função do pino, por exemplo: pinMode(13, OUTPUT); Neste caso, note que estamos definindo que o pino digital 13 do Arduino irá atuar como OUTPUT, ou seja, saída. Por outro lado, quando precisamos definir um pino como entrada, utilizaremos a palavra reservada INPUT. A função digitalWrite será utilizada para definirmos o valor de um pino digital, por exemplo: digitalWrite(13, HIGH); Note que utilizamos a função digitalWrite para colocar um nível 1 (HIGH) no pino 13. Conforme podemos observar a seguir, podemos utilizar a palavra reservada LOW para colocar o nível 0 no pino 13. digitalWrite(13, LOW); Quando digitar as instruções no ambiente de desenvolvimento tome cuidado ao utilizar letras maiúsculas ou minúsculas, pois, a 40 Arduino Simples e Divertido linguagem de programação utilizada para programar o Arduino faz diferenciação entre elas. Desta forma, siga exatamente a grafia utilizada para cada função e palavra reservada. Com o intuito de ilustrar a utilização do ambiente de desenvolvimento e também fixar o conceito de saídas digitais vamos para a montagem dos projetos de 1 a 7, descritos nestecapítulo. 41 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 1: PISCA-PISCA Este projeto é bastante simples e seu objetivo é utilizar a saída digital do Arduino para acender e apagar um LED. Conecte o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 2.2. Figura 2.2: Ligação do Módulo PL2 – First Robot Neste projeto também é possível usarmos módulo P7 – Sensor de Luminosidade ou P21 – Semáforo (Figura 2.3) em substituição ao módulo PL2 – First Robot. 42 Arduino Simples e Divertido Figura 2.3: Módulos P7 (à esquerda) e P21 (à direita) Para usar o módulo P7 conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo (Figura 2.4). Figura 2.4: Ligação Módulo P7 – Sensor de Luminosidade 43 Cláudio Vieira Oliveira e Humberto Zanetti Quando utilizar o módulo P21 – Semáforo conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo P21 (Figura 2.5). Figura 2.5: Conexão do Módulo P21 – Semáforo Independente do módulo utilizado na montagem o sketch (programa) é exatamente o mesmo, desta forma, carregue o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: // Acender e apagar um LED através da saída // digital do Arduino 44 Arduino Simples e Divertido // Pino no qual o LED está conectado: int LED = 13; void setup() { // Definir o pino como saída: pinMode(LED, OUTPUT); } void loop() { // Acender o LED: digitalWrite(LED, HIGH); // Aguardar 500ms ou 0,5 segundo: delay(500); // Apagar o LED: digitalWrite(LED, LOW); // Aguardar novamente 0,5 segundo: delay(500); } Após salvar o sketch (programa), faça a compilação e, em seguida, conecte o Arduino à porta USB do computador. Selecione no menu “Ferramentas”, o modelo da sua placa Arduino e também a porta serial à qual ela está conectada. Finalizando, pressione o botão Carregar para fazer a transferência do sketch para o Arduino. Observe a Figura 2.6 que mostra a disposição dos respectivos botões no ambiente de desenvolvimento do Arduino. 45 Cláudio Vieira Oliveira e Humberto Zanetti Figura 2.6: Ambiente de Desenvolvimento do Arduino Observe, neste sketch, o uso das funções pinMode e digitalWrite já explicadas anteriormente, além da função delay que irá permitir que o programa “espere” a quantidade de milissegundos passada como parâmetro. Experimente modificar o valor passado na função delay para alterar a velocidade na qual o LED pisca. Não se esqueça de transferir o sketch após cada alteração. 46 Arduino Simples e Divertido Projeto 2: SEMÁFORO Neste projeto iremos utilizar os três LEDs (vermelho, amarelo e verde) do módulo PL2 – First Robot para simular o funcionamento de um semáforo. A montagem é bastante simples, basta conectar o módulo PL2 – First Robot diretamente no Arduino, conforme ilustra a Figura 2.7. Figura 2.7: Ligação do Módulo PL2 – First Robot Outra possibilidade de montagem consiste em substituirmos o módulo PL2 – First Robot pelo módulo P21 – Semáforo (Figura 2.8). Neste caso 47 Cláudio Vieira Oliveira e Humberto Zanetti devemos realizar as seguintes conexões utilizando, para isso, um cabo de conexão macho-fêmea: a. Gnd do módulo ao pino de Gnd do Arduino; b. Led1 do módulo ao pino 11 do Arduino; c. Led2 do módulo ao pino 10 do Arduino; d. Led3 do módulo ao pino 9 do Arduino. Figura 2.8: Conexão do Módulo P21 – Semáforo 48 Arduino Simples e Divertido Independente do módulo usado na montagem, no ambiente de desenvolvimento do Arduino digite o seguinte sketch: // Semáforo int VERM = 11; // LED Vermelho int AMAR = 10; // LED Amarelo int VERD = 9; // LED Verde void setup() { pinMode(VERM, OUTPUT); pinMode(AMAR, OUTPUT); pinMode(VERD, OUTPUT); } void loop() { digitalWrite(VERM, HIGH); digitalWrite(AMAR, LOW); digitalWrite(VERD, LOW); delay(2000); digitalWrite(VERM, LOW); digitalWrite(AMAR, LOW); digitalWrite(VERD, HIGH); delay(3000); digitalWrite(VERM, LOW); digitalWrite(AMAR, HIGH); digitalWrite(VERD, LOW); delay(1000); } Após transferir o programa, verifique o seu funcionamento. Note que cada pino digital do Arduino irá controlar o funcionamento de um 49 Cláudio Vieira Oliveira e Humberto Zanetti LED. Na função setup definimos os três pinos como saída, enquanto que na função loop desenvolvemos a sequência de funcionamento do semáforo, isto é: 1. Ligamos o LED Vermelho e apagamos os LEDs Amarelo e Verde; 2. Aguardamos 2 segundos, através da instrução delay (2000); 3. Ligamos o LED Verde e apagamos os outros dois LEDs; 4. Aguardamos 3 segundos; 5. Ligamos o LED Amarelo e apagamos os LEDs Vermelho e Verde; 6. Aguardamos 1 segundo; 7. A sequência inicia novamente, pois, está na função loop e assim sucessivamente. 50 Arduino Simples e Divertido Projeto 3: SEQUENCIAL DE LEDS Vamos novamente utilizar os três leds (vermelho, amarelo e verde) do módulo PL2 – First Robot para criar um efeito de acendimento dos leds da esquerda para a direita e depois no sentido contrário, ou seja, da direita para a esquerda. A montagem é bastante simples bastando conectar o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 2.9. Figura 2.9: Ligação do Módulo PL2 – First Robot 51 Cláudio Vieira Oliveira e Humberto Zanetti Também podemos utilizar os módulos P7 – Sensor de Luminosidade ou P21 – Semáforo em substituição ao módulo PL2 – First Robot. Figura 2.10: Conexão do Módulo P7 – Sensor de Luminosidade Quando o módulo P7 – Sensor de Luminosidade (Figura 2.10) ou P21 – Semáforo 52 Arduino Simples e Divertido (Figura 2.11) for utilizado devemos realizar as seguintes conexões utilizando, para isso, um cabo de conexão macho-fêmea: a. Gnd do módulo ao pino de Gnd do Arduino; b. Led1 do módulo ao pino 11 do Arduino; c. Led2 do módulo ao pino 10 do Arduino; d. Led3 do módulo ao pino 9 do Arduino. Figura 2.11: Conexão do Módulo P21 – Semáforo 53 Cláudio Vieira Oliveira e Humberto Zanetti Independente do módulo utilizado na montagem a programação será a mesma, desta forma, abra o ambiente de desenvolvimento do Arduino e digite o seguinte sketch: // Sequencial de LEDs int LED1 = 11; int LED2 = 10; int LED3 = 9; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); } void loop() { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); delay(200); digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); delay(200); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); delay(200); digitalWrite(LED1, LOW); 54 Arduino Simples e Divertido digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); delay(200); } Analisando o sketch, observe que em intervalos de 200ms ou 0,2s vamos alternando o LED que está aceso para criar o efeito de sequencial. Começamos acendendo o LED1, depois o LED2, depois o LED3 e novamente o LED2 e a função loop inicia novamente e acendemos o LED1 e, assim sucessivamente. 55 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 4: CONTADOR BINÁRIO O objetivo deste projeto é utilizar três leds para mostrar os números entre 0 e 7 no sistema de numeração binário, ou seja 0 (Desligado – LOW) ou 1 (Ligado – HIGH). O Led3 é o menos significativo e deve ficar à direita, o Led2 ocupa a posição central, enquanto o Led1 é o mais significativo ficando localizado à esquerda. 56 Núme ro Led 1 Led 2 Led 3 0 Low Low Low 1 Low Low High 2 Low High Low 3 Low High High 4 High Low Low 5 High Low High 6 High High Low 7 High High High Arduino Simples e Divertido Figura 2.12: Ligação do Módulo PL2 – First Robot A montagem, bastantesimples, pode ser realizada conectando o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 2.12. Este projeto também pode ser montado utilizando o módulo P7 – Sensor de Luminosidade (Figura 2.13), neste caso, utilizando cabos de conexão do tipo macho-fêmea, efetue as seguintes ligações: a. Pino GND do módulo P7 a um dos pinos de GND do Arduino; b. Pino Led1 do módulo P7 ao pino 11 do Arduino; 57 Cláudio Vieira Oliveira e Humberto Zanetti c. Pino Led2 do módulo P7 ao pino 10 do Arduino; d. Pino Led3 do módulo P7 ao pino 9 do Arduino. Figura 2.13: Conexão Módulo P7 – Sensor de Luminosidade Outra possibilidade de montagem consiste em substituirmos o módulo PL2 – First Robot pelo módulo P21 – Semáforo (Figura 2.14). Neste caso devemos realizar as seguintes conexões utilizando, para isso, um cabo de conexão macho-fêmea: a. Gnd do módulo ao pino de Gnd do Arduino; b. Led1 do módulo ao pino 11 do Arduino; c. Led2 do módulo ao pino 10 do Arduino; d. Led3 do módulo ao pino 9 do Arduino. 58 Arduino Simples e Divertido Figura 2.14: Ligação do Módulo P21 – Semáforo Inicie o ambiente de desenvolvimento do Arduino e digite o sketch (programa) a seguir: int digito[8][3] = { { LOW, LOW, LOW }, // 0 { LOW, LOW, HIGH }, // 1 { LOW, HIGH, LOW }, // 2 { LOW, HIGH, HIGH }, // 3 { HIGH, LOW, LOW }, // 4 { HIGH, LOW, HIGH }, // 5 { HIGH, HIGH, LOW }, // 6 { HIGH, HIGH, HIGH } // 7 }; int LED1 = 11; 59 Cláudio Vieira Oliveira e Humberto Zanetti int LED2 = 10; int LED3 = 9; int num = 0; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); } void loop() { digitalWrite(LED1, digito[num][0]); digitalWrite(LED2, digito[num][1]); digitalWrite(LED3, digito[num][2]); num++; if (num > 7) num = 0; delay (1000); } Neste tipo de problema o uso do conceito de matriz irá simplificar a implementação. Desta forma, note que começamos o programa criando uma matriz de 8 por 3 que irá conter os estados possíveis (8) para os três LEDs: int digito[8][3] = { { LOW, LOW, LOW }, // 0 { LOW, LOW, HIGH }, // 1 { LOW, HIGH, LOW }, // 2 { LOW, HIGH, HIGH }, // 3 { HIGH, LOW, LOW }, // 4 { HIGH, LOW, HIGH }, // 5 { HIGH, HIGH, LOW }, // 6 60 Arduino Simples e Divertido { HIGH, HIGH, HIGH } // 7 }; Em seguida, na função loop mostrada a seguir, vamos exibindo o digito binário que será determinado através do valor da variável num. Observe que quando o valor desta variável se tornar maior que 7, atribuímos novamente o valor 0 para ela reiniciando, desta forma, a contagem. void loop() { digitalWrite(LED1, digito[num][0]); digitalWrite(LED2, digito[num][1]); digitalWrite(LED3, digito[num][2]); num++; if (num > 7) num = 0; delay (1000); } 61 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 5: SEMÁFORO COMPLETO O módulo P21 – Semáforo (Figura 2.15) será utilizado para simularmos um semáforo completo, isto é, para veículos e pedestres. Figura 2.15: Módulo P21 – Semáforo Utilizando um cabo conector macho-fêmea realize as seguintes conexões (Figura 2.16): a. Gnd do módulo ao pino de Gnd do Arduino; b. Led1 do módulo ao pino 9 do Arduino; c. Led2 do módulo ao pino 10 do Arduino; d. Led3 do módulo ao pino 11 do Arduino; e. Led4 do módulo ao pino 12 do Arduino; f. Led5 do módulo ao pino 13 do Arduino. 62 Arduino Simples e Divertido Figura 2.16: Ligações do Módulo P21 – Semáforo Após realizar a montagem, acesse o ambiente de desenvolvimento do Arduino e digite o seguinte sketch: // Semáforo completo int VERMV = 9; int AMARV = 10; int VERDV = 11; int VERMP = 12; int VERDP = 13; void setup() { pinMode(VERMV, OUTPUT); pinMode(AMARV, OUTPUT); pinMode(VERDV, OUTPUT); 63 Cláudio Vieira Oliveira e Humberto Zanetti pinMode(VERMP, OUTPUT); pinMode(VERDP, OUTPUT); } void loop() { digitalWrite(VERMV, HIGH); digitalWrite(AMARV, LOW); digitalWrite(VERDV, LOW); digitalWrite(VERMP, LOW); digitalWrite(VERDP, HIGH); delay(3000); digitalWrite(VERMV, LOW); digitalWrite(AMARV, LOW); digitalWrite(VERDV, HIGH); digitalWrite(VERMP, HIGH); digitalWrite(VERDP, LOW); delay(1000); digitalWrite(VERMV, LOW); digitalWrite(AMARV, HIGH); digitalWrite(VERDV, LOW); digitalWrite(VERMP, HIGH); digitalWrite(VERDP, LOW); delay (2000); } Outra possibilidade de implementação, mostrada no sketch a seguir, consiste em fazer com que a luz vermelha de pedestres pisque enquanto a luz amarela do semáforo dos veículos está acesa. // Semáforo completo (com matriz) int ledVerdPed = 13; int ledVermPed = 12; 64 Arduino Simples e Divertido int ledVerdCar = 11; int ledAmarCar = 10; int ledVermCar = 9; int i = 0; int estado[15][6] = { {1, 0, 0, 0, 1, 3000}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 1, 0, 0, 4000}, {0, 1, 0, 1, 0, 2000} }; void setup() { pinMode(ledVerdPed, OUTPUT); pinMode(ledVermPed, OUTPUT); pinMode(ledVerdCar, OUTPUT); pinMode(ledAmarCar, OUTPUT); pinMode(ledVermCar, OUTPUT); } void loop() { digitalWrite(ledVerdPed, estado[i][0]); digitalWrite(ledVermPed, estado[i][1]); digitalWrite(ledVerdCar, estado[i][2]); digitalWrite(ledAmarCar, estado[i][3]); 65 Cláudio Vieira Oliveira e Humberto Zanetti digitalWrite(ledVermCar, estado[i][4]); delay(estado[i][5]); i++; if (i > 14) i = 0; } Conforme podemos notar no trecho de programa a seguir, definimos uma matriz que irá conter o estado do cada um dos LED do semáforo e o tempo (em milissegundos) para cada fase do semáforo. int estado[15][6] = { {1, 0, 0, 0, 1, 3000}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 0, 0, 1, 200}, {0, 0, 0, 0, 1, 200}, {0, 1, 1, 0, 0, 4000}, {0, 1, 0, 1, 0, 2000} }; Em seguida, na função loop utilizamos a variável i para determinar o estado do semáforo em determinado momento. 66 Arduino Simples e Divertido void loop() { digitalWrite(ledVerdPed, estado[i][0]); digitalWrite(ledVermPed, estado[i][1]); digitalWrite(ledVerdCar, estado[i][2]); digitalWrite(ledAmarCar, estado[i][3]); digitalWrite(ledVermCar, estado[i][4]); delay(estado[i][5]); i++; if (i > 14) i = 0; } Note também, neste exemplo, que quando temos um problema que envolve muitos estados, a aplicação do conceito de matriz facilita o desenvolvimento do sketch. 67 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 6: BUZZER Neste projeto iremos emitir sons através do Módulo P15 – Buzzer (Figura 2.17). Para a emissão do som, o buzzer vibra através de um oscilador. Essa oscilação é determinada por uma frequência que, por sua vez, define um som específico. Figura 2.17: Módulo P15 – Buzzer O módulo P15 – Buzzer deverá ser conectado ao Arduino, para isso, ligue o pino GND do Arduino ao pino GND do módulo P15 e, em seguida, ligue o pino 9 do Arduino ao pino Sinal do módulo P15 (Figura 2.18). 68 Arduino Simples e Divertido Figura 2.18: Conexão do Módulo P15 – Buzzer Agora inicie o ambiente de desenvolvimento do Arduino e digite o sketch (programa) a seguir: int BUZZER = 9; void setup() { pinMode(BUZZER, OUTPUT); } void loop() { // Define pino e a frequência: tone(BUZZER, 1200); delay(500); // Silencia o buzzer: noTone(BUZZER); delay(500); } 69 Cláudio Vieira Oliveira e Humberto Zanetti A função tone(BUZZER, 1200) irá fazer com que o buzzer reproduza a frequênciade 1200Hz durante 500ms que é o tempo que foi definido na função delay. Em seguida, a função noTone(BUZZER) desliga o buzzer. No também neste mesmo sketch que utilizamos as funções tone e noTone existentes na linguagem de programação do Arduino, porém, a função tone apresenta duas sintaxes: tone (pino, frequência); tone (pino, frequência, duração); Onde pino referencia qual é o pino que irá gerar a frequência que é o pino do Arduino que está ligado ao positivo do buzzer. A frequência é definida em hertz e a duração (opcional) é em milissegundos. Caso opte pela sintaxe sem duração é necessário usar a função noTone (pino) para silenciar o buzzer. Neste próximo exemplo, iremos usar a segunda sintaxe da função tone. Observe que a função tone(BUZZER, 1200, 500) irá reproduzir a frequência de 1200Hz durante 500ms. Entre no ambiente de desenvolvimento do Arduino e digite o sketch a seguir: int BUZZER = 9; void setup() { pinMode(BUZZER, OUTPUT); } 70 Arduino Simples e Divertido void loop() { // Define o pino, a frequência e a duração: tone(BUZZER, 1200, 500); delay(1000); } Mantenha a mesma montagem, utilizada nos programas anteriores, acesse o ambiente de desenvolvimento do Arduino e digite o seguinte sketch: int BUZZER = 9; int numNotas = 10; // Vetor de inteiros com frequências diversas: int notas[] = { 261, 277, 294, 311, 330, 349, 370, 392, 415, 440 }; /* * Notas: C C# D D# E F F# G G# A * C=Dó D=Ré E=Mi F=Fá G=Sol A=Lá B=Si * As notas sem o “#”, são as notas naturais * (fundamentais). * Aquelas com o “#”, são chamadas “notas * sustenidas” (por exemplo: C#=Dó Sustenido). */ void setup() { pinMode(BUZZER, OUTPUT); } void loop() { for (int i = 0; i < numNotas; i++) { tone(BUZZER, notas[i]); 71 Cláudio Vieira Oliveira e Humberto Zanetti delay(500); } noTone(BUZZER); } Neste sketch observe que definindo a frequência de cada nota musical em um vetor podemos reproduzir um trecho ou mesmo uma melodia completa. 72 Arduino Simples e Divertido Projeto 7: O ROBÔ EMITE SONS Neste projeto iremos utilizar o Módulo PL2 – First Robot em conjunto com o Módulo P15 – Buzzer para adicionar efeitos sonoros ao funcionamento do nosso robô. O módulo P15 – Buzzer deverá ser conectado ao Arduino, para isso, ligue o pino GND do Arduino ao pino GND do módulo P15 e, em seguida, ligue o pino 6 do Arduino ao pino Sinal do módulo P15 (Figura 2.19). Figura 2.19: Conexão do Módulo P15 – Buzzer Em seguida, conecte o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 2.20. 73 Cláudio Vieira Oliveira e Humberto Zanetti Figura 2.20: Ligação do Módulo PL2 – First Robot Agora inicie o ambiente de desenvolvimento do Arduino e digite o sketch (programa) a seguir: // O Robô emite sons #define TAM 4 int OLHOE = 12; int OLHOD = 13; int LED[] = { 9, 10, 11, 10 }; int BUZZER = 6; int i; void setup() { for (i = 0; i < TAM; i++) { pinMode(LED[i], OUTPUT); } pinMode(OLHOE, OUTPUT); pinMode(OLHOD, OUTPUT); pinMode(BUZZER, OUTPUT); 74 Arduino Simples e Divertido i = 0; } void loop() { digitalWrite(OLHOE, HIGH); digitalWrite(OLHOD, HIGH); digitalWrite(LED[i], HIGH); // Define o pino, a frequência e a duração: tone(BUZZER, 5800, 100); delay(200); digitalWrite(LED[i], LOW); i++; if (i == TAM) i = 0; delay(800); } Observe na função loop que iremos acender os LEDs que representam os olhos do robô, enquanto o vetor LED será usado para criar um efeito de sequencial nos LEDs localizados no corpo do robô, simultaneamente a função tone reproduz a frequência de 5800Hz durante 100ms. 75 Cláudio Vieira Oliveira e Humberto Zanetti Capítulo 3: Comunicação Serial A comunicação serial permitirá que o Arduino envie e receba dados dos outros dispositivos. A forma mais simples de implementação consiste em utilizar a própria conexão USB realizada entre o computador e o Arduino para realizar a troca de dados. O próprio ambiente de desenvolvimento do Arduino provê acesso à comunicação serial através do botão “Monitor Serial” (Figura 3.1). Figura 3.1: Botão “Monitor Serial” 76 > Arduino Simples e Divertido Após clicar no botão “Monitor Serial” será exibida uma janela (Figura 3.2) que irá possibilitar tanto receber quanto enviar dados através da porta de comunicação serial na qual o Arduino está conectado. Figura 3.2: Monitor Serial Em termos de programação, a classe Serial é a responsável pela comunicação. Conforme podemos observar no trecho de programa a seguir, o método Serial.begin inicializa a comunicação e estabelece a velocidade de comunicação, que neste exemplo, será 9600 bps (bits por segundo). void setup() { Serial.begin(9600); 77 Cláudio Vieira Oliveira e Humberto Zanetti Serial.print("Digite 1 para acender o led "); Serial.println("ou 0 para apagar:"); } Note também que os métodos Serial.print e Serial.println são usados para enviar dados do Arduino para o outro dispositivo que está conectado que, neste caso, é o próprio computador. void loop() { // Verificar se há bytes a serem lidos na // entrada serial if (Serial.available() > 0) { // Ler o byte que está na entrada serial int entrada = Serial.read(); } } Observe no trecho de programa acima que, por outro lado, o método Serial.available irá retornar a quantidades que bytes que estão disponíveis para serem lidos da entrada serial. O método Serial.read realiza a leitura de um byte da entrada serial. 78 Arduino Simples e Divertido Projeto 8: CONTROLE ATRAVÉS DA SERIAL Neste projeto vamos utilizar a comunicação serial para enviarmos comandos do computador para o Arduino, permitindo, desta forma, acender ou apagar um LED. A montagem, é bastante simples, apenas conecte o módulo PL2 – First Robot diretamente no Arduino (Figura 3.3). Figura 3.3: Ligação do Módulo PL2 – First Robot Neste projeto também é possível usarmos módulo P7 – Sensor de Luminosidade ou P21 – Semáforo em substituição ao módulo PL2 – First Robot. Se você for utilizar o módulo P7 conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo (Figura 3.4). 79 Cláudio Vieira Oliveira e Humberto Zanetti Figura 3.4: Ligação Módulo P7 – Sensor de Luminosidade Quando utilizar o módulo P21 – Semáforo conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo P21 (Figura 3.5). 80 Arduino Simples e Divertido Figura 3.5: Conexão do Módulo P21 – Semáforo Independente do módulo utilizado na montagem o sketch (programa) é exatamente o mesmo. Desta forma, acesse o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: // Exemplo de entrada de dados serial int LED = 13; int entrada = 0; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); Serial.println("Digite 1 para acender o led ou 0 para apagar:"); } void loop() { 81 Cláudio Vieira Oliveira e Humberto Zanetti if (Serial.available() > 0) { // Ler o byte que está na entrada serial entrada = Serial.read(); // Informar o valor que foi recebido Serial.print("Recebido - Valor caracter: "); Serial.print((char) entrada); Serial.print(", valor numerico: "); Serial.println(entrada, DEC); // Acender ou apagar o led de acordo com o // valor recebido na entrada serial if (entrada == '0') digitalWrite(LED, LOW); else if (entrada == '1') digitalWrite(LED, HIGH); else Serial.println("Por favor, digite apenas 0 ou 1!"); } } Analisando o código-fonte do sketch, note que na função setup realizamos a inicialização da comunicação serial através do método Serial.begin(9600) e também enviamos uma mensagem para o monitor serial através do método Serial.println. Em seguida, na função loop verificamosse há dados para serem lidos na entrada serial. Quando isto ocorre o método Serial.available retorna um valor maior que zero verificamos se o byte recebido contém o caractere '0' ou '1'. 82 Arduino Simples e Divertido Projeto 9: CONTROLANDO O ROBÔ Neste projeto vamos utilizar a comunicação serial com o intuito de enviar comandos que irão fazer com que o robô realize diferentes funções. Inicialmente, conecte o módulo PL2 – First Robot diretamente no Arduino, conforme ilustrado pela Figura 3.6. Figura 3.6: Ligação do Módulo PL2 – First Robot Em seguida, acesse o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: 83 Cláudio Vieira Oliveira e Humberto Zanetti // Controle das funções do módulo PL2 através // da entrada serial. int OLHOE = 12; int OLHOD = 13; int VERMELHO = 11; int AMARELO = 10; int VERDE = 9; int NARIZ = 8; int entrada = 0; void setup() { Serial.begin(9600); pinMode(OLHOE, OUTPUT); pinMode(OLHOD, OUTPUT); pinMode(VERMELHO, OUTPUT); pinMode(AMARELO, OUTPUT); pinMode(VERDE, OUTPUT); pinMode(NARIZ, OUTPUT); Serial.println("1. Abrir os olhos"); Serial.println("2. Fechar os olhos"); Serial.println("3. Abrir olho esquerdo"); Serial.println("4. Abrir olho direito"); Serial.println("5. Piscar olho esquerdo"); Serial.println("6. Piscar olho direito"); Serial.println("7. Espirrar"); Serial.println("8. Feliz"); } void loop() { if (Serial.available() > 0) { // Ler o byte que está na entrada serial entrada = Serial.read(); switch (entrada) { case '1': digitalWrite(OLHOE, HIGH); digitalWrite(OLHOD, HIGH); 84 Arduino Simples e Divertido break; case '2': digitalWrite(OLHOE, LOW); digitalWrite(OLHOD, LOW); break; case '3': digitalWrite(OLHOE, HIGH); break; case '4': digitalWrite(OLHOD, HIGH); break; case '5': for (int i = 0; i < 5; i++) { digitalWrite(OLHOE, LOW); delay (100); digitalWrite(OLHOE, HIGH); delay (100); } break; case '6': for (int i = 0; i < 5; i++) { digitalWrite(OLHOD, LOW); delay (100); digitalWrite(OLHOD, HIGH); delay (100); } break; case '7': digitalWrite(NARIZ, HIGH); delay(200); digitalWrite(NARIZ, LOW); break; case '8': for (int i = 0; i < 10; i++) { digitalWrite(VERMELHO, HIGH); delay (100); digitalWrite(VERMELHO, LOW); 85 Cláudio Vieira Oliveira e Humberto Zanetti digitalWrite(AMARELO, HIGH); delay (100); digitalWrite(AMARELO, LOW); digitalWrite(VERDE, HIGH); delay (100); digitalWrite(VERDE, LOW); } break; default: Serial.println("Opção não reconhecida!"); } } delay (500); } O programa é muito parecido com o desenvolvido no “Projeto 8: CONTROLE ATRAVÉS DA SERIAL” apenas adicionamos mais opções. A estrutura de decisão switch-case realiza a seleção de cada opção e executa os comandos associados à determinada funcionalidade. 86 Arduino Simples e Divertido 87 Cláudio Vieira Oliveira e Humberto Zanetti Capítulo 4: Saídas PWM Os pinos digitais 3, 5, 6, 9, 10 e 11, que são identificados pelo símbolo ~ (til) (Figura 4.1), também podem ser utilizados como saída PWM (Pulse Width Modulation). Quando usamos este tipo de saída é possível trabalhar com um conjunto de valores inteiros entre 0 e 255 ao invés de apenas 0 (LOW) ou 1 (HIGH). Desta forma, é possível controlar a velocidade de um motor, a intensidade luminosa de um LED, entre outras possíveis aplicações. Figura 4.1: Pinos PWM~ Neste caso o pino deve ser configurado exclusivamente como saída e a função analogWrite permitirá definirmos o pino, que no exemplo a seguir é 11 e também o valor gerado na saída (50), ou seja, um valor entre 0 e 255. analogWrite (11, 50); 88 > Arduino Simples e Divertido Projeto 10: LED PULSANTE Este projeto é bastante simples e seu objetivo é utilizar uma saída PWM (Pulse Width Modulation) do Arduino para criar um efeito de apagamento e acendimento gradativo do LED. Conecte o módulo PL2 – First Robot diretamente no Arduino, conforme ilustrado pela Figura 4.2. Figura 4.2: Ligação do Módulo PL2 – First Robot Neste projeto também é possível usarmos módulo P7 – Sensor de Luminosidade ou P21 – Semáforo em substituição ao módulo PL2 – First Robot. Para usar o módulo P7 conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 11 do Arduino ao Pino Led1 do módulo (Figura 4.3). 89 Cláudio Vieira Oliveira e Humberto Zanetti Figura 4.3: Ligação Módulo P7 – Sensor de Luminosidade Quando utilizar o módulo P21 – Semáforo conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 11 do Arduino ao Pino Led1 do módulo P21 (Figura 4.4). 90 Arduino Simples e Divertido Figura 4.4: Conexão do Módulo P21 – Semáforo Independente do módulo utilizado na montagem o sketch (programa) é exatamente o mesmo, desta forma, ligue o Arduino, através do cabo USB ao computador. Em seguida, carregue o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: // LED pulsante int LED = 11; float seno; int intensidade; void setup() { pinMode(LED, OUTPUT); } void loop() { for (int i = 0; i < 180; i++) { seno = sin(i * (3.1416 / 180)); intensidade = int(seno * 255); analogWrite (LED, intensidade); delay (20); } } Conforme já explicado, o pino deve ser configurado como OUTPUT, observe o uso da função pinMode no setup. Em seguida, na função loop, geramos valores senoidais entre um 0 e 180 graus. O valor calculado será multiplicado por 255 que é o valor máximo que 91 Cláudio Vieira Oliveira e Humberto Zanetti pode ser gerado por uma saída PWM e utilizado na função analogWrite para definir a intensidade com a qual o LED ser aceso, gerando o efeito desejado. 92 Arduino Simples e Divertido Projeto 11: “SONO” Alterando o “Projeto 10: LED PULSANTE”, vamos criar um efeito com os LEDs que simbolizam os olhos do robô como se ele estivesse “caindo de sono”. A montagem é simples, porém, observe que quando conectamos o Módulo PL2 – First Robot diretamente ao Arduino os pinos 12 e 13 que representam os olhos do robô não estão identificados com o ~ (til) e, desta forma, não poderão ser usados como saída PWM. Desta forma, conforme podemos observar na Figura 4.5, as seguintes conexões deverão ser realizadas através de cabos com conectores do tipo Macho-Fêmea: a. O Pino Gnd do PL2 deverá ser conectado a um dos Pinos Gnd do Arduino; b. O Pino 2 do PL2 (localizado ao lado do Pino Gnd do módulo) deverá ser ligado ao pino 11 do Arduino; c. O Pino 3 do PL2 (localizado ao lado do Pino Gnd do módulo) deverá ser ligado ao pino 10 do Arduino. 93 Cláudio Vieira Oliveira e Humberto Zanetti Figura 4.5: Conexões do Módulo PL2 – First Robot Após realizar a montagem, acesse o ambiente de desenvolvimento do Arduino e digite o seguinte sketch: // Robô com Sono int OLHOD = 11; int OLHOE = 10; float seno; int intensidade; void setup() { Serial.begin(9600); pinMode(OLHOD, OUTPUT); pinMode(OLHOE, OUTPUT); } void loop() { for (int i = 0; i < 180; i++) { seno = sin(i * (3.1416 / 180)); 94 Arduino Simples e Divertido intensidade = int(seno * 255); analogWrite (OLHOD, intensidade); analogWrite (OLHOE, intensidade); Serial.println(intensidade); if (intensidade > 0) delay (40); else delay (2000); } } O programa é praticamente idêntico ao projeto anterior, usamos uma função senoidal para controlar a intensidade com a qual os LEDs que representam os “olhos” do PL2, que estão conectados aos pinos PWM 10 e 11 do Arduino,acendem. 95 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 12: LED RGB Um LED RGB possui três LEDs (Vermelho, Verde e Azul) encapsulados em um mesmo invólucro sendo que, a partir destas três cores, podemos gerar uma infinidade de combinações e efeitos luminosos. Figura 4.6: Módulo P20 – LED RGB Ânodo Comum Na Figura 4.7 podemos notar que as seguintes conexões deverão ser realizadas através de cabos com conectores do tipo Macho- Fêmea: a. Pino Red do P20 no pino 9 do Arduino; b. Pino Green do P20 no pino 10 do Arduino; c. Pino Blue do P20 no pino 11 do Arduino; d. Pino +5v do P20 no pino do Arduino. 96 Arduino Simples e Divertido Figura 4.7: Ligação do P20 ao Arduino Após realizar a montagem, acesse o ambiente de desenvolvimento do Arduino e digite o seguinte sketch: // LED RGB int VERMELHO = 9, VERDE = 10, AZUL = 11; int iVermelho, iVerde, iAzul; void setup() { pinMode (VERMELHO, OUTPUT); pinMode (VERDE, OUTPUT); pinMode (AZUL, OUTPUT); } void loop() { iVermelho = random(256); iVerde = random(256); iAzul = random(256); analogWrite(VERMELHO, iVermelho); analogWrite(VERDE, iVerde); analogWrite(AZUL, iAzul); 97 Cláudio Vieira Oliveira e Humberto Zanetti delay(500); } Analisando o projeto é possível observar que os pinos do módulo P20 – LED RGB Ânodo Comum estão conectados à pinos de saída PWM do Arduino. Em seguida, para cada componente de cor (vermelho, verde e azul) é sorteado um valor aleatório entre 0 e 255. A junção dos valores dos três componentes irá reproduzir a cor resultante durante 0,5 segundo, que é determinado pela função delay. Em seguida, novos valores são sorteados e assim sucessivamente. 98 Arduino Simples e Divertido Capítulo 5: Entradas Digitais Os pinos digitais 0 a 13 do Arduino podem ser configurados como entrada, ou seja, podem receber um valor 0 (LOW) ou 1 (HIGH) de um dispositivo sensor, por exemplo, um botão ou um sensor de obstáculos, entre outros. Neste caso, conforme podemos ver no trecho de programa a seguir, a função pinMode define determinado pino como INPTUT (entrada). void setup() { pinMode(2, INPUT); } Enquanto a função digitalRead obtém o valor recebido pelo pino. void loop() { // Obtém LOW (0) - botão não pressionado // ou HIGH (1) – botão pressionado int valor = digitalRead(2); } 99 > Cláudio Vieira Oliveira e Humberto Zanetti Projeto 13: BOTÃO LIGA-DESLIGA O objetivo deste projeto é utilizar o módulo P4 – Switch (Figura 5.1) para em conjunto com o módulo PL2 – First Robot acender e apagar um LED. Lembrando também que o módulo PL2 – First Robot poderá ser substituído pelo módulo P7 – Sensor de Luminosidade ou P21 – Semáforo. Figura 5.1: Módulo P4 – Switch Utilizando fios de conexão Macho-Fêmea ligue o módulo P4 – Switch ao Arduino (Figura 5.2) da seguinte maneira: a. Pino Gnd do módulo ao pino de Gnd do Arduino; b. Pino +5vcc do módulo ao pino 5 Volts do Arduino; c. Pino Out do módulo ao pino digital 2 do Arduino. 100 Arduino Simples e Divertido Figura 5.2: Conexão do Módulo P4 – Switch Em seguida, encaixe o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 5.3. Figura 5.3: Ligação do Módulo PL2 – First Robot Quando utilizar o módulo P7 conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo (Figura 5.4). 101 Cláudio Vieira Oliveira e Humberto Zanetti Figura 5.4: Ligação dos Módulos P7 e P4 ao Arduino Por outro lado, se estiver utilizando o módulo P21 – Semáforo conecte o pino Gnd do Arduino ao Pino Gnd do módulo e também o pino 13 do Arduino ao Pino Led1 do módulo P21 (Figura 5.5). 102 Arduino Simples e Divertido Figura 5.5: Ligação dos Módulos P21 e P4 ao Arduino Independente do módulo utilizado na montagem o sketch (programa) é exatamente o mesmo, desta forma, ligue o Arduino, através do cabo USB ao computador. Em seguida, carregue o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: // Botão Liga-Desliga int LED = 13; int BOTAO = 2; int valor; void setup() { pinMode(LED, OUTPUT); pinMode(BOTAO, INPUT); } 103 Cláudio Vieira Oliveira e Humberto Zanetti void loop() { // Obtém LOW (botão não pressionado) // ou HIGH (pressionado) valor = digitalRead(BOTAO); digitalWrite(LED, valor); delay (100); } Observe que, neste exemplo, o LED permanece aceso somente enquanto o botão está pressionado. Outra possibilidade de programação, mostrada no sketch a seguir, consiste em realizarmos a manutenção do estado do botão, isto é, quando pressionamos a primeira vez o botão, ligamos o LED e o mantemos aceso mesmo após o usuário soltar o botão. Quando pressionarmos novamente o botão, vamos desligar o LED o mantê-lo desligado até que o botão seja pressionado de novo. Assim sendo, a cada vez que o botão é pressionado o estado irá mudar de ligado para desligado ou vice e versa. // Botão Liga-Desliga com Manutenção de Estado int LED = 13; int BOTAO = 2; int valor; int anterior = 0; int estado = LOW; void setup() { pinMode(LED, OUTPUT); pinMode(BOTAO, INPUT); } 104 Arduino Simples e Divertido void loop() { valor = digitalRead(BOTAO); if (valor == HIGH && anterior == LOW) { estado = !estado; } digitalWrite(LED, estado); anterior = valor; delay (50); } 105 Cláudio Vieira Oliveira e Humberto Zanetti Projeto 14: SELECIONANDO AS FUNÇÕES DO ROBÔ Neste projeto vamos utilizar o módulo P4 – Switch (Figura 5.6) em conjunto com o módulo PL2 – First Robot para realizar a seleção das funções do robô. Figura 5.6: Módulo P4 – Switch Utilizando fios de conexão Macho-Fêmea ligue o módulo P4 – Switch ao Arduino (Figura 5.7) da seguinte maneira: a. Pino Gnd do módulo ao pino de Gnd do Arduino; b. Pino +5vcc do módulo ao pino 5 Volts do Arduino; c. Pino Out do módulo ao pino digital 2 do Arduino. 106 Arduino Simples e Divertido Figura 5.7: Conexão do Módulo P4 – Switch Em seguida, encaixe o módulo PL2 – First Robot diretamente no Arduino conforme ilustrado pela Figura 5.8. Figura 5.8: Ligação do Módulo PL2 – First Robot 107 Cláudio Vieira Oliveira e Humberto Zanetti Digite o seguinte sketch no ambiente de desenvolvimento do Arduino: // Selecionando as funções do robô int OLHOE = 12; int OLHOD = 13; int VERMELHO = 11; int AMARELO = 10; int VERDE = 9; int NARIZ = 8; int BOTAO = 2; int botao; int anterior = LOW; int funcao = 0; void setup() { pinMode(OLHOE, OUTPUT); pinMode(OLHOD, OUTPUT); pinMode(VERMELHO, OUTPUT); pinMode(AMARELO, OUTPUT); pinMode(VERDE, OUTPUT); pinMode(NARIZ, OUTPUT); pinMode(BOTAO, INPUT); } void loop() { botao = digitalRead(BOTAO); if (botao == HIGH && anterior == LOW) { funcao++; switch (funcao) { case 1: digitalWrite(OLHOE, HIGH); digitalWrite(OLHOD, HIGH); break; 108 Arduino Simples e Divertido case 2: digitalWrite(OLHOE, HIGH); digitalWrite(OLHOD, LOW); break; case 3: digitalWrite(OLHOE, LOW); digitalWrite(OLHOD, HIGH); break; case 4: for (int i = 0; i < 5; i++) { digitalWrite(OLHOE, LOW); delay (100); digitalWrite(OLHOE, HIGH); delay (100); } break; case 5: for (int i = 0; i < 5; i++) { digitalWrite(OLHOD, LOW); delay (100); digitalWrite(OLHOD, HIGH); delay (100); } break; case 6: digitalWrite(NARIZ, HIGH); delay(200); digitalWrite(NARIZ, LOW); break; case 7: for (int i = 0; i < 10; i++) { digitalWrite(VERMELHO, HIGH); delay (100); digitalWrite(VERMELHO, LOW); digitalWrite(AMARELO, HIGH); delay (100); digitalWrite(AMARELO,LOW); 109 Cláudio Vieira Oliveira e Humberto Zanetti digitalWrite(VERDE, HIGH); delay (100); digitalWrite(VERDE, LOW); } break; default: digitalWrite(OLHOE, LOW); digitalWrite(OLHOD, LOW); funcao = 0; } } anterior = botao; delay (50); } Conforme podemos notar no sketch o robô irá realizar uma função diferente a cada pressionamento do botão: 1. Abrir os olhos (Ligar); 2. Fechar o olho direito; 3. Fechar o olho esquerdo e abrir o direito; 4. Piscar o olho esquerdo; 5. Piscar o olho direito; 6. Espirrar; 7. Feliz (Sequencial de LEDs); 8. Desligar (default). 110 Arduino Simples e Divertido Projeto 15: CONTADOR COM O DADO ELETRÔNICO Neste projeto vamos utilizar o módulo PL3 – Dado Eletrônico (Figura 5.9) para criar um contador simples. Figura 5.9: Módulo PL3 – Dado Eletrônico Utilizando fios para conexão Macho-Fêmea ligue o módulo PL3 – Dado Eletrônico da seguinte maneira (Figura 5.10): a. Pino Gnd do PL3 ao pino de Gnd do Arduino; b. Pino +5vcc do PL3 ao pino 5 Volts do Arduino; c. Pino Switch do PL3 ao pino digital 2 do Arduino; 111 Cláudio Vieira Oliveira e Humberto Zanetti d. Pino LED 1 do PL3 ao pino digital 13 do Arduino; e. Pino LED 2 do PL3 ao pino digital 12 do Arduino; f. Pino LED 3 do PL3 ao pino digital 11 do Arduino; g. Pino LED 4 do PL3 ao pino digital 10 do Arduino; h. Pino LED 5 do PL3 ao pino digital 9 do Arduino; i. Pino LED 6 do PL3 ao pino digital 8 do Arduino; j. Pino LED 7 do PL3 ao pino digital 7 do Arduino. 112 Arduino Simples e Divertido Figura 5.10: Ligação do Módulo PL3 – Dado Eletrônico Conforme podemos observar no sketch a seguir, sempre que o usuário pressionar o botão, 113 Cláudio Vieira Oliveira e Humberto Zanetti o valor mostrado no dado, que é definido pelo valor da variável contador, será incrementado. // Contador com o Dado Eletrônico // Pinos aos quais os LEDs estão conectados: int LED1 = 13; int LED2 = 12; int LED3 = 11; int LED4 = 10; int LED5 = 9; int LED6 = 8; int LED7 = 7; // Pino ao qual o Botão está conectado: int BOTAO = 2; int botao; int anterior = LOW; int contador = 0; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); pinMode(LED7, OUTPUT); pinMode(BOTAO, INPUT); } void loop() { botao = digitalRead(BOTAO); if (botao == HIGH && anterior == LOW) { contador++; 114 Arduino Simples e Divertido if (contador > 6) contador = 0; mostrarDado(contador); } anterior = botao; delay (50); } void mostrarDado(int valor) { if (valor == 0) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 1) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 2) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 3) { 115 Cláudio Vieira Oliveira e Humberto Zanetti digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, HIGH); } else if (valor == 4) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); digitalWrite(LED7, HIGH); } else if (valor == 5) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); digitalWrite(LED7, HIGH); } else if (valor == 6) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, HIGH); digitalWrite(LED6, HIGH); digitalWrite(LED7, HIGH); } } 116 Arduino Simples e Divertido Projeto 16: DADO ELETRÔNICO O objetivo deste projeto é utilizar o módulo PL3 – Dado Eletrônico (Figura 5.11) para mostrar valores sorteados entre 1 e 6 criando, desta forma, um dado eletrônico que pode ser utilizado em jogos de tabuleiros, substituindo o dado convencional. Figura 5.11: Módulo PL3 – Dado Eletrônico Utilizando fios para conexão Macho-Fêmea ligue o módulo PL3 – Dado Eletrônico (Figura 5.12) da seguinte maneira: a. Pino Gnd do PL3 ao pino de Gnd do Arduino; b. Pino +5vcc do PL3 ao pino 5 Volts do Arduino; 117 Cláudio Vieira Oliveira e Humberto Zanetti c. Pino Switch do PL3 ao pino digital 2 do Arduino; d. Pino LED 1 do PL3 ao pino digital 13 do Arduino; e. Pino LED 2 do PL3 ao pino digital 12 do Arduino; f. Pino LED 3 do PL3 ao pino digital 11 do Arduino; g. Pino LED 4 do PL3 ao pino digital 10 do Arduino; h. Pino LED 5 do PL3 ao pino digital 9 do Arduino; i. Pino LED 6 do PL3 ao pino digital 8 do Arduino; j. Pino LED 7 do PL3 ao pino digital 7 do Arduino. Figura 5.12: Ligação do Módulo PL3 – Dado Eletrônico 118 Arduino Simples e Divertido Acesse o ambiente de desenvolvimento do Arduino e digite o sketch a seguir: // Dado Eletrônico // Pinos aos quais os LEDs estão conectados: int LED1 = 13; int LED2 = 12; int LED3 = 11; int LED4 = 10; int LED5 = 9; int LED6 = 8; int LED7 = 7; // Pino ao qual o botão está conectado: int BOTAO = 2; int botao; int anterior = LOW; void setup() { randomSeed(analogRead(A0)); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); pinMode(LED7, OUTPUT); pinMode(BOTAO, INPUT); } void loop() { botao = digitalRead(BOTAO); 119 Cláudio Vieira Oliveira e Humberto Zanetti if (botao == HIGH && anterior == LOW) { // Exibir o valor sorteado (entre 1 e 6) mostrarDado(random(1, 7)); // Durante 2 segundos delay(2000); // Apagar todos os LEDs mostrarDado(0); } anterior = botao; delay (50); } void mostrarDado(int valor) { if (valor == 0) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 1) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 2) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); 120 Arduino Simples e Divertido digitalWrite(LED4, LOW); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); } else if (valor == 3) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, HIGH); } else if (valor == 4) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); digitalWrite(LED7, HIGH); } else if (valor == 5) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW);
Compartilhar