ミント缶で自動運転
ミント缶本体で自動運転スケッチ
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;
}
}
最近のコメント