So-net無料ブログ作成

Kato SoundBoxをArduinoで操作する。その6 [SoundBox]

 多分、このシリーズこれで最後です。
 スケッチの中身の説明ですが、大きな部分はYaasan様のDSshieldを流用していますので、その部分については割愛します。
 SoundBox関連だけの話をすると、
 一番簡単なスケッチとしては、

#include <SoftwareSerial.h>
SoftwareSerial mySerial(A0, A1); // RX, TX

void setup() {
// ソフトウェアシリアルの初期化
mySerial.begin(38400);
mySerial.setTimeout(300);

delay(1000);
// 警笛鳴らす
mySerial.print("\n0101800001000180:"); //警笛鳴らす
delay(500);
mySerial.print("\n0101800001000081:"); //警笛消す

}

void loop() {
}

こんな感じです。繋ぎは、その4の通りで、スケッチを動かすと、警笛を0.5秒鳴らします。
ボリュームとかはそれなりに大きくしておいてください。

スピードとかは値によって、パリティが変わりますので、シリアルの直書きが面倒なため、
その4のスケッチでは、
sc_function.cppに命令をまとめています。モーター関連は動作させる前か動作させながらかでSTART,SYNCを合わせてください。

使い方ですが、

#include "sc_function.h"
とインクルードしておきます。

Setupでは
void sc_init_serial()
を呼び出し、ソフトウェアシリアルを初期化します。

あとは、loopなどで、好きなように命令を送るだけです。

boolean sc_SetLocoDirection(word address, unsigned char inDirection)
は方向を変える命令です。
address は49155を入れてください。(DCCの3です)
inDirectionは1、2のどちらかです。

boolean sc_SetLocoSpeedEx(word address, int inSpeed, int inProtcol)
はスピードを変える命令です。
address は49155を入れてください。(DCCの3です)
inSpeedは0~1023の1024段階です。
inProtcolは0を入れておいてください。(使ってないです。たぶん)

bool sc_SetLocoFunction(word address, unsigned char inFunction, unsigned char inPower)
は音を鳴らす命令です。
address は49155を入れてください。(DCCの3です)
inFunctionは1~6がボタンと対応しており、7、8は警笛の変わり種として登録しています。
inPowerは0:off,1:onです。

Start,Syncの命令は作っていません。

各命令は内部的に
String run_order(String order)
関数を呼んでいます。
この関数はorderにSmartControllerから出す命令を書くと、
前に[LF]を、後ろにパリティと「:」をつけて命令を送信し、SoundBoxからの受信文字列を返します。
ただ、受信文字列にどんな意味があるのかよくわからないので、現状、返り値は捨てていたりしますが・・・。

 あとは、アイドルパケットみたいなものを出すかどうか?です。(出さなくてもよさそうでしたが)
 それと、SmartControllerとSoundBoxとの通信では初期に13行ぐらいの初期化通信がありましたが、やらなくても動きました。ただし、SoundBox側でボリュームとか合わせる必要があります。

 説明は以上です。
 そのうち、DCCデコーダーにsc_functionを組み込んで、DCCで音の出る据え置き型コントローラを操作できるようにしようと考えています。コントローラだけで2万円しますけどね。

コメント(0) 

Kato SoundBoxをArduinoで操作する。その5 [SoundBox]

 やっと、ここで、Arduinoが出てきます。前置き(というかまあそっちがメインですし)が長かったですが。
 SmartControlerの代わりにArduinoNanoで制御します。ArduinoNanoはPCのArduinoIDEのCOMモニタから動かそうと思いましたが、高機能にしないと、いろいろ面倒くさい気がしてきて、結局PC側はDesktopStationとして、そこからDCCアドレスの3番の時だけ反応するようにしました。使っているポートはArudinoUnoでもありますので、そっちでも使えると思います。
 SoundBoxとの通信はどうやら3.3Vですが、私の持っているArduinoNano(互換チップ)は5Vです。ということで、Txは適当に分圧して、3Vあたりが出るようにしました。一応、サウンドボックスからの受取用にRxも繋ごうと思って、結局、こんな図面をブレッドボードで組んでいます。
SmartControllerControl.png

 写真にするとこうです。
re_DSC02496.jpg

 で、ステレオミニジャック部分の波形はこうなりました。まあ、3.3V超えていないし、送受信も問題なしいいかなあというところです。(マネして、壊しても私は知りませんが)
 通信の途中までは信号がGNDまで落ちていません。ここまでがArduinoNanoからの送信で、GNDまでほぼ落ち切っている真ん中から右側がSoundBoxからの受信です。
Arduinoソフトウェアシリアル信号.png

 で、ソフトですが、DesktopStaionにつながるものはこちらです。 SoundBoxとのコントロールはSoftwareSerialを使用しているので、コンパイルにはライブラリを追加する必要があるかもです(私は大丈夫でした)。Functionはボタンの①~⑥をFn0~Fn5に割り当てています。そして、警笛の変わりだねをFn6,Fn7に割り当てています。
 良く知らなかったのですが、SounBoxに12VのACアダプタを挿して通信を使うことで、SoundBox単体で音も出るし、モーターも制御できるコントローラになります。ただし、基本BEMFでの制御のため、どうも、使いづらいです。モーター付けて回らないと、走行音が出ないとか、止まらないとドア開閉できないけど、なかなかモーターが止まらないとか。音源として利用するなら、スピード命令に追従するような、モーターチックなローパスフィルタが付ければよさそうですが、さっぱり見当が付きません。誰か作っていないかしら?
 で、せっかくなので、とても久しぶりの動画です。
 蒸気機関車の場合


 京急2100形の場合
 
 
 蒸気機関車で遊んでみて思ったことは、割とMp3V5のSLバージョンってイケてるかもと思ったことです。
 その6に続きます。(スケッチの中身で必要そうなところを説明します)



コメント(5) 

Kato SoundBoxをArduinoで操作する。その4 [SoundBox]

 さて、次は多分一番重要な命令の解析です。
 スマホからタップして、その時の命令をUSBシリアルコンバータで見ていくだけです。
 まずはファンクション系です。押すときにOn,離すときにOffします。なので、SoundBoxで2回押すと音が変わるものドアの開閉音とかはこれだと、On,Off,OnOffとする必要があります。また、警笛、汽笛の変更はSoundBopxでは①、②の同時押しして選択とかのようですが、こちらは「0101840X」(Xの部分に0,1,2を入れる)の変更で行けるようです。

警笛、汽笛1
0101840084: 0101840185.  →切り替え
0101800001000180: 0101800181. →On
0101800001000081: 0101800181. →Off

警笛、汽笛2
0101840185: 0101840185. →切り替え
0101800001000180: 0101800181. →On
0101800001000081: 0101800181. →Off

汽笛3(京急は無い)
0101840286: 0101840185. →切り替え
0101800001000180: 0101800181. →On
0101800001000081: 0101800181. →Off

ドア、排水
0101800002000280: 0101800181. →On
0101800002000082: 0101800181. →Off

制動
0101800004000480: 0101800181. →On
0101800004000084: 0101800181. →Off

C-ATS、注水
0101800008000880: 0101800181. →On
0101800008000088: 0101800181. →Off

惰行、絶気
0101800010001080: 0101800181. →On
0101800010000090: 0101800181. →Off

ブザー、投炭
0101800020002080: 0101800181. →On
01018000200000A0: 0101800181. →Off

 次に方向転換とストップですが、
←方向
01018101000080: 0101810180.

→方向
01018101000181: 0101810180.

ストップ
01018102000083: 0101810180.

 次に、スピード、ボリューム、Start、Syncですが、

スピード
010181020FFF73: 0101810180. →max 100%
010181020CF17E: 0101810180. →80%
0101810209A72D: 0101810180. →60%
010181020678FD: 0101810180. →40%
010181020352D2: 0101810180. →20%
01018102000083: 0101810180. →min 0%
なので、「010181020」が命令、0%~100%で0x000~0xFFFと4096段階のようです。

ボリューム
010380FF7D: 0103800183. →max 100%
0103800082: 0103800183. →min 0%
なので、「010380」が命令、0%~100%で0x00~0xFFと256段階のようです。

START
0101810307FF7A: 0101810180. →max 100%
01018103000082: 0101810180.  →Min 0%
なので、「010181030」が命令、0%~100%で0x00~0x7FFと2048段階のようです。

SYNC
010181050CE46C: 0101810180. →max 100%
01018105000084: 0101810180. →min 0%
なので、「010181050」が命令、0%~100%で0x00~0xCE4と3300段階?のようです。(合ってるかなこれ?)

あとはアイドル時のパケットかしら?(送らなくても問題ないような気もした)
01040005: 0104000104.
01050307: 0105030007.
が続く・・・。

 まだまだ、続きますが、
結局、送受信の[LF](SmartControllerからの命令): (SoundBoxからの応答).のうち、
[LF](SmartControllerからの命令):を送ってしまえば、サウンドボックスは動いていました。
それで正しいのかどうかは知りませんが。
 その5に続く。

コメント(0) 

Kato SoundBoxをArduinoで操作する。その3 [SoundBox]

 とりあえず。信号がモニタ出来るようになったので、どんな信号が出ているか確認です。
 スマイラー様からお借りしたSoundBoxには本体添付の蒸気機関車と、別売りの京急2100形がありました。まずは京急2100形で信号の確認です。
 まず、SmartControllerがスマホにつながっていないときは、SoundBoxと以下の通信をしていました。
01000001: 0100000000000001.
01000001: 0100000000000001.
01000001: 0100000000000001.
01000001: 0100000000000001.
01000001: 0100000000000001.

 そして、SmartControllerがスマホにつながると、SoundBoxと以下の初期通信をしていました。
0101010203: 010101000001.
0101010100: 010101000001.
0101010302: 010101000001.
01030002: 0103000002.
0101010504: 010101000001.
0107800B8D: 0107800187.
0101010203: 010101000001.
0101010100: 010101000001.
0101010302: 010101000001.
01030002: 0103000002.
0101010504: 010101000001.
0107800B8D: 0107800187.
01040005: 0104000104.
01010303: 0101030201.
01010404: 0101040004.
01010606: 010106204B61746F20415342204B65694B7975204A6170616E65736520436F6D6D7574657220547261696E20536F756E642056312E32200022.

そして、そのあとは、アイドルパケットの送信みたいな感じで以下のリピートが続いていました。
01050307: 0105030007.
01040005: 0104000104.
01050307: 0105030007.
01040005: 0104000104.
01050307: 0105030007.
01040005: 0104000104.
01050307: 0105030007.

これが蒸気機関車の場合は、初期通信は以下です。
0101010203: 010101000001.
0101010100: 010101000001.
0101010302: 010101000001.
01030002: 0103000002.
0101010504: 010101000001.
0107800B8D: 0107800187.
0101010203: 010101000001.
0101010100: 010101000001.
0101010302: 010101000001.
01030002: 0103000002.
0101010504: 010101000001.
0107800B8D: 0107800187.
01040005: 0104000104.
01010303: 0101030300.
01010404: 0101040004.
01010606: 010106204B61746F20415342204A6170616E65736520537465616D2044353120536F756E642056312E32200076.

 命令はその2でも書きましたが、
[LF](SmartControllerからの命令): (SoundBoxからの応答).
となっております。
 また命令の中身ですが、例えば
0107800B8D: 0107800187.
のなかで、まず、SmartControllerからの命令は、分かりやすく書くと、
01 07 80 0B 8D
ですが、最後の8Dはパリティでパリティの計算は前から順にbitのXORを取っていくやり方です。
 具体的には、
①01^07 = 06
②06^80 = 86
③86^0B = 8D なので、パリティが8D
なので、命令は[LF]の後の0107800B、でパリティが8D、最後の「:」は通信の終端文字。
戻りは01078001でパリティが87、最後の「.」は通信の終端文字。のようです。
COMのモニタで見ると、「:」とSoundBoxからの受信の間にスペース(0x20)がありますが、
これは送受信の切り替え時間のタイミングに相当するように見えます。

 さて、構造もなんとなくわかったので、次は初期化ルーチンで何が行われているかですが、マニュアルないし、わかりません。なんか、レジスタをそのまま叩いているようにも見えますし、変な命令を書いて、動かなくなったら嫌なので、そういう実験もできませんし。(自分のじゃないし。自分のでも嫌だけど。壊れたら、「すいません。普通に使ってたら突然動かなくなっちゃって・・・。」と言いながら、ホビセンに持っていけばいいんだろうか・・・。」それは嘘つきだよな。たぶん。)
 SmartContorollerはファンクションやスピード以外に、ボリューム値やStart値、Sync値をいじれるのと、毎回、0にリセットされているようにも見えるので、SoundBoxに対して、そこら辺の全ての初期化をしているんじゃないのかなあと推測します。あとはスマホから、今、何のカードが刺さっているのかわかりますが、そうすると、それっぽい情報が流れているんだろうなあと思いながら見てみたら、それっぽい部分はわかりました。
 それは、「01010606:」の部分で、SoundBoxからの返り値は京急2100形は
0101 0620 4B61 746F 2041 5342 204B 6569 4B79 7520 4A61 7061 6E65 7365 2043 6F6D 6D75 7465 7220 5472 6169 6E20 536F 756E 6420 5631 2E32 2000 22.
最初の「0101 0620」辺りは命令を復唱しているだけっぽいですが、その後のByteをAsciiコードに直すと、
Kato ASB KeiKyu Japanese Commuter Train Sound V1.2 と読めます。
ASBってなに?って思って調べたら、SoundBoxはアメリカのKatoでは ASB = analog sound boxと言っているようです。
 で、同様に蒸気機関車の同じ部分「0101 0620」を見てみると、
0101 0620 4B61 746F 2041 5342 204A 6170 616E 6573 6520 5374 6561 6D20 4435 3120 536F 756E 6420 5631 2E32 2000 76
で、
Kato ASB Japanese Steam D51 Sound V1.2 ですって。D51がベースのようです。

 あとは、見比べてなんとなくそうだろうなあと思ったのは、
京急2100形 01010303: 0101030201. →戻り値が2
蒸気機関車 01010303: 0101030300. →戻り値が3
1番ボタンの警笛が京急は2種類、蒸気機関車は3種類だったので、その値かなあと思いつつ、
ここら辺を調べるのは、やめておきます。
 次は各命令の解析をします。
 その4に続く。

コメント(0) 

Kato SoundBoxをArduinoで操作する。その2 [SoundBox]

 続きます。
 RS485ではうんともすんとも言いませんが、オシロで見ると、ちゃんと232Cのような信号が出ています。
 初期信号.png

 ここは基本に戻って、まずはスマートコントローラ単体にしてUSBシリアルに繋いで確認です。
 つなぐ場所は、下の写真のコネクタで、
re_DSC02497.jpg
 
 一番根本(GNDに繋ぐ)と一番先っぽ(RXに繋ぐ)です。これで、受信できるはずです。
 で、ArduinoIDEのCOMモニタでめでたく受信できました。
38400bpsで受信.png

 他のCOMモニタでも確認して、こんな信号が出ています。38400bpsで3.3V系です。
01000001:
02000002:
03000003:
04000004:
 あとでわかりますが、 [LF](命令) : という形式です。
 ということで、送り出しの命令はわかりましたので、送受信がどう行われているかを確認するために、SmartControllerとSoundBoxをつなぎます。
re_DSC02495.jpg

 かなりぐちゃぐちゃな写真ですが、SmartController→ブレッドボードでUSBシリアルのRXで受け→SoundBoxとミニプラグケーブルをつないでいます。
 そうしたら、下記のように、送受信が見えるようになりました。
送受信.png

 こんな信号が送受信されています。
01050307: 0105030007.
01040005: 0104000104.
01050307: 0105030007.
01040005: 0104000104.
01050307: 0105030007.
01040005: 0104000104.


 分かったのは後ですが、[LF](SmartControllerから送信): (SoundBoxから送信).となっています。
 あとは、SmartControllerからファンクションとかスピードとか動かしてやって、どんな信号が出ているか解析するだけです。多分。
 その3に続く。

コメント(0) 

Kato SoundBoxをArduinoで操作する。その1 [SoundBox]

 秋のDCCFestの時にスマイラー様に、「KatoのSoundBoxをDCCから操作して音はBluetoothで飛ばして、電車から音を出す。をしたいので、SoundBox貸してください。」と頼みましたら、快く貸してくださいました。で、Yaasan様に「DCCから制御したいので、前分解していたKatoのSmartController貸して下さい。」と頼んで、こちらも快く貸していただきました。ということで、タダで、Smart ControllerとSound Boxを入手したので(いや、借りてるだけですが)、早速、DCCから制御する前段階としてSmartControllerとSoundBoxの通信プロトコルの解析です。
re_DSC02494.jpg
 まずは、SmartControllerのおさらいです。Yaasan様の記事とゆうえん・こうじ様のコメントによると、二線式のよくある双方向通信じゃないか?とのことでした。で、通信波形もYaasan様の記事からなんか、普通の232Cチックです。
 風のうわさでRS285じゃないのか?という話も聞いたので、こっそり、AmazonでRS485通信ができるとかいうUSB接続のコンバーターを買ってみました。
 これで、実験環境は完璧です。で、SmartControllerとSoundBoxの間にRS485をつないで、PCでモニターしてみましたが、なんかデータが全くでない・・・。ということで、RS485コンバーターはお蔵入りです。
 その2へ続く・・・。

コメント(0)