バスコレDCCコラボ編
バスコレの動力はボタン電池で走行するので、直接DCCで制御する事は出来ませんが、前回のバスコレセンサー編の実験で、マグネットを使って停車させる事が出来ました。
そこで、列車が駅に停車したらバスも停車させる事にしました。
マグネットはサーボデコーダで移動させます(上写真サーボホーンの位置に注目してください)。yaasanさんのOEMServoDecoderスケッチを借用しました。列車の停車はフォトセンサーを2個使えば車速を検出できますが、面倒なのでサーボデコーダのスケッチをアドレスマスク無しのファンクションデコーダに変更して、DCCコントローラのスピードステップパケットを受信する事にしました。
CVPair FactoryDefaultCVs [] =
{
CV_MULTIFUNCTION_PRIMARY_ADDRESS, DECODER_ADDRESS},
CV_ACCESSORY_DECODER_ADDRESS_MSB, 0},
CV_29_CONFIG, 0b00000110},
...
};
void setup()
{
...
Dcc.init( MAN_ID_DIY, 10, FLAGS_OUTPUT_ADDRESS_MODE, 0 ); // ID, Ver, Flags, Ops)
...
}
フォトセンサーとサーボモータは、踏切アクチュエータ用に作ったスマイルエキスパンド基板に繋ぎました
//各種設定、宣言
...
#define PIN_SERVO2 12 // smile connector#1 /MISO
#define PIN_STOP 13 // smile connector#3 /SCL
注1:電流100mAのサーボモータを駆動すると、5Vレギュレータの損失(PD)は(12[v] - 5[v]) x 0.1[A] = 0.7Wです。エキスパンド基板ではPD1WのTA78M05を使って5Vにドロップしています。DCCで使うシリーズレギュレータは最大電流よりも最大許容損失が重要です。
DCC速度パケットでスピードステップを受信して、フォトセンサーがオンの時スピード0なら停車と判断します。excec_Function()は全LOCアドレスに反応するのでファンクション9に逃がしてますが、notifyDccFunc()でアドレスチェックすれば不用意にサーボが動き出すのを防ぐ事が出来ます。
//DCC速度信号の受信によるイベント
extern void notifyDccSpeed( uint16_t Addr, uint8_t Speed, uint8_t ForwardDir, uint8_t MaxSpeed )
{
gSpeedCmd = Speed;
...
}
void loop()
{
...
if( (millis() - gPreviousL6) >= 100)
{
int Stopstat = digitalRead(PIN_STOP);
if(Stopstat == HIGH && gSpeedCmd <= 1)
{
exec_function(9, 1);
}
else if(Stopstat == LOW && gSpeedCmd > 1)
{
exec_function(9, 0);
}
...
}
...
}
最近のコメント