用 Arduino 测量地球质量:DIY 分步指南
所需元件与材料
| 元件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 主控板 |
| USB-A 转 B 型数据线 | 1 | 供电与程序上传 |
| 560 Ω 电阻 | 4 | 压电传感器并联保护 |
| 100 Ω 电阻 | 2 | IR 电路限流 |
| 压电传感器 | 4 | 检测落地冲击 |
| IR 发射管(红外 LED) | 1 | 起始计时触发 |
| IR 接收管(光敏二极管) | 1 | 起始计时触发 |
| 旋转电位器 | 1 | 比较器阈值调节 |
| 运放 UA741C | 1 | IR 信号比较整形 |
| 面包板 | 1 | 原型搭建 |
| 1.2 米导线 | 3 | 模块间连接 |
| 通用 PCB 板 | 1 | IR 电路焊接 |
| 胶带 | 1 | 固定用 |
| 硬纸板 | 1 | 搭建释放平台 |
所需软件
- Arduino IDE
项目原理
引言
某天我在体重秤上称重时突然想到:地球的质量是多少?显然无法直接把地球放上秤,必须用间接测量法。本项目实现了一种基于牛顿定律的间接测量方法。
间接测量法
19 世纪科学家利用牛顿第二定律 F = ma 和万有引力定律 F = G·m·M / r²(其中 m 为物体质量,a 为加速度,G 为引力常数,M 为地球质量,r 为地球半径)。令 a = g(重力加速度),联立得:
m·g = G·m·M / r² → M = g·r² / G
已知 G ≈ 6.674×10⁻¹¹ N·m²/kg²、r ≈ 6.371×10⁶ m,只需通过实验测得 g,即可反推地球质量 M。
实验概述
利用自由落体运动测定 g。自由落体仅受重力,初速度 v₀ = 0,下落距离 s = 1 m。根据位移公式:
s = v₀·t + ½·g·t² → 1 = ½·g·t² → g = 2 / t²
关键在于精确测量落体时间 t。需两个时刻戳:释放瞬间与触地瞬间。本项目分别用 IR 光栅与压电传感器获取这两个时刻,Arduino 计算时间差,进而求出 g 与 M。
硬件电路
电路 1:IR 起始计时模块
- IR LED 正向偏置发光,照射光敏二极管
- 光敏二极管反向偏置,与电阻分压
- 分压点接运放同相输入,另一输入接电位器设定阈值
- 运放输出接 Arduino 数字引脚(本例为 D4)
- 物体遮挡光路时输出高电平,释放瞬间变低,记录
startTime
电路 2:压电触地检测模块
- 4 个压电传感器并联,正极接模拟输入 A0–A3,负极接地
- 每个传感器并联 560 Ω 电阻,抑制冲击电压尖峰
- 任一传感器读数超过阈值(默认 110),记录
endTime
机械组装
- 用硬纸板搭建高约 1.1 m 的“屋顶”固定墙面
- IR 模块朝下固定于屋顶下沿
- 压电传感器平铺地面,正对 IR 模块下方
- 三根 1.2 m 导线分别连接 IR 模块的 VCC、GND、信号至 Arduino
- 所有部件用胶带、扎带牢固固定,防震动
实验步骤
- 在落体物体顶部粘贴薄挡板(约 5 mm 厚)
- 将物体托至 1 m 高度,挡板遮挡 IR 光路
- 松手释放,不施加额外推力
- 物体离开瞬间 IR 光路通,Arduino 记录
startTime - 物体砸中压电传感器,产生电压尖峰,Arduino 记录
endTime timeOfFlight = endTime - startTime,代入公式计算g与M
Arduino 代码
const int sensorPin[4] = {A0, A1, A2, A3};
const int photoPin = 4;
const int ledPin = 13;
const int threshold = 110;
int startTime, endTime;
int val[4];
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
for (int i = 0; i < 4; i++) pinMode(sensorPin[i], INPUT);
pinMode(photoPin, INPUT);
}
void loop() {
int start = digitalRead(photoPin);
startTime = millis();
if (start == HIGH) digitalWrite(ledPin, HIGH);
while (start == LOW) {
digitalWrite(ledPin, LOW);
for (int i = 0; i < 4; i++) val[i] = analogRead(sensorPin[i]);
if (val[0] >= threshold || val[1] >= threshold || val[2] >= threshold || val[3] >= threshold) {
endTime = millis();
Serial.print(endTime - startTime);
Serial.println(" ms");
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
start = HIGH; // 退出 while
}
}
}
实验结果
三次测得飞行时间:443 ms、443 ms、464 ms,平均 450 ms。
g = 2 / (0.450)² ≈ 9.876 m/s²
M = g·r² / G ≈ 6.007×10²⁴ kg
谷歌标准值 5.972×10²⁴ kg,误差约 0.6%,结果相当接近!
原理图
文末附有 Fritzing 原理图与实物接线图,可按图焊接 PCB 或面包板搭建。
制造工艺
- 使用 OpenSensors 监测空气质量:Arduino 与 Python 实战指南
- Arduino Mega 按键 PWM 调光:三阶段渐变 LED 实战教程
- 用 Arduino 制作超声波悬浮装置:分步指南
- 基于Arduino UNO的精准频率与占空比测量
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 声纳实时测距与 Processing 可视化
- 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
- MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
- 分步指南:将 YL-39/YL-69 土壤湿度传感器连接到 Arduino UNO
- 构建基于 PHP 的 Web 界面控制 Arduino Uno
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 企业数字化成熟度评估:科学框架与进阶路径