無料ブログはココログ

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

2020年3月

2020年3月14日 (土)

ロジックレベルDCC訂正

ロジックレベルCV書き込み

 Nmraライブラリの動作把握が不十分で思考が錯綜しています。ロジックレベルでもCV書き込みは可能なので訂正します。

CV書き込み

 NmraライブラリでのCV書き込みはnotifyCVWrite()によりユーザスケッチで書き込むか、ライブラリで書き込まれた後notifyCVChange()で確認するのか、ユーザに任されています。

  if( notifyCVWrite )
return notifyCVWrite( CV, Value ) ;
if( readEEPROM( CV ) != Value )
{
writeEEPROM( CV, Value ) ;
    if( notifyCVChange )
notifyCVChange( CV, Value) ;
}

OPSモードは動作中のCV書き込みなので、リセットはせずnotifyCVのパラメータを使って変数を更新して、動作が不安定になるのを回避するのが賢明です。これまではnotifyCVWrite()を使って自前でEEPROM書き込みしていましたが、センサー信号機ではnotifyCVChange()で変数の更新のみにしてみます。

CV書き込み応答

 動力車用デコーダでは走行中にACK反応するとおかしな動きになるので、notifyServiceMode()でCV書き込みモードを判定します。

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

信号機はLED表示で更新した事を確認できる方が安心かもしれません。

void notifyCVAck(void)
{
//if(gSvcMode) {
digitalWrite(G_LED_PIN, HIGH);
digitalWrite(Y_LED_PIN, LOW);
digitalWrite(R_LED_PIN, LOW);
analogWrite(C_LED_PIN, 255);
delay(12);
analogWrite(C_LED_PIN, 0);
digitalWrite(G_LED_PIN, LOW);
//}
}

アクセサリ操作アドレス

 CV保存した4間隔のアクセサリアドレスは

  gAccessoryAddress = Dcc.getAddr()/4 + 1;

で、連続したアドレスに読み直して複数の信号機の同時制御を可能にしました。

 

2020年3月13日 (金)

センサー信号機

ロジックレベルDCC

 以前、ATtiny841で信号機を作りましたが、入手性が良くないのでATtiny85で作り直しています。ミント缶IV用センサーディテクターボードからロジックレベルのDCCパケット(S88NのRailData相当)を受信するので、使用するICはATtiny85のみです。センサーは直接センサーディテクターボードに接続します。

Sensorsignal_sch

 

OPSモードCV書き込み

 接続がロジックレベルなのでCV書き込みはOPSモードで行います。ここで注意すべきはアクセサリアドレスです。OPSモードのパケットはアクセサリデコーダのスイッチ情報を含みませんので1,5,9...と4アドレス間隔で割り当てないとNmarDccライブラリのOPSアドレスチェックで蹴られます。

  if((OutputAddress != getMyAddr()) && ( OutputAddress < 2045 ))
{
DB_PRINT("execDccProcessor: Output Address Not Matched");
return;
}

 一方、notifyDccAccState()ではパケットに含まれるスイッチ番号が加えられ、1,2,3,4の連番で送られて来ます。

  TurnoutPairIndex = (pDccMsg->Data[1] & 0b00000110) >> 1;
OutputAddress = (((BoardAddress - 1) << 2 ) | TurnoutPairIndex) + 1 ; //decoder output addresses start with 1, packet address range starts with 0

 但しNmarDcc内にアドレスチェックがありませんのでデコーダスケッチでチェックしなければなりません。また当然ですがCV読み出しは出来ませんので、アドレスを忘れた時はCV8で初期化してデフォルトのアドレスを使って書き直します。->サービスモードで書き込みが可能

信号機の制御

 機能はNukeyさんの日本型信号機を模倣していますが、4間隔の実アドレスは

void notifyDccAccState( uint16_t OutputAddr, uint16_t BoardNo, uint8_t SwNo, uint8_t Power )
{
uint16_t aAccAdress = (OutputAddr - 3) * (BoardNo - 1);

で、連続の代替アドレスに読み直してアクセサリ操作します。各信号LEDはDIVでオン、STRでオフとして、信号機を赤に変えるだけで他の信号機を自動制御する事にします。1デコーダ4スイッチまでなので4現示仰速以上はあきらめます。(たぶん使うのは3現示だけだと思う)
 センサーディテクタボードのスケッチは、OutputAddrをセンサーチャンネルにマッピングして、センサーがオンになったチャンネルの信号機を赤にするだけの単純なコードで済みます。
 信号機を線路と直角の向きに変えると踏切警報灯にも出来るので、信号機種別に踏切を追加しました。回路図とスケッチだけの妄想です。秋の文化展用で、基板の作成は状況が分からないので当分見合わせています。

 

2020年3月 1日 (日)

PRセンサーを繋ぐ

デージーチェイン

  TPR-105フォトセンサーはオープンコレクタ出力なのでワイヤードオアが出来るなと思いやってみました。僅か4CHのセンサーディテクタ基板でも配線がごちゃごちゃするので少しでも配線量を減らすのが狙いです。

Daisychain_rail

  各センサーレールはGNDとセンサー出力の2芯で繋ぎ足します。

基板との接続

  CH1のみ3芯のセンサーケーブルを接続。他のチャンネルはLED駆動の1芯だけ各センサーと接続します。

Daisychain_connect

デージーチェインスケッチ

  センサー出力を読むアナログポートを固定するだけなので、S88.cppにCV_DAISYCHAINパラメータを追加しました。

  for(i=0; i&ltANALOG_PORT_NUM; i++)
{
if(daisychain) {
light_on_value[i] = analogRead(analog_pin[0]);
} else {
light_on_value[i] = analogRead(analog_pin[i]);
}
}

Daisychain

スケッチのダウンロード
自動往復運転

  Desktop Station Softで受信して3チャンネルのオンオフを確かめました。線路脇に犬走を作って配線を固定すれば、テーブルの上に広げるのも簡単で気が向いたらいつでも自動運転が楽しめそうです。

 

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