工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 産業技術

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

Arduinoと超音波センサを用いた高速自動鉄道踏切制御回路

本チュートリアルでは、Arduinoとサーボモータ、Proteusシミュレータを用いて、シンプルかつ効率的な高速鉄道踏切の自動制御システムを設計する方法を解説します。基本的なアプローチですが、これをベースに列車速度の検出機能などを追加拡張することも可能です。まず、自動化の概念と期待できる効果について整理します。

自動化とは、人的作業・介入を削減または排除する仕組みを構築することです。制御システムは、単一入力で動作する開ループ制御から、出力をフィードバックする閉ループ制御まで多岐にわたります。鉄道分野での自動化は、ヒューマンエラーによる事故リスク低減のために不可欠となっています。

自動化のメリットとデメリット

メリット

  1. 生産性の向上
  2. 品質の安定・向上
  3. 堅牢性の向上
  4. 出力の一貫性確保
  5. 人件費の削減
  6. 高精度な制御
  7. 単調作業からの解放

デメリット

  1. セキュリティ脅威への脆弱性
  2. 開発コストの超過リスク
  3. 初期導入コストが高い
  4. 雇用減少の要因となり得る

メリットがデメリットを大きく上回るため、世界中で自動化が進んでいます。

本プロジェクトでは、超音波センサで列車接近を検知し、サーボモータで遮断機を開閉します。さらに、2つのセンサ間の通過時間から列車速度を推定し、閾値を超える高速通過時にはブザーで警報を鳴らす安全機能も実装します。センサは超音波センサ(HC-SR04)を使用しますが、IRセンサモジュールへの置き換えも可能です。

必要な部品

  1. Arduino UNO
  2. ブザー
  3. 超音波センサ(HC-SR04)×2
  4. サーボモータ ×2

必要なソフトウェア

  1. Arduino IDE
  2. Proteus

回路図

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

主要部品の説明

Arduino UNO

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

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

超音波センサ(HC-SR04)

物体までの距離を測定するセンサで、4ピン(Trig、Echo、GND、VCC)構成です。Trigから超音波パルスを発信し、物体で反射した波をEchoで受信。音速既知のため飛行時間から距離を算出します。トリガには10μs以上のハイパルスが必要です。

主な仕様

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

サーボモータ

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

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

ブザー

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

Arduinoと超音波センサで作る自動鉄道踏切制御システム:回路図とソースコード

自動踏切制御の動作原理

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。これでシミュレーション準備完了です。

関連プロジェクト

産業技術

  1. DIY自動列車制御システム – Arduinoで実現するシンプル・信頼性・カスタマイズ自在なレイアウト運転
  2. SERENA:Arduino Mega 2560とTFT LCDタッチスクリーン搭載カスタムアラームシステム
  3. Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
  4. Arduinoで作る全自動植物水やりシステム - 湿度センサーとRTCで最適制御
  5. NORゲートSRラッチ:デジタルメモリの構築と理解
  6. 実績ある電気システムにおける一般的な故障モード
  7. TTL NORゲートとORゲートの理解:回路解析と変換
  8. 高度なモータ制御回路:ラッチング、停止、タイムディレイ技術
  9. クラウド監視:リアルタイム資産管理のためのリモート制御システム
  10. M-TECH:Apolloルーター向け高度CNC制御システム
  11. PIRセンサー駆動自動ドア開閉システム:回路、動作、応用