使用超声波传感器制作自动泡泡枪
Quote from Matoo robot on 2024年7月9日, pm9:23想变成一个孩子,看到微风吹拂的泡泡,然后落在草地上吗?只需将手放在传感器上即可。
项目介绍
介绍
嘿,你好。今年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) 返回信号传输和接收之间的持续时间。
在代码中,计算距离后,我们将其四舍五入到小数点后的第三位数字,并将其打印在串行监视器上。我尝试了一下,以确保超声波传感器工作准确。这是我的连续剧的截图:
旋转舵机
我尝试了伺服电机的不同角度。对我有用的是:
- 扣动扳机:120度
- 扳机释放: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); } } } }
电路
想变成一个孩子,看到微风吹拂的泡泡,然后落在草地上吗?只需将手放在传感器上即可。
项目介绍
介绍
嘿,你好。今年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) 返回信号传输和接收之间的持续时间。
在代码中,计算距离后,我们将其四舍五入到小数点后的第三位数字,并将其打印在串行监视器上。我尝试了一下,以确保超声波传感器工作准确。这是我的连续剧的截图:
旋转舵机
我尝试了伺服电机的不同角度。对我有用的是:
- 扣动扳机:120度
- 扳机释放: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);
}
}
}
}
电路