a. Sphero
スマートフォンで操作するモバイルゲームシステムSphero を利用した演習を行う。
SPHEROのWebサイト
Spheroの紹介Blog記事 http://tech.tmd45.jp/entry/2013/12/01/001418
今回利用するアプリ
ORBBASIC
http://www.gosphero.com/tag/orbbasic/
アプリはiOS と Android 用に無料のものがある。各自でDLしてインストールする。
ORBBASICの他に、基本操作アプリ Shero も動作確認用にインストールする。
スマートフォンと Sphero は Bluetoothを使って通信するので、以下の手順で接続をする。
Spheroとスマートフォンの接続:
Spheroの起動:
充電済みのSpheroを手に取り、2度コツコツと叩く。
LEDが光り起動する。
Spheroの接続:
各OSの設定メニューから、Bluetooth接続の画面を出し、BTを有効にする。
Spheroとペアリングで接続する。
Spheroには、Bluetoothの接続名の他、アプリ用の名前が付いている。
Bluetooth の接続名 と Spheroの名前:
Sphero-RGB さっくん
Sphero-YGB ぞっくん
今回は2台のSphero を用意した。
演習者を2グループに分けて割り当てるので、グループ内で交代して利用すること。
以下のどちらの方法で交代してもOK。
・交代するたびに、Spheroと接続を切り、別のデバイスと接続して利用
・ペアリング済みのデバイスを固定し、何らかの方法でプログラムを渡して利用
授業用の掲示板に orbBASICのコードを書込み、コピー&ペーストして利用するなど。
動作確認:
・基本アプリ Sphero でリモコン操作で Spheroを操縦し動作を確認する。
・orbBASIC でサンプルプログラムを実行する。
android版は、アプリの電波アイコンから spheroと接続する。
iOS版はアプリ起動の前にOSの設定から接続する。
サンプルプログラムは、Spheroに関連したものとorbBASICの動作確認のみでSpheroを操作しないものがある。
サンプルプログラムの概略:
20cmGeofence.bas
20cm移動したら色を変える。
(このプログラムを実行したまま、Spheroをジョイスティックで操縦して動作確認)
AutoDrive.bas
振動を与えたら、ランダムに色を変えながらランダムに移動をし続ける。(Spheroを観察)
CrazyColor.bas
5秒間、LEDをチカチカ表示。LEDの点滅色はビット演算で巡回させる。(Spheroを観察)
FastPrimes.bas
3~200までの間の素数を求め、実行時間を計測する。(コンソールに結果表示)
ReprocessedDriving.bas
色を変えながら、ランダムに基準方向が左右90度の範囲で数秒間ごとに再設定される。
(このプログラムを実行したまま、Spheroを
ジョイスティックで操縦して動作確認)
SlowPrimes.bas
3~200までの間の素数を求め、素数が見つかる度にLEDの色を変えて通知する。(Spheroを観察)
TXObserver.bas
Spheroが回転したときに色が変わる。
(このプログラムを実行したまま、Spheroを
ジョイスティックで操縦して動作確認)
orbBASICについて:
80年代風の 非構造化BASIC 。
ソースコードは、行単位で、行番号をプログラマ自身が割り当て管理する。
プログラムは行番号が小さい順に実行される。
行番号が10,20,30と10単位で割り振ってあるのは、20行と30行の間にコードが必要になった際、25行を作成してコードを挿入出来るようにするためである。
行番号が足りなくなった場合は、番号を割り当て直してコードを整理する必要がある。
この時代のBASICは、基本的に GOTO 行番号 の形式で、プロフラムの実行順を制御する。C言語など現代のほとんどの言語が採用している プログラムの ブロック 構造は 利用できない。
アルゴリズムでブロック構造が必要になる場合は、IF コマンドと GOTO コマンドを組み合わせてプログラマが実装する必要がある。
例)Aの値に応じて、ブロック1 とブロック2 の処理に分岐し、結果を表示
10 Aの値を計算
20 IF A> 20 THEN GOTO 60
30 ブロック1
40 ブロック1
50 GOTO 80
60 ブロック2
70 ブロック2
80 PRINT A
orbBASIC リファレンスマニュアル(英文)
https://s3.amazonaws.com/docs.gosphero.com/api/Sphero_orbBasic.pdf
概略:
書式
行番号 空白 コマンド
ユーザ変数:
大文字小文字の区別なし。
A-Y の25個。
配列 Z(1)~Z(25)の25個。
合計50個。すべて 32bit符号付き整数値。範囲( -2,147,483,647 ~ +2,147,483,647)
文字列変数は無い。
ユーザ変数、システム変数、タイマー、フラグはプログラム実行時にすべて0で初期化される。
■センサー値関連
システム変数:
timerA, timerB, timerC
16bit 符号なし(0~65535) ミリ秒単位でカウントダウンされる。読み書き可能。
ctrl
コントロールの ON OFF フラグ。 1がON、0がOFF
speed
読み取り専用。0-255、ロボットのスピード。モータ2個の平均値。(右モーター、左モーター)
yaw
読み取り専用。0-359、ロボットの向き。
pitch
読み取り専用。迎え角(上昇・下降)、真下が-90、真上が+90
roll
読み取り専用。ロール角。左回転いっぱいで、-180。右回転いっぱいで+180。
accelX, accelY, accelZ
読み取り専用。3軸の加速度。-32768 ~ + 32767
gyroX, gyroY, gyroZ
ジャイロの回転角。20000 to +20000
Vbatt
バッテリーのボルト。
Sbatt
バッテリステータス。
1 充電中
2 充電完了
3 残量低下
4 残量僅か
cmdval
コマンド受信フラグ。フラグチェック後(読み取り後)に自動的に0クリア。
spdval
読み取り専用。スピード設定値。スマートフォンのリモコンアプリから設定(0-255)0は停止。
hdgval
読み取り専用。向き設定値。スマートフォンのリモコンアプリから設定(0-359)
dshake
ダブルシェイクフラグ
accelone
読み取り専用。加速度(XYZ合成値)。0が自由落下(0G)。調整完了・標準値が1000(1G相当)
シェイクして振りまわすと最大8000(8G)まで感知。
xpos, ypos
位置座標、内蔵ロケータの値(加速度による見積もり値?)。
単位はcm。読み取り専用、16bit符号付き整数(-32768 to + 32767)
■計算関連
演算記号(優先順位順):
( ) 括弧計算
* 乗算
/ 割り算
% 割り算の余り
{ 左ビットシフト
} 左ビットシフト
+ 加算
- 減算
& ビットAND
| ビットOR
関数:
sqrt x
ルート計算 計算は整数の範囲のみサポート。少数以下は工夫して計算する。
例)
xのルート計算を、
10000 倍した値で sqrt x*10000 と計算し、 x/100 が整数部、 x%100 を少数部とする。
rnd x
0~xまでの擬似乱数。
abs x
絶対値
■制御関連
ステートメント(コマンド):
IF文
if A > 5 then A = 5
if A*B = B*C then goto 60
if timerA = 0 then print "Out of time!"
if A ! B then print "Not equal"
if A>1 and A<10 then ?"In range" else return
ループ
for X = 1 to 5 … next X
for X = 1 to 5 step 2 … next X
for Y = 10 to 3 step -3 … next Y
分岐
GOTO 行番号
GOSUB 行番号
分岐先から return で分岐元の次の行に制御を戻す。
on X*Y goto 100,200,300,400
式の計算結果に対応した番号に分岐。
上記のコードで X*Y が 2 なら、200行に分岐。
■出力関連
コンソール表示
print 式
? 式
print "メッセージ1" 式1 "メッセージ2" ...
■アクション制御関連
実効遅延
delay x
xミリセカンド、ステートメントの実行を遅延させる。TimerA~Cに影響なし。
プログラム終了
end
■LED関連
LEDカラー設定
RGB r,g,b
8ビットRBGカラー
LEDC x
色番号で指定
0 <off>
1 red
2 green
3 blue
4 orange
5 purple
6 white
7 yellow
8 <off>
方向指定用LEDの明るさ設定
backLED x
0-255
■乱数
擬似乱数再設定(プログラム実行時に自動使用)
random
■走行関連
走行
goroll h,s,g
hは方向、角度0-359で指定
sは速度、0-255で指定
gはフラグ。 2が回転優先。1がノーマル。0は停止制御
向きの設定
heading h
モーター直接制御
raw Lmode,Lspeed,Rmode,Rspeed
4つの数値で、左モーターのモードと速度、右モーターのモードと速度を指定。
速度は 0-255。
モード
0 Off (モータ切断)
1 前進
2 逆進
3 ブレーキ(モータ短絡)
4 Ignore (モードに変更無し)
■その他
位置設定
locate x,y
動作モード制御フラグ
basflg x
書き込み専用。3ビット値
1 BF_EXCLUSIVE_DRV Bluetoothからの操作指示と排他制御。
2 BF_STEALTH orbBASICのプログラム実行は未使用時間タイムアウトをリセットしない。
4 BF_KEEP_LED セットするとorbBASICがLEDのオーナーになる。通常はマクロがLEDのオーナー。
リセット
reset
変数、フラグ初期化、プログラム再実行。
その他:
print の出力は 32byteまで。
for gosub のネストは最大4。
マイナスのリテラル数値は無い。
A = 0 - 9
と減算を利用して表現。
演習課題:
1.サンプルプログラムを改造して、動作を確認する。
2.何かにぶつかるまで前進し、衝突後に移動停止するプログラムを作成する。
3.何かにぶつかるまで前進。衝突後、移動停止。次に向きを微調整(少し左に回転など)。前進再開 を繰り返すプログラムを作成
4.自由課題
上記のプログラム作成に取り組む。
orbBASICアプリで作成したコードを、コピー&ペーストで講義用掲示板に投稿。
学籍番号も記入すること。
投稿するプログラムは、 1 + (2または3)
投稿するプログラムは、 (2または3) + 4
の組合せのどちらかでOK。