前一段时间,在头条号上发布了一个短视频《 用Arduino在家制作“雷达”的4个步骤》,有好多人问如何制作,所以在此写一篇文章,尽量详细的介绍一下制作过程。

一、材料

用到的材料有Arduino UNO开发板、舵机、超声波传感器、面包板,先来一张全家福吧。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(1)

“小雷达”需要的材料

接下来分别进行一下简单的介绍:

1、Arduino开发板

什么是Arduino开发板呢,我把它比作一个小电脑,有兴趣的朋友可以看一下我上传的视频。它的设计初衷就是让非专业人士能够快速上手编程、开发小型自动控制应用,从这一点上说,它是比较容易学习的,我也在更新Arduino应用的基础教程视频,有兴趣的朋友可以观看一下。

Arduino是一个大家庭,是一系列开发板的总称,不同的板子有有不同的功能,大小、接口数量、处理器种类、处理数据速度也不同,可以到官方网站www.arduino.cc/en/main/hardware查看各种型号的板子。

这里重点介绍一下Arduino UNO,它是最常用的一款开发板,也是本次制作中用的一款Arduino开发板。它的构造如下:

arduino小雷达制作(Arduino制作小雷达的详细步骤)(2)

Arduino UNO构造

它的各部分功能:

  1. 重启按钮:重新启动Arduino上面的程序。
  2. USB接口:Arduino一般通过这个接口进行程序的刻录,并且可由此接口提供电源。
  3. 电源接口:Arduino独立工作的时候一般使用这个接口供电。
  4. 供电接口:可提供5V、3.3V的电压以及接地。
  5. 模拟输入接口:Arduino Uno 有 6个模拟输入端口,标记为 A0 到 A5,都可提供 10 位的模拟信号解析 (即 1024 种不同的数值)。
  6. 单片机:运行程序的核心部件。
  7. 数字接口:用来处理数字信号,有输入和输出模式。

Arduino开发板需要编程才能使用,他的编程软件就叫Arduino,可以到官方网站上进行下载。

2、舵机

(1)什么是舵机

舵机集成了电机、齿轮及内部反馈系统,它能够转动达到并保持指定的角度。内部反馈系统主要依靠的是位置检测器,由电机控制齿轮转动,通过位置传感器判断是否达到了指定位置,并实时进行反馈校正。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(3)

各种舵机

(2)舵机的种类

电子制作中常用的舵机从外形上看基本都是一样的,主要区别可能就是大小不同。其实选择舵机主要看两个性能指标:扭力和转速。扭力就是指舵机有多大劲,是否能够完成要执行的动作。转速就是在对完成速度有要求时要考虑的一个变量了。

本次制作中舵机只需要能够带动超声波传感器转动就可以了,对舵机没有特别要求。

(3)如何控制舵机

这里需要重点讲的是如何控制舵机,舵机一般有三根线,黑色(或棕色)的线是接地线,红线接 5V电压,黄线(或是白色或橙色)接控制信号端。舵机的控制信号是方波,一般叫做PWM波,PWM是脉冲宽度调制的英文简写。可以简单理解为通过控制PWM波的脉冲宽度来控制舵机转动的角度。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(4)

不同宽度的脉冲控制舵机转动不同角度

一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。这里特别要注意的是: 控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。

(4)Arduino如何控制舵机

Arduino是如何控制舵机的呢,本次制作用到了Arduino集成的servo库,其中包含了可以控制舵机的函数:

本次制作中只用到了其中两个函数,attach()设定连接舵机控制端的接口,write()控制舵机转动的角度。下面就是用11口控制舵机从0°到180°来回转动的代码。

#include <Servo.h> Servo radarServo; void setup() { radarServo.attach(11); } void loop() { for(int i=0;i<=180;i ) { radarServo.write(i); delay(50); } for(int i=180;i>=0;i--) { radarServo.write(i); delay(50); } }

3、超声波传感器

arduino小雷达制作(Arduino制作小雷达的详细步骤)(5)

超声波传感器模块

超声波传感器采用“回声定位”的方式来确定距离,发出一个脉冲声波,等待反射回来的声波,通过发出跟发射回来的时间差来计算距离。我的这个视频中简单讲解了超声波传感器的原理及应用。

超声波传感器有4个引脚:GND、VCC、Trig和Echo ,模块的GND和VCC分别连接到Arduino开发板的GND和5V引脚就可以了。Trig和Echo引脚可以连接到Arduino开发板上的任意数字接口。

为了产生超声波,需要将Trig设置为高电平并持续10μs。这将使超声波传感器发出一个声波脉冲,它将声速340米/秒在空气中传播,如果碰到物体反射回来,就会在Echo引脚中接收。 Echo引脚将输出声波传播的时间,以微秒为单位.。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(6)

“回声定位”的计算

例如,如果物体距离传感器10厘米,并且声速为340米/秒也就是0.034厘米/μs,则声波将需要行进约294微秒到达物体。但是你从Echo引脚得到的数字将是这个数字的两倍,因为声波需要前进并向后反射。因此,为了获得以cm为单位的距离,我们需要Echo引脚接收的行程时间值乘以0.034并除以2,这一点在后边的编程中要用到。

Arduino提供了一个测量脉冲时间长度的pulseln()函数。语法格式为:pulseIn(PIn, value),其中pin就是读取脉冲时间的接口,value是设定等待的脉冲为高电平还是低电平,值为HIGH或LOW。通过超声波传感器测量距离,编程就是通过将Trig设置为高电平脉冲从而使传感器输出一个声波脉冲,通过Echo引脚读取脉冲反射回的总时间,通过公式计算距离。下面是通过超声波传感器不断测量距离的程序。

const int trigPin = 9; const int echoPin = 10; long duration; int distinCM; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distinCM = duration*0.034/2; Serial.print(i); Serial.print("*"); Serial.print(distinCM); Serial.print("#"); }

4、面包板

面包板是常用的实验材料,可以免焊接连接电路,面包板上有很多小插孔,是专为电子电路的无焊接实验设计制造的。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(7)

面包板

这里也简单介绍了面包板

二、制作步骤

1、电路连接

在确定完要实现的功能之后,首先选择可以完成这些功能的硬件。然后就是设计电路,确定硬件的连接关系,文章开头已经列出了用到的硬件,这里还需要确定舵机、超声波传感器控制端与Arduino开发板的连接关系。这里我们用9、10脚控制超声波传感器,11脚控制舵机,其连接关系如下:

arduino小雷达制作(Arduino制作小雷达的详细步骤)(8)

”小雷达“的电路连接关系

2、梳理思路

编程之前最好先梳理一下思路,这里我们要做到的是让舵机带着超声波传感器从0到180度以1度的精度来回转动,在这期间超声波传感器不断测量距离并传给上位机,由上位机进行图形显示。

arduino小雷达制作(Arduino制作小雷达的详细步骤)(9)

”小雷达“程序流程图

3、编写程序及调试

(1)Arduino编程

思路理清楚了,按照电路连接关系编写Arduino的程序,本制作的程序如下:

#include <Servo.h> const int trigPin = 10; const int echoPin = 9; long duration; int distinCM; Servo radarServo; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); radarServo.attach(11); } void loop() { for(int i=0;i<=180;i ) { radarServo.write(i); delay(50); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distinCM = duration*0.034/2; Serial.print(i); Serial.print("*"); Serial.print(distinCM); Serial.print("#"); } for(int i=180;i>=0;i--) { radarServo.write(i); delay(50); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distinCM = duration*0.034/2; Serial.print(i); Serial.print("*"); Serial.print(distinCM); Serial.print("#"); } }

(2)上位机编程

本制作中实现电脑上显示雷达扫描图像所用到的软件是processing,我也是进行这个制作时接触到的这款软件,给我的感觉就是功能很强大,建议大家有时间研究一下。这款软件可以在官网上进行下载:https://processing.org/download/。

上位机程序的功能就是读取Arduino上传的超声波传感器在不同角度测定的距离,并以图形的形式显示出来。上位机的代码如下:

import processing.serial.*; import processing.opengl.*; import toxi.geom.*; import toxi.processing.*; ToxiclibsSupport gfx; Serial port; String serialAngle; String serialDistance; String serialData; float objectDistance; int radarAngle, radarDistance; int index=0; void setup() { size (1280, 720); gfx = new ToxiclibsSupport(this); smooth(); //println(Serial.list()); //String portName = Serial.list()[0]; String portName = "COM6"; port = new Serial(this, portName, 9600); //port = new Serial(this,"COM4", 9600); port.bufferUntil('#'); } void draw() { //fill(10,255,10); noStroke(); fill(0,4); rect(0, 0, 1280, 720); fill(10,255,10); //Radar arcs and Lines pushMatrix(); translate(640,666); noFill(); strokeWeight(2); stroke(10,255,10); arc(0,0,1200,1200,PI,TWO_PI); arc(0,0,934,934,PI,TWO_PI); arc(0,0,666,666,PI,TWO_PI); arc(0,0,400,400,PI,TWO_PI); strokeWeight(4); line(-640,0,640,0); line(0,0,-554,-320); line(0,0,-320,-554); line(0,0,0,-640); line(0,0,320,-554); line(0,0,554,-320); popMatrix(); //Ultrasonic Lines pushMatrix(); strokeWeight(5); stroke(10,255,10); translate(640,666); line(0,0,640*cos(radians(radarAngle)),-640*sin(radians(radarAngle))); popMatrix(); //Object Detection Lines pushMatrix(); translate(640,666); strokeWeight(5); stroke(255,10,10); // red color objectDistance = radarDistance*15; if(radarDistance<40) { line(objectDistance*cos(radians(radarAngle)),-objectDistance*sin(radians(radarAngle)),633*cos(radians(radarAngle)),-633*sin(radians(radarAngle))); } popMatrix(); } void serialEvent (Serial port) { serialData = port.readStringUntil('#'); serialData = serialData.substring(0,serialData.length()-1); index = serialData.indexOf("*"); serialAngle= serialData.substring(0, index); serialDistance= serialData.substring(index 1, serialData.length()); radarAngle = int(serialAngle); radarDistance = int(serialDistance); }

经过以上步骤,连接电路、编程并下载之后,应该就可以完成本次制作了。 如果大家还有什么不明白的地方,欢迎留言或给我发私信,我将尽力解答,谢谢。

,