無料ブログはココログ

自動運転

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を超えた時に発車メロディが鳴ります。

2020年5月24日 (日)

自動運転の応用例2

部品の行方2

AliExpressに注文した部品で、ようやくストレートタイプのユーロコネクタだけが届きました。

15edgka

自動信号機

スケッチが充実しないと自動運転基板を頒布する機運にならないので、Nuckyさんの日本型信号機のスケッチを作ってみました。久しぶりなので復習します。

アドレスの割り振り

デコーダアドレス 2 3 4
方向 T C T C T C
出発信号    
閉塞信号    
場内信号    

手持ちの信号機は4現示ですが、デコーダを3現示に設定して現示条件を割り振りました。条件1をデコーダアドレスとし、条件2(黄、青)は前方の信号機のデコーダアドレスを設定します。
AdrPair型配列に割り振るアドレスを格納して、配列インデックスを引数に赤信号と青信号の関数を呼び出します。センサーを踏んだ信号機を赤に、前方の信号機を青に変えます。その先の信号機は条件アドレスの割り振りに従い自動的に黄色に変わります。

Photo_20200524181103 Photo_20200524181101 Photo_20200524181102

エンドレス運転を想定してますが、都合により直線線路で撮影しました。

 

信号機制御スケッチ

// Decoder
struct AdrPair {
word Pri;
word Sec;
};
AdrPair AccSig[] = {
{2, 3},
{3, 4},
{4, 2},
};
void processJob()
{
switch(gProcessState) {
case 1:
getSensor(1);
if(gOnChannel == 1) {
SignalRed(0);
SignalGreen(1);
gProcessState = 2;
}
break;
case 2:
getSensor(2);
if(gOnChannel == 2) {
SignalRed(1);
SignalGreen(2);
gProcessState = 3;
}
break;
case 3:
getSensor(3);
if(gOnChannel == 3) {
SignalRed(2);
SignalGreen(0);
gProcessState = 1;
}
break;
}
}