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万円しますけどね。
スケッチの中身の説明ですが、大きな部分は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万円しますけどね。
2018-10-27 22:35
コメント(0)
コメント 0