FlashAirのLua機能を使いPIO制御を行って見ます1
  (Lua関数"fa.pio"で操作する基本編)

〔FlashAir買ってみた編〕   〔PIO制御2〕 〔3〕 〔4〕 〔iSDIO機能〕 〔マイコンのトップに戻る〕


FlashAir表の外観  これが[FlashAir]で、SDHCカードに無線LANを内蔵した物ですよね。
 ですので、デジカメ等に挿したままPC等から無線でダウンロードや閲覧可能な
 一品ですがぁ、それ以外の機能で、SDカードの端子をGPIOとして利用出来る機能
 有ります。
 と言う事は、FlashAir自体がマイコンの様にデジタル入出力が可能と言う事です、
 このページではこのPIO機能について書きます。

 PIO機能は、FlashAirの第3世代(W-03)以降でのみ利用可能となります。

PIO機能を利用するにはLuaスクリプト言語で記述したファイルをSDカード内に入れて置くだけで
動作します。

SDカードの端子について

FlashAir裏の外観
SD端子No PIOmode端子名 SDmode端子名 SPImode端子名
@ D3 DATA3/CD CS
A CMD CMD DI
B (VSS) (VSS) (VSS)
C (VDD) (VDD) (VDD)
D CLK CLK
E (VSS) (VSS) (VSS)
F D0 DATA0 DO
G D1 DATA1
H D2 DATA2
 PIO機能で使用できる入出力端子は、"D3","CMD","D0","D1","D2"の
 5本です。


SDカードのソケットについて

SDソケット  左が実験で使用したSDカードの標準型ソケットモジュールです、
 これはスイッチサイエンスで購入したのですがぁ...
 2016/02/01現在は販売終了となっています、代替えも無しです。
 (こちらに代替え有りました、ピン配列は異なります)

 こちらの様なソケットは有りますが、これを半田付けしたモジュールが
 見当たりません。
 尚、秋月電子のこちらは、マイコン等と"SPImode"で接続する場合の
 モジュールなので、ここの実験では使用出来ません。(改造すればぁ...)

 なのでぇ、実験を行いたい人はソケットを何とか自力で解決しましょう。
 (PS.秋月電子のこちらで販売されました使えるでしょう)

実態の回路写真 左が実験時の回路写真で、電源は3.3Vです。

LEDは抵抗1KΩを介して"D2"端子に接続です。
ピンの出力電流は最大どの位流せるか調べたので
すがちょっとぉ不明です。 m(_ _)m
この配線でLEDには1.5mA程は流れていると
思いますがぁ....。

スイッチはプルアップ配線で"D1"端子に接続
しました。

後は、Luaスクリプト言語で記述したファイルを
入れたFlashAirをソケットに挿すだけで
動作してしまいます。何とも簡単なぁ!単純明快!
v(o^_゚o)ってゆうかぁ、明朗会計ぃ。

《動作させて見る》

動作させる為の準備

@ SDカードをパソコンのSDスロットかカードリーダで開きます。

A カード内には隠しフォルダーやファイルが有るので表示させないとダメです。
  (表示させる方法は、こちらのサイトをご覧ください。)

B [SD_WLAN]フォルダーの"CONFIG"ファイルを開きます。
  ファイル内の最後の行に下記2行を追記します。
  IFMODE=1
  LUA_RUN_SCRIPT=/xxxxxx.lua

  ※ IFMODE=1はPIO機能を利用する為の設定です、
    LUA_RUN_SCRIPTはカードの起動時に"xxxxx.lua"ファイルを実行するです。
    電源投入後、約5秒後にファイルが実行されます。

LEDチカチカスクリプトファイル

(boot_pio_LED.lua)としました、この下から
-----------------------------------------------------
-- LEDの点滅テスト                                 --
-- DATA2(D2)に配線のLEDを約500ms毎に点滅させる処理 --
-----------------------------------------------------

while(1) do
     fa.pio(0x08,0x08)   -- LED点灯
     sleep(500)
     fa.pio(0x08,0x00)   -- LED消灯
     sleep(500)
end
この上までをコピー&ペーストし、SDカードのルートディレクトリに"boot_pio_LED.lua"で書込み、
"CONFIG"ファイルに"LUA_RUN_SCRIPT=/boot_pio_LED.lua"とする。
SDカードを実験回路にセットし起動後、5秒後にLEDが500ms毎に点滅するはずです。

スイッチでLED点灯スクリプトファイル

(boot_pio_SWtoLED.lua)としました、この下から
-------------------------------------------------------------------------
-- スイッチによるLEDの点灯テスト                                       --
-- DATA2(D2)に配線のLEDを、DATA1(D1)接続のスイッチにより点灯させる処理 --
-------------------------------------------------------------------------
io = 0x08                                     -- D2のみ出力設定
ans,dt = fa.pio(io,0x00)                      -- 現在のI/O情報を得る
while(1) do
     if (bit32.btest(dt,0x04) == false) then  -- スイッチが押されたか?
          ans,dt = fa.pio(io,0x08)            -- LED点灯とI/O情報を得る
     else
          ans,dt = fa.pio(io,0x00)            -- LED消灯とI/O情報を得る
     end
     sleep(300)       -- この行は外さない事(他の機能が動作しなくなる為)
end
この上までをコピー&ペーストして、SDカードのルートディレクトリに"boot_pio_SWtoLED.lua"で書込み、
"CONFIG"ファイルに"LUA_RUN_SCRIPT=/boot_pio_SWtoLED.lua"とする。
SDカードを実験回路にセットし起動後、5秒後にスイッチを押せばLEDが点灯します。

"sleep(300)"が有るのでスイッチの反応速度は若干遅いですが、 この行は絶対外さないで下さい!
ループさせてしまうと他の機能が動作しにくくなります、無線LAN機能が使えなくなり、
エクスプローラでも表示出来なくなり、更にはフォーマットも出来なくなり
щ(´□`)щ オーマイガーッ!!
(´Д`|||) ってゆうかぁ、顔面蒼白ぅ。

で、私は、また買い直し覚悟を決め、[SDFormatter]でSDを抜き差ししながらなんとかフォーマットに
成功しました。 ε-(´▽`)
本日の格言【 !(・o・) スクリプトが起動する前の5秒間が勝負パンツ 】

Luaスクリプトについて

Lua機能について、まずはこちらの"FlashAir Developers"サイトを見ましょう。
Lua 5.2 リファレンスマニュアル」の日本語訳が有りますが、解りにくいですNET検索をした方が良いかもぉ。
NOXさんの「Lua基礎文法最速マスター」ブログ辺りで"Lua入門"も読みましょう。

PIO端子で入出力する為のFlashAir専用関数で"fa.pio"の使い方を説明します。

正規なリファレンスマニュアルはこちらです。
端子とデータビットの関係
ビット 7 6 5 4 3 2 1 0
端子名       D3 D2 D1 D0 CMD

s, indata = fa.pio(ctrl, data)
 指定したビット情報に従い、SDインターフェースのPIOに対して入力と出力の両方を実行します
 ctrl  :ピンの入出力を設定します、0=入力 1=出力
 data :出力するピンの状態を指示します、0=LOW 1=HIGH
 s   :関数の実行結果を返します、0=失敗 1=成功
 indata:入力ピンの状態を返します、0=LOW 1=HIGH
 例1) D1をHIGHで出力する場合(D1のみ出力で他は入力)
    s,indata = fa.pio(0x04,0x04)

 例2) D1をLOWで出力する場合
    s,indata = fa.pio(0x04,0x00)

 例3) D3を入力とする場合(他の端子は出力で設定)
    s,indata = fa.pio(0x0F,0x00)        --PIOの状態を読込む(出力LOWも実行される)
        if (bit32.btest(indata,0x10) == true) then  --D3のビットを調べる
             -- HIGHなら何か処理する
        end

  ※ 狙ったピンのみ出力可でなく、出力設定したピン全部に出力実行される、注意。
Luaスクリプトの起動タイミング

・SDカードの起動時に実行
 LUA_RUN_SCRIPTで起動時に実行するLuaスクリプトのパスを指定します。
・SDカードにファイルを書き込んだ時に実行
 LUA_SD_EVENTでファイル書き込み時に実行するLuaスクリプトのパスを指定します。
・SDカードにブラウザからアクセスした時に実行
 "http://flashair/xxxx.lua"等とアクセスを行う、スクリプトの標準出力がブラウザの画面に表示出来る

《ブラウザから動作させて見る》

上では、Luaスクリプトの"fa.pio"を使ってのLED点灯でした。
今度は、ブラウザからのLED点灯を行って見ます。
FlashAirには予め"command.cgi"が組み込まれています、このCGIにコマンドデータ(下記)を付けて
"GET"リクエストを発行するだけでFlashAirのPIOをON/OFF出来ます、
"command.cgi"の正規なリファレンスマニュアルはこちらです。

動作させる為の準備

上記での"動作させる為の準備"Bまで行っていますね。
但し、"LUA_RUN_SCRIPT"は要りません、外すか、ファイル名を変えて置きます。

※ 実行する場合は勿論、FlashAirのSSIDにパソコンの無線接続を切り換えますよ、念の為。
  (切り換えはこちらを参考にしましょう)

実行

ブラウザのアドレスバーで下記を実行させて下さい、FlashAirの"D2"端子に接続のLEDが点灯します。

http://flashair/command.cgi?op=190&CTRL=0x08&DATA=0x08
 op=190    :PIOを操作する為のコマンドです
 CLRT/DATA:上記の"fa.pio"と同じ内容のデータを設定します(DATA=0x00でLEDは消灯)

{"STATUS":"OK","CTRL":"0x08","DATA":"0x18"}
 と、この様にFlashAirから返答が有るので、"DATA"を見ればPIOの状態が解りますね。
 (ちょっとここで解せないのが0x18で返って来るが"D3"端子何処にも接続されていないのですがぁ)

HTMLで実行

HTML実行画像  下記からダウンロードした、
 HTMLファイル(pio_WEBtoLED.htm)を
 FlashAirのルートディレクトリにコピーします

 ブラウザのアドレスバーで
 "http://flashair/pio_WEBtoLED.htm"
 を実行すれば左図の様に表示されます。


※ Windows 7 Pro SP1 32Bit での環境ですがぁ....
※ HTMLファイル(pio_WEBtoLED.htm)をPC側に置いて実行させた場合は上手く動作しませんでした。
※ [Google Chrome Vr48][Firefox 44]は上手く動作しますが、
  なぁーぜかぁ、[IE10.0.32]では上手く動作しません。(2回目以降のLEDのON/OFFが不可なのね)
  IE11に変えて見ようかなぁ?...(ってかぁ、"Firefox"に乗り換えるぞぉ)

《ダウンロードファイルについて》

↓からダウンロードして下さい、このページで使うファイルを纏めて置きました。
FlashAir_pio.lzh

解凍したファイルは以下です。
boot_pio_LED.lua    - LEDチカチカスクリプトファイル(起動時実行)
boot_pio_SWtoLED.lua - スイッチでLED点灯スクリプトファイル(起動時実行)
pio_WEBtoLED.htm   - ブラウザからLED点灯 HTMLファイル(ブラウザから実行)

《その他》

SDカードの標準ソケットモジュール、秋月電子でも通販ないよねぇ、マイクロSDなら
秋月もスイッチサイエンスも有るのですがぁねぇ。
検索もかからないしぃ、ソケットを半田付けしろってかぁ、一度失敗してるしぃ。
前みたく販売してほしぃぞぉ。FlashAirの工作には必要ですだぁ、 秋月さん、スイッチサイエンスさん。

それにしても、正規サイトの"Lua関数リファレンス"類のマニュアルは、解りにくい、詳しく書いていない、
ですでーす、たぶん"Lua職人"でない"事務職人"当たりが書いてそうなかんじぃ、 東芝さん。


次ページ2では、"秋月電子のFlashAir DIP IO ボード"を使ってPIOを操作します。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.