dsshieldauto
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン最新のリビジョン両方とも次のリビジョン | ||
dsshieldauto [2018/01/21 09:29] – [タクトスイッチによるルート切り替え] yaasan | dsshieldauto [2018/01/27 08:12] – 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からコールされています。ほとんど同じように使用することが出来ます。 |
+ | {{:: | ||
==== 使用できるピン ==== | ==== 使用できるピン ==== | ||
+ | |||
+ | ピン・端子を使用するときは、pinModeをuser_init()の中で必ずピンの設定します。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | pinMode(8, OUTPUT); | ||
+ | |||
+ | // | ||
+ | pinMode(7, INPUT); | ||
+ | |||
+ | // | ||
+ | pinMode(A2, INPUT); | ||
+ | </ | ||
+ | |||
+ | 実際に使う場合には、以下のように使用します。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | digitalWrite(8, | ||
+ | |||
+ | // | ||
+ | int aSensor = digitalRead(7); | ||
+ | |||
+ | // | ||
+ | int aAnalog = analogRead(A2); | ||
+ | </ | ||
+ | |||
+ | DSシールドで解放されているピンは以下の通りです。この他は、S88や電圧チェック機能で使用されています。 | ||
+ | なお、いかに記載はありませんが、5V、3.3V、GNDピンは自由に使用できます。 | ||
|デジタル入出力ピン|D7, | |デジタル入出力ピン|D7, | ||
|アナログおよび\\ デジタル入出力ピン|A2, | |アナログおよび\\ デジタル入出力ピン|A2, | ||
|I2C通信または\\ アナログおよび\\ デジタル入出力ピン|A4, | |I2C通信または\\ アナログおよび\\ デジタル入出力ピン|A4, | ||
+ | |||
==== 主な命令 ==== | ==== 主な命令 ==== | ||
- | AUTOスケッチでは、Arduinoの命令は全部使えますが、たぶん混乱するだけなので、以下の命令でまずは使ってみてください。\\ | + | AUTOスケッチでは、Arduinoの命令は全部使えますが、たぶん混乱するだけなので、以下の命令を中心に、まずは使ってみてください。\\ |
車両アドレス: 「ADDR_DCC+DCCアドレス」で指定してください。DCCアドレス8102であれば、ADDR_DCC+8102です。MM2アドレス5なら、ADDR_MM2+5です。\\ | 車両アドレス: 「ADDR_DCC+DCCアドレス」で指定してください。DCCアドレス8102であれば、ADDR_DCC+8102です。MM2アドレス5なら、ADDR_MM2+5です。\\ | ||
行 69: | 行 114: | ||
|CMD_Turnout(アクセサリアドレス, | |CMD_Turnout(アクセサリアドレス, | ||
|Serial.print, | |Serial.print, | ||
+ | |||
+ | ==== C言語の基本 ==== | ||
+ | |||
+ | C言語の細かい記述方法は、本屋さんに売っているC言語入門の本を斜め読みしながら覚えてください。いきなり全てを覚える必要はありません。サンプルをいじりながら、修正してみて手探りしながら体で覚えていただく形が良いと思います。 | ||
+ | |||
+ | プログラムは基本3要素で成り立っています。シーケンス(順序実行)、分岐、繰り返しです。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | Serial.println(" | ||
+ | CMD_Power(1); | ||
+ | |||
+ | CMD_LocFunction(ADDR_DCC + 3, 0, 1); | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 1, 1); | ||
+ | CMD_Wait(500); | ||
+ | |||
+ | Serial.println(" | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 10, 1); | ||
+ | CMD_Wait(500); | ||
+ | </ | ||
+ | |||
+ | 分岐は以下の通りです。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | static byte sFlag0 = 10; | ||
+ | |||
+ | if( sFlag0 == 10) | ||
+ | { | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 繰り返しは、似たような命令を、シンプルに表現する方法です。繰り返しは、シーケンスと分岐を組み合わせるとできますが、C言語では専用命令forやwhileがありますので、これを使うと楽が出来て便利です。 | ||
+ | |||
+ | スピードを徐々にあげるような命令は、繰り返し命令を使うと短く記載できて楽です。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | |||
+ | for( int i = 0; i < 11; i++) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | </ | ||
===== スケッチの例 ===== | ===== スケッチの例 ===== | ||
==== アドレス3車両のファンクション操作 ==== | ==== アドレス3車両のファンクション操作 ==== | ||
+ | |||
+ | 車両のファンクションを動かすサンプルです。[[http:// | ||
+ | |||
< | < | ||
行 86: | 行 195: | ||
void user_program(void) | void user_program(void) | ||
{ | { | ||
- | SerialDS.println(" | + | Serial.println(" |
CMD_Power(1); | CMD_Power(1); | ||
行 93: | 行 202: | ||
CMD_Wait(500); | CMD_Wait(500); | ||
- | SerialDS.println(" | + | Serial.println(" |
CMD_LocFunction(ADDR_DCC + 3, 10, 1); | CMD_LocFunction(ADDR_DCC + 3, 10, 1); | ||
CMD_Wait(500); | CMD_Wait(500); | ||
- | SerialDS.println(" | + | Serial.println(" |
CMD_LocFunction(ADDR_DCC + 3, 11, 1); | CMD_LocFunction(ADDR_DCC + 3, 11, 1); | ||
CMD_Wait(500); | CMD_Wait(500); | ||
- | SerialDS.println(" | + | Serial.println(" |
CMD_LocFunction(ADDR_DCC + 3, 9, 1); | CMD_LocFunction(ADDR_DCC + 3, 9, 1); | ||
CMD_Wait(500); | CMD_Wait(500); | ||
- | SerialDS.println(" | + | Serial.println(" |
/* 永久ループ(終了) */ | /* 永久ループ(終了) */ | ||
while(1){} | while(1){} | ||
行 115: | 行 224: | ||
==== タクトスイッチによるルート切り替え ==== | ==== タクトスイッチによるルート切り替え ==== | ||
+ | |||
+ | 詳細は、[[http:// | ||
< | < | ||
行 171: | 行 282: | ||
{{http:// | {{http:// | ||
+ | Youtube動画: | ||
+ | {{youtube> | ||
+ | |||
+ | |||
+ | ==== メルクリン車両の単純往復シャトル運転 ==== | ||
+ | |||
+ | メルクリン車両(Marklin Digital, Marklin Motorola 2)の往復シャトル運転です。 | ||
+ | ファンクション操作や、ボタンでスタートをかけるなどの動きを実現しています。 | ||
+ | |||
+ | 詳細は、[[http:// | ||
+ | |||
+ | |||
+ | < | ||
+ | / | ||
+ | /* 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); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Youtube動画: | ||
+ | {{youtube> | ||
dsshieldauto.txt · 最終更新: 2018/01/27 08:44 by yaasan