無料ブログはココログ

2020年12月 4日 (金)

ミント缶-HACX

HACXスケッチを移植

ミント缶IV R1.6にD99 HACXのスケッチを移植しました。その理由は、HOMEメニューにより機能が一目で分かると思ったからです。

Home

ミント缶は鉄道模型入門の方、DCCお試し希望の方を対象とした、低価格なエントリーモデルです。隠されていた機能を目に見える形にすることで、それなら試してみようとか思われる方が増える結果になったら幸いです。OLED表示器が小さいのが問題ですが、基板と0.96インチOLEDが沢山残っているので、申し訳ございませんが1.3インチの変更はユーザさんにお任せとします。

ミント缶-HACXの操作方法については、当ブログ内「ウェッブページ」の 1.ミント缶アーカイブ項目に、ミント缶-HACX.pdfをアップしました。

 

アドレス選択

▲▼ボタンで4桁アドレスを選択するのは至難ですが、現状は棚上げです。メーカー標準のアドレス3を主体に運用をお願いします。『ロコアドレスを読み出して運転開始したい』とのご要望もありましたが、ワンコインデコーダにRailCom出力を実装するのは現実的ではありません。苦肉の策として"Read CV"メニューでCV1を読み出した結果を選択アドレスに表示する事にしました。

Loco

 

CV読み出し

CVがよくわからない事がDCCを敬遠する一因であるとの意見もあります。『CVに値を書き込んだけど読み出せない』『CV読み出しが出来ないのでデコーダが壊れているのではないか』など、疑問を持たれる方もいらっしゃる様です。DCCトラックは一方的に電力を出力するもので、基本的には双方向性がありません。なのでデコーダ自身が一時的に電流を増加させる巧妙(?)な仕組みでCV読み出しを実現しています。

HACXスケッチの移植過程でCV書き込みの確認(ACK)がうまくいかなかったので、トリガー出力を追加してデコーダの電流増加波形を調べてみました。

Standerd Smile95
Lenz Standerd SmileDec85

CV書き込み後のACKはCV読み出しと同じく電流の増加でコントローラに通知する仕組みです。HACXスケッチは書き込みとACK取得を5回以上繰り返して、電流増加の閾値を超えたら完了します。

左のLenz社Standerdは少々反応が鈍いのか、ACKが間欠しています。右はATtiny85版のスマイルデコーダで毎回ACKを返しています。普段からLenzの方がCV読み出しに失敗する頻度が高いです。因みにデコーダの負荷はどちらもKATOの小型動力車です。CV読み出しは電流変化量だけでなく、デコーダの応答性、線路の集電不良など、幾つかの不確定要素を含んでいる事をお分かり頂けますでしょうか。

2020年10月25日 (日)

C-Size DCC

お試しの配送ルート

FusionPCBに頼んだ基板は急ぎじゃないので割安なJapan Direct Lineにしました。SSGを解約して新たに契約した配送ルートです。国慶節の前日に基板は完成しましたが発送は10月8日。でもそれから予定通りぴったり2週間で到着しました。

Japandirectline

届いた基板はC-Sizeシリーズ(?)の2点。1点はアナログ自動運転のリバースループを実験する基板。

Rlp_pcb

もう1点は自動運転向けのDCCコントローラ基板ですが届く前にまたしても設計変更したので使わずに廃棄です。マスコン用ロータリーエンコーダの位置決めが確かめられたので良しとします。

Dcc_pcbHandle

2020年9月22日 (火)

C-SizeDCC 改訂版4

レベル変化割り込み

前回の写真に赤いマスコンレバーが写ってます。ロータリーエンコーダの取り込みですが、INT1のD3をPWMに振ったので汎用ポートのレベル割り込みを使う事にしました。ATMEGA4809の割り込み設定はPORTレジスタをあれこれ弄らなくてはいけない様でどうしようと思いましたが、ダメ元でattachInterruptを使ってみたらあっさり動きました。

#define ENC_A 4
#define ENC_B 5
getSpeedLib::getSpeedLib()
{
...
attachInterrupt (digitalPinToInterrupt(ENC_A), ENC_READ, CHANGE );
attachInterrupt (digitalPinToInterrupt(ENC_B), ENC_READ, CHANGE );
...
}
Arduino IDEのシリアルモニタ
--------------------------
twaydcc C-Size DCC r0.2
--------------------------
on
ENC_READ:1,0,1,4
ENC_READ:1,1,2,4
ENC_READ:1,2,3,4
off
ENC_READ:0,3,0,5 // 1ノッチ
AnalogSpeed:1,254,255 // 加速開始
AnalogSpeed:2,253,255
AnalogSpeed:3,252,255
AnalogSpeed:4,251,255
on
ENC_READ:3,0,3,5
ENC_READ:3,3,2,5
ENC_READ:3,2,1,5
off
ENC_READ:0,1,0,4 // ノッチオフ

C-SizeDCC 改訂版3

アナログとデジタルの出力を分離

アナログモードのPWM周波数を31KHzにするためC-SizeDCCの回路を再度変更しました。ターンアウトデコーダをドライブ出来ないTB67H450をアナログ出力専用とし、アナログモード時のデジタル出力はアクセサリパケットのみを送出する事にしました。フィーダ線の繋ぎ換えが面倒ですが、価格が高いTB6643KQを一個にして少しだけコストダウンしました。一方、ATMEGA328PのArduino NanoはTCCR2Bをデジタルパケットの生成に使っていてD3,D11が使えませんので、ミント缶と同じくデジタル出力のD9、D10からPWMを送出して、アナログモードの自動運転は諦めます。

Csizedccb_sch

ATMEGA4809のPWM

Arduino Nano EveryでPWMを31KHzにする方法が分からなかったので、forum.arduino.cc の書き込みを拝借しました。

#if defined(__AVR_ATmega4809__)
// D3,D6 pwm output
PORTMUX.TCBROUTEA |= PORTMUX_TCB1_bm; // 0:PA3 -> 1:PF5(~D3)
PORTMUX.TCBROUTEA |= PORTMUX_TCB0_bm; // 0:PA2 -> 1:PF4(~D6)
// TCB1 Mode
TCB1.CTRLB = 0 << TCB_ASYNC_bp /* Asynchronous Enable: disabled */
| 1 << TCB_CCMPEN_bp /* Pin Output Enable: enabled */
| 0 << TCB_CCMPINIT_bp /* Pin Initial State: disabled */
| TCB_CNTMODE_PWM8_gc; /* 8-bit PWM */
// TCB1 Clock select
TCB1.CTRLA = TCB_CLKSEL_CLKDIV2_gc; /* CLK_PER (1/2) */
TCB1.CTRLA |= TCB_ENABLE_bm;
// TCB0 Mode
TCB0.CTRLB = 0 << TCB_ASYNC_bp /* Asynchronous Enable: disabled */
| 1 << TCB_CCMPEN_bp /* Pin Output Enable: enabled */
| 0 << TCB_CCMPINIT_bp /* Pin Initial State: disabled */
| TCB_CNTMODE_PWM8_gc; /* 8-bit PWM */

// TCB0 Clock select
TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc; /* CLK_PER (1/2) */
TCB0.CTRLA |= TCB_ENABLE_bm;
#endif

I/O Multiplexingを使ってTCB1とTCB0のアサインをD3とD6に切り替えるのが肝です。TCBクロックをシステムタイマーの1/2に設定しています。

ProbePwm_dcc

2020年9月 5日 (土)

C-SizeDCC 改訂版その2

C-SizeDCCでCV書き込み

今まで試してなかったのでやってみました。Arduino Nano EveryのUSB端子をパソコンに繋いでDesktopStationSoftwareの「CV設定」で書き込みと読み出しを行います。
最初、何故か読み出しデータが実際のCV値と異なりましたが、ADCの初期化を以下のように修正したら正常に読み出し出来ました。

最初のコード

void ADC0_init()
{
#if defined(__AVR_ATmega4809__)
ADC0.CTRLC = ADC_REFSEL_INTREF_gc;
ADC0.CTRLC |= ADC_PRESC_DIV8_gc;
#else
ADCSRA = ADCSRA & 0xf8; // Faster Analog read
ADCSRA = ADCSRA | 0x04; // 1/8 ADC Prescaler
#endif
analogReference(DEFAULT); // set analog reference 5V(VCC)
}

4809の初期設定がVDDなのでこれを保持し、analogReference(DEFAULT);は実行しないよう修正しました。

void ADC0_init()
{
#if defined(__AVR_ATmega4809__)
ADC0.CTRLC &= 0b00010000; // clear prescaler;
ADC0.CTRLC |= ADC_PRESC_DIV8_gc;
#else
ADCSRA = ADCSRA & 0xf8; // Faster Analog read
ADCSRA = ADCSRA | 0x04; // 1/8 ADC Prescaler
analogReference(DEFAULT); // set analog reference 5V(VCC)
#endif
}

Dscvwrite

«C-SizeDCC 改訂版