2018年01月30日

DSシールドをFlashAirでタブレット・スマホから制御する

たぶん、首を長くして待っている方が多かったんじゃないでしょうか。

SDカード型の無線LANであるFlash Airを使って、DSシールドをスマホやタブレットから、パソコンなしで単体で動かすことができます。

おまえ、ラズパイで何かやるって言ってたじゃ無いかというご指摘があると思います。その通りなのですが、選択肢として、こちらも十分に有効なのでご紹介させていただきます。

DSshield_FAir_control1.jpg

□用意する物

全部でだいたい、8000円台です。FlashAirが一番高い(3200円)。それでも、ロクハンのスマホコントローラよりは安いと思う。

・Arduino UNOまたは互換機
SDカードシールドV4
Flash Air W-03(秋月で売ってます)
DSシールド
・USB電源アダプタ(理由は後述)
・USBケーブル
・12VのACアダプタ

DSshield_FAir_sdshield.jpg

□スケッチ

以下の専用スケッチをArduino UNOに書き込んでください。まだぜんぜんチューニングできてないので、怪しいところがあります。

DSshieldFlashAir_r0.zip

□Flash Airの設定

以前にここで紹介した方法のままですが、一応書きます。

------------------------

Flash Airを買ったら、SD_WLANという隠しフォルダにアクセスし、以下のファイルを上書き保存する。
たとえば、EドライブにFlashAirのドライブが出たら、パスを打ち込む画面にE:/SD_WLAN/と直打ちすると移動できる。隠しフォルダ・ファイルを表示するように設定変更すると一番いいかもしれません。

webapp_for_fair.ZIP

こんな風にしてください。

FlashAir_Folder_1.png

CONFIGという隠しテキストファイルがあるので、テキストエディタで開きます。SD_WLANフォルダ同様、普通には見えないので、隠しファイルを表示するように設定変更するか、以下のようなファイラーを使ってアクセスしてください。(かめさん2というファイラーは私が15年以上前に作ったソフトです)

FlashAir_Folder_2.png

以下のように行を追加して「APPAUTOTIME=3000000」を足す。この命令は、勝手に省電力モードにしない設定です。



FlashAirは、ここではWifiのアクセスポイントになります。WifiのSSID検索で、flashair_(英数字の羅列)と出るはずなので、それをクリックしてパスワードは初期設定は12345678です。

DSshield_FAir_ipad.jpg

初回はアクセスポイントの設定をする画面になるはずです。書かれた通り設定してください。初期設定でよければ、OKを押すだけで何もしなくてもよいです。

もう一回アクセスしなおして、URLをhttp://flashair/にすると、いつものDesktop StationのWebアプリ画面が出てくるはずです。これでFlash Air側の準備は完了です。

□制限事項

・SDカードシールドがD4を占有するので、S88が使えません。
・W-03でのみ、動作確認済み。昨年初夏にでたW-04では未確認。そのうち買います

□現在分かっている課題

・FlashAirの起動時間が掛かる(30〜1分くらい)
・FlashAirの消費電流が200mA程度で、これがあまりにもデカすぎる。ショボいArduino UNOの電源では耐えきれずに頻繁にリセットが掛かります。なので、USBから5V/0.5Aの安定電源供給が必要。かなり電源を強化したArduino UNO互換機をどこかで見たので、そういうのを使うと大丈夫なはずです。
→普通のArduinoUNOで動かしたい場合は、スマホ充電などで使うUSB電源アダプタで供給すればOKです。
・たまに言うことを聞かないときがある。原因は不明、すぐに戻る。
・20分くらいWifi ONで動かしっぱなしで、SDカード表面が40〜45℃(室温は16.6℃)になる。
・共有メモリの反応が鈍いときがある。タイマー割り込みとケンカしているかもしれない。

□ビデオ



□今後

FlashAirの最新版のW-04だと、Luaエンジンがパワーアップしてかなりのことができるようになりました。
またWifiの安定性やスピードも桁違いに速くなったので、このようなWeb操作もだいぶサクサクになってます。

私が上記で作ったのは、FlashAirのほんの一部の機能で、ほとんど性能や実力を生かせてません。もっといろいろな事が出来ると思うので、試してみるといかがでしょうか。ラズパイよりも、意外と取っつきやすいと思います。ラズパイは、機能が多すぎなのとLiuxが分からないと、どうにもならないところが難点です。
posted by yaasan at 20:29 | Comment(0) | 鉄道模型

2018年01月27日

秋月に青緑色LED

ワンコインデコーダと信号機でおなじみのNuckyさん日本型信号機は、3mmのLEDを使用しますが、緑色については入手が難しくて皆さん苦労されていると思います。

秋月電子のLEDのところを見ていたところ、なんと昨年末に青緑色LED(波長505nm)の3mm青緑色LED OSG3DA3164Aが追加されていました。1個20円です。

Nuckyさん推奨は、マルツの高価な1個60円のタイプでしたが、秋月電子の販売商品で全てカバーできるということになります。(黄色590nm、赤は秋月で該当商品が売ってます)

私は、以前から高価な青緑色LEDについての代替品を調査してきましたが、書かれたとおりの仕様(505nm波長のLED)であれば、もうその必要は無いかもしれません。

※波長が20nmズレた青緑もどきLEDは、継続して10〜20個をタダでばらまいています。こんなインチキ品でも欲しいという奇特な方は、DesktopStationの商品の注文時にお申し付けください。
posted by yaasan at 21:04 | Comment(0) | 鉄道模型

2018年01月26日

DSシールドの説明書(書きかけ)

DSシールドに今はとても力を入れているので、説明書を作ってみました。

DSP0012_DSshieldInstruction_0_1.pdf

DSシールドの技術を使ってDSmainの廉価版でも作れそうですね。大電流が流せなくなるので、安くする意味や需要があるのかよく分かりませんが。
posted by yaasan at 08:32 | Comment(0) | 鉄道模型

2018年01月24日

DSシールドをPLCのようにする その5

メルクリンユーザー様、お待たせしました!!DSシールドで、メルクリンデジタル車両(MM2)を動かしました。特に、コマンドステーション部分についてのソフトは何もいじってませんが、メルクリン車両も動かせると言うことを、一応証明しました。

AUTO_MM2_1.jpg

メルクリンの29791は、弊社ではメルクリン車両のリファレンス機として使用しています。安くて壊れても財布が痛くないのと(当てても負荷をかけても全く壊れません・・・)、個人的にICE2の機関車(TGVの先頭車と同じ方式で、客車じゃないですよ!!)が好きなのもありますが。

□使用している機器

前回使ったタクトスイッチ、ブレッドボード類
・BAITE UNO互換機
DSシールド
・メルクリン ICE2(MM2デコーダ搭載車)
・CTrack線路、センサーレール
・フジガヤ2 S88 Detector(赤外線反射式在線検出器)

AUTO_MM2_2.jpg

□スケッチ

DSshieldAUTO_r0d.zip


/*****************************************************************/
/* User Program Area */
/*****************************************************************/

void user_init(void)
{

pinMode(8, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);

digitalWrite(8, HIGH);//内部プルアップON
digitalWrite(11, HIGH);//内部プルアップON
digitalWrite(12, HIGH);//内部プルアップON

//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("Power On");
}


void user_program(void)
{
static byte sButtonState = 1;


//ボタンが押されたとき、digitalReadは0を返す。押さないときは1を返す。

if( digitalRead(8) == 0)
{
Serial.println("Button 1");

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("Button 2");

sButtonState = 2;
CMD_Wait(100);
//急停車
CMD_LocSpeed(ADDR_MM2 + 2, 100);
}

if( digitalRead(12) == 0)
{
Serial.println("Button 3");

sButtonState = 3;
CMD_Wait(100);
}

/* S88のスキャン */
CMD_ScanS88();


if( CMD_GetS88(0) == 1)
{
Serial.println("S88 Detected");

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("REV");

//警笛
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("FWD");

//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);
}
}


□動きの説明

ボタン1を押すとサウンドを出して走行をスタートさせています。その後は、永遠と、往復を繰り返します。センサは1つのみで、時間式でシャトル運転させています。自動運転に関して、パソコンは使っていません。Aruino内に上記のスケッチを書き込んで動かしています。

車両はメルクリンのため、車両アドレスのオフセットにはADDR_MM2を付けています。DCC車両を動かすときは、ADDR_DCCに直せば、DCC車両で同じ事が可能です。

なお、途中でCMD_ScanS88()を呼び出しているのは、S88デコーダは在線検出すると信号をホールド(ラッチ)します。なので、定期的にCMD_ScanS88()をコールしてリフレッシュしないと前回のゴミが残るのです。おまじないとして、途中でコールしてS88デコーダの情報をいったんクリアーしているわけです。実装方法によってはハマりやすい現象なので、お気を付けください。

DSシールドは、DCCとメルクリンの両方に対応した世界で唯一のArduino用シールド(拡張基板)ということが、おわかりになると思います!

□Youtubeビデオ

posted by yaasan at 20:59 | Comment(0) | 鉄道模型

2018年01月23日

DSシールドのAUTOスケッチによる自動運転プログラミングで、できること/できないこと

DSシールドAUTOスケッチによる、パソコン無しでのDCC自動運転について、実現できること、実現できないことをYoutubeで引っ張ってきた自動運転の動画でご紹介したいと思います。

なお、判断基準は私の頭の中だけで、実際に試したわけでは無いので、ご了承ください。ただ、技術的には無理そうだな、もしくは超ハードなプログラミングが必須だな、と思ったら、できないこと、に振り分けます。ボーダーラインは、ちょっと厳しめです。

□できないこと(Cons)

まず、Taka@さんの、Desktop Station SoftwareDSmainR5.1を使ったケース。これは、実はAUTOスケッチで難しいです。複数の条件によって、複数台をバラバラに動かすのが、Arduinoのプログラムでは超不得意です。DesktopStationSoftwareでは、並列運転ができるようにソフトを実装しているのですが、パソコンくらいの性能が無いとキツいです。



次は、追兎電鉄のDigitraxxのシステム+Rail&CoのTrainControllerを使っているケース。これも、同じく、並列動作が多いのでArduino UNOの性能や機能ではどうしてもキツいです。かなりヘビーなことをしているので、配線だけでなく自動制御でも相当の時間をかけてらっしゃると思います。



□できること(Pros)

MECYさんが、DesktopStationSoftwareで自動運転している動画です。これは、車両数も少なく、条件も少ないのでAUTOスケッチで実現可能です。パソコンを減らすことが出来ます。



Nardiさんの交互運転も、これは可能です。2列車が、センサを踏んだときに止まるという動きなので、停止の動きを少し工夫する形になるとは思いますが、可能です。



次は、DCC/MMシールドを使用されていますが、PCなしで実現されています。これは、同じく可能です。この動きの移植も、元のソースがあれば、それほど難しくないと思います。



次も、DesktopStationSoftwareで実現されていますが、Nuckyさん日本型信号デコーダの制御も入ってきています。こちらも、AUTOスケッチで可能だと思います。ただし、信号機の制御をどう、実装するかはいろいろな方法があると思います。DesktopStationSoftwareだと、センサやポイント状態に連動して自動で変えてくれますが、その辺をC言語でゴリゴリ書くので、手間は大きくなると思います。



フジガヤ2さんの、単線2列車往復も大丈夫です。位置は、static変数に置いておかないといけないとはいけないと思いますが・・・。



あまりにもレベルが低いですが、2016年4月の模型市でお見せした、私の手抜きな1列車のポイント切り替え運転デモです。1列車だけだと、もう、何でも出来ます。制限はほぼ無いと思ってください。複数列車がいると、ややこしいことになって、頭を使わないといけないのです。



--------------------------------------

DSシールドのAUTOスケッチは、1〜2車両で、並列にいろいろな動きをさせなければ、自動運転プログラミングが可能です。逆に言うと、たくさんの動きをしてもOKですが、それがもう一方の車両の動きに影響しなければ、全く問題ありません。

DesktopStationSoftwareのイベント処理は、全ての動きが並列に同時に動くことを許容しています(そうなるように私が裏側で吸収する処理を実装しています)。一方、AUTOスケッチでは、C言語プログラミングで、容量制限や性能の制約もあって、並列処理の工夫を入れる余地が難しい面があります。

並列処理をC言語で書けないとは言いませんが、難易度が一気に跳ね上がります。リアルタイムOSのような処理を実装することになり、プロのプログラマでも苦労するはずです。ということで、
posted by yaasan at 20:02 | Comment(0) | 鉄道模型