a. Sphero

スマートフォンで操作するモバイルゲームシステムSphero を利用した演習を行う。

SPHEROのWebサイト

http://www.gosphero.com/ja/

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。