東芝から発売されているFlashAirを用いた開発を行う人々向けのまとめwikiです。※本wikiは東芝及びフィックスターズ、キオクシアとは何の関係もありません。お問合わせは管理者へお願いします。

最新の情報はFlashAir Developersをどうぞ
W-04特設ページ

FlashTools Pocket Reference W-04

公式に掲載されている関数

関数名機能記載ミス、記載不足等に対する正しいと思われる使い方
requestHTTPリクエストの発行(ポート番号対応)
HTTPGetFileHTTPを使用したファイルのダウンロード
pioSDインターフェースのPIO制御
ftpFTPを使用したファイルのアップロード、ダウンロード
hashハッシュの計算
ScanSSIDスキャンの実行事前に fa.Disconnect() を実行する
GetScanInfoSSIDスキャン結果の取得numは0〜count-1を指定する。電波の強い順に並んでいる
ConnectSTAモードで無線LANの有効化
EstablishAPモードで無線LANの有効化
Bridgeインターネット同時接続モードで無線LANの有効化
Disconnect無線LANの停止
sleep指定時間(ms単位)だけスクリプトの実行を停止します
sharedmemory共有メモリからデータを読み込み或いは書き込みを行います
SetCertルート証明登録
strconvert文字列変換sjis2utf8、utf82sjisのどちらも正常に動作しない
SetChannel無線チャネルを設定する
MailSendメール送信を行う
pingpingを発行する
result = fa.ping(ip)
result: 1 = Success , nill = Error
pwmPWM(Pulse Width Modulation)機能 2019/6に公開
spiSPI操作を行うperiodの範囲は 1〜。クロック周波数の最大は1.6MHz
dataには、num, string, table(from [1] to [#table]) が指定できる
ビット割当
CMD : MOSI(out)
DAT0: SCLK(out)
DAT1: /SS(out)
DAT2: MISO(in)
ReadStatusRegiSDIOステータスレジスタを読みだす
removeファイルの削除
renameファイル名変更
ipIPアドレスを設定
WlanLink接続状態
ConnectedSTA接続子機数とIP・MAC一覧
websocketWebSocketクライアント?
watchdog("start")WatchDogのタイマースタート
watchdog("stop")WatchDogのタイマー停止
watchdog("event")WatchDogのタイマーリセット
watchdog("status")WatchDogの状態取得
i2cI2Cマスタfreqにはnumberを指定する。例. freq = 400
type="binary" 形式で読めるのは16バイトまで
17バイト以上は
res, str = fa.i2c{mode="read", bytes=24, type="string"}
d1, d2, d3, ... = str:byte(1, #str)
とする
テーブルで受けるときは
dat = {str:byte(1, #str)}
とすればよい
PIOのビット割当はDAT1
search最新ファイル検索
serialUART通信機能 2019/6に公開
control("time")日時(16bit)メモ
control("fioget")Wi-Fi接続オンオフ取得
control("fioset")Wi-Fi接続オンオフ(CONFIGに従う)
control("hid_set_pass")秘匿領域への保存のためのパスワードを設定
control("hid_change_pass")秘匿領域に設定したパスワードの変更
control("hid_store")スクリプトを秘匿領域へ保存
control("hid_get")秘匿領域に保存したスクリプトを取得
control("hid_clear")保存したスクリプトファイルを全て削除
control("hid_hash")ハッシュ文字列を作成

公式に掲載されていない関数

getStatus接続種別取得
IBSSアドホックモードで無線LANの有効化
SetCurrentTime現在時刻をFAT形式で設定する
StartWPSWPS設定を開始する
ReadResponse(iSDIOのレスポンスを読む?)
SetSecretCode(不明)
GetSecretCode(不明)
ClrSecretCode(不明)
SetRmHeader(不明)
sysclk(change System clk 0, 10, 20, 80, 160, 213)
task(マルチタスク管理?)
reboot再起動する
udpUDP通信を行う
stackスタックの使用量らしきものを得る

ライブラリ

math数学ライブラリ
osOSライブラリ(非公式)
os.clock()はW4.00.00では 1000秒=1、W4.00.03では 1秒=1なので注意
debugdebugライブラリ(非公式)
corutinecorutineライブラリ

解説

getStatus接続種別取得
result = fa.getStatus()
result: "Bridge"/ "AP_CONNECTED" / "AP" / "STA" / "NO CONNECTED"
IBSSアドホックモードで無線LANの有効化
result = fa.IBSS(ssid, networkkey, encmode)
result: IP Address(string)
SetCurrentTime現在時刻をFAT形式で設定する
SetCurrentTime(FAT_YMD_bits,FAT_HMS_bits)
StartWPSWPS設定を開始する
ReadResponse(iSDIOのレスポンスを読む?)
SetSecretCode(不明)
GetSecretCode(不明)
ClrSecretCode(不明)
SetRmHeader(不明)
sysclk(不明)
task(マルチタスク管理?)
reboot再起動する。その際、CONFIGが読み直される。
fa.reboot()
udpUDP通信を行う
stackスタックの使用量らしきものを得る。
result = fa.stack()
result: 81%

UDPについて

UDP送信
fa.udp("ホスト名",ポート番号,"message","メッセージ内容") でUDP送信らしい.
fa.udp("ホスト名",ポート番号,"file","ファイルパス") でUDPでファイル内容を送信らしい.
両者ともに,UDPテストツールで受信に成功した.

短時間で複数送信しようとしたところ,次のfa.udpで,UDP : already started.や,UDPtask is busy.が出たことから,
非同期に送信が行われている様子.

192.168.0.255 のディレクテッドブロードキャストはできたが
255.255.255.255のリミテッドブロードキャストはできなかった.
ファイル送信
stat,msg = fa.udp("192.168.0.255",4000,"file","/FTLE/run.lua")
print(stat,msg)
メッセージ送信
stat,msg = fa.udp("192.168.0.255",4000,"message","Hello World")
print(stat,msg)
UDP受信
--開始
stat,msg = fa.udp({mode="recv",address="192.168.0.255",port=4000, message="Hello World"})
print(stat,msg)

--受信したデータを取り出す方法は今のところ不明

--停止(だと思うがフリーズ)
stat,msg = fa.udp({mode="stop"})

OSライブラリについて

シェルアクセス
print "HTTP/1.1 200 OK"
print ""

function runSell(comm)
	a,b,c,d,e,f,g = os.execute(comm)
--	print(a,b,c,d,e,f,g)

--print("\n--output--")
	res = fa.request("http://192.168.0.1/eva.cgi")
	print(res)
end


runSell("help")
runSell("version")
runSell("fat ls")
runSell("fat")
clock
os.clock()は1000秒=1っぽい?⇒ W4.00.03では、1秒=1になりました。

corutine

コルーチンが使えるようになったので,協調的マルチタスクが使えるようになりました.

協調的マルチタスクとは,各タスクが自主的に制御を短い間隔で返納する方式です.
つまり,各関数が「待ち時間を入れたい」とか「ここは忙しくない」といったタイミングで
処理の返却を宣言し,他の処理が終わったら続きから再開される,というものです.

コルーチンは,関数の途中で処理をやめ,あとからそこに戻ってくることができます.
ローカル変数等ももちろんそのまま使えます.

下の例では,
  • taskSleepが一定時間待ち,その間は他のタスクに処理を回す
  • taskYieldは処理を返すが,他の処理が終わったら即座に再開したい
  • taskExitは処理を終了したい
という場合に使います.

※taskSleepの代わりにSleepを使うと,時間が正確になる代わりに,
 他の処理がブロックされたままになります

FlashAirでは仕様上,使いみちが限られ,マイコン的に使うときくらいにしか使えませんが
例えば液晶画面を更新しつつ,ボタン入力も受け付け,といった用途に使用できます.
簡易版コード
print "HTTP/1.1 200 OK"
print ""
print "Hello World"

task1 = function()
	local i=0
	for i=0,10 do
    		print("[task1]A:"..i)
    		taskSleep(20)
    		print("[task1]B:"..i)
    		taskSleep(120)
    end
    taskExit()
end

task2 = function()
	local i=0
	while true do
    		print("[task2]:"..i)
    		taskSleep(70)
    		i=i+1
    	end
end

--main rutine
function main()
    local end_time = (1/1000) + os.clock()  --1sec=0.001 この場合1秒間実行する
  
    local co_task1 = coroutine.wrap(task1)
    local co_task2 = coroutine.wrap(task2)

    local co_time1 = 0
    local co_time2 = 0

    print("start")
  
    while true do    
    	if((co_time1 < os.clock()))then
		co_time1 = co_task1()
	end
    	if((co_time2 < os.clock()))then
		co_time2 = co_task2()
	end
    
    	if(end_time < os.clock())then break end
	sleep(1) --SystemThread
	end

    print("end")
end

function taskSleep(t)
    coroutine.yield((t/1000000) + os.clock())
end
function taskYield()
    coroutine.yield(0)
end
function taskExit()
    coroutine.yield(1/0) --Inf
end

--os.clock()は1000秒=1っぽい?
main()
ガチな方
print "HTTP/1.1 200 OK"
print ""
print "Hello World"

task1 = function()
	local i=0
	for i=0,10 do
    	print("[task1]:"..i)
    	sleep(20)
    	--yield
    end
end

task2 = function()
	local i=0
	while true do
    	print("[task2]:"..i)
    	sleep(70)
    	i=i+1
    end
end

--main rutine
function main()
  	local end_time = (1/1000) + os.clock()  --1sec=0.001 この場合1秒間実行する
  
	local co_task1 = coroutine.create (task1)
	local co_task2 = coroutine.create (task2)

	local co_time1 = 0
	local co_time2 = 0

  	print("start")
  
	while true do
--    	print("system:"..os.clock())
--    	print("   co1:"..co_time1)
--    	print("   co2:"..co_time1)
    
    	if((coroutine.status(co_task1) == "suspended")and (co_time1 < os.clock()))then
			stat,co_time1 = coroutine.resume(co_task1)
		end
    	if((coroutine.status(co_task2) == "suspended")and (co_time2 < os.clock()))then
			stat,co_time2 = coroutine.resume(co_task2)
		end
    
    	if(end_time < os.clock())then break end
    	sleep(1) --SystemThread
	end

    print("end")
end

--sleepをオーバーライド
sleep = function(t)
    coroutine.yield((t/1000000) + os.clock())
end
function yield()
    coroutine.yield(0)
end



--os.clock()は1000秒=1っぽい?
main()

FlashTools Pocket Reference W-03

公式に掲載されている関数

requestHTTPリクエストの発行
HTTPGetFileHTTPを使用したファイルのダウンロード
pioSDインターフェースのPIO制御
ftpFTPを使用したファイルのアップロード、ダウンロード
hashハッシュの計算
ScanSSIDスキャンの実行
GetScanInfoSSIDスキャン結果の取得
ConnectSTAモードで無線LANの有効化
EstablishAPモードで無線LANの有効化
Bridgeインターネット同時接続モードで無線LANの有効化
Disconnect無線LANの停止
sleep指定時間だけスクリプトの実行を停止します
sharedmemory共有メモリからデータを読み込み或いは書き込みを行います
SetCertルート証明登録
strconvert文字列変換
SetChannel無線チャネルを設定する
MailSendメール送信を行う
pingpingを発行する
result = fa.ping(ip)
result: 1 = Success , nill = Error
spiSPI操作を行う
ReadStatusRegiSDIOステータスレジスタを読みだす
removeファイルの削除
renameファイル名変更
ipIPアドレスを設定
WlanLink接続状態

公式に掲載されていない関数

ConnectNum接続台数取得
getStatus接続種別取得
IBSSアドホックモードで無線LANの有効化
SetCurrentTime現在時刻をFAT形式で設定する
StartWPSWPS設定を開始する
ReadResponse(不明)
SetSecretCode(不明)
ClrSecretCode(不明)
SetRmHeader(不明)

解説

requestHTTPリクエストの発行
b, c, h = fa.request(url [, method [, headers [, file [, body [, bufsize [, redirect]]]]]])
b, c, h = fa.request{url="http://example.com/",file="Hello.txt"}
HTTPGetFileHTTPを使用したファイルのダウンロード
result = fa.HTTPGetFile(uri, filepath [, user, pass])
result: 1 = Success , nill = Error
pioSDインターフェースのPIO制御
s, indata = fa.pio(ctrl, data)
ctrl : 1 = OUTPUT, 0 = INPUT
data/indata : 1 = HIGH, 0 = LOW
s: 1 = OK , 0 = Error
ftpFTPを使用したファイルのアップロード、ダウンロード
result = fa.FTP(cmd, uri, filename)
result: 1 = Success , nill = Error
hashハッシュの計算
hash=fa.hash(name, data, key)
name: string(md5,sha1,sha256,hmac-sha256)
hash: string(HEX)
ScanSSIDスキャンの実行
count = fa.Scan([ssid])
disconnect状態でのみ有効。
GetScanInfoSSIDスキャン結果の取得
ssid, other = fa.GetScanInfo(num)
num: index
ConnectSTAモードで無線LANの有効化
fa.Connect(ssid, networkkey)
EstablishAPモードで無線LANの有効化
fa.Establish(ssid, networkkey, encmode)
encmode: 0=Open, 1=Open/WEP, 2=Shared/WEP, 3=WPA TKIP, 4=WPA AES, 5=WPA2 TKIP, 6=WPA2 AES
Bridgeインターネット同時接続モードで無線LANの有効化
fa.Bridge(ssid, networkkey, encmode, brgssid, brgnetworkkey)
Disconnect無線LANの停止
fa.Disconnect()
sleep指定時間だけスクリプトの実行を停止します
sleep(millisec)
sharedmemory共有メモリからデータを読み込み或いは書き込みを行います
result = fa.sharedmemory(command, addr, len, wdata)
addr: [0 - 511]
len: [0 - 512]
wdata: string
command: "write", "read"
result: Write > 1 = Success , nill = Error
result: Read > (Read string) = Success , nill = Error
SetCertルート証明登録
result = fa.SetCert(filename)
result: 1 = Success , nill = Error
strconvert文字列変換
result = fa.strconvert(format, orgstr)
format: "sjis2utf8" or "utf82sjis"
result: (Converted string) = Success , nill = Error
SetChannel無線チャネルを設定する
fa.SetChannel(channelNo)
MailSendメール送信を行う
result = fa.MailSend(from,headers,body,server,user,password, attachment, ContentType)
fa.MailSend {from = "a@a.jp", headers = "To:..."}
result: "MailSend is success." or "Error: It failed to send."
spiSPI操作を行う
result = fa.spi(command,data)
command: "init", "mode", "bit", "write", "read"
data: num, string, table(from [1] to [#table])
result: write > num(Received data)
result: read > num(Received data)
result: other > status(?)
dataにどの型が使えるかは公式に説明がないため、実験での確認結果を記載。
removeファイルの削除
fa.remove(fname)
renameファイル名変更
fa.rename(src,snk)
変更先のファイル名が重複している場合は(1)などが自動で付加される。
WlanLink接続状態
result = fa.WlanLink() 
result: 1=Connected, nil = Disconnected
ConnectNum接続台数取得
result = fa.ConnectNum()
result: num = (How many Connected Terms)
getStatus接続種別取得
result = fa.getStatus()
result: "Bridge"/ "AP_CONNECTED" / "AP" / "STA" / "NO CONNECTED"
IBSSアドホックモードで無線LANの有効化
result = fa.IBSS(ssid, networkkey, encmode)
result: IP Address(string)
ReadStatusRegiSDIOステータスレジスタを読みだす
result = fa.ReadStatusReg()
SetCurrentTime現在時刻をFAT形式で設定する
SetCurrentTime(FAT_YMD_bits,FAT_HMS_bits)
StartWPSWPS設定を開始する
ReadResponse(不明)
SetSecretCode(不明)
ClrSecretCode(不明)
SetRmHeader(不明)
reboot再起動する。その際、CONFIGが読み直される。
fa.reboot()
sysclk???
stackスタックの使用量らしきものを得る。
result = fa.stack()
result: 81%

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

スマートフォンの方は画面下部よりPC版に切り替えることをおすすめします

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です