スマートバス停アーキテクチャモデル:自動日よけ機能搭載
必要な部品と用品
| 部品 | 説明 | 数量 |
|---|---|---|
| Arduino Nano R3 | 建築模型用に小型で隠しやすい | 1 |
| サーボ MG995 | ハイトルクサーボ(日よけの重さ対策) | 1 |
| フォトレジスタ(光センサー) | 東向きと西向きに各1個 | 2 |
| 雨センサー | 1 | |
| 高輝度白色LED | 6 | |
| 抵抗 220Ω | 3 | |
| ブレッドボード | 1 | |
| ジャンパーワイヤー (オス-オス) | 27 | |
| ねじ端子台 | 2 | |
| 9V電池スナップ | 2 | |
| 9V電池 | 1 | |
| 単3電池4本ホルダー | MG995用外部電源 | 1 |
プロジェクト概要
前回のプロジェクト(V1.0)のアップグレード版です。
V1.0からの主な変更点:
- 建築模型のサイズ:1.5m × 1m に拡大
- 日よけの重量増加に対応し、SG90マイクロサーボからMG995ハイトルクサーボに変更
- MG995駆動用に外部電源を追加
- 日よけの展開/収納機構を2種類試作。不採用案は2つ目の動画、採用案は3つ目の動画で確認可能
- VarSpeedServoライブラリを使用するようスケッチを修正
- 日よけ状態のロジックエラーを修正(Gurneet1928氏に感謝)
V1.0はこちら。
コード
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; // TRUEでシリアルコンソールにデバッグ出力
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搭載リサイクル仕分けロボット
- DIY自動列車制御システム – Arduinoで実現するシンプル・信頼性・カスタマイズ自在なレイアウト運転
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- Arduinoで作る全自動植物水やりシステム - 湿度センサーとRTCで最適制御
- サーボプレスの基礎:パワー、精度、効率を解説
- サーボモーターの仕組みと重要性
- 精度最大化:ギアヘッドとサーボモータの最適ペアリング
- ECS G86 主軸停止機能付きボーリングサイクル
- SPRINT 20 リニア旋盤:高精度部品向け高速自動旋削
- スマート消耗品で経常収益を最大化:機械メーカーのゲームチェンジャー