無料ブログはココログ

« 2017年9月 | トップページ | 2017年11月 »

2017年10月

2017年10月21日 (土)

NmraDCCライブラリ

NmraDCCライブラリ2016

  DSturnout decoderのステイショナリロコデコーダ改造で気が付いたのですが、mrrwa.orgのDCCライブラリ2016年版からinit()関数でCV29に書き込むパラメータが変更されています。init()関数呼び出しのパラメータでCV29の値を決めたい趣旨は理解できますが、一番よく使うDcc.init(MAN_ID_DIY, 100, FLAGS_MY_ADDRESS_ONLY, 0); で困った事が起きます。
NmraDcc.cppのinit()

void NmraDcc::init( uint8_t ManufacturerId, uint8_t VersionId, uint8_t Flags, uint8_t OpsModeAddressBaseCV )
{
  ...
  writeCV( CV_29_CONFIG, ( readCV( CV_29_CONFIG ) & ~cv29Mask ) | Flags ) ;

NmraDcc.hの定義

#define FLAGS_MY_ADDRESS_ONLY  0x01

で、FlagsパラメータにFLAGS_MY_ADDRESS_ONLYを渡すとCV29のビット0が常に1、すなわちDirection反転で進行方向と反対のヘッドライトが点灯します。両運転台車両は少数派、重連モードで対処すりゃいいなど実害は少ないのでしょうが、問題である事に変わりありません。
FLAGS_DCC_ACCESSORY_DECODERは0x80。これが本来の目的なのでしょう。FLAGS_OUTPUT_ADDRESS_MODEの0x40はリザーブドなので、こちらもCV29には書き込まない方が無難かと思いますが、2015版以前でも0x40は書き込まれます。
  スケッチをDirectionビットに対応すると進行方向が一致しなくて悩みましたが、CV29の書き込みを2015版以前に戻して解決しました。

  writeCV( CV_29_CONFIG, ( readCV( CV_29_CONFIG ) & ~cv29Mask ) | cv29Mask ) ;

2017年10月19日 (木)

ステイショナリロコデコーダ

DSturnout decoder

  DesktopStationさんのターンアウトデコーダをステイショナリデコーダに改造しました。『ポイントデコーダはステイショナリでしょ』と言われそうですが意味合いが違います。モータデコーダをステイショナリに使用する例で、DCCからPWMをアナログトラックに供給して、ロクハンのC11「大樹」の走行が目的です。
  改造と言ってもスケッチを書き変えただけです。書き込むスケッチはSD5_MotorR1.zipを使いました。DCCラインの不具合を処理した2016版のNMRAライブラリがアーカイブされていますが、コールバック関数が2014版のままなので、2015版以降に合わせて2つの関数を変更しました。

1. extern void notifyDccSpeed( uint16_t Addr, uint8_t Speed, uint8_t ForwardDir, uint8_t MaxSpeed )
-> extern void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
2. extern void notifyDccFunc( uint16_t Addr, FN_GROUP FuncGrp, uint8_t FuncState)
-> extern void notifyDccFunc( uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)

モータードライバー

  ターンアウトデコーダにはALLERGO社のA4953が使われていますが、出力が ON - Free PWM駆動なので、リニアなモーター制御が出来ません。モータの逆起電力を吸収させるため ON - Break PWMで駆動するように motor_ctrl.cppを変更しました。

#ifdefALLEGRO
  analogWrite(MOTOR_PWM_B, 255);
  analogWrite(MOTOR_PWM_A, 255 - 250);
#else
  analogWrite(MOTOR_PWM_B, 0);
  analogWrite(MOTOR_PWM_A, 250);
#endif

Img_1565

  モータ駆動のPWMポートはD3とD11で、OUT2に繋がっています。D5,D6のOUT1も使用可能にして2台分のモータデコーダにすれば、アナログトラックを複線化して2列車の同時運行も可能になるでしょう。

2017年10月13日 (金)

7セグLEDドライバーのテスト

7SEG LEDドライバーIC

  電気屋の毎日のyaasanさんが 7SEG I2Cモジュールをミント缶DCCコントローラに使う事を提案されてます。http://powerele.sblo.jp/article/180453571.html
aitendoでTM1637Dチップを仕入れたので実験してみました。20ピンDIPで100円でした。Arduinoライブラリ"DigitalTube.zip"はキースキャンが出来ませんが、Arduino Forumにchmroさんのコードがアップされていましたので拝借しました。 https://forum.arduino.cc/index.php?topic=360318.0
TubeTab[]はDigitalTubeのデータに戻しました。またDigitalTubeをライブラリに登録したので、エラーが出ない様にクラス名をTM1637keyに書き変えました。 テストしたスケッチはDigitalTubeに付属するNumberFlow.inoで、0からFまでdisplay()で桁を移動しながら連続表示します。
ユーザズマニュアルで指定されている、CLKとDIOピンの10Kohmと100pは手抜きして取り付けていませんが、取り敢えず表示出来ました。

3桁7セグと1個のキーで実験

Img_1557

  display()関数は、桁を指定しないで表示データ配列のみを渡すと、複数の桁を一気に表示する様です。
キースキャンはSG1からSG8の8ビットをK1とK2で切り替えて、16個のキーを取得します。
uint8_t keypressed = tm1637key.keyscan();
スキャンデータは何も押さなければ255、K1-SEG1間に接続したスイッチを押すと247でビット3がオンです。おや、ユーザズマニュアルと一致しませんね。2バイトデータを1バイトにエンコードしているからでしょう。

2017年10月 8日 (日)

店頭でALTOISミント缶を発見

中身より人気のミント缶

   上野でアルトイズのミント缶を見つけました。 御徒町駅からアメ横ウェルカムモールに入り、少し先の輸入菓子店です。
ペパーミントは残念ながら訳有りで3個セット売り。中身はともかく、缶が空いてからは、電子回路のケース、水彩パレット、小物入れ、サバイバルキットなど、ミント缶DCCコントローラファンに限らず、Arduino UNO、BeagleBone Blackにも使えて用途は沢山。激安のケースです。

Image1

新しく設計する時は、ペパーミント色の基板も作ってみたいです。

2017年10月 5日 (木)

フォトセンサー入力式MP3プレイヤー

MP3デコーダV5にフォトセンサーを接続

Desktop StationのYaasanさんが、MP3デコーダをデジタル入力式MP3プレイヤーとして使う例を提案されています。
Yaasanさんの電気屋の毎日のブログ http://powerele.sblo.jp/archives/20170903-1.html
名古屋電鉄さんのHP http://www007.upp.so-net.ne.jp/nagoden/

デジタル入力のバリエーションとして、フォトセンサーで車輛を検出して、駅到着アナウンスを流すスケッチを作りました。

Mp3dec_di

  フォトLEDの電流制限抵抗はセンサー側に実装して、センサー入力はデコーダの入力ピンをプルアップ設定しました。内部プルアップは数10Kohm程度で、少し感度は落ちます。
  車輌の進行方向は、2個のフォトセンサーを使うべきところ、手抜きしてDCC速度信号の受信イベント notifyDccSpeed()から取得しました。

スケッチの要点

1. アドレスマスク無しのファンクションデコーダ設定
  //Dcc.init( MAN_ID_NUMBER, MAN_VER_NUMBER,   FLAGS_MY_ADDRESS_ONLY , 0 );
  Dcc.init( MAN_ID_NUMBER, MAN_VER_NUMBER, FLAGS_OUTPUT_ADDRESS_MODE, 0 );
  任意のアドレスの進行方向を取得する為です。2列車同時走行は禁止です。

2. フォトセンサー検出アルゴリズムを実装
  Fujigaya2さん作 S88_Control_K6スケッチのdetect_analog();を1CH分にして使いました。
  http://seesaawiki.jp/fujigaya2/d/S88%20Detector
  スケッチで使われている動作確認用のRUN_LEDをMP3Decに実装しました。

3. フォトセンサーオンならMP3を再生します。

  if(gbIRon)
  {
    if(gPwmDir > 0)
    {
      PlayMP3_Simple(3);  // 上り到着アナウンス
    }
    else
    {
      PlayMP3_Simple(4);  // 下り到着アナウンス
    }
  }

4. 出発アナウンスは手動ファンクションで再生
  アドレスマスク無しなので、ファンクション受信イベント関数にマイアドレスチェックを追加。

extern void notifyDccFunc(...
{
  if(Addr == gCV1_SAddr)
  {
    ...
  }
}

走行テスト

Circle_run

2017年10月 1日 (日)

鉄コレ12m級小型電車Aをサウンド化

SmileDecoderR6n

  サウンドデコーダ製作のエキスパートなごでんさんの、擬似走行音を出す車載デコーダ"SmileDecoderR6n"は改良の為リリースが少し延期されました。待ち焦がれている方も多いと思いますが、DCC電子工作連合の特権を使って、R6nのES版を動作確認目的で組み込んでみました。
SmileDecoderR6nについてはこちら。
  http://www007.upp.so-net.ne.jp/nagoden/

鉄コレ12m級小型電車A

  中古で見つけた12m級小型電車Aを暫く放置していましたが、急遽TM-03動力ユニットを仕入れてDCC化にチャレンジです。へのへのもへじのおもちゃ箱さん
  https://blogs.yahoo.co.jp/henohenomoheji707/14037163.html
の記事で『窓ガラスを外すと何とかなる』を真似たら入りました。
動力ユニットはDCモードの動作確認をするまでも無くいきなり分解です。

Image1

集電板とモータを結ぶ電極を撤去すれば、デコーダの組み込みは簡単そうです。

リード線引き出しとデコーダを縮小

  集電板とモータに直接リード線をハンダ付けしました。デコーダ側は2mmピッチのコネクタを使います。 デコーダはスマイルコネクタが、斜めに傾いているモータのお尻に接触するので、エッジ部をカットしました。

Image2

  後でもスケッチを書き込む為に、aitendoで見つけた0.68mm径のP50B1(アイテンドーでの名称はテストプローブですhttp://www.aitendo.com/product/9822)をユニバーサル基板に立てて、スマイルコネクタの内側に並んでいるスルーホールに当てます。

Image3

クランプ機構を作る予定でしたがうまく行かず、厚紙で作ったスペーサを挟んで上から押さえつけました。妄想中のSmileSlim841は基板の幅が異なるので、クランプでは無く押さえ機構を考えたいです。

デコーダ組み込み

  DIYキューブは高さを縮小。トマランコンデンサはスペースが足りない様なので、10MFの電解直付けです。

Image4 Image5

感想

  なんとか収まりました。サウンド選択の初期値は、小型電車Aに相応しい吊掛け音ですが、面白いのでCV47を書き変えてドレミファインバータに変更しました。サウンドスケッチは既にMPUパワーの限界に達していて、DCCパケット精度の影響かサウンドが停止する事があります。サウンドトラックスのDSXデコーダと共通の課題となる予感がします。

« 2017年9月 | トップページ | 2017年11月 »