無料ブログはココログ

デコーダ

DCCデコーダ

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が影響するとは考えられず現時点では諦めです。

2021年9月 9日 (木)

デコーダキャリア基板

Slim651基板

TRAINOさんからEC-SlimのNEM-651版を送って頂きましたので、KATOのキハ110 100番台に入れてみました。この車両のDCC化は、初回がロクハンのデコーダ動作確認、次にRailCom Display確認のためLenz Standerdに装換。その後RailCom追っかけ運転のためBトレに移植して空き家になっていました。

ワンコインデコーダ

基板は1.27ピッチ6ピンプラグのNEM-651用ですが、組み込むのはワンコインデコーダR6です。Slim651基板はメーカ市販のデコーダに合わせて、FH/RHとAUX1がドライバー出力用に設計されてます。ワンコインデコーダはロジック出力なのでデコーダが燃えます。そこで基板上で高電圧に繋がっているR1を撤去しました。念のため両極性化のデジトラも撤去しちゃいました。外した部品は単体の両極性化基板に有効利用します。

Aya-circuit

基板組み込み

キハ110本体は以前の改造のまま、Slim651側を改造車体に合わせました。両運転台の100番台なので付属の6ピンソケットは基板内側に向けました。室内灯はパッドが沢山用意されていて、組み込む車両に合わせた選択が可能です。室内灯のAUX1出力がデコーダに無い場合はジャンパーパッドのGND側にハンダを盛って常時点灯する事も出来ますが、一部がワンコインデコーダで遮られるのであっさり省略しました。

Install

動作確認

無事完了しました。室内灯は無くてもヘッドライトは必須なので、ワンコインのスマイルコネクタから引き出しました。LEDは最初のDCC化でウォームホワイトに交換済です。

Kiha110_20210909182401

2021年7月31日 (土)

OneCoin for KATO Loco

氷河特急をDCC化

C-SizeDCCコントローラでアナログ動力車の自動運転を楽しんでいて、車両のDCC化は放棄していますが、OneCoinDec6をポイントデコーダ化するため、久しぶりにPICKit2を掘り出したので、同時にOneCoin for KATO Locoを組み立てました。再頒布が開始された時に基板を購入していたのですが、ヘッドライトのLEDパッド位置がきつくて諦めていました。

Onecoinforkato

集電パッドを少し削って前方に移動するとLEDのスペースを確保できそうなので、GE4/4に組み込んでみました。F0、走行ともに良好で、R140をぎりぎり通過しました。

Ge4_4

 

2021年7月27日 (火)

リバース運転その2

ターンアウトデコーダの配線

何も考えずにワンコインデコーダを組み立てて、不自由無くアナログ運転してましたが、DCC運転で困ってしまいました。ターンアウトは電力ロスを避けるため、コントローラから直接接続しますので、線路への給電分岐を考えなければなりません。そこで2台目の組み立ては[IN]に2列2ピンのピンヘッダー使いました。コントローラから1列目に接続し、2列目はリレー基板を介して線路に繋ぎます。文字通りワンコインで出来るデコーダなので、気楽に追加組み立てが出来てありがたいです。

Onecoin

 

2021年7月13日 (火)

リバース運転

リバース運転用デコーダ

ターンアウトと極性反転リレーに2台のデコーダを使い、配線やスペースに難ありなので1台のデコーダに集約しました。使ったのはポイントデコーダ化のOneCoinDec6です。Dec6-1822Point-0.91beta.asmにリレー駆動コードを追加しました。尚改造コードについてWeb.Nuckyさんに問い合わせる事はご遠慮ください。

Onecoinr6

C-SizeDCCコントローラのアナログトラック出力を使って無改造のチビロコを運転してます。写真に納まらなくなるので自動運転用のセンサディテクタ基板には繋がず、手動のターンアウト操作での運転です。

リレー基板回路図

Revercerelay

CVの設定は CV3=5 (x10ms)、CV6=200 (Duty80%)です。ポイントは負荷が軽目のKATO EP-150なので、外付けコンデンサ無しでも動きました。

2020年8月 9日 (日)

信号機デコーダ

往復運転用信号機

自動往復運転スケッチに信号機を追加するためのデコーダを作りました。動作はNuckyさんの日本型信号機に準拠してますが、チップはATtiny85で信号機モードを二つ追加しました。一つは踏切警報灯、もう一つは上りと下りを兼用する信号です。

Decoder

テコ機能の活用

往復運転には上りと下りの信号機が欲しくなりますが、配線が2倍になるので1台のデコーダに2現示両面信号機を取り付けて上り下りを兼用するモードを追加しました。テコをオンにすると上りは赤に固定して下りを有効に、テコがオフの時は上りを有効にします。スケッチだけで信号機基板は手付かずなので動作確認にNuckyさんの信号機を使いました。

Teco_offTeco_on

2020年6月14日 (日)

ノラミント缶改めC-TypeサイズMM/DCCコントローラ

部品の行方4

そろそろOLEDが届く頃かもしれないので残りの部品を秋月に注文しようかと思いましたが、口座に穴が空きAliexpressから延滞金3円!の請求が来ました。没記名の彫刻代や法要費、実家の永代供養費など出費がかさむので、給付金が届くまで当分見合わせです。お急ぎの方にはC-Typeの自作をお勧めします。

ポート選択を変更

リバース自動運転スケッチに上下信号機6台を追加する計画ですが、省配線のため全てをトラックから給電したいのでアナログ専用のメイントラックはミント缶と同じアナログ/デジタル切換えに戻し、アナログモード時のみデジタル専用にD4,D5を使う仕様に変更します。
fujigaya2さんのブログに怖いレポートが上がっていましたので、安全のため5Vレギュレータを追加しました。Arduino nanoのオンボードでは放熱が厳しく、自動運転基板の外部接続も考えるとVin=12VではPdがきついです。ミント缶IVでもレギュレータが40℃まで上昇してPd maxが低下します。

Schematic2 Board2

相変わらずロジックレベルでの動作確認だけですが、アドレス登録とCV操作を追加した暫定スケッチをアップします。DSCoreにCtypeフラグを追加して、アナログモードの時はパケット出力をD4,D5に切り替えます。

ダウンロード - ctype_dcc.zip

部品表

Ref Value Qty Code Price
C1 220uF35V 1 P-11758 10
C4-7 1.0uF 4 P-04066 100
CN1 MJ-4PP-9 1 C-06070 50
J1 DC Juck 1 C-09408 30
JP2 2x4P(5P) 1 C-13635 15
Jumper pin MJ-254-6BK 1 P-03687 100
MD1 Arduino nano Every 1 M-14848 1,500
TB1,2 WJEK254-2.54-02P 1 P-14217 50
U1 TA48M05F(SQ) 1 I-00451 100
(*1)(C2 0.1uF 1   )
(*1)(C3 47uF35V 1   )
U2 TB67H450FNG 1 I-14967 115
U4 TB6643KQ 1 I-07688 280
(*2)S1,2 FHU-1x42SG 1 C-05779 80
VR1 RK0971221 1 P-03036 250
Knob ABS-28 1 P-00253 20
PCB CType 1 P-00517 60
sub PCB AE-SOP8-DIP8 2 P-05154 100
合計 2,860
(*1)I-00451付属品
(*2)パネルオプションを使う場合はC-03138を推奨
CVリードオプション
U3 ACS711 1 I-12267 240
C8 1nF 1 P-04062 100
パネルオプション
Clear Panel   2 P-09853 240
Spacer 14mmH 1 P-01861 50
S1,2 1X15P(20p low profile) 2 C-03138 120
総計 3,510

※純正のArduino nano EveryをAliexpressのArduino nano互換機に置き換えると1,000円以上圧倒的に安くなりますが、現在の入手性は分かりません。

2019年8月11日 (日)

ロクハン24系専用スマイルデコーダ

ロクハン24系のデコーダ

  ロクハンのDCCデコーダA059は組み込み易く価格も手頃ですが、24系7輌セット全てに組み込むとなると車輛セット実勢価格の2倍近くになるのでATtiny85で自作してみました。作ったのは7面付けで5枚だけ。送料込みで1枚260円でした。部品代は秋月の販売単位で1300円なので、7輌分でも車輛のセット価格を上回る事は無さそうです。

Smilelightz24

室内灯を調光

  ロクハンのデコーダはあまりに基本的過ぎてDCCを存分に楽しむには機能不足です。そこでATtiny85のPWMポート2CHを使って通路側と室内側を調光してみました。通路側はファンクション3、室内の輝度はファンクション4,5,6に割り当てました。各輝度はCV設定で変更する事もできます。OPSに対応したので走行しながらレイアウトに合わせて輝度を調整出来ます。

通路側ファンクション3
Aisle
室内側就寝中、トイレは通路側のライトです。遮蔽版を付け忘れたので室内に漏れています。
Room
室内側ファンクション4、日が暮れたので点灯。オロハネなのでビップルームはウォームホワイトにしてみました。
Room_f4
室内側ファンクション5、落ち着いた光量でディナータイム
Room_f5
室内側ファンクション6、就寝までのくつろぎタイム
Room_f6

単体LEDなので光ムラは避けられません。導光板を試したいところですがデコーダの部品と重なるのでスペースがありません。

 

2019年3月 9日 (土)

スマイルデコーダリバイバル

元祖スマイルデコーダが復活?

  MP3サウンドデコーダでお馴染みのなごでんさんが新商品を開発しています。R6nの進化系とR5nです。なんで6から5に戻るのか、それはかつてのR3、R4を引き継いでいるからです。
  R6nとの大きな違いはADPCM再生に使用していた16bitPWMをモータ用に戻したことです。モータその物から発生するリアルなVVVFを再現します。8bitPWMによるサウンド出力も可能ですが、パワーアンプは外付けです。

スマイルデコーダの比較

Image1

  上がR3、中段がR5n、下がR6nです。R3と変わらないサイズですが、BEMFと非対称DCC機能が追加されて実装密度が上がっています。厚さも1mm薄く4mmになりました。C1の10MFチップキャパシタを小型にすると更に0.2mm薄くできます。

2019年3月14日 訂正:R5nの配線が間違っていました。上から の順が正解です。

スケッチを書き込む

  スマイラーさんのCOMBOAで書き込みます。基板の厚さは0.8mmでThinソケットに無理なく入りました。相変わらずLチカが楽しいライターです。 書き込むスケッチは fujigaya2さんのVVVF+Melodyです。リンク切れじゃなくて良かった。fujigaya2さんに感謝です。

Image2

動作テスト

  なごでんさんの助言で初期値で大き目なCV2、3、4を夫々10近辺に書き変えたら自然な動きになりました。正に蚊の鳴くような音ですが、スピーカーを組み込めない小さなBトレにはぴったりです。『やかましい』と家族に顰蹙を買う事も無くなりました。

Image3

  モータ自身で出すVVVF音は、当然ですがモータによって大きく異なります。IMONの小型モータは音が出ませんでした。fujigaya2さんによると鉄コレの琴電(15m級)が良いそうです。動力ユニット次第でしょうけど手持ちに12m級があるので組み込んでみたいなと思います。
はじめは非対称DCCのテストを目的にしていましたが、VVVFモータ音が楽しくて暫くはいろんな動力で遊ぶ事になりそうです。


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