LIST
サンプルに磁気センサの数値を 1 秒おきに表示していく プログラムを載せます。
Lin.Acc.Y: 25 m/s2 Lin.Acc.Z: 26 m/s2 MotionX: 27
MotionY: 28 MotionZ: 29 Game rot.X: 30 Game rot.Y: 31 Game rot.Z: 32
Mag. uncal.X: 33 uT Mag. uncal.Y: 34 uT Mag. uncal.Z: 35 uT Gyr. uncal.X: 36 Gyr. uncal.Y: 37 Gyr. uncal.Z: 38 Step count: 39 Step detect: 40
サンプルに磁気センサの数値を 1
秒おきに表示していくSensor Off End
他のセンサといえば、GPS
センサがあります。命令:GPS
書式:GPS ON, GPS OFF
説明:GPS(Global positioning System receiver)の ON/OFF
命令:GET`LOCATION 書式:GET`LOCATION
lat,lon,alt[,bearing,accuracy,speed,time[,provider$]]
説明:GET`LOCATION は、位置デバイスから得られるデータ を返します。ここで位置デバイスとは、GPS に限らず、地理
上のデータを返すサービス一般をさします。GPS は事前にスイッチオンしてから使ってください。
コメント:この命令は Android
端末だけ対象です。(例)
GET`LOCATION x,y,a
サンプルプログラム
センサを使うので PC のひとたちはごめんなさい。楽しめ
ません。Android でお楽しみのひとたちは、これをネタにし
て色々楽しんでください。ここで使っているグラフィック
ス関係の命令は次章で説明します。
磁場測定
リアルタイムにグラフを表示して、最終的にデータを ファイルに保存するプログラムです。
センサを備えてれば温・湿度や気圧も測れますね。加速
度計もあるので振動解析もできます。ただ測定間隔をどこまで狭められるか、センサの追従性がどの程度か、細かい
諸元はわかりません。数値として表示されてるからといって、その値が正しいのかは判断できませんから。汎用携帯
端末のセンサなので、ちゃんとした計測機器ではなく、ツール程度と受け止めていただきたいと思います。
プログラムの基本は SensorOn して、ループで回して、終
了したら SensorOff するというものです。ループの中でDelay 命令(または Pause 命令)を入れて測定時間間隔を決め ています。
加速度計はわりとキビキビ反応しました。手でカシャカ
シャ動かすとそれに応答してます。まあ、手で振る程度の 確認なのでそんなに早い振動まで試せていません。携帯端 末として使う範囲ですし、せいぜい 0.01 秒(=100Hz)程度が 信頼できる値じゃないでしょうか。ですのでエンジンや モーターの振動とかは観察できるかな?(X11-BASIC)
' jibanyan3x.bas
' Display Gauss Sensor xyz with Array form and FileI/O
Dim T$(2048), GMX(2048), GMY(2048), GMZ(2048) ! 配列を 2048個分確保 Count = 32 ! 測定個数を仮に初期値32個にしておく
dt = 0.5 ! 測定時間間隔
YX0 = 0 ! プロット開始初期値x YY0 = 0 ! プロット開始初期値y YZ0 = 0 ! プロット開始初期値z filname$ = "gausens.dat"
' センサのスイッチを ON Sensor On
' 画面設定 ShowPage Pause 1
Get_Geometry 1, bx, by, Width, Height If Height > 320
' big screen
brafan = Height / 5 inpfac = 0.75
inphf = 0.8 depth = 6 density = 5 Else
' small screen
brafan = Width / 3.2 inpfac = 1
inphf = 1 depth = 4 density = 3 Endif
Clearw
' 座標系の設定。上限2048個として画面の横幅を測定個数にする。
If Width > 2048 Then Count = 2048
Else
Count = Width Endif
' X軸の描画と測定条件の表示 Y0 = Height / 2
Line 0, Y0, Width, Y0
Wsize$ = "Width=" + Str$(Width) + " Height=" + Str$(Height) + " dt="
+ Str$(dt)
Deftext 0, 0.1, 0.1, 0 LText 0, 0, Wsize$
' センサーの値をグラフィクス For i = 1 To Count
Delay dt ! センサ on から起動するまで時間かかることがあるので先に Delay を置いた。
Disp$ = Str$(i) + "/" + Str$(Count) White = Get_Color(64000, 64000, 64000) Color White
Text 0, 25, Disp$ ! 更新するテキストは"Text"命令を使うのが便利 T$(i) = Time$
' chX
GMX(i) = Sensor(10) YX1 = GMX(i)
Red = Get_Color(64000, 0, 0) Color Red
Line i - 1, (YX0 * 5) + Y0, i, (YX1 * 5) + Y0 YX0 = YX1
' chY
GMY(i) = Sensor(11) YY1 = GMY(i)
Green = Get_Color(0, 64000, 0) Color Green
Line i - 1, (YY0 * 5) + Y0, i, (YY1 * 5) + Y0 YY0 = YY1
' chZ
GMZ(i) = Sensor(12) YZ1 = GMZ(i)
Blue = Get_Color(0, 0, 64000) Color Blue
Line i - 1, (YZ0 * 5) + Y0, i, (YZ1 * 5) + Y0 YZ0 = YZ1
ShowPage Next i
' センサのスイッチを OFF します。
Sensor Off
' 色を戻しておく
White = Get_Color(64000, 64000, 64000) Color White
' 測定データを保存するか
Print "<< Measure Complete >>"
Input " Data Save (Y/N) "; Ans$
If Ans$ = "Y" or Ans$ = "y" Then Open "O", #1, filname$
For i = 1 To Count
Print #1, T$(i); ","; GMX(i) Using "+##.##"; ","; GMY(i) Using
"+##.##"; ","; GMZ(i) Using "+##.##"
Next i Close #1 Endif
End
(Result)
重力センサでコロコロ
Android の Sensor()命令の応用です。Android の傾きセン サ値を読んで、端末の傾いた方向へ線が伸びるようにして ます。
(X11-BASIC)
' ballcororox.bas ' 2015/12/23
' グラフィクス画面設定 ShowPage
Pause 1
Get_Geometry 1, bx, by, Width, Height If Height > 320 Then
' big screen
brafan = Height / 5 inpfac = 0.75
inphf = 0.8 depth = 6 density = 5 Else
' small screen
brafan = Width / 3.2 inpfac = 1
inphf = 1 depth = 4 density = 3 Endif
Clearw
' Print "-Width,Height = "; Width; ","; Height x0 = Width / 2
y0 = Height / 2 Sensor On
Grau = Get_Color(64000, 64000, 64000) ! お好みの色で Color Grau
Do
MouseEvent x If x > 0 Break Endif
dx = Sensor(6) dy = Sensor(5) x1 = x0 + dx y1 = y0 - dy If x1 < 0 Then
x1 = 0
Else If x1 > (Width - 1) Then x1 = (Width - 1)
Endif
If y1 < 0 Then y1 = 0
Else If y1 > (Height - 1) Then y1 = (Height - 1)
Endif
Line x0, y0, x1, y1 x0 = x1
y0 = y1 ShowPage Delay 0.2 Loop
Sensor Off Stop
'Quit End
グラフィクス描画
グラフィック描画するのに必要な命令を解説します。こ こでは、これだけ知ってれば結構なことができるという命 令を紹介します。少なくとも、この章に掲載するサンプル プログラムのグラフィクス関連の命令はこれだけでまか なっています。
パソコン版の人ならわかりやすいのですが、X11-BASIC は
起動するとテキスト文字を入力するプロンプトが表示されます。この画面を X11-BASIC では、インタラクティブモー ドと呼んでいます。これに対してグラフィックスウィンド ウは、グラフィックコマンドが実行されると自動的に開か れます。Android 版の X11-BASIC を使ってる人は、Android OS がシングルウィンドウなので、テキストでやりとりする インタラクティブモードの上にグラフィックスウィンドウ が被さってる状態だと考えていただければよいと思います。
ですのでグラフィックス命令がないプログラムでなら、テ
キストコンソール下だけでプログラムを実行されます。標準状態なら、640x400 ドットの画面上に Line や Circle
や Box を描画ます。Get_Color()と Color 命令を使えば、総
天然色で出力することができます。実行したグラフィックス命令は、ShowPage コマンド実行の後で画面に反映されま
す。逆に言えば、ShowPage が実行されないと画面上は特に
変化がありません。これによって高速なアニメーションを 可能にします。ビットマップによるグラフィックス表示を可能にするた め、文字列に矩形のグラフィック領域の内容を入れたり、
文字列からグラフィック画面にビットマップデータを表示 させるコマンド Get、Put があります。Get、Put で使用され るファイル形式は、標準ビットマップのため、外部で作成 したアイコンを使用することができます。透過性やアル ファチャンネルもサポートされてます。ちなみにグラ
フィックス画面には日本語文字はありません。英語だけに なります。
命令:Openw 書式:Open n
説明:グラフィックウィンドウを開きます。最大で 16
枚のウィンドウを開くことができます。グラフィクスの出力は すべて、最後に開いたウィンドウに描かれます。Openw は複
数のウィンドウを切り替えることに使えます。最初に開くウィンドウはデフォルトでは自動でウィンドウ1になりま す。
命令:Closew
書式:Closew [<num>]
説明:グラフィックウィンドウを閉じます。数字が与えら れれば、その番号が付与されているウィンドウを閉じます。
次のグラフィックコマンドが実行されるとウィンドウは再
び開かれます。
命令:Clearw
書式:Clearw [<num>]
説明:グラフィックウィンドウをクリアします。数値が与 えられれば、それに対応する番号のウィンドウをクリアし ます。
命令:ShowPage 書式:ShowPage
説明:ShowPage はグラフィクス出力を画面に反映させます。
通常、ShowPage を実行しない限りグラフィクス出力はウィ
ンドウ上に反映されません。ただし、TomTom
端末は即座に 反映されるようになってます。命令:Get_Geometry
書式:Get_Geometry <winnr>, <varx%>, <vary%>, <varw
%>, <varh%>
説明:Get_Geometry はウィンドウサイズを返します。この コマンド実行前にウィンドウは開かれていなければなりま せん。
(例)
Get_Geometry 1, bx, by, Width, Height
関数:Color_RGB()
書式:c% = Color_RGB(r, g, b [, a])
説明:Color_RGB()は色相を定義する値を返します。RGB
値は 0(暗)から 1.0(明)までです。返り値は環境のグラフィク ス環境に依存します。8
ビットカラーセル、またはフリーセルなしの場合、色を指定した内容に最も近く設定でします。
オプションパラメータ a は、アルファ(0...1)値です。
(例)
yellow = Color_RGB(1,1,0) Color yellow
関数:Get_Color()
書式:<num-result> = Get_Color(<red-value>,
<green-value>, <blue-value>)
説明:Get_Color()は RGB で表現される色相値を返します。
数値は 0(暗)から 65535(明)までです。ここで定義した色相
を COLOR
へ渡します。注:この関数はなるだけ使わないで、なるだけ Color_RGB()を使うようにして ください。
(例)
yellow = Get_Color(65535,65535,0) Color yellow
命令:Color
書式:Color <foreground-color> [, <background-color>]
説明:グラフィックウィンドウの前面色を指定します。オ プションで背景色も指定できます。通常 Color 命令は
Color_RGB()関数とペアで使います。
(例)
yellow = Color_RGB(1,1,0) blue = Color_RGB(0,0,1) Color yellow,b lue
命令:Line
書式:Line <x1>, <y1>, <x2>, <y2>
説明:座標(x1, y1)から(x2, y2)への直線を描画します。
線の太さなどのパラメータは Defline で定義できます。
(例)
Line 0, 0, 639, 199
命令:Circle
書式:Circle <x>, <y>, <r> [, <w1>, <w2>]
説明:円を描画します。x と y は円の中心座標、r は円の半
径です。オプションで円弧にすることもできます。w1 は描 画開始角度で w2 が終了角度です。(例)
Circle 100, 100, 50
命令:Deftext
書式:Deftext flag%, width, height, angle
説明:Ltext 命令で使われるラインフォントの設定をします。
スタイル、回転、サイズを定義します。色は Color で、線 種は Defline で定義してください。
flag% : テキストスタイル 0=normal 1=monospace angle : 回転角
width and height : パーセンテージで指定 (100%が 100 Pixel フォントにな ります)
(例)
Deftext 0, 0.1, 0.1, 270
命令:Ltext
書式:Ltext x,y,t$
説明:座標 x, y にテキストを描画します。Ltext コマンド はライン描画テキストです。フォントスタイルや線種は Deftext や Defline 命令で定義してください。
(例)Ltext 10, 10, "test"
命令:Text
書式:Text x, y, t$
説明:t$で与えられるテキスト(Bitmap Font)文字を座標 x,
y に描画。テキスト内容を更新する処理のときはこれを使う
ほうが便利。
(例)Text 0, 25, "test"
(X11-BASIC)
' Show the complete ASCII Font Setfont "*writer*18*"
Color Get_Color(65535, 10000, 10000) For x = 0 to 15
For y = 0 to 15
Text 320 + 16 * y, 20 + 24 * x, Chr$(y + 16 * x) Next y
Next x Showpage End
サンプルプログラム
グラフのテンプレート
典型的な時系列グラフのテンプレート(ひな型)として、
ロジスティック写像の時系列グラフを描画します。
(X11-BASIC)
' timeseriesx.bas Count = 100
A = 3.8
' 描画ウィンドウの表示 Openw 1
' 描画セッションの開始