無料ブログはココログ

2019年2月10日 (日)

老眼の味方

1.3インチOLED

  ミント缶IVのOLEDを1.3インチ化するご要望を頂いていますが、基板に固定出来ないので自己責任でお願いしています。実例が必要かと思い、秋月電子のポリカーボネートケース117-中[P-00358]に入れたミント缶IVで1.3インチOLEDを固定してみました。
  部品の高さを調整して上蓋付きのケースに入れるため、10mm六角ポストにスペーサを追加して、高さを11mmにして基板を上蓋に固定しました。OLEDは7ピソケットを秋月電子のロープロファイル型[C-00173]に交換して、11mmの隙間に納めます。220uFの電解コンデンサも横に寝かせています。

Lowprofile

mintcan r1.30 スケッチ

  ミント缶IV-R1.3でスケッチの変更を機会にOLEDのサイズを切り替える機能を追加しました。SELボタンを押しながら電源スイッチを入れる度に0.96インチと1.3インチを交互に切り替えます。

0led096

0.96インチモードのままでは画面全体が左に移動しています。

0led13

1.3インチモードに切り替えると正常に表示します。

2019年2月 6日 (水)

ミント缶Ⅳ-R1.3

5Vレギュレータを変更

  TA78M05Fが生産終了で暫く休眠していたミント缶Ⅳですが、TA48M05F(SQ)に変更してR1.3として頒布を再開します。2.5V、3Vの低電圧をシリーズに加える事が78M終了の理由と思われます。データーシートと0.1uF、47uFのセットで販売されています。部品価格が上昇したのでキット頒布価格を100円アップして4,200円に変更します。

I00451

Cout(C3)に33uF以上が指定されている為、実装に注意が必要です。在庫基板が完売するまでの暫定処置です。

Ta48m05

スケッチを変更

 

ミント缶ⅣでI2C通信でご紹介したIIC接続機能を組み込むと、フラッシュエリアが不足するのでスケッチをダイエットします。メモリ節約と共に不評の操作方法も変更しました。
1. OLEDフォントから小文字を削除してメモリを節約
2. 老眼の味方1.3インチOLEDモードを追加
  (固定が出来ませんのでOLEDの入手と装換は自己責任でお願いします)
3. 画面切り替えが分かり難いと不評なのでアクセサリデコーダはルート操作のみとした
4. 256以上のアクセサリアドレス書き込みモードを追加
5. 進行方向表示をアイコンから"FWR"、"REV"に変更
6. 在庫基板が未対応のため、暫定的にスケッチのみ先行でスロットルモードを実装
  (ミント缶Ⅳ専用IICコマンドに対応したテンキーの自作などにご利用ください。IIC接続用のコネクタ[MJ-4PP-9 C-06070]は付属しません。)

ファンクション操作画面

Function

ルート操作画面

Route

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月 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

2018年10月18日 (木)

Smile Motor Decoder

超小型DIYデコーダその後

  DCC館さんの超小型なSmileMotorDecoder(Crezy版)基板ですが、フットプリントが変更されて少し作り易くなりました。難関は0.65mmピッチのダイオードスタックDS1です。全体的に作り易くなった気分で気楽にハンダしていたら、DS1の真ん中のピンがハンダ不良で動きませんでした。そこで流しハンダから作戦を変更して、予め真ん中のピンにハンダを盛って固定してみました。しっかりハンダが流れている事を確認したら外側の4ピンにハンダを流します。

Ds1

  モータドライバーのMP6513は0.95ピッチなので気が楽です。スマイルデコーダなのでスケッチも自由に作り変えて好みのデコーダにする事が出来ます。目下、DCCFest2018で失敗した統括制御モードに再挑戦しています。

スケッチ書き込み

  無事ハンダ付けが完了したので、スマイラーさんのSmileWriter-COMBO(A)でスケッチを書き込みました。"HeatBeat"と"Program"のLEDが賑やかに点灯して動作状況が分かり易いです。

Smilewritercomboa

ロクハンに組み込む

  テールライトを折ってしまい、DCCFestではDCC化2輌だけで運転していた103系ですが、月末の文化展に展示するので気を取り直して残り2輌もDCC化しました。A059が足りないのでAタイプモードでカットした残りを集めて室内灯にしました。写真を撮らずに組み込んでしまい、また写真では分かり難いので図にしました。2個直列にしたブロックを並列接続して12Vで点灯します。

A059_led

SmileMotorDecoder(Crezy)のスケッチはモータードライバーをF1に割り当てて室内灯モードにしています。輝度調整をCV35に割り当ててOPS書き込みで走行しながら輝度を調整します。眩しいのは嫌なので輝度を落としていますが、LEDが等間隔では無いのでムラが出ます。品の良い室内を演出するには6灯は必要な様です。

103kei

«ワンコインデコーダ互換のデコーダ