Baixe o app para aproveitar ainda mais
Prévia do material em texto
TREINAMENTO BÁSICO ARDUINO O que é o Arduino? Talvez você que esteja lendo esse livro não tenha conhecido alguns processadores e a sua dificuldade em escrever um código, gravar neles um programa, até mesmo bibliotecas que ensinasse como usá-los e configurar. O que tinha era de uma linguagem difícil de entender para os novatos na área da programação de embarcados ou era em inglês, para passar o código, tinha todo um “ritual” em gravar o chip espetado em uma placa específica para gravação e depois precisamos removê-los para testar em nosso protótipo. Tudo isso que relatei foi substituído pelo Arduino, ele é uma plataforma eletrônica de código aberto baseado em hardware e software livres, de fácil uso e grande material disponível na internet e em livros, inclusive esse que você está lendo. Tudo isso graças a uma grande comunidade mundial de criadores - estudantes, entusiastas, programadores e profissionais que se reúne todos os dias em torno desta plataforma de código aberto. Suas contribuições adicionam uma quantidade incrível de conhecimento acessível que pode ser de grande ajuda para iniciantes e especialistas. As placas do Arduino são capazes de ler o ambiente como a luz através de um sensor, um dedo em um botão ou até mesmo uma mensagem no Twitter, de posse dessas entradas, nossa super placa pode transformá-las em uma saída como por exemplo, ativando um motor, ligando um LED, publicando algo online. esse tratamento da entrada para a saída quem decide é você, dizendo para a sua placa o que deve fazer através de um conjunto de instruções pré-programadas no microcontrolador da placa. Para fazer isso, você usa a linguagem de programação Arduino, com base na Wiring, e o Software Arduino (IDE) , com base no Processing, no próximo capítulo falaremos um pouco desses dois softwares. Já a algum tempo o Arduino vém sendo o cérebro de milhares de projetos makers, engenheiros, estudantes e entusiastas, também já é parte de vários objetos do nosso dia a dia até a complexos instrumentos científicos, por esse motivo escrevemos esse livro, para divulgar essa ferramenta maravilhosa e suas variedades. Por falar em variedades, atualmente o Arduino tem mais de 40 modelos de placas, desde as mais simples e tradicionais como o Arduino Uno (será a que adotaremos neste livro) até as mais avançadas com capacidade de processamento de programas com inteligência Artificial e Internet das Coisas, então vamos comigo conferir no próximo capítulos os principais tipos de Arduino. Tipos de Arduino Arduino UNO http://forum.arduino.cc/ https://www.arduino.cc/en/Main/Products https://www.arduino.cc/en/Reference/HomePage https://www.arduino.cc/en/Main/Software O Arduino Uno é uma placa microcontrolada baseada no ATmega328P. Ela possui 14 pinos de entrada / saída digitais (dos quais 6 podem ser usados como saídas PWM), também possui 6 entradas analógicas, um cristal de quartzo de 16MHz, uma conexão USB, um conector de alimentação até 16V, um bloco de pinos ICSP e um botão de reset. O nome UNO em Italiano significa “um” e foi escolhido para referenciar a versão primeira versão no lançamento do Arduino Software IDE 1.0, a placa UNO foi a primeira de uma série de placas USB Arduino que surgiram até a data de hoje. Na imagem abaixo tem detalhadamente a descrição da pinagem do Arduino UNO. O Arduino Uno pode ser programado com o Software (IDE) do seu Arduino, basta selecionar "Arduino / Genuíno Uno” no menu Ferramentas> Placa (de acordo com o microcontrolador em sua placa). O ATmega328 no Arduino Uno já vem pré-programado com um gerenciador de inicialização que permite carregar um novo código nele sem o uso de um programador de hardware externo. Ele se comunica usando o protocolo STK500 original que consiste em uma série de comandos e respostas, todas elas em ASCII padrão, para troca de dados e execução de tarefas, esse protocolo serve para que o Arduino IDE e o Bootloader se entendam e façam o upload corretamente do seu sketch. Caso você gere um curto-circuito em seu Arduino Uno, isso poderia queimar a porta USB de meu computador? A resposta é não, pois o Arduino Uno possui um fusível reinicializava que protege as portas USB do seu computador contra curtos-circuitos e sobrecorrentes, embora seu computador já forneça um circuito de proteção interna nas suas portas USB, o fusível do Arduino Uno irá fornecer uma camada extra de proteção, caso ocorra uma corrente maior que 500 mA o fusível interromperá automaticamente a conexão até que o curto ou sobrecarga seja removido. E aí? Gostou de conhecer o Arduino UNO? Pois estamos apenas começando nosso a aventura em nosso livro, se os benefícios da primeira placa já lhe encantaram, continue lendo para você conhecer as outras placas e suas diferenças, vamos lá? Então vamos falar agora da prima do Uno, vamos conhecer o Arduino Leonardo. Arduino Leonardo O Arduino Leonardo é parecido com o Arduino Uno, porém tem um diferencial especial, ele pode ser usado com mouse e teclado, ficou curioso? Pois fique um pouco mais nesse capítulo para aprender sobre o Arduino Leonardo. Outra diferença do Arduino Leonardo para o Uno é que o microcontrolador é o ATmega32u4. Os dois microcontroladores, o ATMega328P e o ATMega32U4 estão na família AVR e têm 32K de memória flash (daí os 32 no nome). O que difere é no pacote e quais periféricos são oferecidos. A maior diferença é que o 32U4 possui um periférico de dispositivo USB (daí o U no nome), o 328P não possui um periférico USB dedicado, o Arduino Uno necessita de outro ATmega para essa conexão USB acontecer. O “P” é referente ao PicoPower, que é um conjunto de recursos que permitem economizar energia, incluindo desligar periféricos que não estão em uso. Possui 20 pinos de entrada / saída digitais, porém, diferenciando do Arduino Uno, das 20 portas E/S 7 podem ser usados como saídas PWM e 12 como entradas analógicas, ou seja, tenho mais opções de usar o recurso PWM e ADC. Possui um oscilador de cristal de 16MHz e uma conexão micro USB, aquela igual dos celulares smartphone, diferente do Arduino Uno que a conexão USB é tipo A-B igual a usada em impressoras. Também possui um conector tipo Jack de energia, um cabeçalho ICSP e um botão de reset. Como mencionado anteriormente, a placa Leonardo tem um diferencial exclusivo das demais placas, o ATmega32u4 possui comunicação USB integrada, eliminando a necessidade de um processador secundário. Isso permite que o Leonardo apareça em um computador conectado como mouse e teclado, além de uma porta serial / COM virtual (CDC). A pinagem do Leonardo é bem parecida com a do Uno, porém tem algumas diferenças, abaixo apresento o diagrama PinOut do Arduino Leonardo, vale a pena sentar-se e pesquisar um pouco sobre essas diferenças, neste livro não temos o intuito de se aprofundar no Hardware da placa, apenas apresentá-la e caminhar para o nosso objetivo que é fazer projetos. No site www.arduino.cc, clicando na aba “Resources>Products” você encontrará todas as informações necessárias sobre o Arduino Leonardo e outras placas. Arduino Mega 2560 O Arduino MEGA 2560 foi desenvolvido para projetos mais complexos que necessitam de muitas portas de entrada e saída, ele é ideal para esses projetos pois conta com 54 pinos de E / S digitais e 16 entradas analógicas, é a placa recomendada para impressoras 3D e projetos de automação residencial e veicular. Ele é uma placa de microcontrolador baseada no ATmega2560, entre as portas de entrada e saída 15 http://www.arduino.cc/ delas podem ser usados como saídas PWM, possui também 4 UARTs (portas seriais de hardware), um oscilador de cristal de 16 MHz, uma conexão USB, um conector JACK de alimentação, um cabeçalho ICSP, e um botão de reset. O Mega 2560 também possui um polyfuse reinicializava que protege as portas USB do seu computador contra curtos-circuitos esobrecorrentes. Se mais de 500 mA for aplicado à porta USB, o fusível interrompe automaticamente a conexão até que o curto ou sobrecarga seja removido. Na imagem abaixo detalhamos as portas do Arduino Mega e caso queira se aprofundar mais, acesse o site www.arduino.cc, clicando na aba “Resources>Products”, você encontrará todas as informações necessárias sobre o Arduino Mega e outras placas. http://www.arduino.cc/ Arduino Nano O Arduino Nano hoje é um sucesso, chegando a se comparar ao imortal Arduino UNO, o Arduino Nano tem seu hardware bem parecido com o UNO, duas grandes diferenças são o tamanho compacto, o tipo de porta USB, usa a USB Mini - B para transferência do código e não possui um conector para alimentação DC da placa, essa alimentação precisa ser feita através dos pinos dispostos. Hoje o Nano tem várias versões, uma delas que está sendo sucesso é o Arduino Nano 33 IoT, não iremos nos aprofundar nessa placa neste livro, mas em nossa plataforma on-line iremos fazer vários projetos usando essa placa. Ela é baseada também no ATMega 328P, uma dica ao passar o código para a placa é que caso a IDE não a reconheça e gere o erro ao carregar o código, selecione a placa Arduino “Dueminalove” que possivelmente será transferido a programação com sucesso. Em relação ao Hardware ela tem seus pinos dispostos conforme figura abaixo: Instalação do software Para programar seu Arduino podemos usar de três meios, usando a IDE (Ambiente de Desenvolvimento Integrado) Web Editor, optando por esse recurso você codifica on- line salvando seus esboços na nuvem ou enviar para qualquer placa oficial do Arduino a partir do seu navegador (Chrome, Firefox, Safari e Edge) e sempre tendo a versão mais atualizada do IDE incluindo todas as bibliotecas contribuídas e suporte para novas placas Arduino. Arduino Web Editor reconhece automaticamente qualquer placa Arduino Genuina que for conectada ao seu PC, basta você criar uma conta do Arduino que iremos lhe mostrar o passo a passo de como fazer seguindo o tutorial do site www.arduino.cc. Arduino Web Editor Passo 01: Inscreva-se no Arduino Crie uma nova conta Arduino, preencha o formulário de inscrição e clique no botão ' Create Account'. Você receberá um email com um link para ativar sua conta. Selecione o link e uma nova página será aberta com as informações da sua conta confirmada. http://www.arduino.cc/ https://auth.arduino.cc/register Passo 02: Faça login no Arduino Web Editor Depois de se registrar com sucesso em uma conta do Arduino, acesse create.arduino.cc/editor, aceite o termo e as condições, logo mais você deverá receber um email com um link para o Fórum, onde poderá relatar quaisquer bugs que encontrar e compartilhar seus comentários. O Arduino Web Editor pode ser executado em várias plataformas. Se você estiver usando Windows, Mac ou Linux, siga um fluxo simples para instalar o plug-in do Arduino Web Editor , que permite fazer upload de esboços do navegador para as placas, ao terminar a instalação você será direcionado para a página de login do Arduino. Após o login, você está pronto para começar a usar o Arduino Web Editor. O aplicativo da web é dividido em três colunas principais como pode ver na imagem abaixo: https://create.arduino.cc/editor http://forum.arduino.cc/index.php?board=101.0 https://github.com/arduino/arduino-create-agent https://github.com/arduino/arduino-create-agent A primeira coluna permite navegar entre: ● Seu Sketchbook : uma coleção de todos os seus esboços (' sketch ' é como os programas que você carrega no seu quadro são chamados). ● Exemplos: esboços somente leitura que demonstram todos os comandos básicos do Arduino (guia interna) e o comportamento de suas bibliotecas (na guia bibliotecas) ● Bibliotecas: pacotes que podem ser incluídos no seu esboço para fornecer funcionalidades extras ● Monitor serial: um recurso que permite receber e enviar dados para sua placa via cabo USB ● Ajuda: links úteis e um glossário sobre os termos do Arduino ● Preferências: opções para personalizar a aparência e o comportamento do seu editor, como tamanho do texto e tema da cor Quando selecionado, todos os itens de menu mostram suas opções em um painel lateral (segunda coluna ). A terceira coluna, a área de código, é a que você mais usará. Aqui, você pode escrever um código, verificá-lo e enviá-lo para seus painéis, salvar seus esboços na nuvem e compartilhá-los com quem quiser. Não optando por usar a IDE on-line o software te oferece a possibilidade de fazer o download do programa para uso off-line direto no seu computador. Download da IDE Arduino O seu Software pode ser instalado para uso nos sistemas operacional Windows, Linux e Mac, como o S.O. mais comum no Brasil é o Windows, será esse que irei detalhar na instalação seguindo o tutorial também disponível no site www.arduino.cc . Faça o Download do Software Arduino IDE Obtenha a versão mais recente na página de download escolhendo o pacote Installer (.exe), pois será instalado diretamente tudo o que você precisa para usar o Arduino Software (IDE), incluindo os drivers. . Quando o download terminar, continue com a instalação e permita o processo de instalação do driver quando você receber um aviso do sistema operacional. Escolha os componentes a serem instalados. http://www.arduino.cc/ https://www.arduino.cc/en/Main/Software Na hora que pedir para escolher o diretório de instalação mantenha o padrão. O processo extrairá e instalará todos os arquivos necessários, após isso é só ir à área de trabalho e executar corretamente o Arduino através do atalho do ícone lá disposto. A nova IDE Arduino Pro Alpha Além dessas duas opções, no dia 19 de outubro de 2019, Massimo Banzi e Luca Cipriani lançaram ao vivo na Maker Faire Rome a nova IDE, categorizada como “Versão Alpha”, Arduino Pró IDE Alpha. Onde segundo o site oficial do Arduino, www.arduino.cc e o anúncio no evento ao qual estive presente, os principais recursos dessa nova versão são: ● Ambiente de desenvolvimento moderno e completo ● Modo Dual, Modo Clássico (idêntico ao IDE clássico do Arduino) e Modo Pro (visualização Sistema de Arquivos) ● Novo gerenciador de placas ● Novo Gerenciador de Bibliotecas ● Lista de placas ● Preenchimento automático básico ● Integração com o Git ● Monitor Serial ● Modo escuro E tem mais, a equipe Arduino promete mais mudanças, novos recursos serão lançados em breve como: ● Sincronização de esboço com o Arduino Create Editor ● Depurador ● Totalmente aberto para plug-ins de terceiros ● Suporte para linguagens adicionais que não sejam C ++ Este livro não tem o intuito de lhe ensinar a usar a IDE Arduino Pró Alpha, até porque ainda está em processo de otimização, quem sabe no nosso livro volume 2 detalhamos e ensinamos seu uso, até lá, vamos usar a IDE tradicional offline que você baixou em seu computador. http://www.arduino.cc/ Capítulo 02 – Linguagem de Programação com a IDE Arduíno Antes de falarmos sobre linguagem de programação, gostaria de apresentar o conceito de Lógica de Programação onde é simplesmente a técnica de desenvolver sequências lógicas para atingir determinado objetivo seguindo uma regra lógica matemática, temporal ou outras regras básicas da Ciência da Computação. Após essa lógica formatada podemos transformá-las em uma linguagem de programação onde agora temos como princípio a sintaxe específica para cada tipo de linguagem. Ficou difícil de entender? Então deixa eu exemplificar, para atravessar uma rua, como você procede? Bem, eu caminho até a borda da calçada, paro, constato se estou de frente a uma faixa de pedestre, se estiver, olho para um lado e para o outro, se não vier carro eu inicio a travessia. Caso venha carro eu aguardo um tempo e depois repito a ação de olhar para os dois lados para decidir se atravessoou continuo aguardando não ter mais fluxo de carro, e se eu não estiver de frente a uma faixa de pedestre? Bem, nesse caso eu não posso atravessar, logo devo girar em 90° e caminhar até encontrar uma faixa para executar as ações descritas anteriormente e realizar meu objetivo, ou seja, a travessia. Ou seja, eu desenvolvi uma sequência lógica para atingir meu objetivo que seria atravessar a rua, porém o computador não entende essa minha lógica, logo preciso transformá-la em uma linguagem que ele intérprete e decodifique e essa linguagem é a que chamamos de linguagem de programação. O Arduino possui uma IDE própria, porém, uma IDE não é uma linguagem de programação, que deriva do inglês onde IDE significa Integreted Develpment Environment, ou seja, ambiente de Desenvolvimento Integrado, logo a IDE do nosso Arduino é uma ferramenta, que ajuda todo processo de desenvolvimento de software integrando outras ferramentas e facilitando seu uso. A sua principal função é ser um editor de texto. Logo, hoje em dia é muito comum a pessoas que estão iniciando confundir o Arduino como uma linguagem de programação, no entanto nossa IDE Arduino é uma aplicação multiplataforma escrita em Java derivada dos projetos Processing e Wiring, vamos conhecer cada uma delas? Processing Processing é uma linguagem de programação de código aberto desenvolvido para ensinar a comunidade de programação com uma metodologia visual e fácil de entender, foi projetado em 2001 para um público de não programadores tendo por base as capacidades básicas da linguagem de programação Java. https://processing.org/ Wiring A linguagem de programação Wiring é uma estrutura de programação de código aberto e voltada para o uso embarcado em microcontroladores permitindo a criação de software para controlar dispositivos conectados a uma ampla variedade de placas de microcontroladores como por exemplo o Arduino. A https://processing.org/ linguagem Wiring serve como base para a IDE Arduino ter essa versão simplificada da linguagem C++ que conhecemos. http://wiring.org.co/ Java Java é uma linguagem de programação orientada a objetos desenvolvida na década de 90 com algumas particularidades como a Portabilidade, ou seja, independência de plataformas, além de possuir uma extensa biblioteca de rotinas que facilitam a cooperação com protocolos TCP/IP. https://www.java.com/pt_BR/ Agora com todos os envolvidos devidamente apresentados, vamos programar então, acredito que você já passou pelo capítulo 01 e instalou seu software de acordo com seu sistema operacional, então abra a sua IDE Arduino e dedos nos teclados. Programando com Arduino Caros leitores, agora com o entendimento do que é uma lógica de programação e tendo sido apresentado a algumas linguagens de programação chegou o momento de aprofundarmos na IDE que é objetivo de estudo neste livro, vamos estudar as estruturas, as funções, as bibliotecas, classes e métodos usados na IDE Arduino que você também já foi apresentado no capítulo anterior. ● Estrutura inicial do seu programa O seu programa dentro da IDE Arduino se estrutura em 4 áreas onde você poderá programar, olhando para a imagem abaixo observe as áreas A, B, C e D, que iremos a seguir explicar um pouco sobre elas. http://wiring.org.co/ https://www.java.com/pt_BR/ A área “A” é onde você declara as variáveis global do seu programa (não se preocupe, iremos explicar o que é uma variável global e local e suas diferenças), nesse ambiente também incluímos as bibliotecas necessárias para o funcionamento de seu projeto, orientamos o objeto a classe da biblioteca e inicializamos alguns parâmetros necessários (tudo vai depender de seu projeto e objetivo). Então falamos aqui de declaração de variável, biblioteca, objeto e parâmetros, tudo isso pode parecer outro mundo para você mas não se preocupe que iremos estudar juntos e viajar para esse mundo do Arduino sabendo de tudo. o setup() A área “B” é o setup() de seu programa, é onde escrevemos as linhas de programação referente a configuração de seu código, é uma das funções que devem ser incluídas em todo o programa Arduino, ela é executada apenas uma vez em três situações, no momento em que a placa é ligada, resetada ou inicializado uma comunicação serial. Isso é útil para configurações que você só faz uma vez, como configurar a direção dos pinos definindo qual o modo de uso (INPUT ou OUTPUT), inicializar interfaces de comunicação e assim por diante. void setup() { // coloque seu código de configuração aqui, //para executar uma vez: } o loop() A área “C” é o loop() do seu programa, é a segunda função obrigatória em todos os programas Arduino. Nessa função, colocamos o núcleo de nosso código-fonte, o que estiver entre as chaves ( { } ) do loop será executado indefinidamente enquanto a placa estiver ligada, ou seja, seu comportamento padrão será de um ciclo de repetição, por isso é chamado de loop, logo o sketch será lido a partir da primeira linha após a chave até a última linha antes da chave de fechamento onde volta para o início do loop, ou seja para a primeira linha após a chave aberta no loop e percorre todas as linhas seguintes novamente se repetindo sucessivamente até que a placa seja desligada ou o botão de reset pressionado. Se quiser que o Arduino faça algo somente uma vez na inicialização (ou seja dentro do setup) você ainda precisa incluir a função loop, mas pode deixá-la vazia. void loop() { // coloque seu código principal aqui, //para executar repetidamente: } o Criando novo Void A área “D” do seu programa, é onde você pode criar uma nova função fora do ciclo de repetição loop, onde o seu programa só irá percorrer aquelas linhas quando for convidado a entrar nessa nova função. Por exemplo, dentro do void loop() posso ter uma condição onde se a pessoa pressionar um botão ela ligue um led, esse é um exemplo bem simples e não aplicável, mas retrata o funcionamento da chamada de função, então o programa ficaria assim: void loop() { if (botao==0){ ligaLED(); } } void ligaLED(){ digitalWrite(3,HIGH); } Mais uma vez, não precisa se preocupar agora com esse comandos novos, iremos ensiná-los no momento certo no decorrer deste livro. A nova função que acabamos de criar, ligaLED, é executada através de um void que está fora do loop e é chamada através do comando ligaLED(), ou seja, agora toda vez que eu precisar ligar um led dentro do meu programa eu não precisarei mais escrever digitalWrite(3, HIGH) (que é o comando para ligar o LED), apenas chamarei o comando ligaLED. Como disse essa não é ma aplicação ideal, criamos uma função nova quando teremos dentro dela uma sequência de instruções complexas que eu iria usar algumas vezes dentro do loop, para eu não ficar repetindo-as toda vez que precisar, gerando assim mais linhas de códigos e memória necessária para execução, com esse método o programa só executará quando for chamado realmente. ● Imprimindo na Tela A impressão na tela é feito através da porta Serial, aprendemos no capítulo que fala sobre a placa Arduino que ele tem uma conexão USB, utilizada pela IDE para fazer o upload do código para o processador e essa mesma conexão pode ser utilizada pelos skecthes que desenvolvemos no Arduino para enviar dados ao computador ou ler dados do computador, para eu imprimir algo na tela primeiro preciso conhecer o botão SerialMonitor, é uma ferramenta muito útil, em especial para depurar o seu código, pois nele é exibido os dados seriais enviados do seu Arduino (USB ou placa Serial) e também poderá ser feito o inverso, enviar os dados de volta ao Arduino digitando algo na caixa de texto que é aberta assim que você clicar no botão Serial Monitor, observe a figura abaixo: Importante informar que essa tela só será aberta caso o Arduino esteja conectado a porta USBdo computador e com a porta serial selecionada, que irá aparecer na sua IDE comumente como COM3 ou COM4, iremos aprender a selecioná-la também quando formos escrever nosso primeiro código nesse capítulo ainda. O último ponto importante a se conhecer para estabelecermos uma comunicação Serial entre o Arduino e o computador de uma forma eficaz é definir a taxa de transmissão (Baud Rate) na qual os dados devem ser enviados de/para o Arduino. Essa taxa de transmissão é a taxa por segundos em que as alterações de estado ou dados, que são os bits, são enviadas da placa Arduino para o computador ou ao contrário, do Arduino para o computador. A configuração padrão é de 9600 baud, porém pode ser alterado no canto inferior direito do seu monitor serial conforme figura anterior. Conhecendo a forma de conectar e configurar a sua comunicação serial vamos entender então como imprimimos uma frase vinda do Arduino na tela do meu computador, para executar essa tarefa eu preciso que um objeto chamado Serial esteja instalado na minha IDE, para nossa sorte, assim que instalar a IDE Arduino a biblioteca SoftwareSerial ser´´a também instalada e a classe Serial é quem será responsável pela comunicação, ela traz consigo alguns métodos que são funções específicas para a ações específicas dentro meu programa: if(Serial), available(), availableForWrite(), begin(), end(), find(), findUntil(), flush(), parseFloat(), parseInt(), peek(), print(), println(), read(), readBytes(), readBytesUntil(), readString(), readStringUntil(), setTimeout(), write() e serialEvent(). Muitas linguagens de programação têm essa função que permite a criação de programas capazes de se comunicar com a porta serial, a Processing, que comentamos no início deste livro, é um exemplo de uma linguagem que usa desse recurso e um excelente complemento para projetos com seu Arduino por ter a opção de gerar gráficos de acordo com informações recebidas de sua placa. Durante a nossa jornada aqui neste livro iremos conhecer algumas dessas funções, porém neste capítulo iremos aprender 3 delas, vamos conhecê-las? o Função Serial.begin() Essa função abre a porta serial para enviar dados de volta ao computador a uma certa velocidade de transmissão que é definida pelo programador, de acordo com a necessidade da comunicação, e configurada posteriormente com a IDE. Conforme já comentado anteriormente a taxa de transmissão padrão é de 9600 bits por segundo. Taxa de transmissão (baud rate) mais rápidas permitem que você transmita mais dados em menos tempo, mas também podem gerar erros de transmissão em alguns sistemas de comunicação, então cuidado com experiências aleatórias usando taxas diferentes, seu projeto pode não se comportar como o esperado. Um segundo argumento opcional configura os dados, paridade e bits de parada. O padrão é 8 bits de dados, sem paridade, um bit de parada, observe a sintaxe dessa função: Serial.begin(velocidade) Serial.begin(velocidade, configuração) Serial: objeto de porta serial. velocidade: em bits por segundo (baud). Tipos de dados permitidos: long. configuração: define dados, paridade e bits de parada. Os valores válidos são vários, 24 no total, aqui neste livro mostrarei os três principais, que são: SERIAL_8N1 (esse é o padrão da IDE), SERIAL_5E1 (paridade par) e SERIAL_5O1 (paridade ímpar); caso queira conhecer todas as configurações válidas acesse o site do Arduino oficial, arduino.cc/reference/en/language/functions/communication/serial/begin/. Exemplo de um código: void setup() { Serial.begin(9600); } void loop() {} Além da porta USB também, o Arduino possui dois pinos são reservados para comunicação serial, conforme visto anteriormente neste livro, os https://www.arduino.cc/reference/en/language/functions/communication/serial/ifserial https://www.arduino.cc/reference/en/language/functions/communication/serial/available https://www.arduino.cc/reference/en/language/functions/communication/serial/availableforwrite https://www.arduino.cc/reference/en/language/functions/communication/serial/begin https://www.arduino.cc/reference/en/language/functions/communication/serial/end https://www.arduino.cc/reference/en/language/functions/communication/serial/find https://www.arduino.cc/reference/en/language/functions/communication/serial/finduntil https://www.arduino.cc/reference/en/language/functions/communication/serial/flush https://www.arduino.cc/reference/en/language/functions/communication/serial/parsefloat https://www.arduino.cc/reference/en/language/functions/communication/serial/parseint https://www.arduino.cc/reference/en/language/functions/communication/serial/peek https://www.arduino.cc/reference/en/language/functions/communication/serial/print https://www.arduino.cc/reference/en/language/functions/communication/serial/println https://www.arduino.cc/reference/en/language/functions/communication/serial/read https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytes https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytesuntil https://www.arduino.cc/reference/en/language/functions/communication/serial/readstring https://www.arduino.cc/reference/en/language/functions/communication/serial/readstringuntil https://www.arduino.cc/reference/en/language/functions/communication/serial/settimeout https://www.arduino.cc/reference/en/language/functions/communication/serial/write https://www.arduino.cc/reference/en/language/functions/communication/serial/serialevent pinos 0 e 1 do Arduino servem para comunicar placas entre si, por exemplo, usando a comunicação serial, o Arduino Mega possui quatro pares de pinos serial e podem ser configurados com taxa de transmissão distintas, olhe o exemplo abaixo: void setup() { Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); } void loop() {} Agora que já inicializamos a comunicação serial vamos enviar uma mensagem para a tela do computador, usando Serial.print(). o Função Serial.print() O uso do comando Serial.print irá enviar os dados para o seu computador como texto ASCII, que é a forma legível para os humanos, na tabela abaixo temos quatro colunas, a “Caracter” (é a forma de texto que entendemos), “Dec”, “Oct” e “Hex”. Quando escrevemos algo dentro dos parênteses do Serial.print entre aspas “ “, isso diz para o meu Arduino que a informação a ser enviada é uma string, ou seja uma palavra, e será impresso no monitor serial exatamente a informação entre os parênteses, por exemplo: void setup() { Serial.begin(9600); // inicia a comunicação serial } void loop() { Serial.print("Livro sobre Arduino..."); } Escreva esse código em sua IDE, conecte o Arduino e transfira o sketche para sua placa, observe o passo a passo abaixo: Passo 1: Programa escrito Passo 2: Click em ferramentas Passo 3: Selecione a placa conectada Passo 4: Selecione a porta COM detectada Passo 5: Click na seta para direita (Carregar) Quando seu sketche for carregado no microcontrolador do Arduino abra o monitor serial clicando no ícone da Loopa conforme imagem abaixo: Passo 6: Abrindo Monitor Serial Agora observe na imagem abaixo, é isso o que você verá no seu monitor serial após carregar o código Percebeu que você mandou escrever apenas 1 vez a mensagem “Livro sobre Arduino…” porém o programa está imprimindo várias vezes? Isso se deve ao que aprendemos sobre a função loop, ela é a responsável de repetir sempre os comandos que estiverem entre as chaves de seu void, também tem outro ponto que gostaria que observasse, o seu Arduino está imprimindo sempre na mesma linha, e se eu quisesse que essa impressão fosse sempre em outra linha, ou seja, toda vez que o loop reiniciasse a impressão fosse na linha posterior, pois é isso que o próximo tópico irá ensinar. o FunçãoSerial.println() A diferença desse comando agora para o anterior é o “ln” no final do Serial.print, esse “ln” que forma o comando Serial.println garantirá que a próxima vez que o código ver outro comando Serial.print ele será impresso na linha abaixo do anterior, vejamos o exemplo abaixo que é o mesmo do anterior, apenas adionando o “ln” no comando Serial.print. void setup() { Serial.begin(9600); } void loop() { Serial.println("Livro sobre Arduino..."); } Agora, após carregar o código em seu Arduino, observe como ficará a impressão no Monitor Serial. Tanto o Serial.print quanto o Serial.println quando recebem dentro de seus parênteses uma letra ou palavra que não esteja entre aspas isso significa que neles tem uma variável e o que será impresso na tela do seu Monitor Serial será o que está carregado na variável escrita, para esclarecer vamos entender o que é variável, quais seus tipos e especificações técnicas mais à frente no próximo tópico deste livro, no momento só acredite q a palavra “frase” contém a mensagem: “Gosto de estudar Arduino.”, logo se eu escrever o código abaixo e carregar no meu Arduino o que será que vai ser impresso no meu monitor serial? String frase="Gosto de estudar Arduino."; void setup() { Serial.begin(9600); } void loop() { Serial.println(frase); } Observe que agora o que é passado dentro do Serial.print não contém mais as aspas, temos a palavra “frase”, porém confira na imagem abaixo o que é impresso no Monitor Serial do seu Arduino. Os comandos Serial.print e Serial.println também podem receber um parâmetro opcional que possibilitará a formatação do valor que será enviado pela porta de comunicação serial, ou seja, por padrão o que é enviado é em caracter, como foi dito anteriormente, a linguagem que nós humanos entendemos, mas também posso “forçar” o Arduino para que quando envie a informação para o computador o faça formatado para uma das outras três formas da tabela ASCII que mostramos no tópico anterior: BIN, DEC e HEX. Dessa forma a sintaxe ficaria assim: Serial.print(informação, formatação) Serial.println(informação, formatação) Vamos exemplificar para ficar mais fácil o entendimento: void setup() { Serial.begin(9600); } void loop() { Serial.println(“Testando valores: “); Serial.println(64, BIN); Serial.println(64, DEC); Serial.println(64, HEX); } Após carregar o código, observe o que é escrito em sua tela: Volte no livro e confira na tabela ASCII o que representa o número 64 em BIN (Binário), DEC (Decimal) e HEX (Hexadecimal), assim confirmamos a veracidade e importância da tabela ASCII na vida de um programador. o Concatenando a função Serial.println() Caso eu queira escrever 3 informações em uma linha e após isso quebrar a linha, precisarei escrever linhas de código usando o Serial.print e a última linha dessa lógica usando o Serial.println, observe o exemplo abaixo, agora iremos usar uma variável “x” que nela será carregado um valor 4, e o que eu quero que seja impresso é a seguinte frase: “Estudo esse livro 4 horas por dia.” int x=4; void setup() { Serial.begin(9600); } void loop() { Serial.print("Estudo esse livro "); Serial.print(x); Serial.println(" horas por dia."); } Confira que somente o último Serial.print é que recebe o comando de quebra de linha “ln”, agora observe como será impresso no monitor Serial após carregar o código. Legal, não é? Mas para isso acontecer eu tive que escrever 3 linhas de código, agora vamos aprender a fazer isso em uma linha só, esse método é chamado de concatenação de Strings. Para obter o mesmo resultado, porém usando apenas uma linha de código eu preciso entender de concatenação, que é executada com o comando + porém tendo que ser escrito entre Strings, ou seja palavras. Concatenação é um termo usado em ciências da computação para designar a operação de unir o conteúdo de duas ou mais strings. Por exemplo, considerando as strings "casa" e "mento" a concatenação da primeira com a segunda gera a string "casamento". Logo, observamos em nosso código que temos uma variável inteira junto com a frase que queremos obter, se a concatenação é a operação de unir duas ou mais https://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o https://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o https://pt.wikipedia.org/wiki/String https://pt.wikipedia.org/wiki/String strings, como faremos para unir também a variável inteira, ou seja o x do meu sketche? Para isso, será necessário aplicar o comando que transforma uma variável do tipo inteiro em uma variável do tipo string, sua sintaxe é a seguinte: String(variável a ser modificada o tipo); A palavra String, atentar para o “S” maiúsculo, junto com a variável que desejamos modificar entre parênteses, gerará um resultado de uma variável modificada para o tipo string. int x=10; //x é uma variável do tipo inteiro que recebe o número 10 Serial.println(x); //Será impresso 10, porém é 10 em forma decimal Serial.println(String(x)); //Será impresso 10, porém é 10 em forma de //cadeia, palavra. Então, alterando o programa anterior, ficaremos com o mesmo resultado porém o sketche será assim: void setup() { Serial.begin(9600); } void loop() { Serial.println("Estudo esse livro " + String(x) + " horas por dia."); } Já que estamos falando de variáveis vamos logo conhecer os tipos que mais usamos com o Arduino. ● Conhecendo os tipos de variáveis a) String() Formalizando e explicando mais tecnicamente o comando que aprendemos no tópico anterior, este comando constrói uma instância da classe String. Ou seja, pega uma variável que era de qualquer outro tipo e ao colocá-la dentro dos parênteses da String, essa variável que era por exemplo do tipo inteiro (um número, como no exemplo anterior) irá se transformar em uma palavra, você verá um número, mas para o seu código agora aquilo é uma palavra, ou seja, se você posteriormente quiser somar essa variável que você mudou para String o código dará um erro, muito importante, duvida? Faz um teste, transforma uma variável inteira em string e depois tenta somá-la com outro número. Existem várias versões que constroem Strings a partir de diferentes tipos de dados (ou seja, formata-os como sequências de caracteres), incluindo: • uma sequência constante de caracteres, entre aspas duplas (ou seja, uma matriz de caracteres) • um único caractere constante, entre aspas simples • outra instância do objeto String • um número inteiro constante ou número inteiro longo • um número inteiro constante ou número inteiro longo, usando uma base especificada • uma variável inteira ou longa • uma variável inteira ou longa, usando uma base especificada • float ou double, usando uma casa decimal especificada Construir uma String a partir de um número resulta em uma string que contém a representação ASCII desse número, lembra da tabela ASCII que apresentamos em tópicos anteriores? O padrão é a base dez, por exemplo: String thisString = String (13); fornece a string "13". Observe as aspas no número 13, logo já aprendemos outra coisa, que tudo que está entre aspas é uma palavra. Se após o número tiver uma vírgula é porque não iremos utilizar a base 10 que é a padrão, observe a sintaxe e o parâmetro desse tipo de declaração: Sintaxe String (val) String (val, base) String (val, decimalPlaces) Parâmetros val: uma variável para formatar como uma String. Tipos de dados permitidos: string, char, byte, int, long, sem sinal int, sem sinal long, float, double. base: (opcional) a base na qual formatar um valor integral. decimalPlaces:somente se val for float ou double. As casas decimais desejadas. b) array Um array é uma declaração do tipo matriz que é uma coleção de variáveis que serão acessadas com um número de índice. As matrizes podem vir a ser complicadas, não a usaremos em nosso curso, por isso não iremos entrar em detalhes com esse tipo de variável, aconselho a acessar o site arduino.cc e estudar mais sobre esse tipo de variável na aba “referência”, porém o uso de matrizes simples é relativamente fácil, veja o exemplo abaixo: Todos os métodos abaixo são formas válidas de criar (declarar) uma matriz. int myInts [6]; • Você pode declarar uma matriz sem inicializá-la como em myInts. int myPins [] = {2, 4, 8, 3, 6}; • Em myPins, declaramos uma matriz sem escolher explicitamente um tamanho. O compilador conta os elementos e cria uma matriz do tamanho apropriado. int mySensVals [6] = {2, 4, -8, 3, 2}; • Finalmente, você pode inicializar e dimensionar sua matriz, como em mySensVals. char message [6] = "olá"; • Observe que, ao declarar uma matriz do tipo char, é necessário mais um elemento que a sua inicialização para manter o caractere nulo necessário. E para eu ler? O que tem dentro da matriz? A referência da matriz inicia no Zero, ou seja, o primeiro elemento dela é indexado em zero. Isso também significa que em uma matriz com dez elementos, o índice nove é o último elemento. Conseqüentemente: int myArray[10]={9, 3, 2, 4, 3, 2, 7, 8, 9, 11}; Então caso eu queira acessar o índice 9 da minha matriz, que é a posição 10, basta escrever o comando abaixo: // myArray[9] contains 11 Caso eu tente acessar o índice 10, será gerado um erro, pois ele não existe nessa matriz, existe 10 elementos distribuídos do 0 ao 9. // myArray[10] is invalid and contains random information (other memory address) c) bool Uma variável bool só contém 2 tipos de valores possíveis, verdadeiro ou falso, observe a sintaxe dela logo abaixo. Sintaxe bool var = val; Parâmetros var: nome da variável. val: o valor a ser atribuído a essa variável. d) boolean boolean é um tipo não padrão para bool definido pelo Arduino, ele é usado em outras linguagens. É recomendável usar o tipo padrão bool, que é idêntico. e) byte A codificação de caracteres que já estudamos neste livro, denominada ASCII (American Standard Code for Information Interchange) adotou a informação de que 1 byte equivale a 8 bits usando exclusivamente a base binária (valores 0 ou 1), ou seja, um byte é uma sequência de 8 zeros ou uns, logo isso me retorna 256 valores diferentes de caracteres para representação de texto nos computadores, padronizando desta forma as operações entre diferentes dispositivos. Sintaxe byte var = val; Parâmetros var: nome da variável. val: o valor a ser atribuído a essa variável. f) char Um tipo de dados usado para armazenar um valor de caractere. Para usar um único caracter usa-se aspas simples ‘A’, no caso de vários caracteres juntos seria aspas duplas “ABC”. Os caracteres são armazenados como números, no entanto. Você pode ver a codificação específica no gráfico ASCII. Isso significa que é possível fazer aritmética em caracteres, nos quais o valor ASCII do caractere é usado (por exemplo, 'A' + 1 tem o valor 66, uma vez que o valor ASCII da letra maiúscula A é 65). Essa variável causa muita confusão e erros de implementação de códigos quando trabalhamos com conexão Bluetooth, por exemplo, quando desenvolvemos um aplicativo de celular que controla um carro para frente e para trás e nesse aplicativo definimos que para o carro ir para frente será apertado o botão verde que irá enviar um dado que programei ser ‘a’, e quando apertar o botão vermelho o app irá enviar um dado que programamos ser ‘b’ ao Arduino, e lá em nossa placa de Arduino tempos que programá-la de acordo com o que o app envia, ou seja, caso o Arduino receba a letra ‘a’ ele irá girar os motores no sentido horário movimentando o carro para frente, e caso receba ‘b’ a ação será girar o motor no sentido anti-horário fazendo com que o carro se movimente para trás, porém, o seu arduino quando receber o carácter ‘a’ que você programou no seu aplicativo, na verdade ele irá receber o decimal 97, então para que seu robô funcione como o esperado, ele deveria esperar o valor 97, onde é o referente a ‘a’ na tabela ASCII, que já vimos anteriormente e pelo que você pode perceber iremos consultá-la ainda muitas vezes, logo, guarde-a com muito carinho. O tamanho do tipo de dados char é de pelo menos 8 bits. É recomendável usar apenas char para armazenar caracteres Sintaxe char var = val; Parâmetros var: nome da variável. val: o valor a ser atribuído a essa variável. g) double Número de ponto flutuante de precisão dupla, um ponto flutuante é A representação em Ponto Flutuante é o modo como o computador representa números reais. Por exemplo o número 52,258 é representado na notação científica como 0,52258 X 10^2. No Uno e em outras placas baseadas em ATMEGA, isso ocupa 4 bytes. No Arduino Due, os duplos têm precisão de 8 bytes (64 bits). Sintaxe duplo var = val; Parâmetros var: nome da variável. val: o valor a ser atribuído a essa variável. h) float Tipo de dados para números de ponto flutuante, ou seja um número que possui um ponto decimal. Números de ponto flutuante são freqüentemente usados para aproximar valores analógicos e contínuos porque eles têm maior resolução que números inteiros. Os números de ponto flutuante podem ser tão grandes quanto 3,4028235E + 38 e tão baixos quanto -3,4028235E + 38. Eles são armazenados como 32 bits (4 bytes) de informação. Logo não aconselhamos o uso da declaração Float quando não for necessário, se você só vai usar números inteiros não use float pois ela ocupa mais espaço na memória de seu programa. Agora se você está fazendo cálculos matemáticos, é interessante usar o float senão seu programa tratará o resultado como numero inteiro no caso de uma divisão que gere como resultado uma fração por exemplo. Sintaxe float var = val; Parâmetros var: nome variável. val: o valor que você atribui a essa variável. E por falar em número inteiro vamos ver esse tipo de variável inteiro agora. i) Int Chegamos no tipo de variável que apareceu no programa, o tipo inteiro. Os inteiros são seu tipo de dados que mais usamos no Arduino, usamos até desnecessariamente caindo na mesma condição do float, usamos o int onde poderíamos usar o bool que é um tipo de declaração que só recebe dois tipos de números, 1 ou 0 (zero).. No Arduino Uno (e em outras placas baseadas em ATmega), um int armazena um valor de 16 bits (2 bytes). Isso gera um intervalo de -32.768 a 32.767 (valor mínimo de -2 ^ 15 e um valor máximo de (2 ^ 15) - 1). Nas placas baseadas em Arduino Due e SAMD (como MKR1000 e Zero), um int armazena um valor de 32 bits (4 bytes). Isso gera um intervalo de -2.147.483.648 a 2.147.483.647 (valor mínimo de -2 ^ 31 e um valor máximo de (2 ^ 31) - 1). Observe que estamos sempre falando de “armazena um valor”, quando a variável excede sua capacidade máxima ou mínima, elas transbordam . O resultado de um estouro é imprevisível, portanto, isso deve ser evitado. Sintaxe int var = val; Parâmetros var: nome variável. val: o valor que você atribui a essa variável. j) long Variáveis longas são variáveis de tamanho estendido, é um qualificador, você pode ter uma declaração de um numero e alongar seu armazenamento incluindo o “long”. Ela armazena 32 bits (4 bytes), de -2.147.483.648 a 2.147.483.647. Se estiver fazendo contas com números inteiros, pelo menos um dos números deve ser seguido por um L, forçando-o a ser longo. Vamos fazer um exemplo: Digite esse código, carregue em seu Arduino e observe no Monitor Serial que o número carregado navariável “x” impressa incrementa até 255 e depois zera recomeçando, ou seja, estourou a pilha de armazenamento da declaração tipo byte que como vimos no tópico anterior ela varia de 0 a 255. byte x=0; void setup() { Serial.begin(9600); } void loop() { x++; Serial.println(x); } Agora inclua o formatador “long” entre a declaração e a varável, você verá na impressão na tela, após passar o código, que o valor gerado agora armazena números maiores do que 255. byte long x=0; void setup() { Serial.begin(9600); } void loop() { x++; Serial.println(x); } k) short O “short” é um tipo de variável de dados de 16 bits. Em todos os Arduinos (baseados em ATMega e ARM), um short armazena um valor de 16 bits ou seja 2 bytes. Isso gera um intervalo de -32.768 a 32.767 (valor mínimo de -2 ^ 15 e um valor máximo de (2 ^ 15) - 1). Sintaxe short var = val; Parâmetros var: nome variável. val: o valor que você atribui a essa variável. l) string String é uma cadeia de textos, usamos ela entre aspas e sempre quando quisermos representar uma palavra. Exemplo: Serial.begin(9600); String frase = "Hoje estou cansado."; Serial.print(frase); Pronto caros makers, agora você pode dizer que conhece os principais tipos de variáveis usados no Arduino, seguindo em nosso código, a próxima linha entra numa função chamada “void”, em especial a “void setup”, então se o programa mencionou ela (que sempre vai mencionar) então vamos aprender mais sobre essa função. ● Controlando o tempo Ação de muita relevância e importância na Robótica, o poder de controlar o tempo, precisamos saber administrar o tempo dentro do código, aquele pequeno atraso para dar tempo a leitura do sensor, ou o servo-motor concluir seu objetivo, e para piscar o led? Preciso intercalar em ligado e desligado, esse intervalo de tempo ligado e desligado é alcançado programando o tempo. E para nossa sorte a IDE Arduino já traz um pacote incluso com quatro funções que me permite controlar o tempo dentro do Sketche, são elas: delay(), delayMicroseconds(), micros() e millis(). Neste tópico iremos aprender cada uma delas, exemplificar e programar, vamos lá. o Função delay() Pausa o programa pelo período de tempo (em milissegundos) especificado como parâmetro dentro dos parênteses. (1000 milissegundos equivalem a um segundo) Sintaxe: delay(tempo de pausa em milissegundos) Exemplo: O código pausa o programa por um segundo antes de alternar o pino de saída. int ledPin = 13; // LED conectado ao pino digital 13 void setup () { pinMode (ledPin, OUTPUT); // define o pino digital como saída } void loop () { digitalWrite (ledPin, HIGH); // acende o LED delay (1000); // aguarda um segundo digitalWrite (ledPin, LOW); // desliga o LED delay (1000); // aguarda um segundo } Embora seja fácil fazer um projeto de um LED piscando com a função delay() e muitos makers e estudantes usam o delay que querem apenas um atraso curto para tarefas como troca de switch, porém não se acostume com essa “facilidade”, pois o uso de delay() em um projeto apresenta desvantagens significativas. Nenhuma outra leitura de sensores, cálculos matemáticos ou manipulação de pinos pode continuar enquanto seu sketche estiver parado na linha do delay, durante a função de atraso; portanto, na verdade, ela interrompe todo o programa, simplesmente ele para ali, e se no caso seu projeto não pode parar de monitorar um sensor, fique sabendo que quando você usa o delay o restante do código é esquecido naquele momento, logo seu sensor não estará sendo monitorado. Por isso que iremos ensinar a técnica millis(), último tópico deste capítulo, logo, enquanto não chegamos no millis vamos conhecer outra função que também faz atrasar seu programa. o Função delayMicroseconds() Caso você precise de um tempo de espera menor ou fração de milissegundos essa função virá no momento certo, o delayMicroseconds pausa o programa pela quantidade de tempo (em microssegundos) especificada pelo parâmetro. Para eu obter uma pausa de 1 milissegundos será preciso escrever entre os parênteses o valor 1000. Atualmente, o maior atraso preciso é com o valor de 16383, que equivale a 16,383 milissegundos ou 0,016 segundos. Isso pode mudar em versões futuras do Arduino. Para atrasos superiores a 15000 microssegundos aconselhamos você a usar o delay (). Sintaxe: delayMicroseconds(tempo de pausa em microssegundos) O parâmetro dentro do parênteses só é permitido se for do tipo unsigned int . Exemplo: O código pausa o programa por 100 microssegundos antes de alternar o pino de saída. int ledPin = 8; // LED conectado ao pino digital 8 void setup () { pinMode (ledPin, OUTPUT); // define o pino digital como saída } void loop () { digitalWrite (ledPin, HIGH); // acende o LED delayMicroseconds (100); // aguarda 100 microsegundos digitalWrite (ledPin, LOW); // desliga o LED delayMicroseconds (100); // aguarda 100 microsegundos } Esta função só trabalha com segurança de precisão com um valor de delay acima de 3 microsegundos, não tente usá-la com valores menores que esse. o Função micros () A função micros () não é uma função para ser usada para causar um retardo em seu programa, ela na verdade, quando chamada dentro do código, retorna o número de microssegundos desde que a placa Arduino começou a executar o programa atual. Esse número irá exceder, ou seja, voltar a zero, após aproximadamente 70 minutos de placa ligada, ou seja, a cada 70 minutos essa contagem reinicia, isso em placas Arduino com cristal de 16 MHz como por exemplo, Duemilanove e o Arduino Nano, e o valor retornado tem uma resolução de quatro microssegundos (ou seja, o valor retornado é sempre um múltiplo de quatro). Já em placas Arduino de 8 MHz como por exemplo, o Arduino LilyPad, essa função tem uma resolução de oito microssegundos. Sintaxe: time = micros () A variável time deve ser declarada como unsigned long. Exemplo: O código retorna o número de microssegundos desde que a placa Arduino foi inicializada. unsigned long time; void setup () { Serial.begin (9600); } void loop () { Serial.print ("Hora:"); time = micros (); Serial.println (time); // imprime o tempo desde o início do //programa delay (1000); // espera um segundo para não enviar grandes //quantidades de dados } o Função millis A função millis() é semelhante a micros(), porém ela retorna o número de milissegundos desde que a placa Arduino começou a executar o programa atual. Essa contagem dura bem mais antes da pilha estourar (resetar a contagem) esse número só irá exceder, ou seja voltar a zero, após 50 dias de placa ligada, ou seja, a cada 50 dias essa contagem reinicia contanto que o tipo de variável que irá receber a contagem do millis seja declarado como unsigned long, tal qual a função micros. Sintaxe: time = millis() A variável time deve ser declarada como unsigned long. Exemplo: O código retorna o número de milissegundos desde que a placa Arduino foi inicializada. unsigned long time; void setup () { Serial.begin (9600); } void loop () { Serial.print ("Hora:"); time = millis (); Serial.println (time); // imprime o tempo desde o início do //programa delay (1000); // espera um segundo para não enviar grandes //quantidades de dados } ● Fazendo umas continhas com Arduino Ôpa, calma, não precisa fechar o livro, esse livro não é da temida matemática, porém ela é fundamental para qualquer atividade em nossa vida e no caso de projetos embarcados como a Robótica usando o Arduino não poderia ser diferente. A IDE Arduino nos disponibiliza alguns comandos que permitem a execução de cálculos matemáticos em seu microcontrolador AtMega como por exemplo:Operadores Aritméticos: resto, multiplicação, divisão, adição subtração e operador de atribuição. Funções Matemáticas: Cálculo do valor absoluto, intervalo de valores, regra de três, potência, quadrado, raiz quadrada, mínimo e máximo. Funções Trigonométricas: Cosseno, Seno e Tangente. Neste livro não iremos nos aprofundar em todas, iremos estudar as mais usadas e que precisaremos para aplicar em nossas prática e projeto final, pois continua conosco nessa rica leitura. o Operadores aritméticos ( % ) Resto A operação resto, também conhecido como módulo, calcula o resto da divisão de um número inteiro por outro. Atenção para não confundir o símbolo % que se refere ao resto da programação como operador (%) da matemática que se refere a divisão, na computação a divisão é é calculada através do símbolo ( / ). Tenha atenção também que apesar do nome módulo, cuidado para não confundir o módulo do operador (%) da computação com o módulo da matemática (| x |), que na linguagem arduino é calculada através da função abs (). Sintaxe: resto = dividendo % divisor A variável time deve ser declarada como unsigned long. Parâmetros: resto: variável. Tipos de dados permitidos: int, float, double dividendo: variável ou constante. Tipos de dados permitidos: int divisor: variável ou constante diferente de zero. Tipos de dados permitidos: int Exemplo: int x = 0; x = 7 % 5; // x agora contém 2 x = 9 % 5; // x agora contém 4 x = 5 % 5; // x agora contém 0 x = 4 % 5; // x agora contém 4 ( + ) Adição Comando básico da aritmética, simples como na matemática, o símbolo de ( + ) escrito entre dois operandos irá realizar a soma desses valores. Sintaxe: soma = operando1 + operando2; Parâmetros: soma: variável. Tipos de dados permitidos: int, float, double, byte, short e long operando1: variável ou constante. Tipos de dados permitidos: int, float, double, byte, short e long operando2: variável ou constante diferente de zero. Tipos de dados permitidos: int, float, double, byte, short e long Exemplo: A prática apresentada abaixo irá imprimir o valor da soma, variável “c”, entre as variáveis “a” e “b” a cada 1 segundo, porém toda vez que o programa reiniciar o loop a variável “a” irá receber o valor de “b” e a variável “b” irá receber o valor de “c”. int a = 10; int b= 7; int c; void setup(){ Serial.begin(9600); } void loop(){ c = a + b; Serial.println(c); a=b; b=c; delay(1000); } Vamos ver como ficaria: Segundo 01: a=10, b=7 e c=17 Segundo 02: a=7, b=17 e c=24 Segundo 03: a=17, b=24 e c=41 E assim sucessivamente, legal não é? Então vamos continuar desbravando os operadores matemáticos agora com a operação de subtração. ( - ) Subtração Outro comando básico da aritmética, agora é o oposto da soma, o símbolo de ( - ) escrito entre dois operandos irá realizar a subtração desses valores. Sintaxe: subtracao = operando1 - operando2; Parâmetros: subtração: variável. Tipos de dados permitidos: int, float, double, byte, short e long operando1: variável ou constante. Tipos de dados permitidos: int, float, double, byte, short e long operando2: variável ou constante diferente de zero. Tipos de dados permitidos: int, float, double, byte, short e long Exemplo: A prática apresentada abaixo irá imprimir o valor da subtração, variável “c” recebe a diferença entre as variáveis “a” e “b” a cada 1 segundo, porém toda vez que o programa reiniciar o loop a variável “b” irá ser incrementado +1 em seu valor, assim você observará que a resposta “c” chegará a um momento em que será negativo, logo a operação de subtração pode causar overflow se o resultado é menor que o que pode ser armazenado no tipo de dado (ex. subtrair 1 de um int com valor - 32,768 resulta em 32,767). int a = 10; int b= 1; int c; void setup(){ Serial.begin(9600); } void loop(){ c = a - b; Serial.println(c); b++; //soma mais 1 unidade ao valor que tem em b delay(1000); } ( * ) Multiplicação O operador de multiplicação usado na programação Arduino é o ( * ) escrito entre dois operandos irá realizar a multiplicação desses valores. Sintaxe: multiplicação = operando1 * operando2; Parâmetros: multiplicação: variável. Tipos de dados permitidos: int, float, double, byte, short e long operando1: variável ou constante. Tipos de dados permitidos: int, float, double, byte, short e long operando2: variável ou constante diferente de zero. Tipos de dados permitidos: int, float, double, byte, short e long Exemplo: Observe o exemplo abaixo, iremos multiplicar duas variáveis do tipo float, porém o resultado eu declarei como int, logo o número fracionário que esperávamos será descartado e será mostrado apenas a parte inteira. float a = 10.2; float b= 2.3; int c; c= a*b; // O resultado esperado seria 23,46, porém será armazenado apenas o valor 23 ( / ) Divisão O operador de divisão usado na programação Arduino é o ( / ) escrito entre dois operandos irá realizar a multiplicação desses valores. Sintaxe: divisão = numerador / denominador; Parâmetros: divisão: variável. Tipos de dados permitidos: int, float, double, byte, short e long numerador: variável ou constante. Tipos de dados permitidos: int, float, double, byte, short e long denominador: variável ou constante diferente de zero. Tipos de dados permitidos: int, float, double, byte, short e long Atenção: O denominador não pode ter valor zero. Exemplo: float a = 10.2; float b= 2.3; //pode ser qualquer valor diferente de zero int c; c= a / b; o Calculando a potência Lembra do elevado ao quadrado da matemática? Pois isso é um número elevado a potência 2 e é exatamente isso que a função pow() faz, ela calcula o valor de um número elevado a uma potência. pow () também pode ser usado usado para aumentar um número para uma potência fracionária, que nesse caso seria uma raiz, também serve para gerar mapeamento exponencial de valores ou curvas, como medidas de temperaturas usando termistores. Sintaxe: pow(base, expoente); Parâmetros: base: o número. Tipos de dados permitidos: float. expoente: a potência ao qual a base é elevada. Tipos de dados permitidos: float Exemplo: z=pow (x , y); o Calculando a raiz quadrada A função sqrt() calcula a raiz quadrada de um número, que na matemática, a raiz quadrada de um número “x” é um número único e não negativo que quando multiplicado por si próprio se iguala ao número “x”. Sintaxe: sqrt(x); Parâmetros: x: o número. Tipos de dados permitidos: qualquer tipo de dados. Exemplo: z=sqrt(x); ● Brincando de sortear o Função random() E para encerrar nossa primeira parte do livro de conceituação na programação Arduino, temos a função random(), usando ela o programa gera falsos sorteios de números, por que falamos de falsos sorteios? Na verdade a função é programada para iniciar sempre com o mesmo valor a partir deste, ir gerando valores “aleatórios”. Sintaxe: random(max); random(min, max); Parâmetros: min: limite inferior do valor aleatório, entra no sorteio. max: limite superior do valor aleatório, não entra no sorteio. Exemplo: long sorteio; void setup () { Serial.begin (9600); randomSeed (analogRead (0)); } void loop () { // imprime um número aleatório de 0 a 999 sorteio = random (1000); Serial.println (sorteio); // imprime um número aleatório de 35 a 54 sorteio = aleatório (35, 55); Serial.println (sorteio); delay (50); } Lembra do que falamos no início deste tópico? De que a função random() sempre inicia com um mesmo número? Pois bem, para resolver esse impasse podemos chamar no setup a função randomSeed(), esta função gera números “sementes” diferente, assim a cada reinicializaçãodo Arduino a função random irá iniciar com um número diferente de sequência de sorteio. Agora tire seus componentes do Organizador e vamos começar a montar projetos. Capítulo 03 – Arduíno controlando as coisas Ligando as coisas no Arduino Só fazer o Arduino processar e apresentar as informações em nossa tela não é o objetivo dessa super placa, sua criação e desenvolvimento foi para integrar a programação para ligar e movimentar as coisas em nosso meio com suas portas de entrada e saída conforme estudamos em tópicos anteriores. Essas portas são o meio de comunicação entre o processador e o mundo fora dele, tudo que você programar no AtMega328P, processador do Arduino UNO por exemplo, e definir alguma ação nessas portas ela será obedecida pelo Arduino e a mágica acontecerá. Comparando com uma pessoa, é como se nós fossemos o Arduino, nosso cérebro o processador, o AtMega por exemplo, nossas articulações os motores e nossos olhos as portas definidas na programação Arduino como entrada e nossa boca a porta definida na programação Arduino como uma porta de saída. Na porta de entrada que declaramos como olhos, temos sensores tipo cameras e na porta de saída que declaramos tipo boca temos um alto-falante conectados, logo podemos fazer um pseudocódigo da seguinte forma: se (olhos==fantasma){ execute(boca, GRITE); } E é exatamente nessa lógica que iremos programar a partir de agora, vamos lá. ● Entradas e saídas digitais. Já vimos em tópicos anteriores que as portas do Arduino são de entrada ou saída de dados variando de acordo com o modelo da placa, iremos trabalhar com o Arduino UNO, onde ela tem 20 portas de entrada e saída de dados sendo 6 portas Analógicas e 14 portas para informações digital. Funcionando o LED Como vimos em tópicos anteriores, oLED é um diodo emissor de luz, possuindo, em nosso primeiro projeto, duas “pernas”, onde a maior deve ser conectada na porta do Arduino e a menor no GND. Considero o LED o componente mais importante da Robótica, pois com ele posso simular qualquer situação em que eu não teria o componente, por exemplo, se desejo que meu projeto aciona uma bomba d’agua, e naquele momento não tenho essa bomba, poderei simulá-la usando um led, onde ele iria ascender na situação em que seria para ligar a bomba, então vamos aprender a controlar esse tal de LED. ● Piscando um LED - Função digitalwrite() Primeiro vamos montar nosso circuito, como devo considerar que você leu os capítulos anteriores e tem o conhecimento do Hardware do Arduino e como é o LED e para que serve o resistor, você deve montar o seu circuito conforme imagem abaixo, dúvidas poderá ser enviado um email para o autor deste livro contato@profsandromesquita.com. mailto:contato@profsandromesquita.com A prática Pisca Led é a porta de entrada para o Arduino, prática clássica que até já vem como exemplo no programa da IDE, logo, decidimos mostrar aqui no blog (exclusivo aqui, não tem no vídeo que você assistiu) três formas diferentes de piscar o Led...Antes de começar monte seu hardware de acordo com a imagem acima: Um resistor de 330 Ohm ligado a porta 13 do Arduino que por sequencia liga-se o outro terminal do resistor na "perna" positiva (anodo) do seu Led, e a perna negativa (Catodo) você ligaria no GND do Arduino, observe a imagem mais detalhada de um LED logo abaixo: Este é o programa inicial do Arduíno, o famoso "Olá Mundo" da programação é feito com o piscar Led no Arduino. Essa saudação entre o Arduíno e o meio exterior é feita comumente usando essa Lógica De Programação onde se escreve um passo a passo de cada estado estado do Led. A primeira linha, int LED=13; declara ao Arduíno que a variável LED é do tipo inteira e está ligada na porta 13 do Arduino. Já dentro da função void setup() o comando pinMode(LED,OUTPUT); configura a porta 13 do Arduino como uma porta de saída, tendo em vista que por padrão de fábrica todas as portas são configuradas como entrada, logo se faz necessário o uso desse comando. Até esse ponto será padrão para os 3 modos de controle da atividade de piscar o Led, a partir da função void loop() é que difere uma lógica da outra. No void loop() temos 4 linhas de programação escrita, o comando digitalWrite(LED, HIGH); que eleva a porta 13 do Arduino para nível lógico alto (5v) ligando o Led, em seguida o chamado delay(1000); para a programação por 1 segundo mantendo o estado do Led ligado por esse período de tempo, logo o Led se apaga pois o comando digitalWrite(LED, LOW); baixa o nível lógico da porta para 0 (0v) e novamente espera 1 segundo com o comando delay(1000); A segunda forma que gostaria de apresentar da Prática Pisca LED invertendo o status da variável que está declarada...como assim? Calma..continue lendo este livro que você vai entender que você vai entender. Nessa lógica de piscar o Led, usamos uma programação mais refinada e com isso economizamos uma linha de programação e a aparência do programa parece ser mais agradável e organizada, ela funciona assim: a variável estado recebe valor inicial zero nas declarações de variáveis no início do programa (nível lógico baixo) e como ela está escrita no segundo parâmetro do comando digitalWrite(LED, estado); ele irá receber o valor que está carregado nessa variável, ou seja desligar o Led, após esse comando o programa espera 1 segundo no delay(1000); e em seguida inverte o sentido da variável estado com o comando !estado e em seguida carrega esse novo valor invertido na variável estado com o comando estado=!estado assim quando chegar novamente no digitalWrite(LED, estado); o Led inverterá seu estado de desligado para ligado, por exemplo. A última forma que quero apresentar de Piscar o LED é lendo o status do LED na própria função que executa a ação de piscar, vamos ver como é: Para concluir esta primeira interação do Arduino como mundo exterior apresento a terceira forma de realizar o projeto de piscar o Led, e para isso iremos aprender a usar o comando digitalRead(); que é quem realizada a leitura em uma determinada porta digital do Arduino. A diferença desse programa para os dois mostrados anteriormente é que dentro do comando digitalWrite(LED, !digitalRead(LED)); no lugar da variável estado usa-se o comando de leitura da porta digital digitalRead();, ou seja, o Arduíno verifica o estado atual da porta e inverte o estado dela, de 0 para 1 por exemplo, toda vez que entrar na função usando o comando ! antes do digitalRead(LED); sempre esperando um segundo a cada execução dessa linha. Esse programa fica mais enxuto e inteligente sendo considerado um programa bem escrito. Revisando os comandos que aprendemos nesse post : ● digitalWrite(porta,estado): responsável por escrever em uma porta digital ● digitalRead(porta); responsável por ler em uma porta digital ● delay(atraso); responsável por realizar um atraso no programa ● pinMode(porta,modo); responsável por configurar a porta do Arduino com saída ● Oscilando um LED - Função analogwrite() Além do comando binário (que só atende 2 estados, 1 ou 0, ligado ou desligado) aplicado ao LED, pode também controlar o seu nível de luminosidade, como vimos na pinagem do Arduino no Capítulo anterior, através das portas especiais 3, 5, 6, 9, 10 e 11, que são portas PWM o Arduino pode “transformar” a saídas destas portas que seriam digitais em analógica criando um pulso com modulação em cada porta destas citadas acima, e o que é essa Modulação por Largura de Pulso conhecido como PWM (Pulse Width Modulation)? PWM (Pulse Width Modulation) PWM é o conceito de pulsar rapidamente o sinal digital na saída da porta do Arduino, lembra que estudamos que do pino 0 ao 14 do seu Arduino são portas de entrada ou saída digital, ou seja, adotam dois possíveis valores, zero ou um, que equivale a ligado ou desligado,que eletricamente testando na saída das portas teremos 0v ou 5v para o Arduino UNO por exemplo, pois bem e se nessa saída eu quiser uma tensão de 2,5v, ou seja, quero produzir um “meio termo”, nem ligado total, nem desligado, como farei isso se a porta não é analógica e sim digital? É nesse momento que entra nosso amigo PWM que é uma Modulação por Largura de Pulso, seria como o seu Arduino fosse enviar um código Morse, onde para cada frequência de bips dentro de um intervalo de tempo significaria uma letra. A técnica PWM é comumente aplicada no controle de motores elétricos, aquecedores, lâmpadas e Led’s por exemplo, onde justamente será um dos exemplos adotados em nosso livro, o controle PWM para um LED e outro para um motor CC. Então já sabendo que o PWM é a técnica usada para gerar sinais analógicos do Microcontrolador AtMega de seu Arduino e sabendo de sua importância e eficiência nos dias de hoje, neste capítulo vamos aprender os conceitos básicos desta técnica e como ela é aplicada no controle do brilho do LED usando o Arduino. Ao gerar circuitos analógicos de forma digitalmente, os custos do sistema e o consumo de energia podem ser drasticamente reduzidos. Um exemplo atual é o uso do inverter no ar-condicionado, comprovada redução no consumo de energia em relação aos aparelhos tradicionais. Devido à eficiência deste tipo de controle, muitos microcontroladores já incluem controladores PWM no chip, facilitando esta implementação. O sinal PWM é totalmente digital porque em qualquer dado instante de tempo, a alimentação CC ou está totalmente ligada ou completamente desligada. Porém o processo de ligar e desligar dentro de um intervalo de tempo é que forneceria para a carga um sinal analógico, por exemplo, olhe agora para o interruptor da lâmpada de onde você está, se ele estiver ligado, sua lâmpada estará acesa, caso contrário estará desligada, isso é um sinal digital, ou ligado ou desligado, e quando liga ela produzirá sua capacidade de luz máxima. Agora experimente ligar e desligar bem rápido o interruptor, você verá uma sensação de meia luz, porém devido nossa limitação motora ainda perceberemos o processo da luz apagando e acendendo, agora imagine isso sendo feito por um processador na frequência certa e tempo certo, teremos o efeito perfeito do que simulamos com o interruptor da lâmpada, isso é uma modulação PWM. A Figura abaixo mostra três sinais PWM diferentes sendo que a primeira mostra uma saída PWM a um ciclo de trabalho de 75%. Ou seja, o sinal está ligado para 75% do período e desligado nos outros 25%. As Figuras 2 e 3, logo abaixo, mostram as saídas PWM a ciclos de trabalho de 50% e 20%, respectivamente. Estas três saídas PWM codificam três diferentes valores de sinal analógico, a 75%, 50% e 25% da energia de entrada. Como no exemplo a alimentação é de 5V, observe na imagem o quanto de tensão é fornecido para cada ciclo de trabalho. https://www.slideserve.com/ian-willis/aula-06-sinais-anal-gicos Vamos começar então a nossa prática, como vamos montar uma prática de variar o brilho do LED de forma gradual iremos precisar dos seguintes componentes: - 01 Arduino UNO (pode ser outro) - 01 LED de alto brilho Azul (pode ser qualquer outra cor) - 01 Resistor de 470 Ohm - 02 Cabos Jumper - 01 Protoboard de 400 furos (pode ser menor) Com os componentes na mão siga a montagem de acordo com o esquema desenhado abaixo: https://www.slideserve.com/ian-willis/aula-06-sinais-anal-gicos Quando você montar o seu projeto deve ficar parecido com o desta foto abaixo: Agora chegou a hora de programar seu Arduino para ligar esse LED de uma forma gradual e continua, ligando e desligando variando seu brilho gradualmente, então abra sua IDE e vamos começar. [code] /* * Uso do PWM com LED * Aumentando e diminuindo a * intensidade do brilho do LED */ int led=3; //Nomeando a porta 3 como led //A porta 3 do Arduino é PWM void setup() { pinMode(led,OUTPUT);//Define o pino do led //como porta de saída } void loop() { //Sequência de ligar o led gradualmente for (int brilho=0; brilho<=255; brilho++){ analogWrite(led, brilho); //Envia para o led //um valor analógico delay(15);//Aguarda 20 milissegundos p/ aumentar } //Sequência de ligar o led gradualmente for (int brilho=255; brilho>=0; brilho--){ analogWrite(led, brilho); //Envia para o led //um valor analógico delay(15);//Aguarda 20 milissegundos p/ diminuir } } [/code] O que temos de novo neste código é a estrutura de repetição for, ela é responsável por deixar o programa preso nesse loop pela condição determinada no segundo parâmetro de sua especificação, onde compara se a condição atingiu seu valor, vamos explicar melhor pra você entender. Vamos supor que você desobedeceu sua mãe e ela falou assim: - Você vai ficar de castigo no canto da parede por 10 horas! Então, para você não ficar de castigo por mais tempo que o determinado pela mamis, você a cada hora olha pro relógio e compara, "O tempo que estou de castigo é menor ou igual a 10? Se for, preciso continuar no canto da parede, se for 11 já posso sair desse castigo." O "castigo" é o laço de repetição for que vai lhe deixar no canto da sala até que a variável determinada seja atingida, que no nosso caso será uma variável inteira "brilho", então bora entender o que é esse tal de Laço FOR falando tecnicamente: A instrução FOR é usada para repetir um bloco de instruções entre chaves. Um contador de incremento é geralmente usado para incrementar e finalizar o loop sendo útil para qualquer operação repetitiva inclusive variação da tensão na porta de saída do Arduino que será a prática deste tópico. A Syntax é assim: for (valor inicial; condição final; o quanto de incremento) { // o que você quiser fazer ponha aqui } valor inicial: acontece primeiro e somente uma vez. condição final: cada vez que o loop é testado; se for verdade, o bloco de instruções e o incremento forem executados, a condição será testada novamente. Quando a condição se torna falsa, o loop termina. o quanto de incremento: executado sempre através do loop quando a condição for verdadeira. Então como a porta PWM fornece um valor que varia de 0 a 255, onde zero em PWM é 0V em tensão no LED e 255 em PWM é 5V em tensão no LED, a cada vez que o programa entrar no for ele irá somar +1 na variável brilho até atingir o valor 255 e sair desse laço for e partir para a próxima condição de nosso sketch, que é agora a lógica inversa, diminuir o brilho do LED. Vamos fazer outra prática com laço FOR agora variando as portas do Arduino no próximo tópico, assim aprenderemos mais sobre essa estrutura de repetição tão usada em nossos projetos com Arduino. ● Montando uma sequência de LEDS O esquema de montagem de nosso projeto será igual ao da imagem acima desenvolvido no fritzing, caso você não saiba o que é e nem como instalar o Software Fritzen, volte alguns capítulos deste livro, pois publicamos os links dos softwares que precisamos em nossas práticas. A ideia é que o se inicie uma sequência de LED’s ligados, ligando primeiro o LED verde, após 1 segundo desliga-o e liga o LED amarelo, fazendo o mesmo processo quando se passar mais um segundo, desligando agora o LED amarelo e ligando o LED branco, se repetindo o ciclo até que o Arduino seja desligado ou resetado. A programação é simples, usaremos a estrutura de repetição FOR que aprendemos no tópico anterior, porém como sempre temos que aprender uma coisa nova, vamos aplicar o conhecimento do FOR na configuração das portas do Arduino, sabe onde é? Lembra do comando usado? Sim, acertou, no pinMode, se não entendeu, tenha calma,
Compartilhar