無料ブログはココログ

« Smile Motor Decoder | トップページ | スマイルデコーダのスケッチを改変 »

2018年11月 6日 (火)

ミント缶Ⅳ用のミント缶Ⅳ

ミント缶ⅣでI2C通信

  私の暮す自治会主催の展示で大勢のキッズ達が遊びに来てくれましたが、DCCコントローラの取り合い、車輛の奪い合いで大混乱。一人一台のスロットルの必要性を痛感しました。私は一人引き籠りで遊んでますので、複数の動力車でもDCCコントローラ1台で運転する方が操作性が良いと思っていましたが、次回展示の必要性に迫られてミント缶Ⅳ2台のI2C通信の実験を開始しました。

ミント缶Ⅳスロットル

  スロットルはI2Cマスターとして、速度調節とファンクション操作をミント缶Ⅳへ送信します。12V系のDCC回路は実装せず、DSCoreの実行をWire.writeに置き換えます。ミント缶Ⅳ側のオーバーヘッドを最小にする為、コマンド体系を最近検討を始めたNMRA TI-9.2.3で定義されているSUSI-I/Fを参考にして4バイトに制限しました。

byte aIICText[4];

aIICData[0] = gLocAddress % 256;
aIICData[1] = gLocAddress / 256;
aIICData[2] = 0b01100000 | gFunc1; // SUSIのFnコマンドにファンクション番号を追加
aIICData[3] = gLocFunc1;

Wire.write(aIICData, 4);
Wire.beginTransmission(8);
Wire.endTransmission();

ミント缶ⅣスケッチにI2Cコードを追加

  ミント缶Ⅳのスケッチサイズが限界に近いので、CV書き込み機能を削除して容量を確保し、I2Cスレーブでスロットルからの指令を受け取るコードを追加しました。CV書き込みはOPSモードで実行出来るので、CV読み出し機能が無いミント缶では書き込み専用トラックによるCV書き込みは不要と判断しました。

#include <Wire.h>

byte gIICData[4];

void setup()
{
  ...
  Wire.begin(8);
  Wire.onReceive(IICRead);
  ...
}

void IICRead()
{
  gIICrecv = Wire.available();
  pinMode(A3, OUTPUT);
  digitalWrite(A3, HIGH);
  for(int n=0; n<gIICrecv; n++)
  {
    gIICData[n] = (byte)Wire.read();
  }
  pinMode(A3, OUTPUT);
  digitalWrite(A3, LOW);
}

digitalWrite(A3...はI2C受信割り込みを計測する為のトリガーです。

Mint_multi_packet

I2C受信によるDCCパケット停止期間は1ms弱でした。

実際に操作してみた

  ロクハンの103系で先頭車アドレス103をスロットルに、動力車アドレス102をミント缶本体で選択して、無事室内灯が点灯しました。動力車の走行も問題無しですが、暫くテストを繰り返してI2C通信のオーバーヘッドによる影響を確認したいと思います。

Mint_multi

« Smile Motor Decoder | トップページ | スマイルデコーダのスケッチを改変 »

コントローラ」カテゴリの記事

コメント

3台以上の、マルチマスターの確認も是非お願いいたします。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: ミント缶Ⅳ用のミント缶Ⅳ:

« Smile Motor Decoder | トップページ | スマイルデコーダのスケッチを改変 »