Programação com Arduino – Parte 1

Para desenvolver a sua aplicação e colocar as suas ideias em prática com o Arduino, não há como escapar da programação. A escrita do software, mas bem chamado nesse caso de “firmware”, isto é, um programa que será embarcado em microcontrolador, é a etapa mais importante da execução do projeto.

Depois de feito a arquitetura e elaborado os layouts de ligação de todo hardware que fará interface com o Arduino, a próxima etapa é por a mão na massa e escrever o código que irá rodar na sua placa. Vamos entender nesse post como é a estrutura e como é feito um firmware para o Arduino. Vamos relembrar quais os conceitos básicos das linguagens estruturadas que são importantes e vamos te dar as condições de desenvolver as suas primeiras aplicações e andar com as próprias pernas. Vamos lá!

O que você precisa saber para começar a programar um Arduino?

Preparando o seu setup

O primeiro passo para começar a programar o Arduíno é fazer o download e instalar a IDE usada para escrever e gravar os códigos na placa. Essa IDE é open-source e está disponível para Windows, MAC e Linux. O download pode ser feito diretamente na página oficial.

Após instalar a IDE, é necessário fazer as configurações iniciais. São passos simples e também já foram abordados em nosso post “Desenvolvendo com Arduino: Primeiros Passos”.

Basicamente, devemos executar as três etapas abaixo:

  1. Alimentar e conectar o Arduino ao PC pelo cabo USB
  2. Na IDE, selecionar o modelo da placa
    1. Abrir a aba Tools, selecionar a opção Board e depois selecionar Arduino Uno (ou outro modelo que você esteja utilizando)
  3. Selecionar porta serial para a qual a placa foi atribuída
    1. Abrir a aba Tools, selecionar a opção Serial Port e depois selecionar a porta COMX, em que X é o número que o PC associou à porta serial atribuída ao Arduino.

Feitos esses três passos o Arduino a IDE está pronta para ser usada e para gravar os códigos na sua placa.

Qual linguagem o Arduino usa?

A linguagem de programação do Arduino é baseada nas famosas linguagens C e C++ e também na linguagem Wiring.

A linguagem C é dita uma linguagem de baixo nível, isto é, uma linguagem que é próxima da linguagem dos microcontroladores e processadores, na qual temos que programar registradores de bits, manipular a memória e executar instruções do processador. C++ já é uma linguagem de alto nível, ou seja, seu nível de abstração é maior e ela está mais próxima da linguagem humana do que da dos computadores. Em linguagens de alto nível nós não manipulamos a memória e os recursos de hardware diretamente, mas sim por meio de bibliotecas e recursos previamente disponíveis que deixam a linguagem mais transparente para o programador.

A linguagem Arduino utiliza uma série de bibliotecas e recursos para que o usuário não tenha que manipular bits e registradores do microcontrolador. Do ponto de vista do usuário, apenas é utilizado chamadas de funções e escrita de procedimentos lógicos.

Se você já programou alguma dessas linguagens, Arduino não será um problema para você. Se você nunca programou em C/C++, ou mesmo em linguagem nenhuma, também não há problemas! O Arduino é muito intuitivo e toda a parte complexa está encapsulada em bibliotecas e funções.

Como compilar e gravar um programa?

Compilar e gravar um programa no Arduino é muito tranquilo. Primeiro vamos entender o que é compilar um programa de computador.

Compilar, no contexto da programação, significa verificar toda a sintaxe do código e, caso esteja tudo escrito dentro das regras da linguagem, criar o chamado código objeto, que é um outro programa, semanticamente idêntico o que você escreveu, mas que está escrito na linguagem do microcontrolador. O arquivo gerado pelo processo de compilação é exatamente o arquivo carregado no Arduino na hora de gravá-lo.

Para compilar um programa na IDE do Arduino basta utilizar o atalho ctrl+R, ou então, acessar o comando de compilar na aba Sketch -> Verify/Compile.

Agora, depois de compilar um programa, precisamos de gravá-lo em nossa placa. Para fazer isso, certifique-se de que a placa está devidamente conectada na entrada USB do PC e que a mesma foi reconhecida pela IDE.

Se assim for, basta utilizar o atalho Ctrl+U e será feito o upload do código para a placa. Ou então, acesse o comando de fazer upload na aba File -> Upload.

O que você precisa saber para entender um programa em Arduino ?

Um programa de computador possui vários componentes diferentes. Com Arduino não é diferente. Tal como outras linguagens de programação, ele possui variáveis, funções e rotinas, estruturas de controle lógico e por aí vai. Vamos entender os principais componentes de um programa Arduino nessa sessão.

Componentes de um código

Variáveis

Uma variável de um programa é um espaço de memória com tamanho pré-definido associado ao tipo da variável criada. Por exemplo, se você precisa fazer uma conta aritmética simples em seu programa, você pode criar uma variável do tipo Inteiro com o nome de X. Assim você pode escrever a seguinte linha de código:

X = 2+ 3;

O espaço de memória associado à variável X será preenchido com o valor 5.

As variáveis podem ter tipos diferentes. No Arduino, as variáveis podem ser dos seguintes tipos:

  • boolean: valor verdadeiro (true) ou falso (false)
  • char: um caractere
  • Byte: tamanho de 8 bits
  • int: número inteiro de 16 bits com sinal
  • unsigned int: número inteiro de 16 bits sem sinal
  • long: número inteiro de 16 bits com sinal
  • unsigned long: número inteiro de 16 bits sem sinal
  • float: número real de precisão simples (ponto flutuante)
  • double: número real de precisão dupla (ponto flutuante)
  • string: sequência de caracteres
  • void: tipo vazio (não tem tipo)

Dessa forma, dependendo das necessidades matemáticas e características da lógica do seu programa, você vai precisar de declarar variáveis de um tipo ou de outro.

Atribuição de valor

Atribuição de valor é o ato de atribuir a uma variável que foi criada um determinado valor para ser armazenado por ela. Isso é feito em Arduino através do sinal de “ =”.

Veja os exemplos abaixo:

Usando Variáveis no Arduino

Declaração de variáveis no Arduino

No exemplo acima, foi criada uma variável inteira de nome X, e uma variável do tipo float de nome Y. Utilizando o sinal de atribuição, nos armazenamos o valor 5 em X, e 1.3 em Y.

Funções e rotinas

Funções e rotinas são trechos de código separados da estrutura principal do programa que realizam uma determinada tarefa e podem ou não retornar um resultado. Na definição clássica, funções são trechos de código que retornam um valor e rotinas são funções que não retornam nada. No entanto esses dois nomes são usadas de forma intercambiável no dia a dia.

Por exemplo, se você está escrevendo um programa e precisa fazer um cálculo de somar algumas variáveis várias vezes no decorrer do código. Ao invés de escrever esse cálculo várias vezes no decorrer do código, você pode criar uma função com o nome somaVar(x,y,z) e chamar essa função cada vez que quiser fazer a conta.

As funções tem a seguinte sintaxe:

Usando funções com Arduino

Declarando funções com Arduino

Veja que uma função é composta de:

  • Tipo da função : é o tipo de valor que a função retorna. No nosso exemplo o resultado retornado pela função é um inteiro, então o tipo da função será Int. É declarado antes do nome da função(em vermelho no exemplo). Caso a função não retorne nada, o tipo deve ser Void.
  • Nome da função: é o nome que você vai usar no decorrer do código para chamar a função. Está em azul no nosso exemplo acima.
  • Parâmetros da função: Os parâmetros são os valores que a função recebe para poder fazer cálculos ou procedimentos lógicos. Esses valores devem ter um tipo obrigatoriamente. No nosso exemplo, temos três parâmetros, x, y e z, do tipo inteiro. Os parâmetros são declarados entre parênteses logo depois do nome da função.
  • Corpo da função: Em laranja no nosso exemplo está o corpo da função em si. Após a declaração da função, o procedimento lógico que você deseja escrever deve estar entre chaves. Entre essas duas chaves você vai escrever o cálculo ou qualquer tarefa que você queira executar com a função.

Estruturas de controle de fluxo e tomada de decisão

No decorrer do seu código você sempre precisará tomar decisões, direcionar o fluxo do algoritmo e suas tarefas e cálculos, fazer loops para preencher vetores ou implementar uma tarefa lógica e várias outras possibilidades.

Tudo isso é feito através das estruturas de controle de fluxo. Vamos destacar as cinco principais delas, dividindo-as em dois grupos: Tomada de decisão e controle de fluxo.

Tomada de decisão
If..else

A estrutura básica para tomada de decisão é o if..else. Como o próprio nome sugere, ele toma uma decisão baseada numa avaliação lógica. Se o resultado dessa avaliação for verdadeira, a estrutura executa o código subsequente ao if, se o resultado for falso, é executado o código subsequente ao else.

A sintaxe é a seguinte:

If ( expressão lógica )

  ….

          Else

  …..

Exemplo:

Expressão if...else

Utilizando if…else com arduino

No exemplo acima, a variável X receberá o valor 5, pois o resultado da expressão lógica entre parênteses no if é verdadeiro. Caso ela fosse falso, o valor de X seria 2.

Existem algumas variações, como o if…elseif….else, e também algumas formas abreviadas de escrever a estrutura. No entanto, se você entendeu o if..else básico, todas as demais variações serão naturais para você.

switch()

O switch é uma estrutura de tomada de decisão que avalia o valor de uma variável de controle e direciona o código para um caso específico. Vejamos como é a sintaxe para entender melhor.

switch()

Utilizando switch() com arduino

Na estrutura mostrada acima, a variável x é que controla a tomada de decisão. Se o valor de x for igual a 1, o código vai para linha Case 1. Se x for igual a 2, Case 1 é ignorado e o código executado é o que se segue em Case 2. O número de casos é indefinido, mas recomenda-se que não seja mais de uma dezena e não menos que três.

Na eventualidade de não existir nenhum Case correspondente ao valor da variável de controle, o código executado é o Default, geralmente escrito ao final do Switch.

Os breaks no meio do switch dizem para o compilador para e sair do switch, continuando o código que vem logo abaixo do fechamento das chaves que delimitam o switch.  São colocados depois de cada Case para evitar que avaliações desnecessárias sejam feitas.

Controle de fluxo

As estruturas de controle de fluxo são os famosos Loops usados para fazer iterações e executar tarefas. Os dois principais deles são o for e o while.

 For

A sintaxe do for é a seguinte:

for

Usando for com arduino

Essa estrutura significa que o código inserido entre as chaves que se seguem ao for será executado x vezes. Ou seja, se x for igual a 5, o loop rodará 5 iterações. A cada iteração o valor da variável de controle i é iterada também. Assim, na primeira iteração o valor de i é zero, na segunda é um, na terceira é dois, e assim por diante até que i seja igual ou maior a x.

While

O while também é uma estrutura em loop muito utilizada.  O trecho de código inserido entre as chaves que se seguem ao while é executado sempre, desde que a expressão lógica seja verdadeira. No momento em que a expressão ĺógica do while for falsa, o loop não será executado mais.

Exemplo:

While no Arduino

While com arduino

No exemplo acima, o loop será iterado quinze vezes. Veja que ao começar o While a variável de controle é igual a zero. E dentro do while há uma linha: i++. O operador ++ faz com que a variável seja somada em 1 unidade. Ou seja, a cada iteração do while, a variável i é somada de 1 unidade. Assim, na primeira iteração, i começa com zero,mas é somada de 1 unidade e vira um. Na segunda iteração i começa igual a um, é iterada e vira dois. E assim por diante até que i seja igual a quinze. Nesse momento a expressão lógica do while se torna falsa e o corpo do while não é mais executado.

Estrutura padrão do código arduino e bibliotecas

Em todo código do Arduino você encontrará sempre duas funções: a void setup() e void loop(). Além deles, você comumente verá linhas com a diretiva #include, usada para incluir bibliotecas no código.

Bibliotecas são coleções de funções e definições de parâmetros e variáveis que ao invés de serem incluídas no programa principal, são salvas em um arquivo separado e incluídas no programa principal por meio de uma linha de código. Assim, todas as funções e definições dentro dessas bibliotecas ficam disponíveis em seu código. Bibliotecas são muito úteis pois permitem dividir um programa complexo em mais de um arquivo. Os arquivos de biblioteca em geral possuem a extensão .h.

A função void setup() é onde são feitas as inicializações e configurações do microcontrolador do Arduino. A função void Loop() é onde vamos escrever o nosso código em si. Trata-se do loop infinito que vai rodar enquanto o Arduino estiver ligado. Todas as ações do nosso código deverão estar nesse loop.

Veja na figura abaixo um exemplo em que são incluídas duas bibliotecas, uma para trabalhar com strings e outra para controlar displays LCD:

Includes no Arduino

Essa estrutura padrão em conjunto com os outros conceitos que você acabou de conhecer serão as ferramentas de código principais de todos os seus programas em Arduino.

Continua a aprender com a leitura da parte 2 desse post. Lá falaremos sobre as interfaces de hardware do placa Arduino e como controlar e utilizá-las em suas aplicações. Bons estudos e qualquer dúvida deixe o seu comentário!

Avaliações: 5.0. de 6 votos.
Por favor, aguarde...
Vitor Vidal
Vitor Vidal
Engenheiro eletricista, mestrando em eng. elétrica e apaixonado por eletrônica, literatura, tecnologia e ciência. Divide o tempo entre pesquisas na área de sistemas de controle, desenvolvimento de projetos eletrônicos e sua estante de livros.