無料ブログはココログ

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;
}
}

2024年3月24日 (日)

MP3デコーダにOPSモードを追加

MP3デコーダのCV

操作性を改善したR1.6のスケッチですが、CVモードでCV値を変更して電源再投入を何度も繰り返すのは煩雑です。ミント缶IV初期型でOPSモードに触れていましたが、記憶が遠いので改めてOPSモードについて書きます。 OPSモードでの書き込み対象とするのは、

  1. CV30のデコーダモード:0=モータ、2=ヘッドライト
  2. CV48のレール継ぎ目音:0=なし、1=あり
  3. CV51の継ぎ目音最高速:0 - 100
  4. CV58のMP3ボリューム:初期値26
  5. MP3Function再生モード:0=オフ、1=シングル、2=リピート、3=オンのみシングル ( Function範囲 CV_MP3_F0 - CV_MP3_F28 )

の5通りです

スケッチに追加

追加するnmra関数はNmraDcc.cppのprocessDirectOpsOperation(...)関数内writeCV()からコールされるnotifyCVWrite()と、resetServiceModeTimer(..)からコールされるnotifyServiceMode()です。

  void notifyServiceMode(uint8_t svc)
{
//CV書き込みがサービスモードかOPSか判別 gSvcMode = svc;
}

uint8_t notifyCVWrite(uint16_t CV, uint8_t Value)
{
...

今回起きた疑問点

ATtiny85版のデコーダではちゃんと動いてましたが、UNO版は何故か

  1. notifyCVWriteを追加するとデコーダ全てが反応しない
  2. notifyServiceModeでサービスモードを保持(?)できない

なので、Nmraライブラリ内でwriteEEPROMの後で呼び出されるnotifyCVChangeでMP3パラメータを更新する事にしました。また、notifyCVAckではサービスモードの判定をコメントアウトしてますので、ロコが書き込みに反応します。

  void notifyCVChange( uint16_t CV, uint8_t Value)
{
switch(CV) {
case CV_DECODER_MODE:
gCV30_DECODER_MODE = Value;
break;
case CV_MP3_Vol:
gCV58_MP3_Vol = Value;
break;
case CV_MP3_F3:
gCV113_MP3_F3 = Value;
break;
}
}

void notifyCVAck(void)

{
//if (gSvcMode != 0) {
MOTOR_Ack();
//}
}

トラック上のすべてのデコーダに書き込まれてはまずいので、validCVで呼び出されるnotifyCVValidでマイアドレスの判定を実行します。

  uint8_t notifyCVValid(uint16_t CV, uint8_t Writable)
{
// ServiceMode
if (gSvcMode != 0) return 1;

// chk myAddr
uint16_t aAddr = Dcc.getAddr();
if (!chkMyAddr(aAddr) && !chkConsistAddr(aAddr)) {
return 0; // not write
}

return 1; // exec writeCV
}

3月27日 追記

MP3パラメータはwriteEEPROMの後のnotifyCVChangeで更新していますので、CV範囲のチェックが働かず、全てのCVが書き変え対象で要注意です。 また、OPSでのAck動作ですがデコーダは車載せずに遊んでますので、気にする事はありませんでした。 notifyCVWriteを使うとデコーダが動作しない原因は不明です。初期化関数initでCV_29_CONFIGに書き込みが行われるのが気になりますが、

// Set the Bits that control Multifunction or Accessory behaviour
writeCV( CV_29_CONFIG, ( readCV( CV_29_CONFIG ) & ~cv29Mask ) | (Flags & cv29Mask) );

CVリードも動作しなくなるのでCV29を確認する術もありません。AVR Boardは最新の1.8.6でIDEが原因でもなさそうです。 デコーダそのものが反応しないので、パケット割り込みかと思いますが、notifyCVWriteが影響するとは考えられず現時点では諦めです。

2024年3月21日 (木)

SSD1306Ascii lib-2

アドレスCV書き込み

訳あってデコーダのCV書き込み操作が頻発しています。そのためR1.6スケッチの操作性の悪さが改めて身に染みる事態となり、SSD1306Ascii lib使用のついでに改造する事にしました。 ミント缶IV基板は頻繁に弄り過ぎてスケッチが継ぎ接ぎだらけ、非合理的で醜い事態です。

愚痴のついで

体調を崩してからは車輛のDCC改造は不可能で国内メーカーの後ろ向き加減に閉口する毎日です。やむを得ず単体のデコーダだけでモータ回転、LEDの点灯、MP3のサウンドなどを楽しんでます。
せめてライト基板のある車両くらいはDCCコネクタを実装出来ないものでしょうか。 KATOのマイトラムはヘッドライトを点灯出来るそうで期待しましたが、DCC化に関する記事はどこにも見当たりません。

本題に戻ります

R1.6で扱えるロコアドレスは1から25の25通り限定でそれ以外のアドレスは登録メニューで書き変える仕様です。
登録したアドレスはその場でデコーダのCVに書き込みますが、スケッチの出来が悪くて嫌なので、CV書き込みモードに引き渡す様に改造してみました。

Laddr ロコアドレス 11を110に変更後[ENT](ボタン5)を押してミント缶に登録。 次に[CVW](ボタン4)を押すとCV書き込みモードに画面が変わります。 ※写真ではボタン名が読めなかったので修正してます
Cv29_20240321181701 登録したアドレス110をデコーダーに書き込む為先ずCV29のPrimaryかExtendedかスケッチでBit5を自動的に決めてます。
CV書き込みメニューの流用でデコーダのCV29値を[CVR]で確認する事が出来ます。デコーダはLENZ Standerdで左の写真では128ステップのほかアナログ対応(bit2)とRailCom(bit3)がオンになってました。アドレスは110なのでExtendedビットは0です。
Cv1 ここで[CVW](ボタン4)を押すとデコーダーのCV29に書き込み、アドレス書き込み画面に変わります。 PrimaryアドレスなのでCV1の書き込みに変わりました。 [CVW](ボタン4)を押すとCV書き込みが完了して、変更したアドレスでデコーダを操作する事が可能になります。

 

2024年2月16日 (金)

ミント缶コントローラのフォント

ミント缶の終了

私の体調不良でミント缶を終了してしまいました。大変申し訳ございません。
体調は悪化の一方ですが担当医から喝を入れられて、毎日ボーっと過ごすより出来る事だけでもやってみようと思い、久しぶりにミント缶コントローラを掘り出しました。 
OzOLEDライブラリが何処にあったかネット検索していたら偶然、SSD1306Asciiライブラリの存在を知ったのでミント缶で試してみました。

Ascii

名前の通りAscii文字のみで図形は扱えませんが、一部の文字を改変して△▽だけ表示しています。
ライブラリには56通りのファイルがアーカイブされていて、選択肢が大きいです。上の画像では、"lcd5x7.h"、"lcdnums12x16.h"、"lcdnums14x24.h"を使って表示しています。

フォントの選択

未確認ですがAdafruit GFX library 互換との事です。
SSD1306Ascii.hでインクルードされる "allFonts.h"ファイルに使いたいフォントファイルを記述します。
ちょっと変化の有るフォントも使いたかったのですが、さすがに5x7では変化の付けようが無いようで、ファイルを変えても区別がつきません。
因みにこんなフォントもありますが、文字幅が10ドットあって表現内容が限られてしまいます。そもそもイタリックでは都合が良くありませんね。


Callibri11
Callibri11_italic

自動運転スケッチ

ライブラリを変更した為かスケッチが使うフラッシュメモリに空きが出来ましたので、ミント缶本体に自動運転スケッチを組み込むことが出来ました。運転パターンを変える度にスケッチを書き直すのは負担なので3個のセンサーを使って、最初に踏んだチャンネルで3通りの運転パターンを実現しました。
そろそろ体調が限界なので、この件については後日アップする予定です。

 

2022年5月 2日 (月)

wio terminalその4

一通りDCCスケッチで遊んだので、移植例が紹介されていたパックマンでゲームに戻ります。画像の商標を考慮してスケッチは未公開との事ですので、Wio Terminalスケッチのトレーニングになるかと思い移植にトライしました。


Pacman


記事に従って、SPI接続のILI9328をWio Terminal内蔵TFTに変更と、ボタン操作を 5Way Switchに変更する事であっさり動きました。「drawFastHLine() だけで抽画されている事に驚嘆」されていて確かに変更は簡単でしたが、抽画データーのアルゴリズムまで追うのは諦めました。トレーニングは放棄してしばらくは懐かしいパックマンで遊ぶことにします。

«wio terminalその3