智能公交站台建筑模型:自动遮阳棚系统
组件与物料
| 组件 | 说明 | 数量 |
|---|---|---|
| Arduino Nano R3 | 体积小,易隐藏于建筑模型内 | 1 |
| MG995 大扭矩舵机 | 驱动较重遮阳棚,替代 SG90 | 1 |
| 光敏电阻 | 一只朝东、一只朝西,检测光照方向 | 2 |
| 雨滴传感器 | 检测降雨 | 1 |
| 高亮白光 LED | 站台照明与路灯模拟 | 6 |
| 220Ω 电阻 | LED 限流 | 3 |
| 面包板 | 原型搭建 | 1 |
| 公对公杜邦线 | 连接元件 | 27 |
| 螺丝端子 | 外部供电接入 | 2 |
| 9V 电池扣 | 逻辑电源 | 2 |
| 9V 电池 | 逻辑电源 | 1 |
| 4×AA 电池盒 | 舵机大电流供电 | 1 |
项目简介
这是 V1.0 版本的升级:原版链接
主要改进:
- 模型尺寸扩大至 1.5m × 1m
- 遮阳棚重量增加,舵机升级为 MG995
- 增加外部供电驱动大扭矩舵机
- 尝试两种遮阳棚展开机构,最终采用第三版方案(视频 3)
- 引入
VarSpeedServo库实现平滑变速控制 - 修复遮阳棚状态逻辑小错误(感谢 Gurneet1928 指正)
视频资料
- 电路制作过程
- 建筑模型制作过程
核心代码
The Code (C/C++)
#include <VarSpeedServo.h>
VarSpeedServo servo;
int easternLight = 0; // 东侧光照
int westernLight = 0; // 西侧光照
int rainSensed = 0; // 雨滴检测
int sunshadePosition = 0; // 遮阳棚当前位置
int rainThreshold = 512; // 雨滴阈值
int sunshadeExpanded = 120; // 展开角度
int sunshadeContracted = 60; // 收缩角度
int ambientLighting = 0; // 环境光平均值
int turnOnLightsOn = 150; // 开灯阈值
int ledIntensity = 0;
int ledPower = 0;
int servoSpeed = 20; // 舵机转动速度
bool debugging = false; // 调试模式
void setup() {
pinMode(A4, OUTPUT); // 站台内部照明
pinMode(A5, OUTPUT); // 路灯
pinMode(A1, INPUT); // 西侧光敏
pinMode(A2, INPUT); // 东侧光敏
pinMode(A3, INPUT); // 雨滴传感器模拟量
pinMode(2, INPUT); // 雨滴传感器数字量
servo.attach(A0);
servo.write(sunshadeContracted, servoSpeed, true); // 初始收缩
if (debugging) {
Serial.begin(9600);
Serial.println("*** DEBUGGING STARTED ***");
Serial.println("-------------------------");
}
}
void oya_mydebug(String text, int value = NULL) {
if (debugging) {
Serial.print(text);
if (value) { Serial.print(" = "); Serial.println(value); }
else { Serial.println(" "); }
}
}
void expand_collapse(int easternLight, int westernLight) {
if (easternLight <= westernLight) { // 日出:东侧光强或持平
oya_mydebug("It's sunrise");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Sunshade expanded");
}
}
if (easternLight > westernLight) { // 日落:西侧光强
oya_mydebug("Sun is going down");
if (sunshadePosition != sunshadeContracted) {
servo.write(sunshadeContracted, servoSpeed, true);
oya_mydebug("Sunshade contracted");
}
}
}
void loop() {
// 读取传感器
easternLight = analogRead(A2);
westernLight = analogRead(A1);
rainSensed = analogRead(A3);
sunshadePosition = servo.read();
ambientLighting = (easternLight + westernLight) / 2;
oya_mydebug("easternLight", easternLight);
oya_mydebug("westernLight", westernLight);
oya_mydebug("rainSensed", rainSensed);
oya_mydebug("sunshadePosition", sunshadePosition);
oya_mydebug("ambientLighting", ambientLighting);
// 降雨判断:模拟值越小雨越大
if (rainSensed < rainThreshold) {
oya_mydebug("It's raining...");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Sunshade expanded");
}
} else {
oya_mydebug("It is not raining...");
if (ambientLighting <= turnOnLightsOn) { // 天黑开灯
oya_mydebug("It's getting dark, turning on the lights");
ledPower = (turnOnLightsOn - ambientLighting) * 4;
oya_mydebug("ledPower", ledPower);
analogWrite(A5, ledPower);
analogWrite(A4, ledPower);
expand_collapse(easternLight, westernLight);
} else { // 白天关灯
oya_mydebug("A lot of sunshine, turn off lights");
analogWrite(A5, 0);
analogWrite(A4, 0);
expand_collapse(easternLight, westernLight);
}
}
if (debugging) {
Serial.println("********************");
Serial.println(" ");
delay(5000);
} else {
delay(100);
}
}
原理图
制造工艺
- 莱昂内尔模型火车:历史、制造与未来
- 基于 Google Coral Edge TPU 的垃圾分类机器人
- Arduino自动列车控制器 – 可编程调度/加减速/双向运行
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino 自动浇水系统:定时 + 土壤湿度双模式,轻松养护盆栽
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- 伺服压力机核心解析:动力、精度与效率的完美平衡
- 伺服电机深度解析:工作原理、分类与核心价值
- 齿轮箱与伺服电机完美搭配:精准运动控制的黄金法则
- ECS G86带主轴停止镗削循环
- SPRINT 20线性车床:高精度零件的快速自动化车削
- 智能耗材服务:机器制造商未来五年营收20%增长的新引擎