基于红外传感器的雷达设计——通过Processing实现

此次设计用到的红外测距传感器是夏普(SHARP)的GP2Y0A21YK0F;传感器测试相关文档请阅读:


概述

雷达通常在军事领域运用较多,民用方面也有很多,在此就不一一举例说明了。
本次设计主要是想通过红外测距传感器配合单片机系统实现“雷达”硬件,通过异步串口通信,将数据传输至PC,并通过Peocessing开发上位机“雷达”界面用以显示。
在传感器的测试文档中,小楊通过矩形数量来显示传感器输出值。
今天既然说是“雷达”,那小楊就模拟一个“雷达”界面。

雷达硬件组成:

老套路,发烟测试,通过最简单的方法实现效果。
SHARP的GP2Y0A21YK0F传感器性能稳定,好用不贵,且不需要再设计外围电路。
那剩下的就是具备ADC+串口通信功能的单片机系统咯,出于最简单实现的初衷,小楊就用下面这款了:

开发板兼容ArduinoIDE编程。不在这里过多赘述,相关信息请参阅工作室的其他文档。
整体连接如下:

忘了说,扫描需要云台,就用舵机简单模拟一个,关于舵机控制,请参考:

下面直接展示代码:

// Visual Micro is in vMicro>General>Tutorial Mode
// 
/*
    Name:       LeiDa.ino
    Created:    2018/7/22 13:23:31
    Author:     禾灮\HeGuang
*/

// Define User Types below here or use a .h file
//
#include <Servo.h>. 

// Define Function Prototypes that use User Types below here or use a .h file
//// 初始化设置
const int VoPin = 14;
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
int Range_SHARP(){
    duration = analogRead(VoPin);
    distance = (1024 - duration)/10 - 50;
    return distance;
}


// The setup() function runs once each time the micro-controller starts
void setup(){
    pinMode(VoPin, INPUT);
    Serial.begin(9600);
    myServo.attach(10);
}

// Add the main program code into the continuous loop() function
void loop(){
    for(int i=15;i<=165;i++){
        myServo.write(i);
        distance = Range_SHARP();
        Serial.print(i);
        Serial.print(",");
        Serial.print(distance);
        Serial.print(".");
        delay(50);
    }
    for(int i=165;i>15;i--){
        myServo.write(i);
        distance = Range_SHARP();
        Serial.print(i);
        Serial.print(",");
        Serial.print(distance);
        Serial.print(".");
        delay(50);
    }
}

完成了这些准备,下面就该上位机开发了。
雷达上位机
开发用到的软件: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 (1200, 700);     //这个分辨率自己根据你的电脑的配置和显示屏幕配置进行更改。
  smooth();
  myPort = new Serial(this,"COM7", 9600);  //这个串口号一定要更改。  
  myPort.bufferUntil('.');
}
void draw() {
  fill(98,245,31);
  noStroke();
  fill(0,4); 
  rect(0, 0, width, height-height*0.065); 
  fill(98,245,31);
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) { 
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  index1 = data.indexOf(",");
  angle= data.substring(0, index1);
  distance= data.substring(index1+1, data.length());
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074);
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  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);
  // draws the angle lines
  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);
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance=iDistance*((height-height*0.1666)*0.025);
  if(iDistance<40){
    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);
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle)));
  popMatrix();
}
void drawText() {
  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(28);
  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(); 
}

*

感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。

感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

            禾灮,感谢有你。

未来,我们将一如既往,砥砺前行。

                                    禾灮·小楊
                                   2018.08.13

猜你喜欢

转载自blog.csdn.net/HeGuang68207/article/details/81814586