Архитектурная модель «Умная остановка» с автоматической тентой
Компоненты и материалы
| Arduino Nano R3 (компактный) | 1 |
| Сервопривод MG995 (высокий момент) | 1 |
| Фоторезисторы (восточный и западный) | 2 |
| Датчик дождя | 1 |
| Высокояркие белые LED | 6 |
| Резисторы 220 Ом | 3 |
| Макетная плата, перемычки, клеммники, держатели батарей (9В + 4×AA) | 1 компл. |
О проекте
Улучшенная версия архитектурной модели остановки общественного транспорта (размер 1.5×1 м). Основные изменения по сравнению с v1.0:
- Увеличенный размер модели и вес тента → сервопривод MG995 вместо SG90.
- Добавлено внешнее питание для сервопривода.
- Проработаны два механизма раскрытия тента (один отвергнут, итоговый показан в 3-м видео).
- Использована библиотека
VarSpeedServoдля плавного движения. - Исправлена логическая ошибка в состоянии тента (спасибо Gurneet1928).
Алгоритм работы
- Два фоторезистора (восток/запад) определяют положение солнца: если восток светлее — рассвет, тент раскрыт; если запад светлее — закат, тент свёрнут.
- Датчик дождя: при дожде тент всегда раскрыт.
- Освещение: при низком освещении включаются внутренние и внешние LED (ПШИМ).
- Скорость сервопривода задаётся константой
servoSpeed = 20.
Код
#include <VarSpeedServo.h>
VarSpeedServo servo;
int easternLight = 0, westernLight = 0, rainSensed = 0, sunshadePosition = 0;
int rainThreshold = 512;
int sunshadeExpanded = 120, sunshadeContracted = 60;
int ambientLighting = 0, turnOnLightsOn = 150, ledIntensity = 0, 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 ***"); }
}
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("********************"); delay(5000); }
else delay(100);
}
Схемы
Схема подключения всех компонентов к Arduino Nano.
Производственный процесс
- Модельные поезда Lionel: история, производство и будущее
- Робот для сортировки мусора на Google Coral Edge TPU
- Максимизация повторяющейся выручки с умными расходниками: Игролом для производителей станков
- Автоматическое управление модельной железной дорогой на Arduino — DIY-контроллер поезда
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- SPRINT 20: линейный токарный автомат для высокоточной серийной обработки
- Основы сервопрессов: мощность, точность и эффективность
- Серводвигатели: принцип работы и значение
- Максимизация точности: правильное сочетание редукторов (gearheads) с сервоприводами
- Цикл ECS G86 расточки с функцией остановки шпинделя