Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード
Arduinoと超音波センサを用いた高速自動鉄道踏切制御回路
本チュートリアルでは、Arduinoとサーボモータ、Proteusシミュレータを用いて、シンプルかつ効率的な高速鉄道踏切の自動制御システムを設計する方法を解説します。基本的なアプローチですが、これをベースに列車速度の検出機能などを追加拡張することも可能です。まず、自動化の概念と期待できる効果について整理します。
自動化とは、人的作業・介入を削減または排除する仕組みを構築することです。制御システムは、単一入力で動作する開ループ制御から、出力をフィードバックする閉ループ制御まで多岐にわたります。鉄道分野での自動化は、ヒューマンエラーによる事故リスク低減のために不可欠となっています。
自動化のメリットとデメリット
メリット
- 生産性の向上
- 品質の安定・向上
- 堅牢性の向上
- 出力の一貫性確保
- 人件費の削減
- 高精度な制御
- 単調作業からの解放
デメリット
- セキュリティ脅威への脆弱性
- 開発コストの超過リスク
- 初期導入コストが高い
- 雇用減少の要因となり得る
メリットがデメリットを大きく上回るため、世界中で自動化が進んでいます。
本プロジェクトでは、超音波センサで列車接近を検知し、サーボモータで遮断機を開閉します。さらに、2つのセンサ間の通過時間から列車速度を推定し、閾値を超える高速通過時にはブザーで警報を鳴らす安全機能も実装します。センサは超音波センサ(HC-SR04)を使用しますが、IRセンサモジュールへの置き換えも可能です。
必要な部品
- Arduino UNO
- ブザー
- 超音波センサ(HC-SR04)×2
- サーボモータ ×2
必要なソフトウェア
- Arduino IDE
- Proteus
回路図

主要部品の説明
Arduino UNO
Microchip ATmega328Pを搭載したオープンソース開発ボードで、14本のデジタルピンと6本のアナログピンを備え、USB接続でプログラム書き込みが可能です。電源はUSBまたは7〜20VのDC入力に対応。FTDIチップの代わりにATmega16U2(初期版はATmega8U2)をUSB-シリアル変換に使用しています。

超音波センサ(HC-SR04)
物体までの距離を測定するセンサで、4ピン(Trig、Echo、GND、VCC)構成です。Trigから超音波パルスを発信し、物体で反射した波をEchoで受信。音速既知のため飛行時間から距離を算出します。トリガには10μs以上のハイパルスが必要です。
主な仕様
- 電源電圧: +5V DC
- 待機電流: <2mA
- 動作電流: 15mA
- 有効角度: <15°
- 測定距離: 2cm〜400cm
- 分解能: 0.3cm
- 測定角度: 30°
- トリガパルス幅: 10μs
- 寸法: 45×20×15mm

サーボモータ
特定角度への精密位置決めが可能なアクチュエータで、モータ・センサ・制御回路が一体化しています。フィードバック制御(クローズドループ)により、ステッピングモータのようなオープンループ制御とは異なり、動的なタスク適応が可能です。エンコーダで位置・速度フィードバックを行い、誤差信号をゼロにするよう制御します。

ブザー
圧電式などが一般的で、内部回路とフェライトディスクの振動で音を発生させる電流駆動デバイスです。

自動踏切制御の動作原理
2つの超音波センサをArduinoでトリガし、距離を継続測定します。線路が空いていればサーボは待機。列車がいずれかのセンサ検知範囲に入ると距離値が変化し、Arduinoがデジタルピン7,8をHIGHにしてサーボを90°回転、遮断機を閉じます。列車が反対側センサを通過して離れると、サーボが元位置に戻り遮断機を開きます。
安全機能として、2センサ間の通過時間が閾値未満(高速通過)の場合、ブザーを鳴らして周囲に警告します。
ソースコードと解説
整数型変数5つ、長整数型4つを定義。tr1,tr2,eh1,eh2でパルス送受信、val1,val2,dis1,dis2で時間・距離を格納。ボーレート9600bpsでシリアル通信を設定。
const int tr1 = 13, eh1 = 12, tr2 = 3, eh2 = 2;
int bz = 11;
unsigned long val1, dis1, val2, dis2;
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int pos = -1;
setup()ではピンモード設定、サーボ接続ピン指定、シリアル通信開始を行います。
void setup() {
pinMode(tr1, OUTPUT); pinMode(tr2, OUTPUT);
pinMode(bz, OUTPUT); pinMode(eh1, INPUT); pinMode(eh2, INPUT);
myservo1.attach(8); myservo2.attach(7);
Serial.begin(9600);
}
loop()では、超音波センサを交互にトリガして距離を測定し、条件分岐でサーボ制御とブザー制御を行います。距離が100cm未満なら遮断機閉動作、両方100cm以上なら開動作。連続して両センサが近距離検知した場合にブザーON。
void loop() {
// センサ1測定
digitalWrite(tr1, LOW); delayMicroseconds(2);
digitalWrite(tr1, HIGH); delayMicroseconds(10);
digitalWrite(tr1, LOW);
val1 = pulseIn(eh1, HIGH);
dis1 = (val1 * 0.0343) / 2;
// センサ2測定
digitalWrite(tr2, LOW); delayMicroseconds(2);
digitalWrite(tr2, HIGH); delayMicroseconds(10);
digitalWrite(tr2, LOW);
val2 = pulseIn(eh2, HIGH);
dis2 = (val2 * 0.0343) / 2;
Serial.println("distance is "); Serial.println(dis1); Serial.println(dis2);
if (dis1 < 100 || dis2 < 100) {
if (pos == -1) {
for (pos = 0; pos <= 90; pos += 1) {
myservo1.write(pos); myservo2.write(pos); delay(15);
}
}
delay(1000);
// 再測定で高速判定
digitalWrite(tr1, LOW); delayMicroseconds(2);
digitalWrite(tr1, HIGH); delayMicroseconds(10);
digitalWrite(tr1, LOW);
val1 = pulseIn(eh1, HIGH);
dis1 = (val1 * 0.0343) / 2;
digitalWrite(tr2, LOW); delayMicroseconds(2);
digitalWrite(tr2, HIGH); delayMicroseconds(10);
digitalWrite(tr2, LOW);
val2 = pulseIn(eh2, HIGH);
dis2 = (val2 * 0.0343) / 2;
if (dis1 < 100 || dis2 < 100) {
digitalWrite(bz, HIGH);
Serial.println("distance2 is "); Serial.println(dis1); Serial.println(dis2);
}
} else if (dis1 >= 100 && dis2 >= 100) {
if (pos == 91) {
for (pos = 90; pos >= 0; pos -= 1) {
myservo1.write(pos); myservo2.write(pos); delay(15);
}
}
digitalWrite(bz, LOW); delay(200);
}
}
Proteusでのシミュレーション方法
Arduino IDEで[File]→[Preferences]→「Show verbose output」の「compilation」と「upload」にチェック。コンパイル後に表示されるhexファイルのパスをコピーし、ProteusでArduinoコンポーネントをダブルクリックして「Program File」に貼り付けてOK。これでシミュレーション準備完了です。
関連プロジェクト
- Arduinoによる物体検知自動ドアベル
- Arduino自動夜間照明
- Arduino PWMプログラミング
- Arduinoシリアル通信
- 電子工作卒業研究テーマ集
- 電子工学プロジェクトアイデア
- 初心者向け基礎電子工作ミニプロジェクト
産業技術
- DIY自動列車制御システム – Arduinoで実現するシンプル・信頼性・カスタマイズ自在なレイアウト運転
- SERENA:Arduino Mega 2560とTFT LCDタッチスクリーン搭載カスタムアラームシステム
- Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
- Arduinoで作る全自動植物水やりシステム - 湿度センサーとRTCで最適制御
- NORゲートSRラッチ:デジタルメモリの構築と理解
- 実績ある電気システムにおける一般的な故障モード
- TTL NORゲートとORゲートの理解:回路解析と変換
- 高度なモータ制御回路:ラッチング、停止、タイムディレイ技術
- クラウド監視:リアルタイム資産管理のためのリモート制御システム
- M-TECH:Apolloルーター向け高度CNC制御システム
- PIRセンサー駆動自動ドア開閉システム:回路、動作、応用