無料ブログはココログ

« 2018年11月 | トップページ | 2019年2月 »

2019年1月

2019年1月13日 (日)

スマイルデコーダのスケッチを改変

久しぶりにスマイルデコーダを弄る

  ミント缶IVが冬眠中で暫く鉄道模型から遠ざかっていますが、久しぶりにDCC館さんのSmileMotorDecoderを弄りました。10月のDCCFestで挫折したOPSモードと統括アドレスモードに再度挑戦です。

NMRA DCC ライブラリ

  使い慣れた古いライブラリはアクセサリデコーダのOPSモードをサポートしていない様で、ライブラリを弄り倒していましたが気力の限界で、試しに2017-11-29版に変えたらあっさり動きました。モータデコーダならどちらでも良いのですが、共通にしたいので新しいバージョンを使う事にしました。サイズが大きくなったのでダイエットのためACCESSORYの処理をコンパイルスイッチで除外して、フラッシュの使用量を10%ほど軽量化出来ました。
  NmraDcc_x.cppを使用しているナゴデンさんのMP3やR6nでもOPSモードは可能ですが、ダイレクトモードと区別が無くACK動作してしまいます。これでは走行中に都合が悪いので、SmileMotorDecoderでは2017-11-29版に追加されているnotifyServiceMode()で判別して、OPSモードの時のACK動作を回避します。

uint8_t gSvcMode = 0;

void notifyServiceMode(uint8_t svc)
{
  gSvcMode = svc;
}

void notifyCVAck(void)
{
  if (gSvcMode != 0) MOTOR_Ack();
}

統括アドレスモード

  先ずConsistパケットの処理は2017-11-29版でも実装されていないので独自に追加しました。

  ...
  
  if( Cmd & 0b00010000 )
  {
    if( notifyDccConsist)
    {
      notifyDccConsist( Addr, AddrType, Cmd, Data1 & 0b01111111);
    }
  }
  ...

  一時的なConsistAddressと固定されたMyAddressの両方で動作させるため、DCC.initのパラメータから"FLAGS_MY_ADDRESS_ONLY"を除外して、スケッチ内でアドレスをチェックする事にしました。初めは両方のアドレスを一つの関数でチェックしていて不都合が有る事が分かりましたので、関数を二つに分けて状況によってチェックするアドレスを使い分けました。
1) OPS書き込みは両アドレス

void notifyDccConsist( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Cmd, uint8_t ConsistAddr)
{
  if (!chkMyAddr(Addr) && !chkConsistAddr(Addr)) return;
  
  gCV19_CAddr = ConsistAddr;
  gConsistDir = Cmd << 7;
  Dcc.setCV(CV_CONSIST, gConsistDir | gCV19_CAddr);
}

2) SpeedとF0は統括アドレスの時は固有アドレスを無視

void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
{
  if (gCV19_CAddr == 0) {
    if (!chkMyAddr(Addr)) return;
  } else {
    if (!chkConsistAddr(Addr)) return;
  }
}

void notifyDccFunc( uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
{
  ...
  case FN_0_4:
    // Function F00
    if (gCV19_CAddr == 0) {
      bMyAddr = chkMyAddr(Addr);
      if (!bMyAddr) return;
    } else {
      bMyAddr = chkConsistAddr(Addr);
      if (!bMyAddr) return;
    }
    ...

3) F1以降はどちらのアドレスに反応するかCVで設定する事がNMRAで推奨されていますが、SmileMotorDecoderはF0のみなのでCV項目は設けていません。

    // Function F01
    bMyAddr = chkMyAddr(Addr);
    if (!bMyAddr) return;
    ...
}

F0の制御

  統括アドレスで連結2台以上を同時運転する場合、電機やキハなど両運転台のヘッドライト点灯を工夫しないといけません。そのため車輛毎にCV34で点灯する向きを指定する事と、後続車のCV29ビット0(方向)に1を書き込んで車輛の向きを反対にする事で対処します。統括アドレスの時はFHだけを点灯させます。
  有志のスケッチにSmileMotor85_diet.zipをアップしました。

実際の操作

  ミント缶IVの[SEL]ボタン長押しでオプション画面に切り替え、CONSISTメニューを選んで、ロコアドレス3のデコーダにADR 5を書き込みます。ロコアドレスを4に切り替えて同様にADR 5を書き込みます。

Consist

[FX]ボタン(ESC)でファンクション画面にもどり、ロコアドレス5でF0をオンにすると先頭車のFHが点灯します。

Consist_adr5

Adr5_fwd

進行方向をREVに切り換えると後続車のFHが点灯します。因みにCV4による惰行中を判定するコードをmotor_ctrl.cppに追加したので、完全に停車するまで進行方向は変わりません。

Adr5_rev

CONSISTアドレスに0を書き込んで統括モードを解除すると、ヘッドライトの制御も解除されます。

Adr3_adr4

« 2018年11月 | トップページ | 2019年2月 »