Prévia do material em texto
2 Boas-vindas! Como já visto no módulo anterior, o arduino é sustentado por dois pilares: hardware e software. Como o hardware já foi devidamente explicitado a cada um de vocês, chegou à hora de adentrarmos um pouquinho no mundo do software. Neste módulo se conhecerá o Ambiente Integrado de Desenvolvimento do Arduino (IDE – Integrated Development Environment), estrutura de programação, comandos básicos, além de fazermos juntos alguns experimentos. Esteja atento ao fato de que cada elemento visto é peça essencial para um bom desenvolvimento durante a competição. Entender, compreender e saber aplicar os conceitos passados pode lhe garantir a vitória no torneio. Então, só avance um tópico quando tiver de fato entendido. Bons estudos. #partiuEstudar #TorneioArduinoChallenge #conhecimentoEmpirico Objetivos Ao finalizar esse módulo, você terá que ser capaz de: 1. Saber fazer a instalação e o uso da IDE e dos drivers do Arduino em seu computador; 2. Entender e compreender a estrutura básica de um programa em arduino; 3. Dominar e manipular os comandos específicos de programação. 3 1. Introdução Para começarmos esse módulo é necessário se atentar a alguns itens importantes, dos quais fazemos constantemente uso, mas raramente sabemos explicar o que é, ou em muitos casos, nem sabíamos que existia ou paramos pra pensar sobre isso. O primeiro deles é o computador. Pare um minuto a sua leitura e me responda: você sabe o que de fato é um computador? Em palavras gerais, ele nada mais é que uma a máquina, controlada por um microprocessador, que tem como objetivo principal realizar um conjunto de instruções. O microprocessador é o grande responsável por entender, compreender e realizar essas ações. Se fizermos uma analogia com o corpo humano, ele é o cérebro que comanda todo esse processo. Só por curiosidade, o microprocessador que compõe o arduino é o ATmega. É extremamente válido deixar informado neste ponto, que cada tipo de microprocessador entende um conjunto diferente de instruções. Isso significa que cada computador tem um cérebro que entende um tipo de linguagem específica, como se fosse um idioma próprio. Cientificamente esse idioma é denominado de linguagem de máquina. A linguagem de máquina não é de fácil compreensão ao ser humano, mas em contrapartida é a única forma de um computador entender o que tem que ser feito. É necessário então ter um mediador entre esse dois eixos. Esse mediador é chamado de linguagem de programação de alto nível. Ela é como se fosse um idioma intermitente entre o homem e a máquina. Um grande exemplo disso é a famosa C++, que por sua vez é a linguagem usada pela plataforma arduino, contendo algumas adaptações. Então, o que temos até agora é um seguinte: Um ser humano estuda e passa a entender e interpretar a linguagem de alto nível para poder conversar com o computador e estabelecer que ele faça algumas ações específicas. O computador pega essa linguagem de alto nível e converte-a para a linguagem de máquina. Você se lembra que eu disse que um computador só entende a linguagem de máquina? Pois bem, após isso, o computador compreende o que tem que ser feito e passa a executar o que foi pré-determinado. Essa conversão entre linguagem de alto nível e linguagem de máquina recebe o nome de compilar e o responsável por fazer esse processo é o compilador. 4 Ilustração 1 - Conversão da linguagem de alto nível para linguagem de máquina Mas espere um pouco? Você saberia dizer onde é encontrado um compilador? Esse tradutor geralmente é encontrado dentro um ambiente integrado de desenvolvimento, a IDE (Integrated Development Environment), que por sua vez é um aplicativo que permite a escrita e a compilação de um programa. Ou seja, autoriza escrever uma série de instruções e depois a converte para uma linguagem entendível ao computador. O arduino tem seu próprio IDE, denominado de Arduino IDE. E para que consigamos usufruir dessa plataforma, é necessário que o instalemos em nosso computador. Prove que entendeu: O que é uma linguagem de programação de alto nível? Onde é encontrado um compilador? Porque é preciso instalar o IDE no computador? 5 1.1 Instalação do Arduino IDE Para instalarmos a IDE, vá até o site do arduino, encontrado pelo endereço https://www.arduino.cc/, clique na aba ‘software’. Uma nova tela será aberta. Desça um pouco até encontrar o escrito ‘Download the Arduino IDE’. No canto direito da tela se terá várias opções de Sistema Operacional. Uma vez escolhida qual melhor lhe atende, clique sobre ela. A página será redirecionada. Por fim escolha a opção‘Just Download’. OBS: O exemplo da imagem fez o download para o sistema operacional Windows. Ilustração 2 - Página inicial do Arduino https://www.arduino.cc/ 6 Ilustração 3 - Seleção do Sistema Operacional Ilustração 4 - Download do IDE Depois de ter feito o download, dezipe a pasta do IDE e clique no ícone com o nome arduino. Uma tela como a da ilustração 6, deverá ser aberta. 7 Ilustração 5 - Ícone que deverá ser clicado 8 Ilustração 6 - Tela que deverá ser aberta Essa tela é onde toda a programação será feita e entre algumas ações é a responsável por transferir o código escrito para o microprocessador do arduino. 9 1.2 Instalação de drivers no Windows Conecte o seu carrinho na porta USB de seu computador. Vá até a opção “Computador” encontrada no Menu Inicial, clique com o botão direito em cima dele e escolha a opção “Propriedades”. Ilustração 7 - Instalando os drivers - passo 1 Feito isso, a tela que se encontra na ilustração abaixo será aberta. Escolha a opção “Gerenciador de dispositivos”. 10 Ilustração 8 - Instalando os drivers - passo 2 Uma tela será aberta. Escolha a opção Portas (COM e LPT), Arduino Uno e clique com o botão direito em cima dele. O símbolo do arduino terá um ponto de exclamação ao lado dele, simbolizando que os drivers não estão instalados corretamente. Depois escolha “Atualizar drivers”. 11 Ilustração 9 - Instalando os drivers - passo 3 Uma tela abrirá. Escolha a opção “Procurar software de driver no computador”. 12 Ilustração 10 - Instalando os drivers - passo 4 Outra tela será aberta. Coloque o caminho que se encontra a pasta do arduino que você baixou no começo deste descritivo, até a pasta drivers. Logo após ter feito isso, clique em “Avançar”. Depois de um tempo, você receberá uma mensagem dizendo que o software do driver foi instalado com êxito. 13 Ilustração 11 - Instalando os drivers - passo 5 OBS: O processo de instalação descrito foi usado para o Windows 7. Os sistemas operacionais mais recentes tendem a fazer a instalação de forma automática. 1. 3 Conhecendo a IDE Arduino Agora que você já fez todas as instalações necessárias para que possamos trabalhar com maestria, é chegado o momento de conhecermos um pouco mais a IDE. Como já explicado, ela é o ambiente que permitirá que escrevamos um programa (conjunto de instruções) e posteriormente o compilarmos para que ele seja traduzido para linguagem de máquina e permita que o que foi definido de fato seja cumprido. A sua interface é bastante intuitiva, porém mesmo assim é interessante ressaltar alguns pontos. 14 Repare que no lado superior esquerdo existe um ícone de verificação. Ao passar o mousesobre ele, a palavra verificar ou verify será apresentado em sua tela. Isso significa, que uma vez que você tenha escrito o programa, é importante que se clique nesse ícone para que esse faça uma busca por ele todo, a fim de achar algum erro de sintaxe. Preste bastante atenção: o “Verificar” irá apenas encontrar erros de sintaxe, ou seja, comandos escritos de forma errada. Ele não é capaz de encontrar erros de lógica. Achar incompatibilidade no processo de raciocínio do programa será exclusivamente responsabilidade sua. Ilustração 12 - Ícone Verificar 15 Agora faça um seguinte: apague tudo que se encontra na tela do IDE neste momento e escreva o código abaixo. Exatamente igual. E depois clique no ícone “Verificar”. Quando apertar verificar, poderá ser pedido que se salve esse documento. Escolha uma pasta que queira salvá-lo e aperte salvar. O que aconteceu logo depois? OBS: não se preocupe em entender o programa neste momento. Apresentaremos posteriormente com mais detalhes a estrutura de programação. #define LED 12 void setup() { pinmode (LED, OUTPUT); } void loop(){ } Perceba que no canto inferior de sua tela aparecerá uma mensagem escrita na cor laranja. Isso acontece porque o código acima se encontra errado. A mensagem que lhe apareceu discrimina esse erro e te dá à proximidade do local onde ele se encontra, podendo até mesmo mostrar o lugar exato. 16 Ilustração 13 - Erro de verificação Se o programa estivesse correto por inteiro, apena iria aparecer uma mensagem dizendo que a compilação se encontra concluída. Assim, como visto na Ilustração 14. 17 Ilustração 14 - Verificação com sucesso Porém, note um seguinte: até o momento instalamos a IDE Arduino e todos os seus drivers, depois abrimos essa IDE, escrevemos um programa e fizemos a sua verificação. Mas ainda falta fazer algo. Você tem alguma ideia do que seja? 18 Observe: esse programa ainda não foi transferido para o arduino. É necessário que esse conjunto de instruções seja carregado para o microprocessador dessa plataforma. Para isso, baste que se conecte um cabo de dados saindo da placa arduino até o seu computador e se clique no ícone “Carregar” ou “Upload”, que se encontra ao lado do ícone “Verificar”. Agora digamos, que em um momento desatento, antes de fazermos a transferência, acabamos esquecendo de fazer a verificação do mesmo. O que você supõe que acontecerá? Dará certo mesmo sem a verificação? Quero dizer, se conter erros ele simplesmente será carregado para o arduino? O botão ‘Carregar’ também acumula a função de fazer uma verificação e caso seja encontrado algum erro de sintaxe, ele lhe avisará da mesma forma que já foi descrito. 19 Ilustração 15 - Ícone de Transferência do programa para o arduino Você deve estar se perguntando neste momento então, pra que se tem um botão de “Verificar” e um de “Carregar”, se este segundo já acumula a função do primeiro. A resposta é simples. Eu posso ir verificando o meu programa em partes, ou seja, escrevo um pedaço e verifico, depois escrevo outra parte e faço novamente a conferência. 20 Para um aprendiz, esta é uma importante prática para se ganhar segurança no que se está fazendo e não deixar acumular possíveis erros e depois ter que consertá-los de uma única vez. Por isso, fica a dica: use o “Verificar” todas as vezes que achar conveniente, afinal, você poderá estar vendo essa plataforma pela primeira vez. Pronto, você agora já possui um conhecimento básico de como usar a IDE. Passaremos a focar a nossa atenção na programação em si. Por isso, tenha ao lado um papel e uma caneta e anote tudo que achar conveniente lembrar para a competição. Além de que é indispensável que se faça todos os exercícios propostos e não apenas veja a sua resolução. 1.4 A programação Caro(a) colega, deixe-me lhe perguntar: você alguma fez já fez uso de programação em sua vida? Repare, não estou me referindo ao uso de programação computacional, mas sim de programação, no modo mais abrangente dessa palavra. Programar é organizar uma série de eventos que deverão acontecer dentro de um determinado espaço de tempo. Então é programação quando eu organizo o meu dia, dividindo-o com os afazeres do colégio, com as atividades extracurriculares, o futebol com os amigos ou a “brigadeirada” com a amigas no fim da tarde. Programar é estabelecer uma sequência de procedimentos a serem seguidos e completados. E a programação computacional segue essa mesma ideia. É um conjunto de instruções que serão executados dentro de um tempo limitado. E desde que ela seja organizada e respeite uma sequência de passos, recebe o nome de algoritmo. No arduino, um programa recebe o nome de Sketch. Por isso fique atento, pois de agora em diante todas as vezes que falarmos em Sketch, estaremos nos referindo ao programa que você está construindo. Toda manipulação computacional só é possível graças a uma linguagem de programação. Como já visto, a linguagem do arduino é estruturada em cima da linguagem C++, e a partir desse momento veremos alguns comandos necessários e sua estrutura para que você tenha um excelente desempenho durante o torneio. 1.4.1 Linguagem de programação do Arduino A linguagem de programação do arduino recebe o nome de Wiring, e é bastante simples. Por esse motivo que essa plataforma é ideal para os iniciantes de robótica. Os comandos disponibilizados possuem nomes correspondentes com suas funções. Porém esses são dados em inglês. 21 Se você reparou nas ilustrações 6,12,13 e 14, pode perceber que a estrutura do código é dividida em dois grandes blocos: o void setup e o void loop. Todo o programa será dividido entre essas duas partições. No setup se encontra a configuração do sketch, ou seja, ele é o responsável por preparar o arduino para se ter o funcionamento adequado. Todos os comandos que estiverem dentro desse trecho será executado apenas uma única vez ao ligar a placa ou ao forçar o seu reinicio. Já no loop, temos toda a inteligência do código. São colocados dentro desse trecho os comandos que definirão o que tem que ser feito para alcançar um determinado objetivo. Ele é composto por uma sistemática que deve se repetir infinitas vezes, logo após o término da execução do bloco do setup, até que haja uma interrupção forçada. No nosso caso, poderia ser, por exemplo, o desligamento do carrinho. Vamos fazer um exemplo para deixar isso mais claro. Exemplo 01: Sabendo que um led que se encontra conectado no pino 12 da placa arduino, faça um programa que o acenda. Vamos entender melhor o que se pede. O enunciado traz duas informações muito importantes explícitas e uma informação implícita que são necessárias para o nosso sketch. Informação implícita: 1 - O led como já foi visto no módulo de hardware, é um dispositivo de saída, ou seja, ele receberá um determinado comando do arduino para ser realizado. Isso se comprova quando no final do enunciado se diz um seguinte: “faça um programa que o acenda.” Em outras palavras, temos aqui uma definição. Informação explícita: 2 - A pinagem que o led se encontra é a 12. O que temos aqui é outra definição. 3 - O objetivo do programa é acender o led. Entendido o que o enunciado deseja e quais informações ele traz consigo, chegou o momento de dividi-la entre setup e loop. 22 Lembre-se: dentro do setup teremos a configuração do programa e dentro do loop o objetivo do mesmo. Configurar, neste caso tem sentindo de definição. Diante disso, quais informações você considera que ficarão no setup e quais ficarão no loop?A imagem abaixo traz essa resposta para você, porém só a consulte depois de ter respondido essa questão. Ilustração 16 - Divisão do programa 23 Prove que entendeu 1.2.1 De uma forma geral, o que deve ser colocado dentro do bloco setup? 1.2.2 E dentro do bloco loop? Entendido como tem que ser feita a estrutura de um programa em arduino, está na hora de conhecermos alguns comandos e algumas constantes. Existem algumas funções básicas para entradas e saídas digitais. São elas: 1. pinMode(): É o responsável por configurar se um determinado pino será visto como entrada ou como saída no arduino. A entrada é comumente chamada de INPUT e a saída é OUTPUT. O INPUT e o OUTPUT são considerados como constantes. A sua estrutura segue a seguinte forma: pinMode(pin,mode), onde pin é o número da pinagem que se estará usando e o mode é definição de INPUT ou OUTPUT. Com isso, podemos perceber que esse comando sempre estará incluso dentro do bloco do void setup(). Se retornarmos ao exemplo que foi dado, temos que: o pino 12 será ligado um led e que esse led é um dispositivo de saída. Usando o pinMode(), ficaremos assim: pinMode(12,OUTPUT); Repare que nessa linha de código acabamos de incluir as informações 1 e 2 deste exemplo. 2. digitalWrite(): Escreve em um dispositivo digital o valor HIGH (ligar ou 1) ou LOW (desligar ou 0). Para usá-lo, o pino deve ter sido configurado como uma saída, porque esse é um comando de escrita. O HIGH e o LOW são considerados como constantes. A sua estrtutura é: digitalWrite(pin,valor), onde pin é o número do pino e o valor será o HIGH ou LOW. Mais uma vez vamos retornar ao exemplo anterior em que é solicitado que se ligue um led que se encontra no pino 12. Usando o digitalWrite(), ficaremos assim: digitalWrite(12,HIGH); 24 Perceba que este comando se refere ao objetivo do exemplo 1, ou seja, ele utiliza da informação 3. Agora se quisermos que esse led fosse desligado, usaríamos: digitalWrite(12,LOW); 3. digitalRead(): Lê o valor de um pino digital especificado, ou seja, se ele está ligado (HIGH ou 1) ou desligado (LOW ou 0). A sua estrutura é: digitalRead(pin), onde pin é o número do pino aonde você quer fazer uma leitura. Por exemplo, digamos que se queira ler o valor de um determinado sensor que se encontra no pino 7, ficaríamos assim: digitalRead(7); Também existem funções para entradas e saídas analógicas. São elas: 1. analogRead(): Faz a leitura de um pino analógico, que pode ter sua intensidade variada desde 0(valor mínimo) a 1023(valor máximo). A sua estrutura é: analogRead(pin), onde pin é a pinagem em que o dispositivo se encontra conectado. Por exemplo, digamos que queremos ler a intensidade de resposta de um sensor e que este sensor se encontra no pino 11. Ficaríamos assim: analogRead(11); 3. analogWrite(): Escreve um valor de 0 a 255 em um pino analógico. Em algumas placas do arduino, esses pinos são marcados pelo símbolo “~”. Atenção: não é necessário configurar o pino como saída para ser usado como saída analógica. A saída passa a ter um comportamento proporcional ao número (0 a 255) que foi escrito nela, ou seja, quanto maior o número, maior será a intensidade colocada na saída. O valor escrito depende do circuito conectado. Por exemplo, um motor terá uma maior rotação quanto maior for esse número. Porém o mesmo motor, para controle de rotação, não pode receber o número menor que 170, pois será danificado. O led também poderá ser controlado. 25 A sua estrutura é: analogWrite(pin, valor), onde pin é a numeração do pino e valor é qualquer um que esteja compreendido e inclusive entre 0 e 255. Por exemplo, digamos que queremos ligar um motor. Lembre-se que o valor mínimo para o mesmo, deve ser 170 e que a pinagem que ele se encontra é o 11. Ficaríamos assim: analogWrite(11,180); Agora, vamos considerar que queremos desligar esse motor. A sintaxe ficaria: analogWrite(11,0); Por fim, veremos duas funções ligadas ao tempo. São elas: 1. millis(): Tem como objetivo principal retornar o número de milissegundos desde que a placa do arduino começou a rodar o programa. Este número chegará ao seu valor máximo e será reiniciado em um tempo de 50 dias. Em palavras gerais, ele contabiliza o tempo em que um programa começou a ser rodado, até 50 dias após. Sua estrutura é apenas millis(). 2. delay(): Essa função tem como objetivo principal suspender, durante um tempo pré- estabelecido em milissegundos o programa que está sendo executado. Repare um seguinte: dentro de 1 segundo se encontra 1000 milissegundos. A sua estrutura é: delay(ms), onde ms é o tempo que é desejado que o programa fique interrompido. Por exemplo, se quiser que um determinado programa fique paralisado por 5 segundos, ficaríamos assim; delay(5000); E ai, entendeu tudo que foi estudado até o momento? Faça um seguinte então: pegue uma folha de papel e descreva cada função citada sem consultar a apostila. Sim, é necessário um pouco de esforço, mas lembre-se, isso pode acarretar em sua vitória no torneio. É importante que essas elas estejam bem frisadas em sua mente para que possamos prosseguir com o nosso treinamento. 26 Pronto, agora que você já sabe todas essas funções, vamos voltar ao exemplo 1 e verificar como ficaria o seu programa. Exemplo 01: Sabendo que um led que se encontra conectado ao pino 12 da placa arduino, faça um programa que o acenda. OBS: Use o led como um dispositivo digital. Quais funções você acha que serão usadas aqui? Lembre que é necessário definir em qual pino o led se encontra e que ele é um dispositivo de saída. Qual função é usada para isso? Depois é necessário ligá-lo. O que você usaria para que isso acontecesse? Antes de olhar a resposta abaixo, procure fazer você mesmo. Ilustração 17 - Resolução do exemplo 1 O nosso próximo passo será deixar esse programa que você acabou de fazer um pouco mais sofisticado. Para isso, peço que você olhe atentamente na figura abaixo e descubra as diferenças que os dois programas têm. Note que ambos fazem a mesma coisa. 27 Ilustração 18 - Comparação entre dois programas Repare que na imagem que se encontra a sua direita, na parte superior do programa se tem um comando da seguinte forma: #define LED 12. Esse comando tem como objetivo permitir que o programador, no caso você, dê um nome a um pino antes que ele seja compilado. Mas porque é feito isso? Digamos que temos um led que está ligado ao pino 12 e que temos um programa com um pouco mais de linhas que esse na imagem, e usamos esse pino 12 em várias partes do mesmo. Se por alguma ventura mudarmos esse led do pino 12 para o 11, exigiria que você tivesse um esforço muito grande para ficar fazendo essa alteração em todo o sketch. Veja bem, esse procedimento é muito suscetível a falhas, pois poderiam passar algumas linhas sem serem notadas, além de que despenderia de muito tempo para fazer uma mudança relativamente simples. Para solucionar casos como esses é que existe o define. A sua estrutura é a seguinte: #define NOME_DA_CONSTANTE valor, onde o NOME_DA_CONSTANTE se refere ao dispositivo em questão e o valor, é a pinagem em que ele se encontra. Com isso, é possível que se pare de usar a pinagem em si no programa, e passe a usar apenas o NOME_DA_CONSTANTE, como pode ser visto no comando: digitalWrite(LED,HIGH). 28 Você consegue perceber a vantagem que isso nostraz? Se por algum acaso houver a mudança do led do pino 12 ao 11, não é necessário fazer a troca em todo o sketch, e sim apenas no define.Deixaria de ser #define LED 12 e passaria a ser #define LED 11, e o problema estaria resolvido. Você terá que concordar comigo que isso facilita muito não é mesmo? Volte a figura e repare por mais alguns instantes. Consegue notar algo em comum entre esses programas além do fato de estarem executando a mesma função? Isso mesmo! Muito bem! Na frente de cada comando existe uma frase que está explicando exatamente o que ele faz. No mundo da programação, nós chamamos isso de comentário e essa é uma prática viável para podermos relembrar de forma rápida o que foi feito no programa depois de algum tempo sem vê-lo, além de que, para você que ainda é um iniciante, deixará o seu programa mais organizado e isso o ajudará em uma compreensão mais ágil. Lembre-se: em uma competição, velocidade é essencial. Todas as vezes que quisermos fazer um comentário, basta que usemos o símbolo “//” e escrevermos algo logo a sua frente. Por exemplo: digitalWrite(LED,HIGH); // acende o led Porém perceba que o comentário se limitará a linha que se encontra o símbolo “//”. A linha debaixo será considerada um comando. Repare também, que no final de cada comando é usado um ponto-vírgula (;). Ele tem o objetivo de avisar que o comando finaliza naquele ponto e é indispensável na programação. Prove que entendeu Agora é com você. Faça a programação, dos exercícios 1, 2, 3 e 4, usando os conceitos adquiridos até o momento. Use o define e comentários. OBS: Caso você não se recorde de todos os comandos vistos, poderá retornar um pouco e relembrar quais são eles e quando são usados. Tê-los em mente é essencial para desenvolver os exercícios 1, 2, 3 e 4. 29 Exercício 1: Agora que você já sabe acender um led, que tal ligarmos um buzzer? Sendo que o buzzer se encontra no pino 11 e é um dispositivo digital, faça com que ele toque. OBS: para que funcione corretamente, é necessário somar o software com o hardware. Não se esqueça de fazer a sua ligação. 30 Resposta: Ilustração 19 - Solução do exercício 1 31 Exercício 2: Refaça o exercício 1, agora considerando que o buzzer é um dispositivo analógico. 32 Resposta: Ilustração 20 - Solução do exercício 2 33 Exercício 3: Acenda o led, usando a pinagem 12 e o buzzer usando a pinagem 11, considerando que o led é digital e que o buzzer é analógico. 34 Resposta: Ilustração 21 - Solução do exercício 3 35 Exercício 4: Refaça o exercício 3, considerando que o led e o buzzer são dispositivos analógicos e que o led tenha um valor de 180 e o buzzer tenha a sua metade. 36 Resposta: Ilustração 22 - Solução do exercício 4 Agora que você já sabe ligar e desligar dispositivos e tem conhecimento de algumas funções específicas, eu lhe proponho um desafio. Faça um pisca-pisca. E ai, funcionou? Se sim, meus parabéns! Mas caso não tenha conseguido, não se preocupe. Nas linhas abaixo, iremos lhe ajudar. Verifique se o seu código se encontra dessa forma: 37 Ilustração 23 - Solução errada do exercício desafio Se sua resposta foi SIM, é preciso que eu lhe diga que o seu raciocínio não está errado. Pois em um pisca-pisca as coisas acontecem dessa forma mesmo: ora o led está acesso, ora ele está apagado. Porém, ao testar, o seu programa não funcionou por um simples motivo: o poder de processamento do arduino é muito rápido, e por conta disso é impossível ver o led apagar. Não que ele não tenha apagado, mas os nossos olhos não conseguem enxergar, pois vemos a uma freqüência limitada. Por isso temos a impressão que ele está o tempo todo acesso. Para resolver esse impasse, basta que se acrescente entre os comandos de ligar e desligar e após o comando de desligar, a função de delay. Ao acrescentá-la, o programa ficará um tempo paralisado no ponto em que ele se encontra e com isso será possível enxergar o efeito do pisca-pisca. Faça essa alteração em seu programa e veja o que acontece. 38 Ilustração 24 - Solução correta do exercício desafio E agora, funcionou? Na solução feita por nós, colocamos um delay com um tempo de 1 segundo. Porém esse tempo pode ser alterado. Faça experimentos, modificando o tempo de ligamento e desligamento do led. Deixe a sua imaginação o guiar neste momento. Então, já que você entendeu, vamos lhe propor um segundo desafio: Exercício Desafio 2: Faça um pisca-pisca que funcione da seguinte forma: Quando o led estiver aceso, o buzzer deverá estar desligado. Quando o led estiver apagado, o buzzer deverá estar ligado. Use o led como digital e o buzzer como analógico, com uma intensidade de 60. 39 Resposta: Ilustração 25 - Solução do exercício_desafio_2 Prove que entendeu Neste ponto, já estudamos as funções básicas do arduino e fizemos juntos alguns exemplos. Nas linhas que se seguem, iremos lhe propor alguns exercícios usando todas as funções que vimos até o momento. Não deixe de fazer esses exercícios e apenas depois de concluí-los, confira as suas respostas. Exercício 5: Faça um programa que mude a intensidade do led de acordo com o tempo. Ele deverá começar desligado e ir aumentando de 50 em 50. Lembre-se que o valor máximo permitido é 255. Use o pino 11. 40 Resposta: Ilustração 26 - Solução do exercício 5 Exercício 6: Usando o mesmo conceito do exercício anterior, acrescente o buzzer e faça que ele também vá aumentando sua intensidade gradativamente, paralelamente ao led. Seguindo mesma escala de valores. Use os pinos 9 e 11. 41 Resposta: Ilustração 27 - Solução do exercício 6 Agora que você já sabe alguns comandos básicos do arduino e já treinou um pouco, vamos conhecer um pouco mais de programação. 42 1.4.2 Estrutura de controle Você terá que concordar comigo que o título deste tópico é extremamente sugestivo. Então, responda rapidamente: Uma estrutura de controle tem como principal objetivo o quê? Exatamente isso: controlar. Mas de que forma? Existem bastantes estruturas de controle na linguagem de programação C++, que por conseqüência acabam sendo herdadas pela Wiring. Porém nos atentaremos a uma em específico, denominada como estrutura condicional. O seu grande objetivo é comparar uma determinada informação com um valor pré-estabelecido, e caso a resposta seja verdadeira, executa uma sequência de ações. Difícil compreender? Vamos ser mais claros: Uma estrutura condicional faz comparações entre informações. Essa comparação é denominada de condição. Por conta disso é necessário se ter em mãos os dados a serem conferidos. Por exemplo, digamos que você deseja comparar a sua nota da prova de matemática com a nota do seu amigo, para ver quem se saiu melhor. Para que essa comparação aconteça, é essencial que se conheça a sua pontuação, tal qual a dele. Isso significa, que para essa estrutura acontecer, é fundamental que se tenha dois elementos. Tendo esse dois elementos e feito esse contraste entre ambos, é possível tirar algumaconclusão. Diante dessa, você estabelecerá uma série de ações que lhe sejam convenientes. Voltemos ao exemplo das notas. Após fazer a comparação, concluiu-se que a sua nota foi superior a nota de seu amigo, e por isso, você decidiu oferecer ajuda para ele estudar. Então ficamos assim: A comparação das notas (condição) levará a uma tomada de decisão (ações). Ainda está um pouco confuso? Não se preocupe. Vamos detalhar um pouco mais. Verifique se a estrutura abaixo o ajuda na compreensão. Temos nesse momento três informações: 1 – Minha nota; 2 – Nota do meu amigo; 3 – Oferecer ajuda; 43 A “Minha nota” e a “Nota do meu amigo” são dados. Ou seja, precisam ser coletados de algum lugar se ainda não o foram. Oferecer ajuda é uma ação. A estrutura condicional exige que comparemos esses dois dados, e logo após executemos uma ação. Para fazer isso, use as palavras “Se” e “Então”. Veja como fica: Se “Minha nota” for maior que a “Nota do meu amigo”, então, eu vou “Oferecer ajuda”. OBS: Verificamos até o momento que as palavras “se” e “então” são poderosos aliados para se realizar uma comparação e promover ações. Por conta disso, é muito importante que sempre se faça uso dela. Ajudou a clarear um pouco mais o que é a estrutura condicional? Pois bem, vamos prosseguir. Antes que possamos levá-la para o código em si, lhe mostrarei uma técnica que o ajudará bastante. Ela é chamada de pseudocódigo e serve para que rascunhemos o nosso programa em um pedaço de papel antes de irmos para o computador. Ele possibilita escrever um determinado programa em uma linguagem extremamente clara para qualquer ser humano. Mais uma vez, vamos voltar ao exemplo das notas. Se fôssemos colocar o seu enunciado em pseudocódigo, ele ficaria da seguinte forma: Se (MinhaNota>NotaDoMeuAmigo) { Oferecer ajuda; } Você consegue compreender o que foi escrito acima? Percebeu a entrada de alguns símbolos? No pseudocódigo que escrevemos, continuamos usando a palavra “se”. A comparação, ou seja, a condição, foi colocada dentro dos parênteses e trocamos a palavra maior por seu respectivo símbolo. Logo após, a palavra “então” foi retirada, porém continua-se a usando para leitura, e a ação a ser tomada é finalizada por ponto-vírgula e finalizamos com outra chaves. Repare um seguinte, sempre que se abrir um parêntese, chaves ou colchetes, é necessário fechá-lo. 44 Só para aumentar a sua compreensão, veja esse pseudocódigo comentado de como pode ser feito essa leitura. Se (MinhaNota>NotaDoMeuAmigo) // Se a MinhaNota for maior que a NotaDoMeuAmigo, Então { Oferecer ajuda; //Eu vou oferecer ajuda } Perceba também que a ação a ser tomada, se encontra alinhada para a direita. Até o momento, conseguiu entender como se dá a estrutura condicional simples? Como pode perceber caro(a) colega, em uma estrutura condicional, usamos alguns elementos de comparação. No exemplo da nota, ele se deu pela palavra maior, porém existem outros. Veja abaixo a tabela com esses elementos e sua simbologia no mundo computacional que deve ser usado em seu pseudocódigo e posteriormente em seu código. Operador de Comparação Simbologia Maior que > Menor que = Menor ou igual a =70) { Aluno aprovado; } Se (x>90) { Aluno aprovado com êxito; } Se (xvalor1) { Tarefa A; } Se (condicao>valor2) { Tarefa B; } Resposta: Se a condição for maior que o valor 1, então será executada a Tarefa A. Se a condição for maior que o valor 2, então será executada a Tarefa B. Pense um pouco mais: Agora que já estudamos a estrutura condicional e verificamos que ela é composta por uma comparação e um conjunto de ações, analise a resposta do exercício 7. Você acha que todas as ações serão realizadas? Lembre-se que no começo deste tópico dizemos que a ação só será realizada se a condição for atendida, ou seja, se a comparação resultar em verdadeiro. Vejamos: no exercício 7, sabemos que x é igual a 70 e depois temos uma série de condições acompanhadas de suas respectivas ações. Vamos verificar se suas ações serão de fato executadas: 1. Se x for maior ou igual a 70, o aluno está aprovado: Se pergunte um seguinte: “70 é maior ou igual a 70?”. A resposta é SIM, por isso, o programa executará a ação Aluno aprovado. 2. Se x for maior que 90, o aluno está aprovado com êxito: Agora tente responder: “70 é maior que 90?”. A resposta é NÃO, por isso, o programa não executará a ação Aluno aprovado com êxito. 3. Se x for menor que 70 o aluno está de recuperação: Responda: “70 é menor que 70?”. A resposta é NÃO, por isso, o programa não executará a ação Aluno reprovado. 4. Se x for menor ou igual a 30 o aluno está reprovado automaticamente: Use o mesmo processo: “70 é menor ou igual a 30?”. A resposta é NÃO, por isso, o programa não executará a ação do aluno. Agora que já aprendemos como é o processo de uma estrutura condicional e como fazer o seu pseudocódigo, está na hora de colocarmos isso no programa. Com o conhecimento que temos em mãos, e se todos os exercícios propostos foram devidamente feitos, não encontraremos dificuldade em fazer essa transição. 47 Repare na comparação entre um pseudocódigo e um código na imagem abaixo: Ilustração 28 - Comparação entre um pseudocódigo e um código A palavra se do pseudocódigo, transforma-se em if, que é o seu significado em inglês. No mais, a estrutura segue quase que o mesmo processo, sendo feito apenas algumas modificações básicas. A ação deixou de ser descrita por definição e passou a se escrever como fazê-la Vamos treinar um pouquinho agora: Exemplo 2: Faça o código e depois confira o seu funcionamento em que, dado um tempo maior que 5 segundos, o buzzer deverá ser tocado com uma intensidade de 30, avisando o ocorrido. Observe o seguinte: Vamos utilizar neste exemplo, todos os conceitos visto até o momento. 48 Ilustração 29 - Solução do exemplo 2 Prove que entendeu Até o momento aprendemos: o Instalação da IDE; o Instalação de drivers; o Estrutura do programa; o Entradas e Saídas digitais: (pinMode(), digitalWrite(), digitalRead()); o Entrada e Saída Analógicas: (analogRead(), analogWrite()); o Tempo: millis(), delay(); o Estrutura condicional e operadores de comparação. Abaixo segue alguns exercícios usando TODOS esses conceitos. Vamos lá? Dados importantes: Todas as vezes que falarmos a respeito de faixa escura, estamos nos referindo a um valor maior que 300. Por sua vez, quando o valor for menor que 300, a faixa será clara. 49 Exercício 9: Faça o código e depois confira o seu funcionamento em que, dado um sensor de luminosidade, que se encontra no pino 0 todas as vezes em que ele ler uma faixa escura, o led seja acendido.50 Resposta: Ilustração 30 - Solução do exercício 9 51 Exercício 10: Use o exercício 9 e acrescente a seguinte condição: Quando o sensor de luminosidade ler uma faixa escura, o led deverá ser ligado. Depois de 10 segundos, o led deverá ser apagado e o buzzer começará a tocar na intensidade 20. Logo após 15 segundos, o buzzer é desligado, o led é acesso em forma de pisca-pisca e o buzzer começa a ter um crescimento gradual de 0 a 255 de intensidade. 52 Resposta: Ilustração 31 - Solução do exercício 10 53 Tudo o que acabamos de ver são estruturas condicionais simples. Ou seja, eu tenho apenas uma comparação a ser feita, ou se quiser, apenas uma condição que deve ser atendida. Contudo, existem ainda as condições compostas, aonde é possível usar mais que um conjunto de comparação. Os operadores que permitem que isso aconteça, são os operadores lógicos “AND” (ou “E”) e “OR” (ou “OU”). 1.4.2.1 Operador AND O operador “AND”, ou “E”, tem o objetivo principal de estabelecer uma relação de inclusão entre dois elementos. Por exemplo, quando dizemos: “Eu estou participando do torneio Arduino Challenge e estou gostando”, eu tenho uma relação de soma. Ambas coisas estão acontecendo. Quando isso é colocado em uma estrutura de condição, as ações provocadas por essas informações só acontecerão se ambas forem verdadeiras. Na programação a sua simbologia é &&. Por exemplo, veja o código abaixo: if((SENSOR1)>300 && (SENSOR2)>300){ digitalWrite(LED,HIGH); } Neste caso, o led só será aceso se o sensor1 e o sensor2 lerem uma “faixa escura”. Se por acaso, o sensor1 ler uma “faixa clara” e o sensor2 ler uma “faixa escura”, ou se o sensor 1 ler uma “faixa escura” e o sensor2 ler uma “faixa clara”, o led não se acenderá. Para que a ação aconteça, é necessário que ambas as condições sejam atendidas. Com isso percebemos o seguinte: Sensor 1 Sensor 2 Led Faixa clara Faixa clara Não acende Faixa clara Faixa escura Não acende Faixa escura Faixa clara Não acende Faixa escura Faixa escura Acende Tabela 2 - Tabela da verdade do operador "AND" 54 É de fácil compreensão esse operador não é mesmo? Pois bem, e se por acaso eu tiver dois sensores, mas se somente um deles ler “faixa escura”, já for suficiente para acender o led, em questão de programação, como faria isso acontecer? Para responder essa pergunta, vamos conhecer o operador “OR”. 1.4.2.2 Operador OR O operador “OR”, ou “OU”, tem por objetivo principal estabelecer uma relação de independência. Se apenas um dos elementos estiver atendendo a condição, então uma ação será realizada em cima disso. Na programação a sua simbologia é ||. Por exemplo, veja o código abaixo: if((SENSOR1)>300 || (SENSOR2)>300){ digitalWrite(LED, HIGH); } Neste caso, o led só não será acesso se o sensor1 e o sensor2 lerem “faixa clara”. Se por ventura, qualquer um dos dois lerem uma “faixa escura”, então o led deverá ser aceso. Com isso percebemos o seguinte: Sensor 1 Sensor 2 Led Faixa clara Faixa clara Não acende Faixa clara Faixa escura Acende Faixa escura Faixa clara Acende Faixa escura Faixa escura Acende Tabela 3 - Tabela da verdade do operador "OR" 55 Agora perceba um seguinte: cada sensor tem separadamente duas opções de leitura de faixa: “faixa clara” ou “faixa escura”. A junção desses dois sensores me oferece quatro possibilidades de leitura: “faixa clara – faixa clara”, “faixa clara – faixa escura”, “faixa escura – faixa clara” e “faixa escura – faixa escura”. Se por acaso, tivéssemos mais um sensor, teríamos 8 condições de leitura: “faixa clara – faixa-clara – faixa clara”, “faixa clara – faixa clara – faixa escura”, “faixa clara – faixa escura – faixa clara”, “faixa clara – faixa escura – faixa escura”, “faixa escura – faixa clara – faixa clara”, “faixa escura – faixa clara – faixa escura”, “faixa escura – faixa escura – faixa clara”, “faixa escura – faixa escura – faixa escura”. Isso acontece porque todas as possibilidades de um sensor, se junta com todas as possibilidades do outro sensor. Um pouco confuso não é mesmo? Veja a imagem abaixo usando apenas dois sensores e veja se clareia um pouco. Ilustração 32 - Todas as combinações utilizando dois sensores Se pegarmos todas as opções e fizermos um agrupamento de todas que se repetem, no fim, teremos apenas quatro opções válidas. Veja: 56 Ilustração 33 - Tabela da verdade de dois sensores Agora imagine só ter que usar esse método para montar a tabela de 3 sensores! Iria ser bem trabalhoso não é mesmo? E se fossem 8 sensores? Seria uma “missão impossível”. Perderíamos muito tempo apenas descobrindo o número de opções possíveis de leitura para esses sensores juntos. Por isso, é importante que você fique muito atento a uma regra que diz: “O número de linhas da tabela-verdade de uma proposição composta (número de opções de leitura dos sensores agrupados) depende do número de proposições simples que a integram, ou seja, a tabela-verdade de uma proposição composta com n proposições simples contém 2ⁿ linhas.” Com isso, se tivermos 03 sensores, basta que usemos 2³ e assim sucessivamente. Se fossem quatro sensores, basta que colocasse 2 elevado a quarta potência. Como no caso, temos dois sensores, basta fazermos, 2², resultando em 04 opções diferentes. Essa regra deixou as coisas mais claras não é mesmo?! Pois bem, não se esqueça dela, ela será indispensável durante a competição. Mas agora que aprendemos a fazer estruturas condicionais compostas e já vimos como é a estrutura, usando os operadores lógicos “AND” e “OR”, está na hora de você mostrar que aprendeu os conceitos passados. Por isso, não deixe de fazer a série de exercícios logo abaixo. 57 Prove que sabe Exercício 11 – Você possui dois sensores: sensor1 e sensor2. Faça um programa que acenda o led quando os dois sensores lerem uma “faixa escura” e o apague se a leitura for uma “faixa clara”. Resposta: Ilustração 34 - Solução do exercício 11 58 Exercício 12 – Faça um programa que ao ligar a placa arduino, um led seja acendido e fique assim todas as vezes que o tempo de ligamento for menor que 5 segundos e maior que 15 segundos. Quando o tempo estiver entre 5 segundos e 15 segundos, inclusive, o led deverá ser apagado. (Esse exercício não se encontra com solução pronta. Levar a resolução para discutirmos na aula presencial) Exercício 13 – Faça um novo programa que: (Esse exercício não se encontra com solução pronta. Levar a resolução para discutirmos na aula presencial) o Acione o buzzer quando o sensor 1 estiver no escuro e o sensor 2 estiver no claro; o Quando o sensor 1 estiver no claro e o sensor 2 estiver no escuro, acenda o LED; o Quando ambos sensores estiverem no claro, desligue o led e o buzzer; o Quando ambos sensores estiverem no escuro ligue o led e o buzzer. Agora que você já aprendeu e treinou todos os tópicos necessários para uma boa competição, só me resta lhe desejar boa sorte na classificatória. Nos vemos logo mais. Até já. 59 Bibliografia BANZI, Massimo. Primeiros passos com o arduino. São Paulo, SP: Novatec Editora Ltda, 2011. https://www.arduino.cc/ https://www.arduino.cc/ _Toc231909139