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

概要

UDP通信を使ってScratchと連携し,Airio Playのボタン情報を送信します.
ブロードキャストを使用しているため,IPアドレスの指定が不要です.
遠隔センサープロトコルを用いているため,Scratchからの許可が必要です.
詳しくはこちらをご覧ください.
遠隔センサとは - おまけ程度のツール置き場 https://sites.google.com/site/gpsnmeajp/scratch/yu...

関連項目:Lua: Scratchとの連携


ライセンス

WTFPLです。

注意

  • 実行にはAirio Playまたは互換基板が必要です.
詳細はこちら→Airio Play
購入はこちら→Airio Play 家電のケンちゃん
  • 最新のFlashAir W-04でのみ動作します
  • Scratch 1.4にのみ対応しています
  • 半角空白は含めますが,日本語は含められません
  • ファイアーウォールの許可が必要です
  • UDPのため送信のみで受信は対応していません(Scratchの変化を取り込むことができません)
  • ブロードキャストの場合同じネットワーク内のすべてのScratchに送信されます.(許可していない場合は受信しません.また複数台に1台から情報を送信できるということでもあります)

遠隔センサ接続を有効にしてください.(右クリックで出現します)

Scratchスクリプト

一度Luaスクリプトを実行し,遠隔センサ接続に成功すると,センサー変数の候補が自動で増えます.

Luaスクリプト

ブラウザから実行するなり,自動起動設定するなりしてください
--IPアドレス文字列から32bitIPアドレス数値に変換
function ipadr2ipnum(ipadr)
  local ip_itr = string.gmatch(ipadr, "%d+")
  local ip = 0
  for i=1,4 do
    ip = bit32.lshift(ip,8)
    ip = bit32.bor(ip,tonumber(ip_itr()))
  end  
  return ip
end

--32bitIPアドレス数値からIPアドレス文字列に変換
function ipnum2ipadr(ipnum)
  local ipadr=""
  for i=1,4 do
    ipadr = tostring(bit32.band(ipnum,0xFF)) .. "." .. ipadr
    ipnum = bit32.rshift(ipnum,8)
  end  
  return string.sub(ipadr,0,-2)
end

--Scartchへ変数を設定する
function ScratchSetValue(ip,var,value)
  fa.udp(broadcast_adr,42001,"message","sensor-update \""..var.."\" \""..value.."\"")
end

--Scartchへメッセージを送信する
function ScratchSendMessage(ip,msg)
  fa.udp(broadcast_adr,42001,"message","broadcast \""..msg.."\"")
end

--サンプル--

--現在のFlashAirのIPアドレスとサブネットマスクを取得し、数値に変換
ip,sub,gate = fa.ip()
ip_num = ipadr2ipnum(ip)
sub_num = ipadr2ipnum(sub)

--ブロードキャストアドレスを計算し、文字列に戻す
broadcast_num = bit32.bor(ip_num,bit32.bnot(sub_num))
broadcast_adr = ipnum2ipadr(broadcast_num)

--ブロードキャストして受信可能なすべてのScratchへ変数を設定
ScratchSetValue(broadcast_adr,"Hello","This is message from FlashAir!")
--ブロードキャストして受信可能なすべてのScratchへメッセージ送信
ScratchSendMessage(broadcast_adr,"Run Function")

print("OK")


--ボタン情報を取得→送信のループ
--UDP送信には時間がかかるので待ち時間を入れる必要がある
while true do
  s,dat = fa.pio(0,0)
  if (bit32.band(dat , 0x07)==0x6)then
    --up
    ScratchSetValue(broadcast_adr,"up","1")
  else
    ScratchSetValue(broadcast_adr,"up","0")
  end
  sleep(10)
  if (bit32.band(dat , 0x07)==0x5)then
    --down
    ScratchSetValue(broadcast_adr,"down","1")
  else
    ScratchSetValue(broadcast_adr,"down","0")
  end
  sleep(10)
  if (bit32.band(dat , 0x07)==0x1)then
    --left
    ScratchSetValue(broadcast_adr,"left","1")
  else
    ScratchSetValue(broadcast_adr,"left","0")
  end
  sleep(10)
  if (bit32.band(dat , 0x07)==0x2)then
    --right
    ScratchSetValue(broadcast_adr,"right","1")
  else
    ScratchSetValue(broadcast_adr,"right","0")
  end
  sleep(10)
  if (bit32.band(dat , 0x10)==0x0)then
    --b
    ScratchSetValue(broadcast_adr,"b","1")
  else
    ScratchSetValue(broadcast_adr,"b","0")
  end
  sleep(10)
  if (bit32.band(dat , 0x08)==0x0)then
    --a
    ScratchSetValue(broadcast_adr,"a","1")
  else
    ScratchSetValue(broadcast_adr,"a","0")
  end
  sleep(10)
  collectgarbage()
end

コメントをかく


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

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

Menu

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

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です