Arduino+Processing模擬雷達掃描效果教程

2021-01-10 初始化工作室

一、前言

閱讀此文前請戳這個視頻觀看使用Arduino超聲波傳感器模擬雷達掃描教程,先了解效果,有直觀感受再來看下文。

圖1 雷達掃描效果

二、硬體準備

圖2 所需硬體

如圖2所示,需要Arduino主板(最好加上擴展板)1塊、超聲波傳感器1個、伺服電機(舵機)1個,1602液晶顯示屏(可選)。

我將超聲波傳感器的Trig、Echo分別連接在擴展板的4、5號引腳,將伺服電機連接在擴展板的9號引腳上,為了簡化程序,後續我沒有使用液晶顯示屏,請你自行添加相關程序。

三、軟體準備

1、Arduino IDE 1.8.9

圖3 Arduino IDE

2、Processing 3.3.5

圖4 Processing

備註:

1、上述軟體版本是我自己調試成功的版本,略低版本可能會有兼容問題,請注意你的軟體版本號;

2、如果Processing的程序編輯器內不能輸入、顯示中文,請在「文件」、「偏好設定」裡,選擇「啟用複雜字體輸入」並在「編輯器和控制臺字體」中選擇「宋體」即可顯示或輸入中文;

圖5 修改Processing偏好設定

3、如果Processing的展示界面不能顯示中文,請在程序裡裝載中文字庫,如圖6第5、19、20行代碼所示。

圖6 裝載中文字庫

四、編寫程序

程序分兩步實現:

第一步:使用Arduino IDE,編寫伺服電機180度循環搖頭、獲取超聲波傳感器返回值(與障礙物的距離值)、向串口輸出伺服電機轉動的角度和超聲波傳感器的距離值(注意要和Processing中獲取串口值的格式一致),代碼如下(請注意修改超聲波傳感器、伺服電機的引腳號為你自己的實際引腳號):

#include<stdio.h>#include <Servo.h> Servo mServo; //創建一個舵機控制對象//當前角度int mAngleNum = 0;//當前是正向旋轉還是反向旋轉char mFront = 0;//超聲波測距引腳const int mTrigPin = 4; const int mEchoPin = 5; //當前距離int mDistance = 0;//像串口發送數據 發送到processingvoid sendStatusToSerial();//測距void ranging();void setup() {// put your setup code here, to run once: Serial.begin(9600); mServo.attach(9); // 該舵機由arduino第9腳控制 pinMode(mTrigPin, OUTPUT); // 要檢測引腳上輸入的脈衝寬度,需要先設置為輸入狀態 pinMode(mEchoPin, INPUT); }void loop() { // put your main code here, to run repeatedly: //多角度設置 mServo.write(180 - mAngleNum); //超聲波測距 ranging(); //發數據 sendStatusToSerial(); delay(60); if( mFront == 0 ) { mAngleNum ++; if( mAngleNum > 180 ) { mFront = 1; } } else { mAngleNum --; if( mAngleNum < 0 ) { mFront = 0; } }}//發送當前狀態到串口void sendStatusToSerial(){ char mAngleStr[6]; char mDistanceStr[6]; sprintf( mAngleStr, "%d", mAngleNum); sprintf( mDistanceStr, "%d", mDistance); delayMicroseconds(2); Serial.print(mAngleStr); Serial.print(","); Serial.print(mDistanceStr); Serial.print("."); delay(50);}//測距void ranging(){ // 產生一個10us的高脈衝去觸發TrigPin digitalWrite(mTrigPin, LOW); //低高低電平發一個短時間脈衝去TrigPin delayMicroseconds(2); digitalWrite(mTrigPin, HIGH); delayMicroseconds(10); digitalWrite(mTrigPin, LOW); mDistance = pulseIn(mEchoPin, HIGH) / 58.0; //將回波時間換算成cm }

第二步:使用Processing,編寫一圖7的界面、獲取串口發送過來的角度、距離值,將其轉換旋轉指針的動作、屏幕中間的紅色提示、屏幕下方的文字提示等,具體代碼如下:

圖7 模擬雷達界面圖

import processing.serial.*;import java.awt.event.KeyEvent;import java.io.IOException;PFont font;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(); font = createFont("宋體.vlw",48); textFont(font); myPort = new Serial(this,"COM5", 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 = "檢測範圍外"; }else { noObject = "檢測範圍內"; } 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("對象: " + noObject, width-width*0.875, height-height*0.0277); text("角度: " + iAngle +" °", width-width*0.48, height-height*0.0277); text("距離: ", 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(); }

圖8 我的模仿作品

總之,實現模擬雷達掃描效果,只需要能將角度、距離值發送到串口,然後使用Processing將獲得的數據模擬出來即可,這種方法可以推而廣之,將其他傳感器的返回值也發送給Processing,將返回值圖形化,說不定你也可以做出其他不一樣的創意出來。

好好學習,天天向上,初始化工作室和你一起學習Arduino知識,快去動手做吧,做出不一樣的雷達掃描效果分享給大家。

相關焦點

  • Arduino教程┃模擬土壤溼度傳感器的介紹
    它是一個模擬輸入模塊,可以實現土壤溼度的檢測,有DO、AO兩種模式。注意不同土壤介質的測量值會存在差異,土壤中的水分存在分布不均勻的情況,數據僅能代表局部溼度。點擊下面的連結觀看視頻了解詳細情況。Arduino學習:認識模擬土壤溼度傳感器一、傳感器簡介本模塊可以實現土壤溼度的檢測,土壤溼度指的是土壤的含水量,能直接影響到作物的水分供應狀況。
  • arduino從零開始(4)PWM與呼吸燈
    你將了解脈衝寬度調試(PWM)的原理你將使用PWM製作一個呼吸燈的效果脈衝寬度調試PWM,也就是脈衝寬度調製,用於將一段信號編碼為脈衝信號(方波信號)。是在數字電路中 達到 模擬輸出效果的一種手段。即:使用數字控制產生佔空比不同的方波(一個不停在開與關之間切換的信號)來控制模擬輸出。我們要在數字電路中輸出模擬信號,就可以使用PWM技術實現。
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • 基於DDS的單脈衝體制雷達目標模擬的實現
    利用DDS晶片AD9857設計了一種單脈衝體制雷達的目標模擬器。通過數字交匯技術將模擬目標和雷達掃描波束進行交匯,計算出DDS晶片的控制參數。在某雷達調試過程中,驗證了該目標模擬器的有效性。關鍵詞 單脈衝;目標模擬;比幅測角;和差波束 單脈衝體制雷達能在一個回波脈衝內獲得關於目標位置的全部信息,這使雷達在工作過程中節約了大量的時間和能量,所以得到廣泛應用。單脈衝測角方法主要有3種:幅度比較法、相位比較法和幅度相位比較法。
  • LabVIEW+Arduino之四位數碼管顯示
    微信搜索【沛華測控】訂閱我們Shania本來想更一期「一位數碼管倒計時」的課程,後面覺得不是很有意思,於是換成四位數碼管,想做一個「數碼管顯示電壓值」的效果。經過幾天的摸索,分別使用LabVIEW和Arduino C/C++實現了同樣的效果,今天跟大家簡單分享一下。
  • 雷達常用詞彙中英文對照表
    Analog phase shifter信號的模擬處理Analog processing of signal模擬信號Analog signal模擬式掃描(連續式掃描)模-數變換Analog-to-digital conversion模擬顯示
  • 十個中文例程教會你輕鬆上手製作Arduino智能小車
    Arduino簡介本文引用地址:http://www.eepw.com.cn/article/201706/348117.htmArduino 是一款便捷靈活、方便上手的開源電子原型平臺,包含硬體(各種型號的arduino板)和軟體(arduino IDE)。
  • 《雨中冒險2》場景掃描雷達有什麼用 場景掃描雷達作用分析
    導 讀 《雨中冒險2》是一款極為有趣和充滿刺激性的冒險遊戲,3D的畫面,給玩家帶來極大的充實感,這裡是玩家「殤_寂滅」給大家帶來的是《雨中冒險2》場景掃描雷達作用分析
  • 數碼管與ARDUINO 開發板的連接使用
    引腳不緊張的情況下可以用單片機的一個引腳來控制它,這樣可以很方便地產生閃爍和熄滅的效果。實際應用時可以將它直接連低電平(GND)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
  • iphone12pro雷達掃描怎麼用 雷達掃描儀在哪裡打開
    iphone12pro中的雷射雷達是什麼?  雷射雷達,理論上是通過發射雷射束來探測事物目標的位置以及速度形狀等特徵量的雷達系統。  iphone12pro雷射雷達有什麼用  1、可以帶來更加具有真實感和沉浸感的AR增強現實體驗:通過AR應用,可以簡化複雜工作空間設計,通過AR應用可以直接預覽工作空間最終效果,還能隨意調節空間,提升部署效率,蘋果商城裡面提供了很多AR應用,小夥伴們可以自己去下載體驗;  2、使用蘋果設備自帶的測距儀:沒有支持雷射雷達的蘋果設備使用測距儀的時候會遇到很難識別出測量的平面位置
  • 一文帶你深入了解掃描陣列雷達信號處理
    一文帶你深入了解掃描陣列雷達信號處理 工程師2 發表於 2018-05-07 14:00:00 主動電掃描陣列 (AESA) 雷達是當今先進武器系統的關鍵組成 ,
  • 【Arduino中級系列教程】項目六 互動電子鼓
    上一課:【Arduino中級系列教程】項目五 燈光調節器友情提示:搭配Gravity:新版Arduino中級套件食用更佳!更進一步,如果想讓燈光效果更明顯的話,還可以考慮使用燈帶,由多個 LED燈組成,現場表現力將更勝一籌。回歸到我們本節的主題——互動電子鼓。這裡用的是一個模擬壓電陶瓷震動傳感器,簡單的說,就是檢測震動的傳感器,原理就是通過鼓的震動來接收的到不同強弱程度的信號,再把該信號反饋給控制器,控制器來實現燈光變化。 所需元件
  • 超高速雷達數位訊號處理技術簡介
    脈衝壓縮、超高速雷達回波模擬等系統.5.多功能雷達信號產生與處理雷達系統具有多種發射波形可以匹配不同的應用環境、通過多波形的組合使用取得最優的效果[8].直接數字合成(DDS)技術是數字波形形成的主要方法之一.當前DDS器件的水平已經可以達到400MHz[9],因此也是超高速數位訊號處理技術的應用背景.
  • 【Arduino極簡教程】-04模擬輸入和輸出
    但有時候只用0或1不能表示中間狀態,這時就需要用到模擬信號。Arduino中處理的模擬信號和通常所說的模擬信號有一點區別,它並不是連續的,通常只能取0-1023之間的整數值,更像是通常所說的數位訊號。由於模擬信號能取的數值範圍增加,所以應用模擬信號能實現的功能也大大增加。
  • [新課推薦]人工智慧科普活動資源包配套課程Micro:bit+ Arduino...
    課時名稱內容第一章1Micro:bit主板及編程網頁介紹簡要介紹microbit主板及編程網頁2運動軌跡利用主板、拓展板(含光線傳感器)製作一個模擬運動軌跡系統課程的第一章會介紹arduino控制板、arduino編程軟體的使用以及簡單的基礎傳感器的使用。第二章主要講程序的邏輯關係以及複雜傳感器的應用。第三章主要講課程的綜合應用,通過搭建一個小車、編寫程序實現小車不同的功能。通過本課程的學習,大家可以掌握arduino編程以及arduino開源硬體的使用。
  • 獨家解析|無人駕駛領域最炙手可熱的兩種雷射雷達固態掃描技術
    可控性好:光學相控陣的光束指向完全由電信號控制,在允許的角度範圍內可以做到任意指向,可以在感興趣的目標區域進行高密度的掃描,在其他區域進行稀疏掃描,這對於自動駕駛環境感知非常有用。但光學相控陣掃描技術也有它的缺點:易形成旁瓣,影響光束作用距離和角解析度:光束經過光學相控陣器件後的光束合成實際是光波的相互幹涉形成的,幹涉效果易形成如下圖所示的旁瓣,使得雷射能量被分散。
  • 知微傳感發布雷射雷達MEMS掃描模組
    與此同時,知微傳感還發布了固態雷射雷達的核心掃描組件MEMS掃描模組,MEMS掃描模組P1130,配置如下:- 鏡面尺寸:3mm- 振動頻率:1.2±10%kHz- 掃描角度:±30°- 角度脈衝輸出解析度:0.05° - 幅值漂移:<0.05°-
  • 技術實驗 | 用Arduino製作倒車雷達系統
    汽車倒車時倒車雷達能發出警報(如圖1),當距離後面的障礙物較近時,倒車雷達系統發出滴滴的警報聲以警示駕駛員。下面,我們用Arduino來製作倒車雷達系統,在機器人車體倒車時發出滴滴的警報聲。在教學中,我們要以數據探究理論為指導,在數字環境下探究問題發生的本質及內在聯繫,並創造新事物,讓探究成為學生探索生活和獲取知識的橋梁。
  • 音圈電機雷射雷達掃描技術在揚塵治理中的應用
    打開APP 音圈電機雷射雷達掃描技術在揚塵治理中的應用 tmmotion 發表於 2020-06-28 09:05:56 所謂揚塵,其是由於地面上的塵土在風力、人為帶動及其他帶動飛揚而進入大氣的開放性汙染源,隨著科技的發展,越來越多先進的設備和技術被用到揚塵治理當中,包括近幾年炙手可熱的雷射雷達掃描技術。
  • 如何使用Qt為arduino製作圖形界面
    如何使用Qt為arduino製作圖形界面 網絡整理 發表於 2019-11-13 11:11:39 步驟1:安裝Qt