ユーザ用ツール

サイト用ツール


dsshieldauto

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
dsshieldauto [2018/01/27 07:49]
yaasan [アドレス3車両のファンクション操作]
dsshieldauto [2018/01/27 08:44] (現在)
yaasan [C言語の基本]
行 93: 行 93:
 |アナログおよび\\ デジタル入出力ピン|A2,A3| デジタルに加え、光センサや可変抵抗器などのアナログセンサを使えます。 | |アナログおよび\\ デジタル入出力ピン|A2,A3| デジタルに加え、光センサや可変抵抗器などのアナログセンサを使えます。 |
 |I2C通信または\\ アナログおよび\\ デジタル入出力ピン|A4,A5|上記に加え、I2C通信が使用できます。wire.hをインクルードする必要があります。| |I2C通信または\\ アナログおよび\\ デジタル入出力ピン|A4,A5|上記に加え、I2C通信が使用できます。wire.hをインクルードする必要があります。|
 +
 ==== 主な命令 ==== ==== 主な命令 ====
  
-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です。\\ 
行 113: 行 114:
 |CMD_Turnout(アクセサリアドレス, 分岐状態) | ポイントや信号機を操作します。0:分岐, 1:直進です。| CMD_Turnout(ADDR_ACC_DCC+32,1);| |CMD_Turnout(アクセサリアドレス, 分岐状態) | ポイントや信号機を操作します。0:分岐, 1:直進です。| CMD_Turnout(ADDR_ACC_DCC+32,1);|
 |Serial.print, Serial,println| シリアル通信でPC等にメッセージを送れます。|Serial.println("車両1検出"); | |Serial.print, Serial,println| シリアル通信でPC等にメッセージを送れます。|Serial.println("車両1検出"); |
 +
 +==== C言語の基本 ====
 +
 +C言語の細かい記述方法は、本屋さんに売っているC言語入門の本を斜め読みしながら覚えてください。いきなり全てを覚える必要はありません。サンプルをいじりながら、修正してみて手探りしながら体で覚えていただく形が良いと思います。
 +
 +まず、変数を覚えましょう。
 +
 +<code>
 +//0-255の値を使うとき、aHako を作る
 +byte aHako;
 +//-32768~32767を使うとき、intを使う
 +int aHako;
 +</code>
 +
 +staticを付けると、変数は消されずに値が保持されます。
 +
 +<code>
 +static byte sHako;
 +</code>
 +
 +なお、C言語のルールでは無く、独自のルールですが、変数の名前は先頭に種類を示す小文字を付けると見やすくなります。関数内で宣言して使う変数には"a"(autoのa)、1つのソースファイル全体で使う変数には"g"(globalのg)、関数内でstatic宣言して使う変数には"s"(staticのs)とします。
 +
 +プログラムは基本3要素で成り立っています。シーケンス(順序実行)、分岐、繰り返しです。
 +
 +<code>
 +//シーケンスの例
 +Serial.println("Power On");
 +CMD_Power(1);
 +
 +CMD_LocFunction(ADDR_DCC + 3, 0, 1);
 +CMD_LocFunction(ADDR_DCC + 3, 1, 1);
 +CMD_Wait(500);
 +
 +Serial.println("Loc 3, Func 10, On");
 +CMD_LocFunction(ADDR_DCC + 3, 10, 1);
 +CMD_Wait(500);
 +</code>
 +
 +分岐は以下の通りです。
 +
 +<code>
 +//分岐の例。A,Bルートが交互に実行される
 +static byte sFlag0 = 10;
 +
 +if( sFlag0 == 10)
 +{
 + //Aルート
 + sFlag0 = 0;
 + Serial.println("Loc 3, Func 10, On");
 + CMD_LocFunction(ADDR_DCC + 3, 10, 1);
 + CMD_Wait(500);
 + CMD_LocFunction(ADDR_DCC + 3, 10, 0);
 +}
 +else
 +{
 + //Bルート
 + sFlag0 = 10;
 + Serial.println("Loc 3, Func 10, On");
 + CMD_LocFunction(ADDR_DCC + 3, 11, 1);
 + CMD_Wait(500);
 + CMD_LocFunction(ADDR_DCC + 3, 11, 0);
 +}
 +</code>
 +
 +繰り返しは、似たような命令を、シンプルに表現する方法です。繰り返しは、シーケンスと分岐を組み合わせるとできますが、C言語では専用命令forやwhileがありますので、これを使うと楽が出来て便利です。
 +
 +スピードを徐々にあげるような命令は、繰り返し命令を使うと短く記載できて楽です。
 +
 +<code>
 +//繰り返しの例。車両のスピードを変える
 +
 +for( int i = 0; i < 11; i++)
 +{
 + CMD_LocSpeed(ADDR_DCC + 3, i * 10);
 + CMD_Wait(200);
 +}
 +
 +</code>
  
 ===== スケッチの例 ===== ===== スケッチの例 =====
  
 ==== アドレス3車両のファンクション操作 ==== ==== アドレス3車両のファンクション操作 ====
 +
 +車両のファンクションを動かすサンプルです。[[http://powerele.sblo.jp/article/182179937.html|DSシールドをPLCのようにする その2(挫折&方針変更)]]で詳細を紹介しています。
 +
  
 <code> <code>
行 159: 行 241:
  
 ==== タクトスイッチによるルート切り替え ==== ==== タクトスイッチによるルート切り替え ====
 +
 +詳細は、[[http://powerele.sblo.jp/article/182189558.html|管理者ブログの記事(DSシールドをPLCのようにする その3)]]を参照ください。
  
 <code> <code>
行 223: 行 307:
 メルクリン車両(Marklin Digital, Marklin Motorola 2)の往復シャトル運転です。 メルクリン車両(Marklin Digital, Marklin Motorola 2)の往復シャトル運転です。
 ファンクション操作や、ボタンでスタートをかけるなどの動きを実現しています。 ファンクション操作や、ボタンでスタートをかけるなどの動きを実現しています。
 +
 +詳細は、[[http://powerele.sblo.jp/article/182228893.html|管理者ブログの記事(DSシールドをPLCのようにする その5)]]を参照ください。
  
  
dsshieldauto.1517006948.txt.gz · 最終更新: 2018/01/27 07:49 by yaasan