dsshieldauto
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
dsshieldauto [2018/01/21 08:08] – [スケッチの書き込み方法] yaasan | dsshieldauto [2018/01/21 09:57] – [DSshieldAUTO] 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の車両・ポイントに対応 | ||
+ | * 教育向け、研修向け、自分の技術向上、ジオラマのギミックのパワーアップなどに使用できます。 | ||
行 28: | 行 36: | ||
{{http:// | {{http:// | ||
- Uploadボタン(→マーク)を押して書き込む | - Uploadボタン(→マーク)を押して書き込む | ||
- | |||
===== スケッチの作り方 ===== | ===== スケッチの作り方 ===== | ||
+ | |||
+ | |||
+ | ==== はじめに ==== | ||
+ | |||
+ | Arduinoの仕組みを使って、DCC鉄道模型の制御を行います。このため、Arduinoの入門書や知識が必要となります。 | ||
+ | |||
+ | 参考サイト: | ||
+ | * [[http:// | ||
==== 全体の構成 ==== | ==== 全体の構成 ==== | ||
+ | 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, | ||
+ | |アナログおよび\\ デジタル入出力ピン|A2, | ||
+ | |I2C通信または\\ アナログおよび\\ デジタル入出力ピン|A4, | ||
+ | ==== 主な命令 ==== | ||
+ | |||
+ | AUTOスケッチでは、Arduinoの命令は全部使えますが、たぶん混乱するだけなので、以下の命令でまずは使ってみてください。\\ | ||
+ | |||
+ | 車両アドレス: 「ADDR_DCC+DCCアドレス」で指定してください。DCCアドレス8102であれば、ADDR_DCC+8102です。MM2アドレス5なら、ADDR_MM2+5です。\\ | ||
+ | アクセサリアドレス:「ADDR_ACC_DCC+DCCアクセサリアドレス」で指定してください。DCCポイント32であれば、ADDR_ACC_DCC+32です。MM2のポイント5であれば、ADDR_ACC_MM2+5です。\\ | ||
+ | |||
+ | |||
+ | ^命令 ^解説 ^使用例 ^ | ||
+ | |CMD_END() |永久ループで止めます。この命令の後は一切制御できなくなります。 | ||
+ | |CMD_ScanS88() |S88からデータを収集する処理。 |CMD_ScanS88(); | ||
+ | |CMD_GetS88(S88アドレス) |収集したS88データから希望のS88アドレス(1-16)の状態(0 or 1)を得る。 |aSensor = CMD_GetS88(2); | ||
+ | |CMD_Wait(待ち時間ミリ秒) | ミリ秒単位(1000で1秒)で待ちます。| CMD_Wait(1000); | ||
+ | |CMD_Power(オンオフ命令) | 0で線路電源オフ、1で線路電源オン。 | CMD_Power(1); | ||
+ | |CMD_LocSpeed(車両アドレス, | ||
+ | |CMD_LocDirection(車両アドレス, | ||
+ | |CMD_LocFunction(車両アドレス, | ||
+ | |CMD_LocFunctionMomentary(車両アドレス, | ||
+ | |CMD_Turnout(アクセサリアドレス, | ||
+ | |Serial.print, | ||
+ | |||
+ | ===== スケッチの例 ===== | ||
+ | |||
+ | ==== アドレス3車両のファンクション操作 ==== | ||
+ | |||
+ | < | ||
+ | / | ||
+ | /* User Program Area */ | ||
+ | / | ||
+ | |||
+ | void user_init(void) | ||
+ | { | ||
+ | |||
+ | } | ||
+ | |||
+ | void user_program(void) | ||
+ | { | ||
+ | SerialDS.println(" | ||
+ | CMD_Power(1); | ||
+ | |||
+ | CMD_LocFunction(ADDR_DCC + 3, 0, 1); | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 1, 1); | ||
+ | CMD_Wait(500); | ||
+ | |||
+ | SerialDS.println(" | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 10, 1); | ||
+ | |||
+ | CMD_Wait(500); | ||
+ | |||
+ | SerialDS.println(" | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 11, 1); | ||
+ | |||
+ | CMD_Wait(500); | ||
+ | |||
+ | SerialDS.println(" | ||
+ | CMD_LocFunction(ADDR_DCC + 3, 9, 1); | ||
+ | |||
+ | CMD_Wait(500); | ||
+ | |||
+ | SerialDS.println(" | ||
+ | /* 永久ループ(終了) */ | ||
+ | while(1){} | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== タクトスイッチによるルート切り替え ==== | ||
+ | |||
+ | < | ||
+ | / | ||
+ | /* User Program Area */ | ||
+ | / | ||
+ | |||
+ | void user_init(void) | ||
+ | { | ||
+ | pinMode(8, INPUT); | ||
+ | pinMode(11, | ||
+ | pinMode(12, | ||
+ | |||
+ | digitalWrite(8, | ||
+ | digitalWrite(11, | ||
+ | digitalWrite(12, | ||
+ | |||
+ | CMD_Power(1); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | |||
+ | void user_program(void) | ||
+ | { | ||
+ | // | ||
+ | |||
+ | if( digitalRead(8) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | CMD_Turnout(ADDR_ACC_DCC + 2, 0); | ||
+ | CMD_Wait(1000); | ||
+ | } | ||
+ | |||
+ | if( digitalRead(11) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | CMD_Turnout(ADDR_ACC_DCC + 1, 1); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_Turnout(ADDR_ACC_DCC + 2, 1); | ||
+ | } | ||
+ | |||
+ | if( digitalRead(12) == 0) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | |||
+ | CMD_Turnout(ADDR_ACC_DCC + 1, 0); | ||
+ | CMD_Wait(1000); | ||
+ | CMD_Turnout(ADDR_ACC_DCC + 2, 1); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | 配線図: | ||
+ | {{http:// | ||
+ | Youtube動画: | ||
+ | {{youtube> | ||
dsshieldauto.txt · 最終更新: 2018/01/27 08:44 by yaasan