コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

センサ命令について 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()