I17 - Régua eletrônica com indicador luminoso RGB - Sensor ultrassônico, display OLED e Arduino

Intermediário - Projeto 17

Medir distâncias com sensor HC-SR04, RGB, display OLED e Arduino

Objetivo

Utilizar o sensor ultrassônico HC-SR04 junto com o Arduino para medir distâncias entre o sensor e um objeto qualquer e exibir o resultado em um display OLED.

Além da exibição das distâncias em cm, mm ou em polegadas quando selecionadas por um botão (push button), vamos incluir também no projeto um indicador luminoso com um led RGB para marcar distancias pré estabelecidas, sendo: distancias entre 5 e 10cm, cor azul, entre 10 e 15 cm, cor verde e entre 15 e 20cm, cor vermelha.

Utilizaremos no projeto a biblioteca HCSR04 para simplificar a programação com o uso do sensor ultrassônico HC-SR04. Esta biblioteca calcula as distâncias e exibe os resultados diretamente em mm, cm e polegadas.

Obs.: Se você desejar conhecer melhor os princípios de funcionamento do sensor HC-SR04 veja o projeto I15 - Como usar o sensor ultrassônico HC-SR04 com Arduino sem o auxílio de biblioteca.

 

Referências:

Projeto 23 - Criando efeito de cores com um LED RGB
Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit
I16 - Como medir distâncias por meio de um sensor ultrassônico HC-SR04 com Arduino e display LCD (régua eletrônica)

Definições

Sensor de Distância Ultrassônico HC-SR04 possui função de medição sem contato entre 2 cm e 4 metros, com precisão de aproximadamente 3mm. O módulo é composto por transmissor ultrassônico, receptor e circuito de controle:

  • Transmissor Ultrassônico – Emite as ondas ultrassônicas que serão refletidas pelos obstáculos;
  • Um receptor – Identifica o eco do sinal emitido pelo transmissor;
  • Circuito de controle – Controla o conjunto transmissor/receptor, calcula o tempo entre a emissão e recepção do sinal;

Ondas ultrassônicas: São ondas mecânicas de alta frequência, acima de 20.000 Hz, que se propaga na velocidade do som. Neste caso, o som não pode ser ouvido pelos seres humanos. O ultrassom é muito utilizado para exames clínicos, sensores, sonares, etc. O módulo HC-SR04 emite ondas com frequência de 40.000 Hz.

Princípio de funcionamento do HC-SR04: O funcionamento do HC-SR04 se baseia no envio de sinais ultrassônicos pelo transmissor do sensor, que aguarda o retorno (echo) do sinal, e com base no tempo entre envio e retorno, calcula a distância entre o sensor e o objeto detectado no circuito de controle:

Display OLED (Organic Light-Emitting Diode, ou Diodo Emissor de Luz Orgânico): Display gráfico com alto contraste, excelente nitidez, leve e muito econômico, pois como possui luz própria não precisa de backlight utilizado nas telas de LCD ou LED, por exemplo. Outra grande vantagem do display OLED é possibilidade de gerar imagens. Como desvantagens, o display possui uma vida útil menor (entre 10mil e 40mil horas de uso) e não deve ser utilizado em locais úmidos, pois a água danifica facilmente o componente. Para saber mais leia Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit. No tutorial você saberá como usar todos os recursos do display OLED SSD1306 via I2C.

Atenção: Não utilize o display em locais molhados ou úmidos, pois a água pode danificar o componente.

O LED RGB nada mais é que três Leds em um só, ele é formado por um vermelho (R de red), um verde (G de green) e um azul (B de blue). Associando as cores dos três Leds é possível se obter várias possibilidades de cores.

Aplicação

Para fins didáticos e projetos onde o HC-SR04 pode ser utilizado para fazer leituras de distâncias entre o sensor e um objeto, acionar alarmes, detectar objetos e corrigir continuamente a trajetória de um robô ao detectar um obstáculo, por exemplo, entre outras aplicações em robótica.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard

Protoboard 830 pontos

1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1    
Módulo Sensor Ultrassônico HC-SR04

Sensor Ultrassônico HC-SR04

1  

- Tensão de Alimentação 5V DC
- Corrente consumida 15mA
- Frequência de operação 40kHz
- Distância (min) 2cm / (max) 4m
- Precisão 3mm
- Ângulo de medição 15graus
- Sinal de entrada [Trigger] Pulso TTL (5V) de 10us
- Sinal de saída [Echo] Pulso TTL (5V) proporcional à distânia detectada

(datasheet)

Display OLED Display LCD 16X2 1  Tarzan Componentes Eletrônicos | Shield Arduino| Display Oled 1.3 Polegadas  Branco 125x64 I2c - R$ 51,90

– Tensão de operação: 3,3-5V
– Controlador: SSD1306
– Cor: Azul e Amarelo
– Comunicação: I2C
– Resolução: 128×64
– Dimensões: 30 x 27mm

Você também poderá utilizar na cor azul, branco ou colorido.

A comunicação poderá ser I2C ou SPI

LED RGB Led RGB 5mm 1

Você poderá utilizar um LED RGB ânodo ou cátodo.

Você poderá utilizar também um LED RGB difuso ou de alto brilho.

Resistor Resistor 3

Utilizar no projeto 3 Resistores de 150Ω ou maior

Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado - Calcular Resistor.

Push Button Push button 6X6X5mm 1    
Arduino UNO Arduino UNO R3 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. O Arduino deve estar totalmente desconectado da fonte de energia enquanto você monta o circuito.

 

Atenção

1. A montagem do módulo HC-SR04 deve seguir a configuração abaixo:

  • Vcc – Deve ser conectado a um pino 5V do Arduino.
  • Trig – Deve ser conectado a um pino digital configurado como saída. Utilizamos o pino 8 do Arduino.
  • Echo – Deve ser conectado a um pino digital configurado como entrada. Utilizamos o pino 9 do Arduino.
  • Gnd – Deve ser conectado a um pino GND do Arduino.

 

2. Neste projeto vamos utilizar um display OLED SSD1306 via protocolo I2C. Para a montagem, verifique a "pinagem" do módulo com comunicação I2C:

Observações:

a. Em algumas marcas os pino Vcc e GND estão invertidos. Portanto, preste muita atenção antes de fazer a conexão com o Arduino.

b. Caso o utilize um display OLED por comunicação via serial SPI veja como é feita a conexão no Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit.

 2.1. Faça a conexão dos pinos SCL e SDA com o Arduino da seguinte forma:

 MICROCONTROLADOR  SCL  SDA
 Arduino Uno  A5  A4
 Arduino Nano  A5  A4
 Arduino Mega  21  20
 Leonardo/Micro  3  2

2.2. No nosso projeto utilizamos um display OLED SSD1306 I2C e Arduino Uno. Veja abaixo como fazer a conexão:

3. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do Arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Assista o vídeo Arduino: Botão e Resistor de Pull Up Interno e leia os artigos Como usar push button com Arduino (programação) e Onze maneiras diferentes de ligar e desligar um led com push button e Arduino.

3.1. No nosso exemplo conectamos o botão no pino digital 2 do Arduino.

4. Lembre-se que existem 2 tipos de LED RGB, o ânodo comum e o cátodo comum. Observe que para cada uma das cores existe um terminal, e além disso o quarto terminal (maior) deverá ser conectado ao polo positivo (ânodo comum) e ao polo negativo (cátodo comum).

4.1. Se você não sabe que tipo de Led RGB você está utilizando, veja o Projeto 23 - Criando efeito de cores com um LED RGB que apresenta um teste para verificação de montagem com led RGB ânodo comum e com cátodo comum.

4.2. Leia também: Led RGB anodo comum ou o Led RGB catodo comum? Como identificar e usar com Arduino (circuito e programação).

 5. Para determinar os valores dos resistores para o seu LED RGB, utilize os dados do fabricante (datasheet). No nosso projeto, utilizamos um LED RGB tipo ânodo comum com as seguintes características:

5.1. A partir destes dados calculamos o valor dos resistores (ou determine através da tabela prática: Tabela prática de utilização de leds 3mm e 5m). Para calcular o valor dos resistores leia: Como calcular o resistor adequado para o led ou utilize o aplicativo: Calculador de Led.

5.2. Após os cálculos determinamos os seguintes resistores (valores mínimos): 2 resistores de 100Ω (terminais cor verde e azul) e 1 resistor de 150Ω (terminal cor vermelho). No nosso projeto utilizamos 3 resistores com 150Ω.

5.2. Veja abaixo de um exemplo um exemplo de montagem utilizando um Led RGB Anodo Comum:

 5. A montagem do nosso projeto foi realizada em um protoboard de 400 pontos e um mini protoboard para montagem do Led RGB:

6. No projeto você pode usar um bloco de poliestireno expandido (isopor) para envolver o led RGB e melhorar a propagação das cores.

 Incluindo a biblioteca HCSR04

Para utilizarmos o módulo HCSR04 sem precisar fazer cálculos para determinar as distâncias entre o sensor e um objeto qualquer, vamos usar a biblioteca HCSR04. Esta biblioteca foi desenvolvida para calcular distâncias, cujos os resultados podem ser exibidos diretamente em milímetros, centímetros e polegadas sem a necessidade de conversão e/ou de qualquer cálculo. Os valores também são expressos também em números reais (decimais), mas mantendo a precisão do sensor que é de aproximadamente 3mm.

Download dos arquivos da biblioteca HC-SR04

 DOWNLOAD - HC-SR04-master.zip

Para saber detalhes desta biblioteca clique aqui.

Instalação das biblioteca

Após fazer o download do arquivo HC-SR04-master.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Incluindo as bibliotecas Adafruit SSD1306 e Adafruit GFX

Para utilizar o controlador SSD1306 vamos incluir a biblioteca Adafruit SSD1306. Esta biblioteca foi escrita para resolver a complexidade do controlador SSD1306, oferecendo comandos simples para facilitar o controle de operação do display OLED.

Para obtermos uma experiência completa, precisamos instalar também a biblioteca Adafruit GFX para exibir elementos gráficos primitivos como pontos, linhas, círculos, retângulos, etc.

Instalação das bibliotecas

1. No IDE do Arduino, acesse a aba Sketch, selecione [Incluir Biblioteca] e depois [Gerenciar Bibliotecas...].

 

 2. No campo de pesquisa digite ssd1306 adafruit. Localizada a biblioteca Adafruit SSD1306 clique no botão [Instalar].

3. Na janela "Dependencies for library Adafruit SSD1306..." clique no botão [Install all]. Desta forma, instalaremos as bibliotecas Adafruit SSD1306, Adafruit GFX library e Adafruit BusIO todas juntas automaticamente.

 4. Após a instalação, observe que aparecerá a informação que as bibliotecas foram instaladas. (Lembre-se que precisaremos das bibliotecas Adafruit SSD1306 e Adafruit GFX Library para controlar nosso display OLED)>

 5. Para mais informações sobre as bibliotecas, acesse: Adafruit SSD1306 e Adafruit GFX library.

Código do Projeto (Sketch)

1. Faça o download e abra o arquivo projetoI17.ino no IDE do Arduino: DOWNLOAD - projetoI17.ino

2. Observações do uso biblioteca HCSR04 a programação:

2.1. Para definirmos a variável responsável pela exibição do resultado, devemos obrigatoriamente setá-la como o uso de ponteiro para um double. Exemplo: double *result;

2.1.1. Se você quiser saber mais sobre ponteiros em C, veja os links: Ponteiro em C, Ponteiro em C: definição e Ponteiros.

2.2. Como a variável global responsável pela exibição do resultado foi definida como um ponteiro para o tipo double (precisão com até 10 casas decimais), o resultado será um array, onde deveremos obter o primeiro item dele. Exemplo: lcd.print(result[0]);

3.  Atenção para o uso do led RGB: Caso utilize um led RGB catodo comum, faça a conexão no GND e altere a linha 38 do sketch para: boolean ledType = 0;

4. Se preferir, copie e cole o código abaixo no IDE do Arduino.

/*******************************************************************************
*
*    I17 - Sensor ultrassonico como régua eletrônica com indicador luminoso
*    Autor: Angelo Luis Ferreira
*    06/04/2022
*    http://squids.com.br/arduino
*
*******************************************************************************/
// biblioteca para sensor ultrassônico
#include                    // inclui a biblioteca do módulo HC-SR04

// bibliotecas para OLED
#include                       // caso utilize comunicação SPI
#include                      // biblioteca requerida para I2C
#include              // biblioteca OLED
#include          // biblioteca OLED

// configuração do display OLED
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 (OLED) display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// define pinos de entrada e saída do Arduino
const byte pinTrig = 7;           // pino digital usado para disparar os pulsos do sensor
const byte pinEcho = 8;           // pino digital usado para ler a saida do sensor
const byte pinBut = 2;            // pino digital usado para o push button
const int R = 9, G = 10, B = 11;  // pinos digitais usados para o led RGB

// limites de distancia de controle para atual o indicador luminoso
// os limtes min e max podem ser definidos entre 2cm e 400cm
byte limitMin = 5; // limite mínimo (5cm)
byte limitMax = 20; // limite máximo (20cm)

// define se o led RGB é catodo comum(GND) = 0 ou anodo comum(Vcc) = 1
boolean ledType = 1; // ATENÇÃO: se o led for catodo comum, mude para 0 

// define outras variáveis globais para medir as distâncias
byte state = 1;          // estado do menu
byte decimal = 0;        // número de casas decimais
String unity = "cm";     // descrição das unidades
double *result;          // uso do ponteiro para um double (obrigatório)

void setup(){
  // pin mode - definie entradas e saídas digitais
  pinMode(pinBut, INPUT_PULLUP);   // pullup interno do Arduino

  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);

  // inicializa o senor HC-SR04
  HCSR04.begin(pinTrig,pinEcho);
  
  // Inicializa a porta serial
  Serial.begin(9600);

   // inicializa a comunicação I2C do OLED end 0X3C
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

   // Clear the buffer e layout do display OLED
  display.clearDisplay();
}

void loop(){ 
  readPushButton();                             // verifica se o pushbutton foi acionado 
  sowDisplay();                                 // exibe a distância no display lcd
  pointerLight(HCSR04.measureDistanceCm()[0]);  // exibe cor na luz indicadora (led rgb)) 
  delay(300);                                   // delay de 300us
}

// verifica se o botão foi acionado - altera para cm, mm ou pol
void readPushButton() { 
  if (!digitalRead(pinBut)) { // verifica se o botão foi acionado = LOW
    state >= 3 ? state = 0 : state = state;  
    state++;  
    while (!digitalRead(pinBut)) {} // aguarda soltar o botão    
    delay(150); // delay para reduzir o efeito bouncing
  }
}

// exibe a distância no display lcd
void sowDisplay() { 
  // faz leitura de acordo com o valor da variável state
  byte x;
  switch (state) {
    case 1:
    result = HCSR04.measureDistanceCm();
    decimal = 0;
    unity = " cm";
    x = 40;
    break;
    
    case 2:
    result = HCSR04.measureDistanceMm();
    unity = " mm";
    decimal = 0;
    x = 30;
    break;

    case 3:
    result = HCSR04.measureDistanceIn();
    unity = " in";
    decimal = 1;
    x = 30;
    break;
  }
  
  //Exibe no display as distâncias em cm, mm ou em polegadas (inchies)
  // imprime "Régua Eletrônica"
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(15, 0);
  display.print("Regua Eletronica");
  display.drawRoundRect(0, 16, 128, 48, 3, WHITE); // desenha retângulo inferior
  // imprime "Squids Arduino"
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(20, 25);
  display.print("Squids Arduino");
  // imprime distância
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(x, 40);
  display.print(result[0],decimal);
  display.print(unity);
  // exibe no display
  display.display();
  // limpa o display
  display.clearDisplay();
}

// define cor do led indicador pela distância (led rgb)
void pointerLight(int distance) {
  int inc = (limitMax - limitMin)/3; // define incremento para alteraçao cores usando 3 cores
  if (distance <=limitMin || distance > limitMax) {
    setColor(255,255,255);
  } else if (distance >= limitMin && distance < limitMin + inc) {
    setColor(0,0,255); // azul
  } else if (distance >= limitMin + inc && distance < limitMin + 2*inc) {    
    setColor(0,255,0); // verde
  }else if (distance >= limitMin + 2*inc && distance <= limitMax) {
    setColor(255,0,0); // vermelho
  }
}  

// exibe cor do led indicador (led rgb)
void setColor(int red, int green, int blue) {
  if (ledType == 1) {
    red = 255-red, green = 255-green, blue = 255-blue;
  } 
  // ativando led rgb nas cores definida pela distância
  analogWrite(R, red);
  analogWrite(G, green);
  analogWrite(B, blue);
}

Vídeo

Como o projeto deve funcionar

1. Ao iniciar o programa já começa a medir a distância do sensor até o obstáculo mais próximo e exibe o resultado no display display OLED.

1.1. O resultado inicialmente é exibido em centímetros (cm).

2. Movendo o obstáculo ou o sensor, a distância entre ambos irá variar também.

3. Para verificar se as distâncias estão corretas, você pode utilizar uma régua para chegar as medidas, lembrando que a precisão da medida com o sensor é de 3mm.

3.1. Alinhe a régua na mesma posição da borda do sensor.

3.2. Coloque um objeto em um ponto da régua e faça a leitura. A distância exibida deverá ser o valor aproximado medido pela régua. Obs.: A leitura do sensor ultrassônico pode ser realizada entre 2cm e 4 metros.

4. Indicador luminoso: quando a distância entre o sensor e o obstáculo for entre 5cm e 10cm, o led RGB ficará azul, entre 10cm e 15c, verde e entre 15 e 20cm vermelho. Fora dessas distâncias, o led RGB permanecerá branco.

5. Para converter as unidades também em milímetros (mm) e polegadas (pol), clique no botão (push button).

6. São realizadas leituras a cada 150 microssegundos.

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores