FlashAirのLua機能を使いPIO制御を行って見ます1
(Lua関数"fa.pio"で操作する基本編)
〔FlashAir買ってみた編〕
〔PIO制御2〕
〔3〕
〔4〕
〔iSDIO機能〕
〔マイコンのトップに戻る〕
これが[FlashAir]で、SDHCカードに無線LANを内蔵した物ですよね。
ですので、デジカメ等に挿したままPC等から無線でダウンロードや閲覧可能な
一品ですがぁ、それ以外の機能で、SDカードの端子をGPIOとして利用出来る機能が
有ります。
と言う事は、FlashAir自体がマイコンの様にデジタル入出力が可能と言う事です、
このページではこのPIO機能について書きます。
PIO機能は、FlashAirの第3世代(W-03:SD-WE)以降でのみ利用可能となります。
PIO機能を利用するにはLuaスクリプト言語で記述したファイルをSDカード内に入れて置くだけで
動作します。
SDカードの端子について
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カードの標準型ソケットモジュールです、
これはスイッチサイエンスで購入したのですがぁ...
2016/02/01現在は販売終了となっています、代替えも無しです。
(こちらに代替え有りました、ピン配列は異なります)
こちらの様なソケットは有りますが、これを半田付けしたモジュールが
見当たりません。
尚、秋月電子のこちらは、マイコン等と"SPImode"で接続する場合の
モジュールなので、ここの実験では使用出来ません。(改造すればぁ...)
なのでぇ、実験を行いたい人はソケットを何とか自力で解決しましょう。
(PS.秋月電子のこちらで販売されました使えるでしょう)
(PS2. ”FlashAir DIP IOボードキット”なる物もある様です、これ良いかもぉ)
左が実験時の回路写真で、電源は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"サイトを見ましょう。
(FlashAir Developers"サイトは閉鎖しました、GitHubにサイトの移しの様なこちらが在りました。) *1)
「Lua 5.2 リファレンスマニュアル」の日本語訳が有りますが、解りにくいですNET検索をした方が良いかもぉ。
NOXさんの「Lua基礎文法最速マスター」ブログ辺りで"Lua入門"も読みましょう。
PIO端子で入出力する為のFlashAir専用関数で"fa.pio"の使い方を説明します。
正規なリファレンスマニュアルはこちら(閉鎖)です。(ここに在り) *1)
端子とデータビットの関係
ビット |
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"の正規なリファレンスマニュアルはこちら(閉鎖)です。(ここに在り) *1)
動作させる為の準備
上記での"動作させる為の準備"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ファイル(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の工作には必要ですだぁ、 秋月さん、スイッチサイエンスさん。
PS. こちらで販売が始まっておる様じゃてぇ。 *1)
それにしても、正規サイトの"Lua関数リファレンス"類のマニュアルは、解りにくい、詳しく書いていない
ですでーす、たぶん"Lua職人"でない"事務職人"当たりが書いてそうなかんじぃ、 東芝さん。
次ページ2では、"秋月電子のFlashAir DIP IO ボード"を使ってPIOを操作します。
リンクの見直し(*1) 2020/03/15
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.