使用超声波传感器制作自动泡泡枪

想变成一个孩子,看到微风吹拂的泡泡,然后落在草地上吗?只需将手放在传感器上即可。

项目介绍

介绍

嘿,你好。今年1月,我在学校成立了一个Arduino俱乐部。我想在俱乐部博览会上展示一些与Arduino有关的东西,我想,“我们需要一些不同的东西。像…泡沫。

结果是一个巨大的打击。孩子们成群结队地来到传感器上,将鼠标悬停在传感器上。只听说过Arduino的老师们开始好奇并开始提问。这个项目的显著成功在于,只听说过Arduino这个词的学生和老师了解了电子产品如何多样化和丰富日常体验。也许它的简单性打破了学生和电子产品之间的障碍,使每个人都可以使用Arduino。

该系统读取通过超声波传感器发射和接收的超声波,并检测与最近物体的距离。然后,当距离足够近(更准确地说,小于 30 厘米)时,微控制器旋转伺服电机,从而扣动气泡枪的扳机。

我使用了相同的电路,因此引脚和接线与图形表示中的引脚和接线相同。

电路

测量距离

在代码中,trigPin 连接到超声波传感器上的发射器,echoPin 连接到接收器。trigPin 将向测量距离的物体发送波。然后,波将到达 echoPin。通过测量波从物体上反弹并返回所需的时间(以微秒为单位),将其乘以波的速度(每微秒 0.0343 厘米),然后除以 2(因为波反弹并返回),我们知道物体和传感器之间的距离。代码如下:


	 digitalWrite(trigPin, LOW);         
	 delayMicroseconds(2);         
	 digitalWrite(trigPin, HIGH);         
	 delayMicroseconds(10);         
	 digitalWrite(trigPin, LOW);         
	 duration = pulseIn(echoPin, HIGH);         
	 distance = (duration * 0.0343) / 2;         
	 Serial.print(distance, 3);         
	 Serial.println("cm");         

在这里,pulseIn(echoPin, HIGH) 返回信号传输和接收之间的持续时间。

在代码中,计算距离后,我们将其四舍五入到小数点后的第三位数字,并将其打印在串行监视器上。我尝试了一下,以确保超声波传感器工作准确。这是我的连续剧的截图:

旋转舵机

我尝试了伺服电机的不同角度。对我有用的是:

  1. 扣动扳机:120度
  2. 扳机释放:30度

总结流程图:

如果传感器与物体之间的距离小于 30 厘米,如果电机未指向 120 度,我们将旋转它直到它指向 120 度。如果距离超过 30 厘米,如果电机不指向 30 度,同样,我们将旋转它直到它指向 30 度。

使用超声波传感器的自动泡泡枪代码

#include <Servo.h>

Servo myservo;

const int trigPin = 6;
const int echoPin = 7;
const int servoPin = 8;


float duration, distance;


void setup() {
  // put your setup code here, to run once:
  myservo.attach(servoPin);
  pinMode(servoPin, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
}


void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration * 0.0343) / 2;
  Serial.print(distance, 3);
  Serial.println("cm");
  delay(100);
  if (distance < 30) {
    if (myservo.read() != 120) {
      for (int angle=myservo.read(); angle<121;angle++) {
      myservo.write(angle);
      delay(10);
    }
    }
  }
  else {
    if (myservo.read() != 30) {
      for (int angle=myservo.read(); angle>=30; angle--) {
        myservo.write(angle);
        delay(10);
      }
    }
  }
  }

电路

Similar Posts

Leave a Reply