基于红外传感器的雷达设计——通过Processing实现
程序员文章站
2022-04-27 13:17:31
...
此次设计用到的红外测距传感器是夏普(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