Como juntar dois projetos num Arduino

Muitas vezes até pessoas com experiência têm problemas em projetos de médio porte, onde não fazem nem a mais vaga ideia de onde pode estar o problema. Muito menos a sua solução. Neste artigo, vamos ver uma forma interessante de se juntar dois projetos num Arduino e como encontrar e evitar possíveis erros.

Para exemplificar, vamos utilizar uma personagem fictícia (Trixie) e uma hipótese de projeto para ela. Vamos supor que a Trixie já conhece o básico de Arduino, já fez o nosso curso que vem com o Kit Arduino UNO Iniciante / Básico e agora quer fazer o seu próprio projeto para resolver um problema em casa.

O projeto

A Trixie quer fazer uma mini-cancela automática utilizando o Arduino. Ela rabiscou num pedaço de papel como deveria ser a sua cancela e viu que precisaria de algo para detetar a presença do carro e algo para movimentar a cancela.

Cancela - ElectroFun Loja de Eletrônica

 

Para a deteção de presença, ela decidiu utilizar um Sensor De Distância Ultrassónico HC-SR04. Para a movimentação, ela sabia que um pequeno servo seria suficiente. Ela escolheu o Servo Motor SG90 9g Tower Pro 360º, que já vinha no kit que ela tinha comprado. Uma vez especificados os componentes, ela já tinha a lista do que precisaria:

Para fazer este projeto, ela viu a aula 6 do curso que explica como funciona o servo motor com o Arduino, colocou o sensor ultrassónico junto conforme a  ensina e… Nada funcionou. E agora?

Dividir para conquistar

Como dizia o imperador Júlio César “divide et impera“. Quando se deseja juntar dois componentes num único projeto é interessante separar bem cada um deles e entendê-los separadamente. O ideal é montar um projeto separado para cada um dos componentes e juntar os dois projetos num Arduino.

É uma boa prática dominar tanto a montagem eletrónica quanto a parte de programação. Uma vez dominado como funciona a ligação do componente com o Arduino – se usa uma saída analógica, digital, PWM ou algum tipo de comunicação – e feita a programação – como iniciar o componente, o que muda ao alterar a montagem, quais parâmetros são utilizados para controlá-lo e o que esses parâmetros representam – é que é aconselhável juntar os componentes.

No caso da Trixie, fica fácil dividir o problema, é um sensor (o HC-SR04) e um atuador (o micro servo). Algumas vezes é mais complexo e a divisão nem sempre é tão visível, mas tente sempre dividi-lo em problemas menores. Resolva-os separadamente, domine cada um dos elementos, para depois juntar numa solução única.

Dominar cada um dos elementos

Uma vez divididos, para juntar dois projetos num Arduino, é interessante estudá-los separadamente. Como vimos anteriormente, a Trixie viu que tinha aulas que ensinavam como funcionam os dois componentes, a nossa sugestão é dominar cada um deles separadamente, ver como os componentes são ligados e como funciona a sua programação no Arduino.

Entendo o servo motor

Como vimos na aula sobre o servo motor, o servo motor é conectado ao Arduino por três fios, o vermelho para os 5V, o marrom para o GND, e o laranja em alguma porta analógica (que tem o til ‘~’ do lado do número). É importante saber o que o componente precisa para ser acionado.

Na parte de programação, é interessante ver as bibliotecas utilizadas e como o motor é acionado. Abaixo temos uma programação parecida com a do curso.

//   Projeto 8 - Acionando um Motor
 
#include <Servo.h>
 
Servo meuServo;
int botao = 7;
 
void setup() 
{
  pinMode(botao, INPUT_PULLUP); // define o botão como saida 
}
 
void loop() 
{
  meuServo.attach(9);
  if(digitalRead(botao) == LOW)
  {
    for(int angulo=0; angulo<=180; angulo++) // Aumenta o angulo ate chegar nos 180 graus
    {
      meuServo.write(angulo);
      delay(10);
    }
    for(int angulo=180; angulo>=0; angulo--)// Diminui o angulo do servo
    {
      meuServo.write(angulo);
      delay(10);
    }
  }
  meuServo.detach();
}

Veja que é necessária a inclusão da biblioteca Servo.h no começo do código, pois esta já vem instalada com a IDE. Também é necessário declarar o servo motor, como feito nesta linha “Servo meuServo;”

Dentro do loop, é necessário “ligar” o servo com o comando “meuServo.attach(9);”. Também é possível perceber dentro do código como é feito o comando para o posicionamento do servo, na linha “meuServo.write(angulo);”.

Entendido o código, podemos diminuí-lo para o mínimo necessário para fazê-lo funcionar. Retiramos o botão do circuito e as estruturas if e for. Tente fazer isso, ainda que mentalmente, o código deve ficar próximo a este programa que apenas coloca numa posição o servo, espera um pouco e coloca noutra.

//Programa: Servo motor minimo
//Autor: ElectroFun
 
#include <Servo.h> // Inclui a biblioteca
Servo meuServo; // Declara o servo motor 
 
void setup() {
  // Nao precisamos de nada aqui
}
 
void loop() {
  meuServo.attach(9); // Liga o servo motor
   
  meuServo.write(0); // Posiciona o motor no 0
  delay(1000); // Aguarda 1 segundo
   
  meuServo.write(45); // Posiciona o motor nos 45 graus
  delay(1000); // Aguarda o 1 segundo
 
  meuServo.detach(); // Desliga o servo motor
}

Veja que os comentários no código ajudam a entender o programa. É sempre bom comentar o seu código até para você mesmo poder entendê-lo no futuro.

Visto como são feitas as conexões e a programação desse projeto, podemos dizer que dominamos o funcionamento do servo motor e podemos passar para a próxima etapa.

Entendendo o sensor ultrassónico

A Trixie até viu o funcionamento do Sensor ultrassónico HC-SR04 na aula 9 do curso, mas não fez uma análise do seu funcionamento na hora de juntar os dois projetos num Arduino só.

Conforme visto no artigo a ligação do sensor é feita da seguinte forma:

Podemos ver que são utilizados os pinos de alimentação do Arduino (5V e GND) e duas portas digitais.

//Programa: Conectar o Sensor Ultrassonico HC-SR04 ao Arduino
//Autor: ElectroFun

//Carrega a biblioteca do sensor ultrassonico
#include <Ultrasonic.h>

//Define os pinos para o trigger e echo
#define pino_trigger 4
#define pino_echo 5

//Inicia o sensor nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);

void setup()
{
Serial.begin(9600);
Serial.println("A ler os dados do sensor...");
}

void loop()
{
//Le as informacoes do sensor, em cm
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
//Exibe informacoes no serial monitor
Serial.print("Distancia em cm: ");
Serial.print(cmMsec);
delay(1000);
}

No código podemos perceber, assim como feito com o servo, o uso de uma biblioteca, na linha “#include <Ultrasonic.h>”. Neste caso, porém é necessário fazer a instalação dela baixando o arquivo no formato .ZIP e adicioná-lo na IDE do Arduino. Para isso, vá em “Sketch -> Incluir Bibliotecas -> Adicionar Biblioteca .ZIP” e selecione o arquivo.

Após a inclusão da biblioteca, é iniciado o sensor, com o comando “Ultrasonic ultrasonic(pino_trigger, pino_echo);”. Também é iniciada a porta serial, que não é obrigatória mas é uma ótima forma de entender o sensor e encontrar problemas na lógica do código.

Uma vez iniciado o sensor, para ler os dados é necessário utilizar uma variável, no programa é chamada de “microsec” e recebe o valor da função “ultrasonic.timing()“. A leitura dos dados é feita na linha “cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);” onde a variável “cmMsec” recebe o valor lido e depois é enviada para a serial. Sem enviar o valor para a serial, teria que ser colocada outra forma de se saber o valor lido.

Juntar os dois projetos num Arduino

Entendido o funcionamento dos dois componentes, é chegada a hora de juntar os dois num projeto usando um Arduino. Mais uma vez, dividir pra conquistar. Vamos ver como é feita a montagem do circuito com os dois componentes e, depois, como juntar os dois programas.

Juntar os circuitos

Quando estudamos os componentes separadamente, vimos os pinos que cada componente precisa:

Servo motor

  • 5 V
  • GND
  • Sinal (saída analógica)

Sensor  ultrassónico 

  • 5 V
  • Echo (porta digital)
  • Trig (porta digital)
  • GND

No circuito com os dois componentes juntos, podemos utilizar o mesmo pino de 5 V e de GND para ambos os componentes. Além desses dois pinos do Arduino, precisamos de outros dois para o sensor ultrassónico, que podemos manter os mesmos vistos anteriormente (4 e 5). Para o servo motor, qualquer saída analógica poderia funcionar, neste caso mantivemos a usada antes (9).

Juntar os programas

Análogo ao que foi feito com os circuitos, para juntar os dois programas num único Arduino deve atentar-se ao que precisa realmente de ser colocado e o que não pode ser repetido, não podemos simplesmente copiar e colar os dois programas juntos e esperar que funcione.

Um programa no Arduino possui duas estruturas principais “setup()” e “loop()“, como visto na Aula 2 do curso.

setup() – Parte do programa no qual configura-se as opções iniciais do programa: os valores iniciais de uma variável, se uma porta será utilizada como entrada ou saída, mensagens para o usuário, etc. Esta função é executada apenas uma vez quando o Arduino é ligado.

loop() – Diferente da função setup(), esta parte do programa repete uma estrutura de comandos de forma contínua ou até que algum comando de “parar” seja enviado ao Arduino. Vamos ver exatamente como isto funciona ao decorrer dos projetos.

Acontece que num programa Arduino só pode ter uma de cada, então deve-se escolher o que é necessário de cada um dos códigos e colocar dentro do “setup()” e do “loop()” de acordo com o que vimos quando estudamos os códigos.

Resumidamente, o programa posiciona o servo motor numa determinada posição (45º) e envia “Abriu” para o computador quando existe algo próximo do sensor ultrassónico (menor que 5 cm). Se não existe nada próximo, coloca o servo noutra posição (0º) e envia “Fechou”.

//Programa: Cancela automática
//Autor: Electrofun

//Carrega as bibliotecas do sensor ultrassonico e do servo
#include <Ultrasonic.h>
#include <Servo.h>

// Para o sensor ultrassonico
//Define os pinos para o trigger e echo
#define pino_trigger 4
#define pino_echo 5
//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);

// Para o servo motor
Servo meuServo; // Declara o servo motor

void setup()
{
// Colocamos a serial para verificar possiveis erros
Serial.begin(9600);
Serial.println("Lendo dados do sensor...");
}

void loop()
{
//Le as informacoes do sensor ultrassonico em cm
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

meuServo.attach(9); // Liga o servo motor

// Pode alterar este valor de acordo com o funcionamento desejado
if(cmMsec < 5) // Verifica se o valor do sensor é menor que 5
{
// Se o valor for
meuServo.write(45); // Posiciona o motor nos 45 graus
delay(1000); // Aguarda 1 segundo
Serial.println("Abriu"); // Envia mensagem pela serial

} else {

// Senão
meuServo.write(0); // Posiciona o motor no 0
delay(100); // Aguarda 0,1 segundo
Serial.println("Fechou"); // Envia mensagem pela serial
}

meuServo.detach();// Desliga o servo motor

// Colocamos a distancia na serial para ajustarmos o sensor
Serial.print("Distancia em cm: ");
Serial.println(cmMsec);
}

Perceba que no início do programa declaramos as duas bibliotecas necessárias. Dentro do “setup()” não era necessário colocar nada,  mas iniciamos a porta serial para nos auxiliar a encontrar erros no programa.

No “loop()” definimos o comportamento do projeto. No começo do loop lemos a medição do sensor ultrassónico, comparamos a medição com o valor 5. Esse valor pode ser alterado de acordo com o seu sensor e como você deseja o comportamento. Fica muito mais fácil ajustar esse valor quando acompanha a medição do sensor através da serial. Se a medida for menor que o valor, colocamos o servo numa posição; se for maior, colocamos noutra posição.

Conclusão

Agora que a Trixie já conseguiu juntar o servo motor e o sensor ultrassónico num único Arduino, ela pode-se preocupar com as outras coisas do seu projeto. Vale lembrar que antes de juntar dois projetos num Arduino ela queria fazer uma cancela para carros.