2018年01月18日

DSシールドをPLCのようにする その2(挫折&方針変更)

DSシールドだけで、DCC/MMシールドの時のように、自分でArduinoで自動運転プログラミングできるようにするためのチャレンジです。

当初はインタプリターを実装しようと思ってましたが、かなり面倒で時間が掛かる割に、効果が薄いような気もするので、方針を変更して、パケット生成エンジンをタイマ割り込みで優先度を上げた上で、パケットを出していない隙間で、皆さんが自由に自動運転ソフトをかけるようにすることにしました。

□スケッチ

全然調整できていない、チャレンジャー向きです。

DSshieldAUTO_r0.zip

DSshieldAUTO_r0b.zip

□現在の状況(r0→r0b)

・とりあえず動くレベル、MP3デコーダ、ZIMOデコーダ以外では未チェック。たぶん、デコーダによってはうまく動かない可能性もある。→だいぶ調整したので、おおよそのデコーダで一応動くと思う。
31%→ 28%(9.1KB)ROM消費、35%→40%RAM消費。結構余っているので、そこそこのソフトは入れ込めるはず。
・CMD_WAITが狙ったとおり動かない。原因調査中。→Timer0のプリスケーラがおかしいようだが、何もしてないので何でこうなったか調べないといけない。とりあえず、1/4に係数をかけて無理矢理調整。delayなどの関数もこの影響で、妙に遅くなっているはず。
割り込み頻度の調整がまだ足りない。→おおよそ7ms程度、処理の余裕ができるように調整。

□使い方

一番最後の関数のuser_programのみを解放します。以下のように書かれています。
単純なシーケンスプログラムで、電源ON、ファンクション操作、終了(永久ループ)です。終了のwhile命令を入れないと、またuser_programは頭の行から動き始めます。


/*****************************************************************/
/* User Program Area */
/*****************************************************************/

void user_program(void)
{
SerialDS.println("Power On");
CMD_Power(1);

CMD_LocFunction(ADDR_DCC + 3, 0, 1);
CMD_LocFunction(ADDR_DCC + 3, 1, 1);
CMD_Wait(500);

SerialDS.println("Loc 3, Func 10, On");
CMD_LocFunction(ADDR_DCC + 3, 10, 1);

CMD_Wait(500);

SerialDS.println("Loc 3, Func 11, On");
CMD_LocFunction(ADDR_DCC + 3, 11, 1);

CMD_Wait(500);

SerialDS.println("Loc 3, Func 9, On");
CMD_LocFunction(ADDR_DCC + 3, 9, 1);

CMD_Wait(500);

SerialDS.println("End...");
/* 永久ループ(終了) */
while(1){}
}


ループをうまく使うことで、ボタン入力を待つ処理などができるわけです。もうちょっと安定化したら、サンプルをたくさん作っていきます。

□どんなことに使えるか

従来のDSシールドや、DSmainはPCが必須でしたが、パソコンなしで、電源があれば、DCC車両やDCCポイントがプログラミングしたとおりに、勝手に動くジオラマを作ったりできます。ボタンをたくさんつけて、DCCポイントのルート変更、なんていう処理もプログラミングできます。

Arduinoなので、自由度は無限大!・・・と言いたいところですが、パケット生成エンジンが裏で動いていて、これがかなり重たい処理なので、その隙間をぬって動かす必要があります。

なるべく、処理は分散して実装するという一工夫が必要なことをご了承ください。この辺のテクニックは、随時、公開していきます。
posted by yaasan at 22:45 | Comment(0) | 鉄道模型

DSbluebox 価格変更

DCC用のCV(設定値)書き換え治具であるDSblueboxを以下のように価格変更します。



キット品 10800円→9800円
完成品  15800円(現行のまま)

変更理由:
DSblueboxの普及促進のため。調達コストも以前より低減できたため(特に液晶など)。

変更日:
2018年1月18日付け
posted by yaasan at 08:44 | Comment(0) | 鉄道模型

2018年01月17日

スマイルコネクタ用のカードエッジコネクタ(中華)を買ってみた

モレックスの6pinカードエッジコネクタをスマイルデコーダ系では採用していますが、入手性が悪くなって価格が大幅に上がってしまったので、コンパチ品を探したところ、Aliexpressにちょうど6Pinのそっくりさんを見つけたので買ってみました。

50pcsで16USDでした。メーカーはWingTATというところのようですが、この商品については特にページはありませんでした。

SmileConn0.jpg

大きな違いは、モレックスのより幅が微妙に大きいのと、基板厚みがたぶんもっと薄く、○□のマークが無いところです。ピン間隔は2.54mmで、基板挿入のピッチも形状も同じでした。カードエッジの部分だけ仕様が微妙に違うというところですね。

SmileConn1.jpg

SmileConn2.jpg

MP3デコーダとワンコインデコーダを差し込んでみましたが、超堅い!!もしかして、基板の厚みが1.6mmではきついのでしょうか。家にあった0.8mm厚のトマラン基板を差し込んだら、あら不思議、ちょうど良いです・・・。

SmileConn3.jpg

SmileConn4.jpg
posted by yaasan at 20:51 | Comment(5) | 鉄道模型

Digikeijs DR-5000を剥いてみた

Nardiさんが、DigikeijsDR-5000の基板写真を提供してくださいました。Tear Downしてみました。

Digikeijs_DR5000_PCB_OMOTE.jpg

Digikeijs_DR5000_URA.jpg

基板だけ見てもさっぱりと思うので、どんな回路になっているかは、以下の通りです。本当にわかりやすいですね。結構シンプルです。

Digikeijs_DR5000_Parts.jpg

・ATXMEGA192A3U (FLASH 192KB+8KB BOOT ROM, SRAM 16KB, EEPROM 2KB)
・Freescale/NXP MC34931EK (DCブラシ付モータドライバ 5A/5-36V)
・中華Wifi-UARTモジュール(有線のEthernet、TCP/IPスタックも内蔵の模様)

DesktopStationで同じ物を、DSmainと同じ規模で作ったら、材料費で6000円程度、これに基板、実装費、ケース、ACアダプタが付くので、150ユーロ(18000円程度)なんて価格はとてもじゃないですが無理です。

DSmainとは明らかに回路コンセプトが違うというのはよく分かりました。ちょっと安心。

ブースタ周りで言えば、5A素子で、TB6643KQと変わらないです。マイコンがXMEGAということが、ちょっと以外でした。欧州の企業の方だと、STM32が多いので。電子工作上がりで来てる人なのかもしれません。

あとは、Wifiモジュールが中華の安価な物になってます。Wifiは常時動かすにはちょっとキツいでしょうね。中華のWifiは電源の供給も難しく、不安定なのが定番ですし。
posted by yaasan at 19:30 | Comment(0) | 鉄道模型

DSシールドをPLCのようにする その1

DSシールドは、DCC/MMシールドから部品を削除してシンプル化した簡略製品です。この部品削除の犠牲になったのが、「Arduinoで自分で自動運転ソフトを気軽に作る」です。

実は、工夫すると出来なくはないですが、非常にややこしい書き方が必要になります。一種のRTOSを模擬した時分割実行を自分で工夫して実装するか、優先度の低いタイマ割り込みを書くかしなければなりません。もう、この説明が意味不明、という方がほとんどだと思います。

ということで、1〜2週間掛けて、この辺のPCなしで自動運転ソフトを実現するためのDSシールドの仕組みを作っていこうと思ってます。まあ、いわゆるPLC的な動きを実現しようという作戦です。

ただし、ArduinoのROMは、ブートローダ以外から書込不可なので、これから新規に開発するローダーソフトはArduino用のスケッチを自動生成する形にして、それをArduinoIDEで書き込むことを念頭に置きます。デバッグなどは、ローダーソフトでも出来るようにしたいと思います。

□ROM,RAM空き容量

素のDSシールドスケッチ(PC接続を基本)で、RAMは残り922バイト、ROMは15KBです。EEPROMは使っていないので、1KBはまるまる使えます。

今考えている4バイトコード実行エンジンだと、15+1KB=16KB、16KB/4B=4000命令分、保持できる形となります。

□余っているポート

D6,D7,D8,D11,D12, A2,A3
(I2Cを使わない場合)A4,A5

単純にGNDと接触させるタクトスイッチでよければ、サクッと7個のボタンが増やせることになります。
I2Cを使うと、拡張出来ると思いますし、S88をデジタル入力ポートとして使うテクニックもあるとは思います。

S88、デジタル入力あたりもサポートしようと思ってます。

□基本命令

以下の様なものを考え中。Windowsのローダーソフト(未開発)で簡単に作れるようにするつもり。仕様は公開するので、ローダーソフトは誰でも作っても良いようにする。

LOC_SPEED
LOC_DIR
LOC_FUNC
TURNOUT
WAIT
WAITIF
JUMP
JUMPIF
END
メモリ(フラグ)操作系
演算系
ポート操作(DO)

□命令リストの実行条件設定項目

・定周期時間
・S88変化
・DIポート変化
・メモリ操作
・他の車両操作変化
・起動時(イニシャル)

□実行スピード

・0.1秒周期
・最大10命令を同時実行
・S88は0.5秒おき取得で固定
posted by yaasan at 08:35 | Comment(0) | 鉄道模型