凡是官网购买产品,均可以获得积分,(积分可以用来下载技术资料)还可以获得精致技术支持。澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室可提供全套电子方案定制服务,了解详情请咨询客服。???????????
查看: 643|回复: 5
打印 上一主题 下一主题

澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万开源小项目-超声波雷达 HC-SR04

[复制链接]

348

主题

2077

帖子

929

活跃值

管理员

Rank: 9Rank: 9Rank: 9

活跃值
929
跳转到指定楼层
楼主
发表于 2019-6-18 14:17:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本次的趣味项目结合舵机、超声波模块并配合上位机Processing制作超声波雷达效果。
1、硬件
(1)模块
澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万迷你板:http://www.lingzhilab.com/index.php/home/goods/introduction?gid=333
超声波HC SR04:http://www.lingzhilab.com/index.php/home/goods/introduction?gid=222
超声波支架:
舵机:http://www.lingzhilab.com/index.php/home/goods/introduction?gid=353

(2)连线


实物 连线:


2、软件
(1)澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万迷你板软件代码:
[C++] 纯文本查看 复制代码
/**********************************************************
*    文件: 超声雷达.ino      by 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
*    -^^- 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万开源,让电子制作变得更简单! -^^-
*    时间: 2019/05/07 09:56
*    说明: 超声测距,把数据传输到processing后,达到雷达的视觉效果
************************************************************/

#include 

//舵机连接的引脚
const int servoPin = 9;

// 超声模块的引脚
const int trigPin = 10;
const int echoPin = 11;

//间隔时间和距离
long duration;
int distance;


Servo myServo; //舵机

// 复位或上电后运行一次:
void setup() {
        //在这里加入初始化相关代码,只运行一次:
        
        //设置超声模块连接的引脚
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
        
        Serial.begin(9600);
        
        //连接舵机的引脚
        myServo.attach(servoPin);
}

//一直循环执行:
void loop() {
        // 在这里加入主要程序代码,重复执行:
        
        //舵机运转角度范围: 15 - 165 度
        for(int i=15;i<=165;i++){
                myServo.write(i);
                delay(30);
                
                //测量距离
                distance = calculateDistance();
                
                Serial.print(i); // 发送角度数据
                Serial.print(","); // 发送分隔符作为数据之间分隔,在processing中就根据这个处理数据
                Serial.print(distance); // 发送距离数据
                Serial.print(";"); // 发送一个结束符号,在processing中接收到这个符号后标识本次数据包完成
        }
        
        //舵机运转角度范围: 165 - 15 度
        for(int i=165;i>15;i--){
                myServo.write(i);
                delay(30);
                distance = calculateDistance();
                Serial.print(i);
                Serial.print(",");
                Serial.print(distance);
                Serial.print(";");
        }
}

//超声测距的函数
int calculateDistance(){
        
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        // Sets the trigPin on HIGH state for 10 micro seconds
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        
        // Reads the echoPin, returns the sound wave travel time in microseconds
        duration = pulseIn(echoPin, HIGH);
        
        distance= duration*0.034/2;
        return distance;
        
}

(2)Processing端的代码:
[C++] 纯文本查看 复制代码
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, "COM24", 9600); // 这里要写上你自己的串口号
    myPort.bufferUntil(';'); //读取到本次数据的结束符
}
void draw() {

    fill(98, 245, 31);
    // simulating motion blur and slow fade of the moving line
    noStroke();
    fill(0, 4); 
    rect(0, 0, width, height-height*0.065); 

    fill(98, 245, 31); // 设置颜色为绿色
    // calls the functions for drawing the radar
    drawRadar(); 
    drawLine();
    drawObject();
    drawText();

    //stroke(0,0,244);
    fill(0, 0, 244);
    textSize(34);
    text("超声雷达演示", 20, 60);
}
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); // moves the starting coordinats to new location
    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); // moves the starting coordinats to new location
    strokeWeight(9);
    stroke(255, 10, 10); // red color
    pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
    // limiting the range to 40 cms
    if (iDistance<40) {
        // draws the object according to the angle and the distance
        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); // moves the starting coordinats to new location
    line(0, 0, (height-height*0.12)*cos(radians(iAngle)), -(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
    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);

    fill(45, 145, 245);
    PFont myFont = createFont("宋体", 34);
    textFont(myFont);
    textSize(34);

    text("目标:"+noObject, 0, height-height*0.0277);

    text("角度:" + iAngle +" °", width*0.36, height-height*0.0277);
    text("距离:", width*0.53, height-height*0.0277);
    if (iDistance<40) {
        text(iDistance +" cm", width*0.60, height-height*0.0277);
    }

    fill(145, 45, 245);
    text("by 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室.", width*0.80, 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();
}


注:上面需要根据自己板子的串口号改成自己的。

3、测试验证
澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万迷你板接好线并上传好代码后,打开Processing,并修改自己的串口号,然后运行,就可以看到类似雷达扫描的效果了:


视频效果看楼下。。。
澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万开源-让电子制作变得更简单! --- 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室

348

主题

2077

帖子

929

活跃值

管理员

Rank: 9Rank: 9Rank: 9

活跃值
929
沙发
?楼主| 发表于 2019-6-18 14:17:38 | 只看该作者
澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万开源-让电子制作变得更简单! --- 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室

0

主题

3

帖子

140

活跃值

注册会员

Rank: 2

活跃值
140
板凳
发表于 2019-7-12 01:14:50 | 只看该作者

3

主题

12

帖子

46

活跃值

新手上路

Rank: 1

活跃值
46
地板
发表于 2019-8-12 16:47:45 来自手机 | 只看该作者
roc 发表于 2019-6-18 14:17
本次的趣味项目结合舵机、超声波模块并配合上位机Processing制作超声波雷达效果。
1、硬件
(1)模块

#include <Servo.h> 第一行编译不过

348

主题

2077

帖子

929

活跃值

管理员

Rank: 9Rank: 9Rank: 9

活跃值
929
5#
?楼主| 发表于 2019-8-12 17:02:52 | 只看该作者
happyren 发表于 2019-8-12 16:47
#include <Servo.h> 第一行编译不过

请提供详细错误截图等信息
澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万开源-让电子制作变得更简单! --- 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室

3

主题

12

帖子

46

活跃值

新手上路

Rank: 1

活跃值
46
6#
发表于 2019-8-12 18:44:56 来自手机 | 只看该作者
roc 发表于 2019-8-12 17:02
请提供详细错误截图等信息

看了下,是贴到网页的代码有乱码,我直接从网页拷贝下来,把乱码也拷贝下来了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver| 手机版| 小黑屋| 澳门开元棋牌色情_澳门开元棋牌官网_开元棋牌输了25万实验室 ( 粤ICP备17040594号-3 )

GMT+8, 2019-10-20 16:10 , Processed in 0.546093 second(s), 24 queries .

快速回复 返回顶部 返回列表