2018年02月08日

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

DSシールドとFlashAirで、タブレット・スマホから制御する技術的な仕組みを解説します。やってることは、そんなに難しくないです。

アーキテクチャ:
FlashAir_Architecture.png

□Webアプリについて

iPadなどで表示する画面は、純粋なHTML5+JavaScriptのWebアプリになっています。ライブラリにはjQueryを使っています。よく端末によっては画面が崩れるというのは、UIライブラリをちゃんとしたものを選定していないためです。今後、この部分はOnsenUIを使用するつもりです。

ArduinoUNOとの通信は、FlashAirの中にある共有メモリをアドレス0番地から32バイト分使用し、以下のようにGETコマンドを発行し、command.cgiのAPIを使って共有メモリに書き込んでます。


http://flashair/command.cgi?op=131&ADDR=0&LEN=32&DATA=操作コマンド


操作コマンドは、setLocoSpeedとかの、シリアルで使っているコマンドと同じにしてあります。いわゆる手抜きですが、同じ方が使い回せますし、シンプルなので良いのです。

HTMLでGETコマンドを使うと、以下のような感じでJavaScript上で書いてもらえれば動作します。DCCアドレス3(49152+3=49155)のスピードを512(50%)としてます。


var url = GetUrl() + "http://flashair/command.cgi?op=131&ADDR=0&LEN=32&DATA=setLocoSpeed(49155,512)";
var request = createXMLHttpRequest();
request.open("GET", url, true);
request.send("");


Webアプリの画面系は、見てもらえば良い通り、ほぼスクラッチでメーターなどをCanvasを使って実装しています。ボタン、タブなどはjQueryUIの機能を使ってます。

特に何も隠してないので、改造していただいて、Arduino UNOと連動してセンサーを表示するとか、新しく画面を作り直して専用の物にするとか、自由にできます。

DCCパケットを作る面倒な部分は全部、ArduinoUNO側でやるので、自動運転制御とか、無線で操作するソフトとか、自由に作っていただければなと思ってます。

□Arduino UNO側

DSシールドの標準機能に加えて、FlashAirにアクセスするためのiSDIOのライブラリを取り込んでいます。また定期的に共有メモリを見に行って、新しく入っていないかを確認する処理が動いています。


boolean SDIO_ReadSharedMem()
{
memset(buffer_sharedMem, 0, 32);
digitalWrite(chipSelectPin, LOW);
uint8_t aResult = card.readExtMemory(1, 1, 0x1000, 32, buffer_sharedMem);
digitalWrite(chipSelectPin, HIGH);

if (!aResult)
{
return false;
}
else
{
if( buffer_sharedMem[0] == 0x00)
{
return false;
}
else
{
return true;
}
}
}


共有メモリに書き込まれるコマンドは、DesktopStationSoftwareと互換なので、データが入っていたら、DCCパケットの更新処理を動かす、という仕組みです。パケットを作るとか面倒なことは全部DScoreがやるので、インターフェースだけ作り込めばOKです。
posted by yaasan at 08:24 | Comment(0) | 鉄道模型
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。