Introdução à programação de hardware com Arduino

Introdução à programação de hardware com Arduino

Uma boa forma para um iniciante começar na programação com hardware é se familiarizar com o Arduino, pois ele é uma plataforma open source que possui uma comunidade bastante ativa, o que facilita a rápida prototipagem de simples projetos de robótica e internet das Coisas (IOT). Neste artigo falaremos a respeito dessa plataforma, da linguagem de programação e dos comandos utilizados para ler informações de sensores e enviar comandos para atuadores.

O projeto Arduino surgiu em 2005 como uma ferramenta criada por professores do Instituto de Design de Interação Ivrea na Itália, para que os alunos pudessem prototipar projetos de eletrônica de forma fácil e rápida. Por ser um projeto aberto, rapidamente se tornou popular no mundo todo, pois qualquer um poderia copiar o projeto e distribuir, mudando apenas o nome, que é uma marca registrada. Atualmente as versões UNO e NANO, possuem um microcontrolador ATmega328 e a versão Mega tem o microcontrolador ATmega2560 que tem mais capacidade.

Portas Analógicas e Digitais

O Arduino vai apresentar diversas portas, como o 5V e o GND que vão prover energia para os componentes, as portas digitais que vão trabalhar com informações binárias (0 e 1) e as portas analógicas que dão uma flexibilidade maior. Ambas as portas, analógicas e digitais, podem ser configuradas no código para atuar como entrada ou saída de dados.

Utiliza-se as entradas para receber dados de sensores e detectar botões sendo pressionados, enquanto a saída é utilizada para controlar atuadores, como motores elétricos que vão converter a energia elétrica em mecânica.

Para escrever o código, utilizamos o Arduino IDE, esse software já possui um compilador que converte a linguagem C++ em um arquivo hexadecimal que pode ser carregado para o Arduino. Se o Arduino estiver conectado ao computador, ele já passa o código automaticamente, mas o arquivo hexadecimal também pode ser passado para programas que simulam circuitos elétricos e possuem o arduino como o proteus. Dessa forma, é possível testar diferentes componentes eletrônicos sem ter que conectar tudo fisicamente ou mesmo não tendo os componentes.

Por padrão, duas funções são chamadas, o setup e o loop, o código que for colocado no setup vai executar apenas uma vez quando o microcontrolador for iniciado e o loop é o que vai ficar repetindo após a inicialização. Então no setup podemos definir se uma determinada porta é entrada ou saída e no loop podemos ler ou mudar o seu estado. Conforme o exemplo abaixo que define um LED piscando.

int LED_PORT = 10;

void setup {
    pinMode(LED_PORT, OUTPUT);
}

void loop {
    digitalWrite(LED_PORT, HIGH);
    delay(500);
    digitalWrite(LED_PORT, LOW);
    delay(500);
}


Neste exemplo, a função pinMode é responsável por definir que a porta 10 é do tipo output, ou seja, a informação vai sair do Arduino para essa porta para controlar o LED. Já a função digitalWrite, serve para mudar o estado da porta que pode ser HIGH (que indica para ligar) ou LOW (que indica para desligar).

Entre a mudança de estado colocamos um delay de 500 milissegundos que será o tempo que o LED vai passar em cada estado antes da mudança. Feito isso, antes de compilar o código é necessário selecionar a placa para a qual o código será compilado, conforme ilustrado abaixo:


Se você estiver com o Arduino conectado ao computador deve selecionar também a porta USB ao qual ele está conectado. Mas se for testar no proteus ou em outro software de simulação, você vai em arquivo, depois preferências e onde tiver a caixa dizendo “mostrar mensagens de saída durante:” você marca compilação.

Assim, quando o código for compilado, será mostrado no terminal do Arduino IDE o local onde o hexadecimal compilado foi salvo, você copia este endereço e cola no software de simulação. No caso do proteus, basta dar dois cliques no Arduino e onde tiver program file, você cola o endereço copiado:


Depois de fazer as conexões elétricas fisicamente ou no software, carregar o código e executar, você verá o LED piscando a cada 500 milissegundos conforme programamos:


Na internet é possível encontrar diversos kits com placas genéricas que são compatíveis com Arduino e que já vem com diversos sensores, resistores, LEDs e outros componentes eletrônicos.

Mas mesmo que você já tenha a placa e os componentes, é bom procurar por um software para simular antes o sistema no computador, pois assim você garante que ao menos o seu código está funcionando e se o sistema na prática não funciona, já pode deduzir que provavelmente se trata de um problema de hardware, como algum mal contato ou um componente queimado.

Outra função que o Arduino possui por padrão é o digitalRead, que podemos utilizar para ler uma porta digital, como o próprio nome já diz, conectada a um botão que vai indicar se ele está sendo pressionado ou não. Podemos reescrever o código que criamos para o LED só acender quando o botão for pressionado, utilizando da função digitalRead da seguinte forma:

int LED_PORT = 10;
int BUTTON_PORT = 7;

void setup() {
  pinMode(LED_PORT, OUTPUT);
  pinMode(BUTTON_PORT, INPUT);
}

void loop() {
  if (digitalRead(BUTTON_PORT)) {
    digitalWrite(LED_PORT, HIGH);
  } else {
    digitalWrite(LED_PORT, LOW);
  }
}


Para o botão, definimos no setup que o pinMode vai ser do tipo input, então no loop utilizamos a função digitalRead para verificar se está passando corrente na porta 7, se sim o estado da porta do LED vai para HIGH, se não, o estado fica em LOW. Para conectar o botão, basta conectar o 5V do Arduino no GND com um botão e um resistor conectados em série, assim quando o botão estiver pressionado vai passar corrente e quando não estiver, não haverá corrente passando. Então basta criar uma conexão no meio entre o botão e o resistor com a porta 7 do Arduino para ele saber se está passando corrente ou não.



Assim como os comandos digitalRead e digitalWrite, também existem comandos para ler e controlar componentes pelas portas analógicas, que são o analogRead e analogWrite. Podem ser utilizados para receber dados de um sensor ou controlar a tensão de saída para definir a intensidade da luz de um LED, respectivamente.

int sensorPin = A0;
int sensorValue = 0;

void setup() {
    Serial.begin(9600);
}

void loop() {
    sensorValue = analogRead(sensorPin);
    Serial.println(sensorValue);
    delay(1000);
}


O código acima é um exemplo para fazer a leitura dos dados analógicos que vem de um sensor, nele utilizamos a função Serial.begin para fazer a comunicação do Arduino com o computador para enviar os dados que estão sendo captados pelo sensor e lidos pelo Arduino com a função analogRead, então esses dados são mostrados no Serial monitor do IDE ao chamar a função Serial.println.

Comunicação Serial

Outra função que o Arduino possui é a da comunicação serial, como já foi ilustrado acima, na qual é possível conectar dispositivos eletrônicos para que eles troquem dados entre si. O nome Serial significa que os dados são enviados em série, um após o outro por um mesmo meio, seja ele um canal de comunicação sem fio ou um fio único. Existem diferentes protocolos de comunicação serial, os que estão presentes no Arduino são o UART, o I2C e o SPI.

A comunicação via UART é feita através dos pinos Tx e Rx, o GND dos dois dispositivos são conectados e o Tx de um é conectado no Rx do outro. UART, que do inglês significa Transmissão e Recepção Universal Assíncrona, é um protocolo que não utiliza o clock para sincronizar os dispositivos. Dessa forma, eles vão se comunicar sem ter uma ordem. Um exemplo que utiliza essa comunicação é o próprio Arduino quando ele se conecta com o computador, a comunicação que está sendo utilizada é UART e um chip externo faz a conversão desses dados para USB. Outro exemplo é o módulo bluetooth.

O barramento I2C, que significa Inter Integrated Circuit, utiliza dois fios, sendo um clock e o outro os dados propriamente, o clock é representado pelo pino SCL e os dados pelo pino SDA. Diferente do UART, no qual os dispositivos podem trocar informação ao mesmo tempo, no I2C vai ter o master e o slave, o master envia os dados e depois o slave responde. O benefício deste protocolo é que ele é mais rápido e dá para conectar vários dispositivos ao mesmo tempo, com múltiplos masters e slaves.

Já a comunicação SPI, que do inglês significa interface serial periférica, funciona como um misto de UART com I2C, ele possui o pino SCK que é o clock, o MOSI (Master Out, Slave In), o MISO (Master In, Slave Out) e o CS que é o chip select. Nesse barramento, é possível conectar múltiplos slaves, mas apenas um master. Os pinos SCK, MOSI e MISO são compartilhados entre todos, mas é preciso ter um pino CS no master para cada slave no sistema.

Das três a comunicação SPI é a mais rápida, em segundo o I2C e por último o UART, mas vale ressaltar que apesar de mais rápido, a complexidade de implementar também vai aumentando. Então a escolha do barramento vai depender do projeto, se for apenas um computador se comunicando com um microcontrolador, pode ser o UART, mas se fosse preciso monitorar múltiplos sensores, então o ideal seria o I2C.


Conclusão

Neste artigo vimos um pouco sobre hardware, utilizando a placa Arduino. É importante destacar que a programação do Arduino é uma habilidade que pode ser aprendida por qualquer pessoa, independente do nível de conhecimento técnico, pois ela foi projetada justamente para ajudar o iniciante a prototipar projetos de hardware e software de maneira rápida. Então com a ajuda da comunidade ativa de usuários do Arduino e dos recursos disponíveis online, é possível realizar projetos criativos e funcionais de maneira acessível.

Dito isso, espero ter fornecido uma introdução clara e útil à programação de hardware com Arduino. Agora, é hora de colocar em prática o que foi aprendido e começar a desenvolver seus próprios projetos. Lembre-se de sempre explorar e experimentar, pois é assim que surgem as melhores ideias e soluções.

💡
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.