segunda-feira, 17 de outubro de 2022

U-BLOX NINA W106 COMO SONAR/RADAR

 

Neste BLOG, será mostrado um Radar (‘Radio Detection And Ranging’) ultrassônico com a Visuino e o software Processing. 

Os primeiros sistemas de radar foram desenvolvidos para detectar e alcançar aeronaves inimigas que se aproximam usando ondas de rádio. Normalmente, os sistemas de radar usam uma ferramenta de visualização chamada indicador de posição do plano (PPI), que coloca pontos em uma configuração polar para representar objetos que ocupam espaço na faixa do detector. Neste tutorial, um sensor ultrassónico (HC-SR04) será usado no lugar de um emissor de rádio e um indicador de posição de plano será construído em Java, registrando os movimentos angulares de um servo motor. O VISUINO irá registrar os dados de alcance do sensor ultrassónico ao mesmo tempo em que controla e gera a posição angular do servo motor. Isso permitirá a criação de um PPI para visualizar a posição de vários objetos ao redor do sistema de radar. Esse projeto pode ser adaptado para robôs, drones, carros e braços robóticos.

Baseado no Projeto 

Radar/Sonar Ultrassônico para seus Projetos - Blog Eletrogate

Porém, utilizado para testes o EVK U-BLOX NINA W106.


EVK U-BLOX NINA W106

UBLOX NINA W106
Wi-Fi 802.11b/g/n
Dual-Mode Bluetooth v4.2
Poderoso suporte de CPU aberta para aplicativos personalizados
Tamanho pequeno e várias opções de antena
Pino compatível com outros módulos NINA
Certificação global
Super Pequena
Módulo baseado no ESP32, com 4MB FLASH
HOMOLOGADO PELA ANATEL

VISUINO


Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino. ... Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá criar e projetar facilmente seus programas usando arrastar e soltar.

http://www.visuino.com/

PROCESSING 

O que é Processing ?

Processing é uma linguagem de programação de código aberto e ambiente de desenvolvimento integrado (IDE), construído para as artes eletrônicas e comunidades de projetos visuais com o objetivo de ensinar noções básicas de programação de computador em um contexto visual e para servir como base para cadernos eletrônicos. A linguagem tem por base as capacidades gráficas da linguagem de programação Java, simplificando características e criar alguns novos.

PROJETO


COMO FUNCIONA?

Como já vimos, o sensor ultrassónico mede a distância dos obstáculos usando ondas ultrassónicas. Nele, o emissor emite uma onda ultrassónica e o receptor recebe a onda refletida pelo obstáculo. Com isso, o sensor mede a distância até o obstáculo calculando o tempo entre a emissão e a recepção. Ao detectar um objeto e calcular a distancia, o VISUINO envia os dados para o software Processing, que irá plotar as informações no gráfico.
  • Basicamente o Visuino gera um "número" de 0 a 180, transforma em 0.0 a 1.0, envia para o servo para posicionar o Sonar.
  • Pega este "número",  adiciona uma "," seguido do valor da distância retornado pelo sonar e finalmente adiciona um "."
  • Envia pela serial.
Em Formatted Text do Visuino é formatado o pacote seguindo o formato abaixo.

angulo,distancia.

No projeto, Text to Char é utilizado para eliminar o CR/LF que o Formatted Text gera.




Para plotar o gráfico do radar, é necessário utilizar o software Processing (Download), faça o download e instale. Aqui está o código do Processing

import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
size (1366, 700);
smooth(); // Define que todos os desenhos tenham bordas suaves
myPort = new Serial(this, "COM5", 9600); // Habilita a porta COM8 na velocidade 9600
myPort.bufferUntil('.'); // Buffering ate o .
}
/**
* @brief Inicia o desenho do radar e chama as outras funções
*/
void draw() {
fill(98, 245, 31); // Define a cor verde usada para desenhar o radar
noStroke(); // Sem desenho na tela.
fill(0, 4); // Define a cor preto
rect(0, 0, width, 1010); // Desenha um retângulo na tela
fill(98, 245, 31); // Define a cor verde claro usada para desenhar o radar
drawRadar();
drawLine();
drawObject();
drawText();
}
/**
* @brief Ler os dados vindo da serial
*/
void serialEvent (Serial myPort) {
data = myPort.readStringUntil('.'); // Ler os dados como String até o . e armazena em data
data = data.substring(0, data.length()-1); // Quebra em substring
index1 = data.indexOf(","); // Separa por ,
angle= data.substring(0, index1); // Atribui o valor ao ângulo
distance= data.substring(index1+1, data.length()); // Atribui o valor a distância
iAngle = int(angle); // Converte o valor em inteiro
iDistance = int(distance); // Converte o valor em inteiro
}
/**
* @brief Desenha o gráfico base do radar
*/
void drawRadar() {
pushMatrix(); // Push a matriz na pilha de matrizes
translate(683, 700); // Deslocar o radar
noFill(); // Define sem cor
strokeWeight(2); // Define a largura do traçado usado nas linhas
stroke(98, 245, 31); // Define a cor verde usada para desenhar linhas
// Desenha as linhas do arco
arc(0, 0, 1300, 1300, PI, TWO_PI);
arc(0, 0, 1000, 1000, PI, TWO_PI);
arc(0, 0, 700, 700, PI, TWO_PI);
arc(0, 0, 400, 400, PI, TWO_PI);
// Desenha as linhas dos ângulos
line(-700, 0, 700, 0);
line(0, 0, -700*cos(radians(30)), -700*sin(radians(30)));
line(0, 0, -700*cos(radians(60)), -700*sin(radians(60)));
line(0, 0, -700*cos(radians(90)), -700*sin(radians(90)));
line(0, 0, -700*cos(radians(120)), -700*sin(radians(120)));
line(0, 0, -700*cos(radians(150)), -700*sin(radians(150)));
line(-700*cos(radians(30)), 0, 700, 0);
popMatrix(); // Pop a matriz na pilha de matrizes
}
/**
* @brief Desenha o objeto quando detectado
*/
void drawObject() {
pushMatrix(); // Push a matriz na pilha de matrizes
translate(683, 700); // Deslocar o objeto
strokeWeight(9); // Define a largura do traçado usado nas linhas
stroke(255, 10, 10); // Define a cor vermelho usada para desenhar linhas
pixsDistance = iDistance*22.5;
// Verifica se o objeto está dentro dos 40 cm, se sim desenha as linhas vermelhas
if (iDistance<40) {
line(pixsDistance*cos(radians(iAngle)), -pixsDistance*sin(radians(iAngle)), 700*cos(radians(iAngle)), -700*sin(radians(iAngle)));
}
popMatrix(); // Pop a matriz na pilha de matrizes
}
/**
* @brief Desenha as linhas no radar
*/
void drawLine() {
pushMatrix(); // Push a matriz na pilha de matrizes
strokeWeight(9); // Define a largura do traçado usado nas linhas
stroke(30, 250, 60); // Define a cor verde usada para desenhar linhas
translate(683, 700); // Deslocar a linhas
line(0, 0, 700*cos(radians(iAngle)), -700*sin(radians(iAngle))); // Deslocar a linhas através do arco
popMatrix(); // Pop a matriz na pilha de matrizes
}
/**
* @brief Desenha os textos no radar
*/
void drawText() {
pushMatrix(); // Push a matriz na pilha de matrizes
if (iDistance>40) {
noObject = "Out of Range"; // Se o objeto estiver fora dos 40cm seta "Out of Range"
} else {
noObject = "In Range"; // Caso o contrário seta "In Range"
}
fill(0, 0, 0); // Define a cor preto
noStroke(); // Sem desenho na tela.
rect(0, 1010, width, 1080); // Desenha um retângulo na tela
fill(98, 245, 31); // Define a cor preto
textSize(25); // Define a tamanho do texto
text("10cm", 800, 690); // Imprime o texto 10cm
text("20cm", 950, 690); // Imprime o texto 20cm
text("30cm", 1100, 690); // Imprime o texto 30cm
text("40cm", 1250, 690); // Imprime o texto 40cm
textSize(40); // Define a tamanho do texto
text("Object: " + noObject, 240, 1050); // Impime o texto Object: ...
text("Angle: " + iAngle +" °", 1050, 1050); // Impime o texto Angle: ...
text("Distance: ", 1380, 1050); // Impime o texto Distance: ...
if (iDistance<40) {
text(" " + iDistance +" cm", 1400, 1050); // Se o objeto estiver dentro dos 40cm imprime a distância do objeto em cm
}
textSize(25); // Define a tamanho do texto
fill(98, 245, 60); // Define a cor verde
translate(390+960*cos(radians(30)), 780-960*sin(radians(30))); // Deslocar o objeto
rotate(-radians(-60)); // Rotaciona o objeto
text("30°", 0, 0); // Imprime 30°
resetMatrix(); // Reseta a matriz na pilha de matrizes
translate(490+960*cos(radians(60)), 920-960*sin(radians(60))); // Deslocar o objeto
rotate(-radians(-30)); // Rotaciona o objeto
text("60°", 0, 0); // Imprime 60°
resetMatrix(); // Reseta a matriz na pilha de matrizes
translate(630+960*cos(radians(90)), 990-960*sin(radians(90))); // Deslocar o objeto
rotate(radians(0)); // Rotaciona o objeto
text("90°", 0, 0); // Imprime 90°
resetMatrix(); // Reseta a matriz na pilha de matrizes
translate(760+960*cos(radians(120)), 1000-960*sin(radians(120))); // Deslocar o objeto
rotate(radians(-38)); // Rotaciona o objeto
text("120°", 0, 0); // Imprime 120°
resetMatrix(); // Reseta a matriz na pilha de matrizes
translate(840+900*cos(radians(150)), 920-960*sin(radians(150))); // Deslocar o objeto
rotate(radians(-60)); // Rotaciona o objeto
text("150°", 0, 0); // Imprime 1500°
popMatrix(); // Pop a matriz na pilha de matrizes
} Conectando a IDE Processing com o U-BLOX NINA W106 Agora, precisamos comunicar o U-BLOX NINA W106 com o programa no Processing: 1. No EVK U-BLOX NINA W106, verifique qual porta serial (no caso do Windows, “COM”) está conectado. 2. Na IDE do Processing, cole o código para gerar o gráfico e altere a linha abaixo para a porta serial em que o EVK U-BLOX NINA W106 está conectado. myPort = new Serial(this, "COM4", 9600);

3. Certifique que a tela do Monitor Serial do está fechada. 4. Na IDE do Processing, click no botão “PLAY” conforme figura abaixo, para executar o código.

DÚVIDAS

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br

Nenhum comentário:

Postar um comentário