Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Neste Tutorial Arduino, mostrarei como você pode fazer este radar legal usando a Placa Arduino e o Ambiente de Desenvolvimento Processing. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo para mais detalhes.

Visão Geral

Tudo o que você precisa para este Projeto Arduino é um Sensor Ultrassônico para detectar objetos, um pequeno Servomotor de hobby para rotacionar o sensor e uma Placa Arduino para controlá-los.

Componentes Necessários para este Projeto Arduino

Você pode obter estes componentes em qualquer um dos sites abaixo:

  • Sensor Ultrassônico HC-SR04
  • Servomotor
  • Placa Arduino
  • Protoboard e Fios Jumpers

Construindo o Dispositivo

  • Primeiro, fiz um suporte de papelão para conectar o sensor ultrassônico ao servomotor. Dobrei como mostrado na imagem abaixo, colei e fixei ao servomotor usando um parafuso assim.
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo
  • Também fixei um header de pinos no qual soldei 4 fios jumpers para conectar o sensor.
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo
  • Finalmente, fixei o servomotor à Placa Arduino usando um elástico.
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Existem também suportes de montagem especiais para o sensor ultrassônico da Banggood. Você pode obtê-los nos seguintes links:

  • Sensor Ultrassônico com Suporte de Montagem
  • Suporte de Montagem para Medição Ultrassônica Banggood
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Esquema de Circuito do Radar Arduino

Conectei o Sensor Ultrassônico HC-SR04 aos pinos 10 e 11 e o servomotor ao pino 12 na Placa Arduino.

Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Códigos Fonte

Agora precisamos fazer um código e carregá-lo na Placa Arduino que permitirá a interação entre o Arduino e a IDE Processing. Para entender como a conexão funciona, clique aqui para visitar meu Tutorial Arduino e Processing.

Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Aqui está o Código Fonte Arduino com descrição de cada linha do código:

// Inclui a biblioteca Servo
#include <Servo.h>
// Define pinos Trig e Echo do Sensor Ultrassônico
const int trigPin = 10;
const int echoPin = 11;
// Variáveis para duração e distância
long duration;
int distance;
Servo myServo; // Cria um objeto servo para controlar o servomotor

void setup() {
  pinMode(trigPin, OUTPUT); // Define trigPin como saída
  pinMode(echoPin, INPUT); // Define echoPin como entrada
  Serial.begin(9600);
  myServo.attach(12); // Define em qual pino o servomotor está conectado
}

void loop() {
  // Rotaciona o servomotor de 15 a 165 graus
  for(int i=15;i<=165;i++){
    myServo.write(i);
    delay(30);
    distance = calculateDistance(); // Chama função para calcular distância medida pelo sensor ultrassônico para cada grau
    Serial.print(i); // Envia o grau atual para a Porta Serial
    Serial.print(","); // Envia caractere adicional logo após o valor anterior necessário depois na IDE Processing para indexação
    Serial.print(distance); // Envia o valor da distância para a Porta Serial
    Serial.print("."); // Envia caractere adicional logo após o valor anterior necessário depois na IDE Processing para indexação
  }
  // Repete as linhas anteriores de 165 a 15 graus
  for(int i=165;i>15;i--){
    myServo.write(i);
    delay(30);
    distance = calculateDistance();
    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

// Função para calcular a distância medida pelo sensor ultrassônico
int calculateDistance(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Define trigPin em estado HIGH por 10 microssegundos
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // Lê o echoPin, retorna o tempo de viagem da onda sonora em microssegundos
  distance= duration*0.034/2;
  return distance;
}
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Agora receberemos os valores do ângulo e da distância medida pelo sensor da Placa Arduino para a IDE Processing usando a função SerialEvent() que lê os dados da Porta Serial e colocaremos os valores do ângulo e da distância nas variáveis iAngle e iDistance. Estas variáveis serão usadas para desenhar o radar, as linhas, os objetos detectados e alguns dos textos.

Para desenhar o radar, fiz esta função drawRadar() que consiste nas funções arc() e line().

void drawRadar() {
  pushMatrix();
  translate(960,1000); // move as coordenadas iniciais para nova localização
  noFill();
  strokeWeight(2);
  stroke(98,245,31); // desenha as linhas de arco
  arc(0,0,1800,1800,PI,TWO_PI);
  arc(0,0,1400,1400,PI,TWO_PI);
  arc(0,0,1000,1000,PI,TWO_PI);
  arc(0,0,600,600,PI,TWO_PI);
  // desenha as linhas de ângulo
  line(-960,0,960,0);
  line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
  line(0,0,-960*cos(radians(60)),-960*sin(radians(60)));
  line(0,0,-960*cos(radians(90)),-960*sin(radians(90)));
  line(0,0,-960*cos(radians(120)),-960*sin(radians(120)));
  line(0,0,-960*cos(radians(150)),-960*sin(radians(150)));
  line(-960*cos(radians(30)),0,960,0);
  popMatrix();
}
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Para desenhar a linha que se move junto ao radar, fiz esta função drawLine(). Seu centro de rotação é definido com a função translate() e, usando a função line() na qual a variável iAngle é usada, a linha é redesenhada para cada grau.

void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(960,1000); // move as coordenadas iniciais para nova localização
  line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle))); // desenha a linha de acordo com o ângulo
  popMatrix();
}
Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Para desenhar os objetos detectados, fiz esta função drawObject(). Ela obtém a distância do sensor ultrassônico, transforma em pixels e, em combinação com o ângulo do sensor, desenha o objeto no radar.

void drawObject() {
  pushMatrix();
  translate(960,1000); // move as coordenadas iniciais para nova localização
  strokeWeight(9);
  stroke(255,10,10); // cor vermelha
  pixsDistance = iDistance*22.5; // converte a distância do sensor de cm para pixels
  // limitando o alcance a 40 cms
  if(iDistance<40){
    // desenha o objeto de acordo com o ângulo e a distância
    line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
  }
  popMatrix();
}

Para o texto na tela, fiz a função drawText() que desenha textos em locais específicos.

Todas essas funções são chamadas na função principal draw() que se repete o tempo todo e desenha a tela. Também aqui estou usando a função fill() com 2 parâmetros para simular desfoque de movimento e desvanecimento lento da linha em movimento.

void draw() {
  fill(98,245,31);
  textFont(orcFont);
  // simulando desfoque de movimento e desvanecimento lento da linha em movimento
  noStroke();
  fill(0,4);
  rect(0, 0, width, 1010);
  fill(98,245,31); // cor verde
  // chama as funções para desenhar o radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

Aqui está a aparência final do radar:

Construa um Sistema Radar com Arduino: Sensor Ultrassônico e Servo – Guia Passo a Passo

Aqui está o Código Fonte Completo do Processing para o Radar Arduino:

import processing.serial.*; // importa biblioteca para comunicação serial
import java.awt.event.KeyEvent; // importa biblioteca para leitura de dados da porta serial
import java.io.IOException;
Serial myPort; // define Objeto Serial
// define variáveis
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;

void setup() {
  size (1920, 1080);
  smooth();
  myPort = new Serial(this,"COM4", 9600); // inicia a comunicação serial
  myPort.bufferUntil('.'); // lê os dados da porta serial até o caractere '.'. Então, na verdade, lê isto: angle,distance.
  orcFont = loadFont("OCRAExtended-30.vlw");
}

void draw() {
  fill(98,245,31);
  textFont(orcFont);
  // simulando desfoque de movimento e desvanecimento lento da linha em movimento
  noStroke();
  fill(0,4);
  rect(0, 0, width, 1010);
  fill(98,245,31); // cor verde
  // chama as funções para desenhar o radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

void serialEvent (Serial myPort) {
  // inicia leitura de dados da Porta Serial
  // lê os dados da Porta Serial até o caractere '.' e coloca na variável String "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  index1 = data.indexOf(","); // encontra o caractere ',' e coloca na variável "index1"
  angle= data.substring(0, index1); // lê os dados da posição "0" até a posição da variável index1 ou seja, o valor do ângulo que a Placa Arduino enviou para a Porta Serial
  distance= data.substring(index1+1, data.length()); // lê os dados da posição "index1" até o final dos dados ou seja, o valor da distância
  // converte as variáveis String em Inteiro
  iAngle = int(angle);
  iDistance = int(distance);
}

void drawRadar() {
  pushMatrix();
  translate(960,1000); // move as coordenadas iniciais para nova localização
  noFill();
  strokeWeight(2);
  stroke(98,245,31); // desenha as linhas de arco
  arc(0,0,1800,1800,PI,TWO_PI);
  arc(0,0,1400,1400,PI,TWO_PI);
  arc(0,0,1000,1000,PI,TWO_PI);
  arc(0,0,600,600,PI,TWO_PI);
  // desenha as linhas de ângulo
  line(-960,0,960,0);
  line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
  line(0,0,-960*cos(radians(60)),-960*sin(radians(60)));
  line(0,0,-960*cos(radians(90)),-960*sin(radians(90)));
  line(0,0,-960*cos(radians(120)),-960*sin(radians(120)));
  line(0,0,-960*cos(radians(150)),-960*sin(radians(150)));
  line(-960*cos(radians(30)),0,960,0);
  popMatrix();
}

void drawObject() {
  pushMatrix();
  translate(960,1000); // move as coordenadas iniciais para nova localização
  strokeWeight(9);
  stroke(255,10,10); // cor vermelha
  pixsDistance = iDistance*22.5; // converte a distância do sensor de cm para pixels
  // limitando o alcance a 40 cms
  if(iDistance<40){
    // desenha o objeto de acordo com o ângulo e a distância
    line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
  }
  popMatrix();
}

void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(960,1000); // move as coordenadas iniciais para nova localização
  line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle))); // desenha a linha de acordo com o ângulo
  popMatrix();
}

void drawText() {
  // desenha os textos na tela
  pushMatrix();
  if(iDistance>40) {
    noObject = "Out of Range";
  } else {
    noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, 1010, width, 1080);
  fill(98,245,31);
  textSize(25);
  text("10cm",1180,990);
  text("20cm",1380,990);
  text("30cm",1580,990);
  text("40cm",1780,990);
  textSize(40);
  text("Object: " + noObject, 240, 1050);
  text("Angle: " + iAngle + " °", 1050, 1050);
  text("Distance: ", 1380, 1050);
  if(iDistance<40) {
    text(" " + iDistance + " cm", 1400, 1050);
  }
  textSize(25);
  fill(98,245,60);
  translate(961+960*cos(radians(30)),982-960*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate(954+960*cos(radians(60)),984-960*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate(945+960*cos(radians(90)),990-960*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(935+960*cos(radians(120)),1003-960*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate(940+960*cos(radians(150)),1018-960*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix();
}

Nova versão atualizada do código do Radar Arduino para se adequar a qualquer resolução de tela:

Apenas altere os valores na função size(), com a resolução da sua tela.

/* Projeto Radar Arduino
 * Versão atualizada. Se adapta a qualquer resolução de tela!
 * Apenas altere os valores na função size(),
 * com a resolução da sua tela.
 *
 * por Dejan Nedelkovski,
 * www.HowToMechatronics.com
 */
import processing.serial.*; // importa biblioteca para comunicação serial
import java.awt.event.KeyEvent; // importa biblioteca para leitura de dados da porta serial
import java.io.IOException;
Serial myPort; // define Objeto Serial
// define variáveis
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;

void setup() {
  size (1920, 1080); // ***ALTERE ISTO PARA A RESOLUÇÃO DA SUA TELA***
  smooth();
  myPort = new Serial(this,"COM4", 9600); // inicia a comunicação serial
  myPort.bufferUntil('.'); // lê os dados da porta serial até o caractere '.'. Então, na verdade, lê isto: angle,distance.
  orcFont = loadFont("OCRAExtended-30.vlw");
}

void draw() {
  fill(98,245,31);
  textFont(orcFont);
  // simulando desfoque de movimento e desvanecimento lento da linha em movimento
  noStroke();
  fill(0,4);
  rect(0, 0, width, height-height*0.065);
  fill(98,245,31); // cor verde
  // chama as funções para desenhar o radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

void serialEvent (Serial myPort) {
  // inicia leitura de dados da Porta Serial
  // lê os dados da Porta Serial até o caractere '.' e coloca na variável String "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  index1 = data.indexOf(","); // encontra o caractere ',' e coloca na variável "index1"
  angle= data.substring(0, index1); // lê os dados da posição "0" até a posição da variável index1 ou seja, o valor do ângulo que a Placa Arduino enviou para a Porta Serial
  distance= data.substring(index1+1, data.length()); // lê os dados da posição "index1" até o final dos dados ou seja, o valor da distância
  // converte as variáveis String em Inteiro
  iAngle = int(angle);
  iDistance = int(distance);
}

void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074); // move as coordenadas iniciais para nova localização
  noFill();
  strokeWeight(2);
  stroke(98,245,31); // desenha as linhas de arco
  arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
  arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
  arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
  arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
  // desenha as linhas de ângulo
  line(-width/2,0,width/2,0);
  line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
  line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
  line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
  line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
  line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
  line((-width/2)*cos(radians(30)),0,width/2,0);
  popMatrix();
}

void drawObject() {
  pushMatrix();
  translate(width/2,height-height*0.074); // move as coordenadas iniciais para nova localização
  strokeWeight(9);
  stroke(255,10,10); // cor vermelha
  pixsDistance = iDistance*((height-height*0.1666)*0.025); // converte a distância do sensor de cm para pixels
  // limitando o alcance a 40 cms
  if(iDistance<40){
    // desenha o objeto de acordo com o ângulo e a distância
    line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
  }
  popMatrix();
}

void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074); // move as coordenadas iniciais para nova localização
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // desenha a linha de acordo com o ângulo
  popMatrix();
}

void drawText() {
  // desenha os textos na tela
  pushMatrix();
  if(iDistance>40) {
    noObject = "Out of Range";
  } else {
    noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  textSize(25);
  text("10cm",width-width*0.3854,height-height*0.0833);
  text("20cm",width-width*0.281,height-height*0.0833);
  text("30cm",width-width*0.177,height-height*0.0833);
  text("40cm",width-width*0.0729,height-height*0.0833);
  textSize(40);
  text("Object: " + noObject, width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle + " °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
    text(" " + iDistance + " cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix();
}

Processo de manufatura

  1. Crie um Sistema Ambilight Impressionante para Monitor com Arduino
  2. Construa o Clássico Jogo Pong no Arduino UNO com Display OLED – Tutorial Passo a Passo
  3. Robô Desviador de Obstáculos com Servo: Construa com Arduino e HC-SR04
  4. Detector de Frequência de Áudio com Arduino – Meça Picos de Som com Módulo de Alta Sensibilidade
  5. Construa Seu Próprio Tamagotchi com Arduino: Projeto DIY de Pet Digital
  6. Controlador Inteligente de Interruptor de Luz Sem Fio: Manipulador Remoto Baseado em Arduino
  7. Jogo da Velha com Arduino, Matriz LED MAX7219 e Caixa de Papelão
  8. Pistola de Água Inteligente com Detecção de Movimento usando Arduino Nano
  9. Construa um Temporizador Regressivo Confiável com Arduino e Display de 7 Segmentos SparkFun
  10. Girassol Eletrônico com Arduino: Rastreador Solar Autônomo