dsshieldauto
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
dsshieldauto [2018/01/21 09:57] – [DSshieldAUTO] yaasan | dsshieldauto [2018/01/27 08:44] (現在) – [C言語の基本] yaasan | ||
---|---|---|---|
行 12: | 行 12: | ||
* 教育向け、研修向け、自分の技術向上、ジオラマのギミックのパワーアップなどに使用できます。 | * 教育向け、研修向け、自分の技術向上、ジオラマのギミックのパワーアップなどに使用できます。 | ||
+ | |||
+ | ===== AUTOスケッチでできないこと ===== | ||
+ | |||
+ | * 複雑な制御。並列で何個も複雑な条件で動く制御パターン。Arduinoで並列処理を書くのが難しいため。 | ||
+ | * 大電流を消費する環境。 | ||
+ | * 大きなレイアウト。 | ||
===== 必要な物 ===== | ===== 必要な物 ===== | ||
行 87: | 行 93: | ||
|アナログおよび\\ デジタル入出力ピン|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です。\\ | ||
行 107: | 行 114: | ||
|CMD_Turnout(アクセサリアドレス, | |CMD_Turnout(アクセサリアドレス, | ||
|Serial.print, | |Serial.print, | ||
+ | |||
+ | ==== C言語の基本 ==== | ||
+ | |||
+ | C言語の細かい記述方法は、本屋さんに売っているC言語入門の本を斜め読みしながら覚えてください。いきなり全てを覚える必要はありません。サンプルをいじりながら、修正してみて手探りしながら体で覚えていただく形が良いと思います。 | ||
+ | |||
+ | まず、変数を覚えましょう。 | ||
+ | |||
+ | < | ||
+ | // | ||
+ | byte aHako; | ||
+ | // | ||
+ | int aHako; | ||
+ | </ | ||
+ | |||
+ | staticを付けると、変数は消されずに値が保持されます。 | ||
+ | |||
+ | < | ||
+ | static byte sHako; | ||
+ | </ | ||
+ | |||
+ | なお、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:// | ||
+ | |||
< | < | ||
行 124: | 行 212: | ||
void user_program(void) | void user_program(void) | ||
{ | { | ||
- | SerialDS.println(" | + | Serial.println(" |
CMD_Power(1); | CMD_Power(1); | ||
行 131: | 行 219: | ||
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){} | ||
行 153: | 行 241: | ||
==== タクトスイッチによるルート切り替え ==== | ==== タクトスイッチによるルート切り替え ==== | ||
+ | |||
+ | 詳細は、[[http:// | ||
< | < | ||
行 211: | 行 301: | ||
Youtube動画: | Youtube動画: | ||
{{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