無料ブログはココログ

« 2024年2月 | トップページ | 2024年4月 »

2024年3月

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月 | トップページ | 2024年4月 »