Arduino を使って鉄道模型を自動運転

※この記事は2010年8月17日のものです。

そんなわけで、前にニコニコに投稿した自動運転装置について、ちょっと解説しておきます。

基本的な回路としては
・Arduino (全体の制御を行う)
・液晶 (デバッグなどのために)
・モーター制御部 (12Vのモーターを制御するために)
・ポイント制御部 (同じく、12Vで一瞬電流を流すために)
・測距用センサー (車輌の接近を感知するために)
・可変抵抗抵抗 (車輌の最高速度や、ブレーキ位置を設定するために)
で構成されています。

では、これらを一つ一つ解説していきます。
・Arduino (全体の制御を行う)
一番一般的な Duemilanove 328 を使っています。
本エントリーの後半に今回使用したスケッチを添付します。スケッチの内容については後述。
・液晶 (デバッグなどのために)
液晶は秋月の SC1602BSLB を使っています。
Arduino に液晶をつなぐ配線はこの辺(デバイスの接続)を参考にして接続しました。
・モーター制御部 (12Vのモーターを制御するために)
12Vモーター駆動用に TB6549PG と言うICを使っています。
このICを駆動するための回路はスペックシートの回路をそのまま使用しています。
スペックシートP15に指定されている部品を使ってP16の回路をそのまま組んでいます。
・ポイント制御部 (同じく、12Vで一瞬電流を流すために)
基本的な回路は「Bトレ三昧」を参考にました。コンデンサーは2200μFを使ってます。
ただ、上記回路の切り替えスイッチ部分をリレーに変更しています。
以下の図で、リレーは Y14H-1C-5DS を、抵抗は10KΩを使用しています。
(作図ソフトを持ってないので、ネット上から一部借用して切り貼りしました、 すいません)

・測距用センサー (車輌の接近を感知するために)
基本動作はこの辺(せつぞく君)の赤外線測距を参考にしました。
・可変抵抗抵抗 (車輌の最高速度や、ブレーキ位置を設定するために)
10KΩの可変抵抗を使用しています。
ここまでで基本的な部品の調達や接続は出来ると思います。

引き続き、AutomaticControl001.pdeの説明をします。

本プログラムは「測距センサーに車輌が近づく→減速して停止→次の動作パターンを実行」をひたすら繰り返しているだけです。動作パターンには「どのセンサーで検知し、ポイントをどのように切り替え、車輌をどちらに走らせるか」を列挙します(後述)。各関数は読んで貰うとして、自分のレイアウトに合わせて変更する必要がある部分だけを解説します。変更が必要なのは「// driving pattern」以降です。

先ずは全体像として以下の4つを設定します。

レイアウトに含まれるポイントの数(今回は1を指定しています)。
#define c_NumOfPoint         1
モーター制御用ICの数(今回は1を指定しています)。
#define c_NumOfPowerSupply   1
センサーの数(今回は3個設置しています)。
#define c_NumOfSensor        3
動作パターンの数(今回は4パターンです)。
#define c_NumOfPattern       4

次に、ピンアサインを設定します(// pin Assign 以降)。
今回はポイントは1箇所で、デジタルの10番ピンを使用します。
int c_Pin_Point[c_NumOfPoint]           = { 10 };
モーター制御ICへの接続はデジタル6/7/8/9番ピンを使います。
int c_Pin_Power[c_NumOfPowerSupply][4]  = {{  6,  7,  8,  9 }};
センサーは3個で、アナログの0/1/2番ピンを使います。
int c_Pin_Sensor[c_NumOfSensor]         = {  0,  1,  2 };
可変抵抗から、ブレーキ開始の距離を取得します。アナログ3番ピンを使います。
#define c_Pin_VRDistance      3
可変抵抗からブレーキやアクセルの強さを取得します。アナログ4番ピンを使います。
#define c_Pin_VRAcceleBreake  4
可変抵抗から車輌の最高速度を取得します。アナログ5番ピンを使います。
#define c_Pin_VRMaxSpeed      5
液晶などの接続は、他のページに書いてある解説の通りです。

最後に、運行パターンを設定します。まだ実装していない機能があるので2カラム目に無駄な項目がありますが無視して下さい。
int c_Program[c_NumOfPattern][2+c_NumOfPoint+c_NumOfPowerSupply] = {
{ 0, 0, HIGH, c_DirLeft  },
{ 1, 0, HIGH, c_DirRight },
{ 0, 0, LOW , c_DirLeft  },
{ 2, 0, LOW , c_DirRight }
};
これの
{ 0, 0, HIGH, c_DirLeft  },
について解説します。
1)0番センサーへ接近するパターンで
2)(2カラム目は無視)
3)ポイントは HIGH 側に切り替えて
4)車輌は左方向に進行せよ
と読みます。複数ポイントがある場合は、3)を羅列する形になります。

ニコニコ動画にアップしているのと同じ構成であればもちろんスケッチを変更する必要はありません。ってか、先ずは確実なニコニコと同じレイアウトからはじめるのがよいと思います。その上で内容を理解してレイアウトを変えるのがよいかと。

ご参考まで。

コメントを残す