dsshieldauto
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
dsshieldauto [2018/01/21 09:37] – [タクトスイッチによるルート切り替え] yaasan | dsshieldauto [2018/01/24 20:53] – [タクトスイッチによるルート切り替え] yaasan | ||
---|---|---|---|
行 1: | 行 1: | ||
====== DSshieldAUTO ====== | ====== DSshieldAUTO ====== | ||
- | DSshieldAUTOは、[[dsshield]]とArduinoUNOだけで、パソコンなしに小規模な自動運転を実現するためのソフトウェアソリューションです。 | + | DSshieldAUTO(AUTOスケッチ)は、[[dsshield]]とArduinoUNOだけで、パソコンなしに小規模な自動運転を実現するためのソフトウェアソリューションです。\\ |
- | 小さいジオラマの車両やギミックをDCCで自動制御して、手を離しながら模型やジオラマをお楽しみいただける仕組みを提供しています。 | + | 小さいジオラマの車両やギミックを小さなArduinoUNO+[[dsshield]]によるコマンドステーションで、DCCの自動制御ができます。手を離しながら模型やジオラマをお楽しみいただける仕組みを提供しています。ボリュームの入力でスピードを変えたり、ボタンで動き方を変えたり、いろいろな演出が出来ます。 |
+ | |||
+ | ===== AUTOスケッチでできること ===== | ||
+ | |||
+ | * パソコンなしで、DCC車両やポイントを気軽に動かせます。(最初のプログラミングするときだけ、パソコンを使用します)。ボタンやセンサーに応じて、車両やポイントを動かすことも出来ます。ArduinUNOにACアダプタをつなげるだけ。 | ||
+ | * DSシールドだけで完結。小規模な用途にも、数万円の高価なコマンドステーションは不要。 | ||
+ | * メルクリン(Marklin Motorola, MM1, MM2)やDCCの車両・ポイントに対応 | ||
+ | * 教育向け、研修向け、自分の技術向上、ジオラマのギミックのパワーアップなどに使用できます。 | ||
+ | |||
+ | |||
+ | ===== AUTOスケッチでできないこと ===== | ||
+ | |||
+ | * 複雑な制御。並列で何個も複雑な条件で動く制御パターン。Arduinoで並列処理を書くのが難しいため。 | ||
+ | * 大電流を消費する環境。 | ||
+ | * 大きなレイアウト。 | ||
===== 必要な物 ===== | ===== 必要な物 ===== | ||
行 42: | 行 56: | ||
==== 全体の構成 ==== | ==== 全体の構成 ==== | ||
- | Arduinoのスケッチは、setup()とloop()で大きく構成されます。一方で、AUTOスケッチでは、user_init()とuser_program()の2つで構成されます。setup()とloop()は、DCC制御で使用しておりますので、user_の関数にプログラミングしていただきます。なお、user_initはsetupからコールされています。user_programはloopからコールされています。ほとんど同じように使用することが出来ます。 | + | Arduinoのスケッチは、setup()とloop()で大きく構成されます。一方で、AUTOスケッチでは、user_init()とuser_program()の2つで構成されます。\\ setup()とloop()は、DCC制御で使用しておりますので、user_の関数にプログラミングしていただきます。なお、user_initはsetupからコールされています。user_programはloopからコールされています。ほとんど同じように使用することが出来ます。 |
+ | {{:: | ||
==== 使用できるピン ==== | ==== 使用できるピン ==== | ||
行 202: | 行 217: | ||
Youtube動画: | Youtube動画: | ||
{{youtube> | {{youtube> | ||
+ | |||
+ | |||
+ | ==== メルクリン車両の単純往復シャトル運転 ==== | ||
+ | |||
+ | |||
+ | < | ||
+ | / | ||
+ | /* User Program Area */ | ||
+ | / | ||
+ | |||
+ | void user_init(void) | ||
+ | { | ||
+ | |||
+ | pinMode(8, INPUT); | ||
+ | pinMode(11, | ||
+ | pinMode(12, | ||
+ | |||
+ | digitalWrite(8, | ||
+ | digitalWrite(11, | ||
+ | digitalWrite(12, | ||
+ | |||
+ | //F0 Light ON | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 0, 1); | ||
+ | |||
+ | //SPEED 0 | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 0); | ||
+ | |||
+ | //POWER ON | ||
+ | CMD_Power(1); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | |||
+ | void user_program(void) | ||
+ | { | ||
+ | static byte sButtonState = 1; | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | if( digitalRead(8) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | sButtonState = 1; | ||
+ | CMD_Wait(100); | ||
+ | |||
+ | /* 前進 */ | ||
+ | //FWD | ||
+ | CMD_LocDirection(ADDR_MM2 + 2, 0); | ||
+ | |||
+ | //警笛 | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 1); | ||
+ | CMD_Wait(2000); | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 0); | ||
+ | |||
+ | // | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 100); | ||
+ | } | ||
+ | |||
+ | if( digitalRead(11) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | sButtonState = 2; | ||
+ | CMD_Wait(100); | ||
+ | // | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 100); | ||
+ | } | ||
+ | |||
+ | if( digitalRead(12) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | sButtonState = 3; | ||
+ | CMD_Wait(100); | ||
+ | } | ||
+ | |||
+ | /* S88のスキャン */ | ||
+ | CMD_ScanS88(); | ||
+ | |||
+ | |||
+ | if( CMD_GetS88(0) == 1) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 100); | ||
+ | CMD_Wait(500); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 75); | ||
+ | CMD_Wait(500); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 50); | ||
+ | CMD_Wait(500); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 25); | ||
+ | CMD_Wait(500); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 0); | ||
+ | CMD_Wait(1000); | ||
+ | |||
+ | //REV | ||
+ | CMD_LocDirection(ADDR_MM2 + 2, 1); | ||
+ | Serial.println(" | ||
+ | |||
+ | //警笛 | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 1); | ||
+ | CMD_Wait(2000); | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 0); | ||
+ | |||
+ | /* 加速 */ | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 25); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 50); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 75); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 100); | ||
+ | CMD_Wait(3000); | ||
+ | |||
+ | CMD_LocFunction(ADDR_MM2 + 2, 3, 1); | ||
+ | CMD_Wait(2000); | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 3, 0); | ||
+ | |||
+ | /* 減速 */ | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 75); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 50); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 25); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 0); | ||
+ | CMD_Wait(2000); | ||
+ | |||
+ | //FWD | ||
+ | CMD_LocDirection(ADDR_MM2 + 2, 0); | ||
+ | Serial.println(" | ||
+ | |||
+ | //Clear | ||
+ | CMD_ScanS88(); | ||
+ | |||
+ | //警笛 | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 1); | ||
+ | CMD_Wait(100); | ||
+ | CMD_LocFunction(ADDR_MM2 + 2, 2, 0); | ||
+ | |||
+ | /* 加速 */ | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 25); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 50); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 75); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_LocSpeed(ADDR_MM2 + 2, 100); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
dsshieldauto.txt · 最終更新: 2018/01/27 08:44 by yaasan