無料ブログはココログ

自動運転

2024年4月14日 (日)

ミント缶で自動運転

ミント缶本体で自動運転スケッチ

SSD1306Asciiで触れましたがミント缶本体に自動運転スケッチを組み込みました。I2C通信する自動運転基板はfujigaya2さん作S88_8ch_Control_K0.inoの detect_analog()のみ、I2Cスレーブにしてミント缶からの要求でセンサーの状態を返す事にしました。
ミント缶基板にTSC TCSセンサー入力を配置してミント缶本体のみで自動運転が出来たら場所も設置も楽になりますが、資金も体力も底を突いているので諦めます。

運転モードは3通り

SSD1306Asciiで触れたセンサーチャンネルによるモード選択は頭が混乱するので、ミント缶にモード選択機能を追加しました。OPSでCV7に所定の値を書き込む事で設定します。自動運転開始時は必ずCH1を踏む約束にしたので迷う事は無くなりました。

運転の様子

何の変哲も無い直線線路です。信号機の設置スペース不足で往路と復路で信号機の意味合いが変わるのが分かり難いです。DCCコントローラはバッテリーだけ無駄に目立つ居酒屋ミント缶です。コロナ過で出番が無くなり、掘り出して自宅で使っています。 余談ですがココログは2019年3月から動画ファイルを直接再生する<video>タグが追加されていることを知りませんでした。格安スマホで低品質の動画です。

信号機デコーダの動作設定

--- 信号機1 信号機2
アドレス 1 2 3 1 3 4
テコ DIV --- --- DIV --- ---
--- DIV --- --- DIV ---
--- STR --- --- STR ---
--- --- STR --- --- STR
黄(注) --- --- DIV --- --- DIV

現示条件2以降のアドレスについては理解出来ていないので、信号機1と信号機2を連続するアドレスにしてデコーダの操作を簡略化しました。上の表の通り信号機1を青にすると同時に信号機2は黄色に変わります。 (注)信号機1を青から直接赤にしても信号機2を赤にすると信号機1に黄色ステップが加わりますが、信号機2は一度黄色の操作を実行しないと次の黄色が直接青に変わってしまいますので、SemaphoRestor(SemaOppo);を挟んで回避します。

運転スケッチ

AutoState変数で処理ステップを進める単純なシーケンスです。目立つように<strong>タグでくくりました。初回のAutoState1は自動加速を実行せず最大速度の取得を行います。 Semapho...関数の引数がデコーダアドレスで SemaHome = 2, SemaOppo = 3 です。

 // mode 2
switch(AutoState) {
case 1: // 初回のみ実行
// home ch turn on
if (AutoCount == 0) {
SemaphoRed(SemaHome); // 通過した信号を赤に
AutoCount++;
} else if (AutoCount == 1) {
SemaphoBlue(SemaOppo); // 前方を青に
NextChannel = OppoChannel;
AutoCount = 0; // 初回は加速しない
AutoState = 2; }
break;
case 2: // 加速
if (AutoCount > 0) {
AutoAcce();
if (AutoCount == 2) {
SemaphoRestor(SemaOppo);
AutoState = 3; }
}
// 通過した信号を赤に
// wait until home or oppo turn on
if (OnChannel == OppoChannel) {
SemaphoRed(SemaOppo);
AutoCount++;
} else if (OnChannel == HomeChannel) {
SemaphoRed(SemaHome);
AutoState = 3; }
DevSpeed = getDevSpeed(4, false); // 減速の度合を設定
break;
case 3: // 減速
AutoDece();
if (CurSpeed == 0) {
TimerCount = 0;
AutoCount = 0;
AutoState = 4; }
break;
case 4: // 反転
if (AutoCount == 0) {
if (TimerCount < STOPTIME) {
TimerCount++;
if (TimerCount == STOPTIME) {
AutoDir();
ChgNextChannel();
AutoCount = 0;
AutoState = 5; }
}
}
break;
case 5: // 前方の信号機を青に
if (AutoCount == 0) {
if (LocoDir == FWD) {
SemaphoYellow(SemaOppo);
} else {
SemaphoYellow(SemaHome);
}
AutoCount++;
} else if (AutoCount == 1) {
if (LocoDir == FWD) {
SemaphoBlue(SemaOppo);
} else {
SemaphoBlue(SemaHome);
}
AutoCount++;
} else if (AutoCount == 2) {
DevSpeed = getDevSpeed(2, true); // 加速の度合を設定
AutoCount = 1;
AutoState = 2; // 加速ステートへ
}
break;
}
}

2021年11月11日 (木)

C-SizeDCCの自動運転

C-SizeDCCの自動運転フラグ

自動運転センサーディテクタはスケッチのロコアドレスを255にすると、C-SizeDCCの選択アドレスを使って運転します。最大スピードもC-SizeDCCのスピード設定で制限します。

void readIIC(byte inByte, byte inCmd, word inAddr, byte inDat, byte inStat)
{
 if (((inByte == 3) && (aLocAddr == 255)) || (aLocAddr == gLocAddress)) {
  bIICLocalAddr = true; // use mintcan address and speed
 }

半自動的な運転が可能ですが、停車時にうっかりスピードツマミに触るとロコが暴走する危険がありました。そこで、C-SizeDCCの選択アドレスで自動運転している時は、手動操作によるDCCパケットを送らない事にしました。

void changedTargetSpeed(word inAddr, const byte inSpeed)
{
 if (bIICLocalAddr == false) {
  DSCore.SetLocoSpeedEx(gLocProtocol + inAddr, ((word)inSpeed << 3), gSpeedStep);
 }

自動運転アドレスとC-SizeDCCのアドレスが同じ場合も同様です。2バイトアドレスの明確な区分けを行っていないので、自動運転スケッチで実アドレス255のロコを運転する時は、C-SizeDCC側も255を選択しないといけません。
これで、2列車のアドレスをRailComで読み出して自動運転する事が可能になりました。RailComアドレスリーダーを実用レベルに仕上げる課題は残ったままです。

2021年10月23日 (土)

Arduino nano の互換性

Arduino nano Every

手持ちの台数不足のため、自動運転スケッチは nano3だけで、nano Everyの動作チェックは行っていませんでした。「秋月電子の部品だけで完成します」と謳っている立場上まずいので、DSairから取り出して動かしてみたら端っからビルドエラーが。
S88.cpp:318:3: error: '_delay_us' was not declared in this scope
S88.cppはゲヌマ・フジガヤ2さんのS88 Detectorから拝借したフォトリフレクタ処理コードです。delayMicroseconds()に置き換えるとビルドは通りますが、ネットの情報によると精度が悪いそうなので、sakuraさんのサイトの wait()関数を拝借しました。チックカウントを取得する micros()を使ってディレイを作る関数です。
Arduino nano Everyボードはチェックが厳格なのか requestFrom()の引数の型でワーニングが出たので、(uint8_t, size_t)にキャストしました。Wire.hにはrequestFrom(int, int)とrequestFrom(uint8_t, size_t)のオーバーロードがあります。

NoboriKudari

無事、Everyで自動運転が出来ました。

 

2021年10月16日 (土)

対向運転3

RailComで在線検知

コントローラのアドレスを運転前に自動選択出来ると都合がよいので、在線検知ダイオードをRailComアドレスリーダーに置き換えました。ところが、C-SizeDCCが不定期にリセットする謎の現象が。電源に異常は無く、I2Cを全く行なっていないのに何故かです。

Reset_20211016161401

止む無く、OLEDが老眼にキツいミント缶を久しぶりに掘り出したら、全く現象が出ず自動運転を継続出来ています。自動運転開始前に運転停止ボタンを押すと、RailComで読み出したアドレスでミント缶のアドレスを設定します。

Ontrackbidi

頻発するケアレスミス

どうせ捨てる基板だと、いい加減にパターンカットしたり頻繁に部品を換えたりで、基板に加わったストレスで動作が不安定。おまけに自作のI2C接続コードの断線も加わり、3か月惰眠を貪り、ようやく動作が安定しました。

対向運転

ミント缶の選択アドレスと自動運転のアドレスが重複した場合の排他的処理は行っていませんので、RailComを使った2列車対向運転スケッチは作っていません。ミント缶2台接続の時はスロットル側を無効に、自動運転の場合はミント缶を無効にしたいので、排他的処理は今後の課題です。

 

2021年9月27日 (月)

対向運転2

モード選択

非DCCのチビロコを運転するため、1列車のみのモードを追加しました。運転開始ボタンを押した時にCH2がオフなら1列車、オンなら2列車の運転モードを選択します。

Chibiloco

1列車で周回するだけなら手動運転と変わらないので、周回の回数でポイントを切り換えて入線を換えます。アナログ車両を完全停止すると在線もオフになるので、在線を離れる検知を3秒に延長しました。自動運転の各種パラメータは DesktopStation Softで設定します。

スケッチのバグ?

時折、在線検知がオフなのにあり得ない位置で停車したり、運転停止後に再び運転開始すると動きがおかしいなど、原因不明な現象が見られるので、暫く試運転で様子見です。センサーの状態で処理ステップを更新する単純なスケッチなのでちょっと不思議です。
あと、対向運転には影響ありませんが、C-Size DCCスケッチはコントローラ優先モードの時にアドレスが更新されない問題があったので修正しました。

CsizeDCC_d.zip

2021年9月25日 (土)

対向運転

Train Detector

在線検出するダイオード基板を作ったので、ぬっきいさんのTrain Detectorの例題を自動運転基板で再現してみました。配線量が多くて在線区間は対向線の2か所のみ、信号機は設置するスペースを確保出来ず挫折しました。

Traindetector

Diodepcb

始めはRailComでアドレスリーダーと在線検出を兼用しましたが、リーダー基板の手抜き設計と集電不良が重なって、全く実用になりませんでした。ダイオード検出でも集電不良の影響を受けるので、在線区間を離れる検出は1秒間継続をチェックするコードを追加しました。

RailComアドレスリーダーの課題

ミント缶の自動アドレス設定だけでも十分役立つので、手放せないアイテムになりました。追っかけ運転の為にはSpeed出力が欲しいのですが、対応するデコーダが限られます。
I2Cマスターはどうにか実用に近いですが、スレーブは動作が不安定でアドレスを読み出しての自動運転開始は、何度かリトライするコードで対応しています。アドレスの読み出しが無いと2列車目のアドレス変更にスケッチの書き変えが必要で実用的ではないので、在線検出にも
使える様に回路とスケッチの見直しを検討中です。

2021年9月 5日 (日)

自動追っかけ運転

追っかけ運転スケッチ

簡易化した小型のRailComリーダーを作って、自動追っかけ運転をやってみました。
先に手動運転する列車をCutOut区間に置き、自動運転ボードの停止ボタン(赤)を押すと、ミント缶にDCC CutOutを要求します。RailComリーダボードから読み出したアドレスがミント缶に設定されたら、ひと先ずオーバル線路の向こう側に移動。今度は自動運転する列車をCutOut区間に置きます。自動運転ボードの開始ボタン(黒)を押して、アドレスを取得出来たら走行開始です。

※C-Size DCCとミント缶はIIC通信を共通の仕様にしてます。

CutOut区間を通過する2列車のチックカウント(millis())を比較して、自動運転列車のスピードを調整します。スピードを取得出来たら良かったのですが、LenzのデコーダはCV28を3にしてもデータが出てきませんでした。

Chaser

アドレスリーダーミニ

DIP部品で小型化するためNORゲートを省いたC-Sizeのリーダーを作りましたが、CutOut検出端子にもDCCパルスの残骸が残り、シリアル出力信号と差程違いが無いので、CutOut検出コンパレータも省略してより小型化しました。

Readerpcb

ミニマム線路で機材を並べるには、限りなく基板を小さくしなければなりませんが、NORゲートを省いた影響でシリアル端子に無用な信号が乗っかり、エラーが続出してRailComデータの検出率が低下します。やはりSMT部品でフルスペックの回路を使うべきでした。実用範囲に達しないので頒布は諦めて個人で楽しむ事にします。

 

2021年8月14日 (土)

自動踏切

在線検知

自動運転用のセンサーディテクタボードで自動踏切スケッチを作りました。踏切も動画紹介も無くて「なんなんだっ」て事ですが、お伝えしたいのは在線検知です。在線検知で思い浮かぶのは閉塞運転くらいで、今更ですが自動踏切に役立つ事に気づきました。進行方向に関わらず、在線検知したら踏切警報を鳴らすので、フォトセンサーに比べてスケッチを単純化出来ました。警報解除にはフォトセンサーを使います。

接続

片側ギャップの線路に本線からダイオードを介して接続します。車両が検知区間に侵入して発生するダイオード両端の電位をセンサーディテクタボードで検知します。

Ontrack

センサーディテクタボードのCH1とCH2を在線検知タイプに設定して、検知チャンネルで運転モードを選択します。CH1はOvalモードで手動運転、CH2は2点間往復モードです。踏切警報音はMP3を使用しました。線路はアナログモードですが、DCCの場合は線路からアクセサリデコーダに電源供給出来ます。その場合は検知区間から供給しない様、注意が必要です。

Layout

続きを読む "自動踏切" »

2020年8月17日 (月)

リバース線自動運転

ターンアウト事故

リバース線路の運転はトミックスの完全選択式でオートリバーサーを省略してますが、安直に運用してACアダプタを壊してしまいました。その原因は

  1. ターンアウトデコーダをロクハンのポイントに合わせて最小の通電タイムにしたままだった
  2. ターンアウトデコーダをトラックから給電した(赤丸)

Image1

貧弱な給電ルートの場合、アナログ運転用のTB67H450からも給電できるくらい瞬時供給能力が下がります。その結果しばらく目を離した隙にポイントが中間位置に止まりそこに動力車が突っ込んでが過電流が流れた様でACアダプタが過熱して壊れました。事故の瞬間は目撃していないので、コントローラの過電流トラップがどうだったのかわかりませんが、モータードライバーのトラップを過信していました。

給電方法を修正

コントローラの端子を分岐して直接ターンアウトデコーダに供給。

Image2

その結果、ポイントの動きが「グシャッ」から「カチッ」に変わり、短絡時間が短縮され電源の過負荷が軽減されたと思います。安全のためには短絡時間をしっかり管理できるオートリバーサーの利用をお勧めします。

2020年8月 4日 (火)

自動運転の応用例3

自動往復運転スケッチ

自動で往復運転するスケッチを作りました。4CHあるセンサー入力を活用して、運転にバリエーションを加えました。CH1とCH2は進行方向の反転、CH3はリバース線路でのターンアウトに使用します。CH4は手動運転時のおまけです。

void processModeSelect()
{
gOnChannel = getSensor(0); //全チャンネルをチェック
if(gOnChannel == 2) { //CH2
gProcessMode = 2; //往復線路
gNextChannel = 1;
gProcessState = 2;
}
else if(gOnChannel == 3) { //CH3
gProcessMode = 3; //リバース線路
gNextChannel = 1;
gProcessState = 7;
}
else if(gOnChannel == 4) { //Ch4
gProcessMode = 4; //手動エンドレス運転
gNextChannel = 4;
gProcessState = 1;
}
}

C-Typeサイズコントローラはアナログでの自動運転に対応しましたが、デジタル専用出力にコストダウン目的で過電流検出4AのTB67H450を使ったためターンアウトデコーダでトラックオン出来ず失敗作です。ブースターが必要ですが面倒なので作りません。

駅のプラットホームにMP3デコーダを仕込んで発車前にメロディを鳴らしています。

往復線路

Round

リバース線路

Reverce

手動運転では2台のポイントを直進にしてエンドレス線路にしますが、自動モードをオンにすると駅での停車がStopTimeを超えた時に発車メロディが鳴ります。