センサ命令について byスマートフォン勉強会@関西#14で話をしました (5)
センサ命令についてですが、このスライドとサンプルは用意していたのですが、時間が無くて飛ばしてしまいました。すいません。
Luaridaでは加速度、磁気、傾斜(方位)の3つのセンサデータを取得できます。
ただし、センサ機能を利用するには、最初にセンサを使用可にする必要があります。それがsensor.setdevXXX(Pow)命令です。先ずはじめに使用したいセンサをPow=1として使用可にしてください。
sensor.getGdirection()は加速度センサを使用可にすれば使えます。センサ命令の詳細は、カテゴリーsensorでブログを調べてください。
DEMO1 磁気センサ
磁気センサと書いていますが、これは傾斜(方位)センサを使った方位計のデモです。磁気センサデータからベクトル計算して方位を求めることもできますが、LuaridaではAndroid既存の関数ラップして、sensor.getOrient()を用意しています。下記にデモプログラムを書きます。方位に合わせてドロイド君と文字を回転させるだけです。
------------------------------------------ --コンパス ------------------------------------------ --関数宣言-------------------------------- main={} --mainメソッド workdroiddraw={} -- ドロイドくんをWorkBMPのx,y座標に描きます printscrl={} --スクロールするテキスト表示 compassview={} --方位磁石の描画 --グローバル変数宣言---------------------- --画面サイズ取得 Gwide, Gheight = canvas.getviewSize() LuaridaPath = system.getCardMnt().."/luarida" --luaファイルを保存しているPath ------------------------------------------ mt={} mt.__newindex=function(mtt,mtn,mtv) dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end mt.__index=function(mtt,mtn) dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end setmetatable(_G,mt) --------以下が実プログラム---------------- ------------------------------------------ --スクロールするテキスト表示 ------------------------------------------ function printscrl( str, fontsize, fcolor, bcolor ) local sc --一度、見えないところにテキストを書いて、改行数を求める sc = canvas.drawTextBox( str, 0, Gheight+1, fontsize, fcolor, Gwide ) --画面の絵をワークエリアに取り込みます canvas.getg( 0, fontsize*sc, Gwide-1, Gheight-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --取り込んだ画面をスクロールさせて描きます canvas.putg( 0, 0, Gwide-1, Gheight-fontsize*sc-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --書き出す部分をバックカラーで塗り潰します canvas.drawRect( 0, Gheight-fontsize*sc-1, Gwide, Gheight, bcolor, 1 ) --スクロールしたところにテキストを書きます canvas.drawTextBox( str, 0, Gheight-fontsize*sc, fontsize, fcolor, Gwide ) end ------------------------------------------ -- ドロイドくんをWorkBMPのx,y座標に描きます ------------------------------------------ function workdroiddraw( wx, wy ) local dcol = color(164,198,57) local ecol = color(255,255,255) local x, y = 0, 0 --MainBMPを透明色に塗りつぶす canvas.putCls() --顔を描く canvas.putCircle( x+28,y+23,19,dcol, 1 ) canvas.putCircle( x+20,y+13,1,ecol, 1 ) canvas.putCircle( x+36,y+13,1,ecol, 1 ) --角を描く canvas.putLine( x+16,y+0,x+19,y+5,dcol) canvas.putLine( x+16,y+0,x+20,y+5,dcol) canvas.putLine( x+40,y+0,x+35,y+5,dcol) canvas.putLine( x+40,y+0,x+34,y+5,dcol) --顔をWorkBMPに描画 canvas.getg( x+10,y+0,x+45,y+19,wx+10,wy+0,wx+45,wy+19 ) --再びMainBMPを透明色に塗りつぶす canvas.putCls() --体を描く canvas.putCircle( x+15,y+48,4,dcol, 1 ) canvas.putCircle( x+41,y+48,4,dcol, 1 ) canvas.putRect( x+10,y+22,x+45,y+48,dcol,1 ) canvas.putRect( x+15,y+48,x+41,y+51,dcol,1 ) --足を描く canvas.putCircle( x+22,y+61,4,dcol, 1 ) canvas.putRect( x+18,y+51,x+25,y+61,dcol,1 ) canvas.putCircle( x+34,y+61,4,dcol, 1 ) canvas.putRect( x+30,y+51,x+37,y+61,dcol,1 ) --腕を描く canvas.putCircle( x+52,y+24,4,dcol, 1 ) canvas.putCircle( x+52,y+41,4,dcol, 1 ) canvas.putRect( x+48,y+25,x+55,y+40,dcol,1 ) canvas.putCircle( x+4,y+24,4,dcol, 1 ) canvas.putCircle( x+4,y+41,4,dcol, 1 ) canvas.putRect( x+0,y+25,x+7,y+40,dcol,1 ) --体をWorkBMPに取得する canvas.getg( x,y+20,x+55,y+64, wx, wy+20, wx+55, wy+64 ) end ------------------------------------------ -- 方位磁石描画 ------------------------------------------ function compassview() local c,p,r --local aax,aay local kaku local cx, cy local pi = 3.141592 local x,y,s local angle local droidangle local siro = color(255,255,255) local blue = color(0,0,255) local xs = 56 --ドロイドくんの横幅(表示時) local ys = 65 --ドロイドくんの高さ(表示時) cx = Gwide/2 cy = Gheight/2 toast("ドロイド君をタッチすると終了します") while(true)do --傾斜を取得 angle, p, r = sensor.getOrient() droidangle = 270 - angle kaku = droidangle/180*pi x = math.sin(kaku) y = math.cos(kaku) canvas.putCls( siro ) --背景を白にする canvas.putrotg( cx, cy, droidangle, 0, 0, xs-1, ys-1 ) --ドロイドくん描画 canvas.putTextRotate( "▲", cx+100*x, cy-100*y, droidangle, 26, blue ) canvas.putTextRotate( "北", cx+70*x, cy-70*y, droidangle, 26, blue ) canvas.drawTextRotate( angle, cx-70*x, cy+70*y, droidangle, 26, blue ) --ドロイド君タッチで終了 x,y,s = touch() if( s~=1 )then if( x>=cx-xs/2 and x<=cx+xs/2 and y>=cy-ys/2 and y<=cy+ys/2 )then break end end end end ------------------------------------------ --メインプログラム ------------------------------------------ function main() canvas.putCls() canvas.workCls() -- ドロイドくんをWorkBMPのx,y座標に描きます workdroiddraw( 0, 0 ) --背景を白にする canvas.drawCls( color(255,255,255) ) --傾斜センサ起動 sensor.setdevOrient(1) --方位磁石の描画 compassview() --傾斜センサ終了 sensor.setdevOrient(0) end main() system.exit()
加速度センサデモ
加速度センサを用いたデモです。Androidを傾けた方向にドロイド君が落ちていくというデモです。sensor.getGdirection()という関数は、傾いている方向を取得する関数です。これを用いて傾き方向を取得しているので、ドロイド君は常に足から落ちていきます。デモプログラムを書きます。
------------------------------------------ --加速度 ------------------------------------------ --関数宣言-------------------------------- main={} --mainメソッド workdroiddraw={} -- ドロイドくんをWorkBMPのx,y座標に描きます printscrl={} --スクロールするテキスト表示 --グローバル変数宣言---------------------- --画面サイズ取得 Gwide, Gheight = canvas.getviewSize() LuaridaPath = system.getCardMnt().."/luarida" --luaファイルを保存しているPath ------------------------------------------ mt={} mt.__newindex=function(mtt,mtn,mtv) dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end mt.__index=function(mtt,mtn) dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end setmetatable(_G,mt) --------以下が実プログラム---------------- ------------------------------------------ --スクロールするテキスト表示 ------------------------------------------ function printscrl( str, fontsize, fcolor, bcolor ) local sc --一度、見えないところにテキストを書いて、改行数を求める sc = canvas.drawTextBox( str, 0, Gheight+1, fontsize, fcolor, Gwide ) --画面の絵をワークエリアに取り込みます canvas.getg( 0, fontsize*sc, Gwide-1, Gheight-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --取り込んだ画面をスクロールさせて描きます canvas.putg( 0, 0, Gwide-1, Gheight-fontsize*sc-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --書き出す部分をバックカラーで塗り潰します canvas.drawRect( 0, Gheight-fontsize*sc-1, Gwide, Gheight, bcolor, 1 ) --スクロールしたところにテキストを書きます canvas.drawTextBox( str, 0, Gheight-fontsize*sc, fontsize, fcolor, Gwide ) end ------------------------------------------ -- ドロイドくんをWorkBMPのx,y座標に描きます ------------------------------------------ function workdroiddraw( wx, wy ) local dcol = color(164,198,57) local ecol = color(255,255,255) local x, y = 0, 0 --MainBMPを透明色に塗りつぶす canvas.putCls() --顔を描く canvas.putCircle( x+28,y+23,19,dcol, 1 ) canvas.putCircle( x+20,y+13,1,ecol, 1 ) canvas.putCircle( x+36,y+13,1,ecol, 1 ) --角を描く canvas.putLine( x+16,y+0,x+19,y+5,dcol) canvas.putLine( x+16,y+0,x+20,y+5,dcol) canvas.putLine( x+40,y+0,x+35,y+5,dcol) canvas.putLine( x+40,y+0,x+34,y+5,dcol) --顔をWorkBMPに描画 canvas.getg( x+10,y+0,x+45,y+19,wx+10,wy+0,wx+45,wy+19 ) --再びMainBMPを透明色に塗りつぶす canvas.putCls() --体を描く canvas.putCircle( x+15,y+48,4,dcol, 1 ) canvas.putCircle( x+41,y+48,4,dcol, 1 ) canvas.putRect( x+10,y+22,x+45,y+48,dcol,1 ) canvas.putRect( x+15,y+48,x+41,y+51,dcol,1 ) --足を描く canvas.putCircle( x+22,y+61,4,dcol, 1 ) canvas.putRect( x+18,y+51,x+25,y+61,dcol,1 ) canvas.putCircle( x+34,y+61,4,dcol, 1 ) canvas.putRect( x+30,y+51,x+37,y+61,dcol,1 ) --腕を描く canvas.putCircle( x+52,y+24,4,dcol, 1 ) canvas.putCircle( x+52,y+41,4,dcol, 1 ) canvas.putRect( x+48,y+25,x+55,y+40,dcol,1 ) canvas.putCircle( x+4,y+24,4,dcol, 1 ) canvas.putCircle( x+4,y+41,4,dcol, 1 ) canvas.putRect( x+0,y+25,x+7,y+40,dcol,1 ) --体をWorkBMPに取得する canvas.getg( x,y+20,x+55,y+64, wx, wy+20, wx+55, wy+64 ) end ------------------------------------------ --メインプログラム ------------------------------------------ function main() local px = Gwide/2 local py = Gheight/2 local dw, dh = 56, 65 local siro = color(255,255,255) canvas.putCls() canvas.workCls() -- ドロイドくんをWorkBMPのx,y座標に描きます workdroiddraw( 0, 0 ) --背景を白にする canvas.drawCls( siro ) --ドロイド君を描きます canvas.putg( px, py, px+dw-1, py+dh-1, 0, 0, dw-1, dh-1 ) --フラッシュしないと画面に反映しません canvas.putflush() --加速度センサ起動 sensor.setdevAccel(1) toast("ドロイド君をタッチすると終了します", 1 ) local lx, ly = 0, 0 local fps = system.getSec() + 1/10 while(true)do --加速度を取得 local ax, ay, az = sensor.getAccel() lx = lx + ay px = px + lx if(px<dw/2)then px = dw/2 lx = 0 elseif( px>Gwide-dw/2 )then px = Gwide-dw/2 lx = 0 end ly = ly + ax py = py + ly if(py<dh/2)then py = dh/2 ly = 0 elseif( py>Gheight-dh/2 )then py = Gheight-dh/2 ly = 0 end --背景白にする canvas.putCls( siro ) --重力の向き取得 local gdir = sensor.getGdirection() --ドロイド君描画 canvas.putrotg( px, py, gdir, 0, 0, dw-1, dh-1 ) --画面更新 canvas.putflush() while( fps>system.getSec() )do end --0.01ms待っている fps = system.getSec() + 1/10 --ドロイド君タッチで終了 local x,y,s = touch() if( s~=1 )then if( x>=px-(dw/2) and x<=px+(dw/2) and y>=py-(dh/2) and y<=py+(dh/2) )then break end end end --加速度センサ終了 sensor.setdevAccel(0) end main() system.exit()