Spike ラージハブ / Inventor ハブ

../_images/hub-spike-inventor.png
inventor hub
inventor hubtop side axiszfront side axisxchannel0channels12
class InventorHub

このクラスは、以下に示す PrimeHub クラスと同じです。どちらのクラスも両方のハブで動作します。

これらのハブは完全に同一です。同じ Pybricks ファームウェアを使っています。

prime hub
prime hubtop side axiszfront side axisxchannel0channels12
class PrimeHub(top_side=Axis.Z, front_side=Axis.X, broadcast_channel=None, observe_channels=[])

LEGO® SPIKE プライムラージハブ。

ハブを初期化します。オプションで、ハブの上面(ボタンのある面)と前面(USBポートのある面)のある向きを指定することで、 ハブの取付けのデザイン を反映できます。

パラメータ:
  • top_side (Axis) -- ハブの上面を通る軸。

  • front_side (Axis) -- ハブの前面を通る軸。

  • broadcast_channel -- ブロードキャストで使うチャンネル番号(0から255)。ブロードキャストを使わない場合は None を指定します。

  • observe_channels -- hub.ble.observe() が呼び出された際にリッスンするチャンネルのリスト。より多くのチャンネルをリッスンすると、より多くのメモリが必要になります。デフォルトは空のリスト(チャンネルなし)です。

バージョン 3.3 で変更: broadcast_channelobserve_channels 引数を追加。

ハブ内蔵ステータスライトの利用

../_images/primehub_light.png
redprime hublighton
light.on(color)

指定の色でライトを点灯します。

パラメータ:

color (Color) -- ライトの色。

prime hublightoff
light.off()

ライトの消灯。

指定の色で、指定の時間だけライトを点灯・消灯して点滅させます。

プログラムの残りの部分が動作している間、ライトは無限に点滅し続けます。

このメソッドは、基本的で、よく使うパターンを作成する簡易な方法を提供します。より一般的で複数色のパターンを作成するには、代わりに animate() を使用してください。

パラメータ:
  • color (Color) -- ライトの色。

  • durations (list) -- 時間のシーケンスを [on_1, off_1, on_2, off_2, ...] の形式で指定。

light.animate(colors, interval)

指定の間隔で1つずつ表示される色のシーケンスでライトをアニメートします。

このアニメーションはバックグラウンドで実行され、プログラムの他の部分は継続的に実行されます。アニメーションが完了すると、繰返し実行します。

パラメータ:
  • colors (list) -- Color の値のシーケンス。

  • interval (Number, ms) -- 色の更新間隔。

ライトマトリクスディスプレイの利用

../_images/primehub_display.png
display.orientation(up)

ライトマトリックスディスプレイの向きを設定します。

新しく表示されるイメージとピクセルだけが影響を受けます。既存の表示内容は変更されません。

パラメータ:

top (Side) -- ライトマトリクスディスプレイのどの側が「上」になるかを指定します。 Side.TOP, Side.LEFT, Side.RIGHT, Side.BOTTOM のいずれかを指定します。

hubdisplayoff
display.off()

すべてのピクセルを消灯します。

00100%hubdisplaypixelrowcolumnat
display.pixel(row, column, brightness=100)

指定の明るさで1つのピクセルを点灯します

パラメータ:
  • row (Number) -- 垂直方向のグリッドのインデックス。一番上が 0 になります。

  • column (Number) -- 水平方向のグリッドインデックス。一番左が 0 になります。

  • brightness (Number 照度: %) -- ピクセルの明るさ。

display.icon(icon)

照度: % 値のマトリックスで表現されたアイコンを表示します。

パラメータ:

icon (Matrix) -- 照度: % のマトリックス。2次元リストでも可。

display.animate(matrices, interval)

画像のリストで作られたアニメーションを表示します。

各イメージは上記と同じフォーマットです。各イメージは、指定された間隔で表示されます。このアニメーションは、プログラムの残りの部分が実行されている間、永遠に繰り返されます。

パラメータ:
  • matrices (iter) -- 照度の Matrix のシーケンス。

  • interval (Number, ms) -- リストの各イメージを表示する時間。

42hubdisplaynumber
display.number(number)

-99 から 99 の範囲の数値を表示します。

マイナス記号(-)は、ディスプレイの中央に淡いドットで表示します。99 より大きい数値は > で表示します。-99 より小さい数値は < で表示します。

パラメータ:

number (int) -- 表示する数値。

Ahubdisplayletter
display.char(char)

ライトグリッドに文字や記号を表示します。英小文字 (a--z)、英大文字 (A--Z)、記号 symbols: !"#$%&'()*+,-./:;<=>?@[\]^_`{|} のいずれかを指定します。

パラメータ:

character (str) -- 表示する文字または記号。

display.text(text, on=500, off=50)

文字列を1文字ずつ表示し、各文字の間にポーズを入れます。最後の文字が表示された後、すべてのライトが消灯します。

パラメータ:
  • text (str) -- 表示する文字列。

  • on (Number, ms) -- 1文字が表示される時間。

  • off (Number, ms) -- 文字と文字の間の表示を消している時間。

ボタンの利用

../_images/primehub_buttons.png
prime hubcenteris pressed
buttons.pressed() Set[Button]

どのボタンが押されているかをチェックします。

戻り値:

押されているボタンの集合。

prime hubcenterstop button is
prime hubnonestop button is
system.set_stop_button(button)

実行中のスクリプトを停止させるボタンまたはボタンの組み合わせを設定します。

デフォルトでは実行中のスクリプトを停止するのにセンターボタンを使います。この動作を変更または無効にして、センターボタンを他の用途に使えるようにできます。

パラメータ:

button (Button) -- Button.CENTER 、または複数のボタンのタプルを指定します。停止ボタンを完全に無効にするには None を指定します。望むなら、中央ボタンを3秒間押すことで、ハブをオフにできます。

IMU の利用

バージョン 3.6 で変更: 以下のメソッドは、デフォルトで補正済みのデータを返すようになりました。使うメソッドによっては、加速度センサーやジャイロスコープのデータが補正値と組み合わされます。以前の生データを取得したい場合は、該当するメソッドで calibrated=False を指定してください。

prime hubisready
imu.ready() bool

デバイスがキャリブレーションされ、使用可能な状態にあるかどうかをチェックします。

ロボットが数秒間静止するとデバイスの再キャリブレーションが行われるため、 True になります。ハブを起動したばかりのときや、10分以上キャリブレーションする機会がなかったときは、 False になります。

戻り値:

使用可能であれば True 、そうでなければ False

prime hubisstationary
imu.stationary() bool

現在、デバイスが静止しているかどうか(動いていないか)をチェックします。

戻り値:

1秒以上静止している場合は True 、動いている場合は False

prime hubtop sideis up
imu.up(calibrated=True) Side

現在、ハブのどちらの面を上に向けているかをチェックします。

パラメータ:

calibrated (bool) -- どの方向が上かを判断するために、補正済みのジャイロスコープおよび加速度計のデータを使う場合は True を指定してください。生の加速度データを使用する場合は False を指定してください。

戻り値:

Side.TOP, Side.BOTTOM, Side.LEFT, Side.RIGHT, Side.FRONT, Side.BACK のいずれか。

prime hubgetpitch
prime hubgetroll
imu.tilt(calibrated=True) Tuple[int, int]

ピッチ角とロール角を取得します。これは、 ユーザー指定の基準となる向き からの相対的なものです。

回転の順序は、ピッチ角、ロール画です。これはロボットのY軸に沿った正回転と、X軸に沿った正回転に相当します。

パラメータ:

calibrated (bool) -- 傾きを判断するために、補正済みのジャイロスコープおよび加速度計のデータを使う場合は True を指定します。生の加速度データを使用する場合は False を指定します。

戻り値:

ピッチ角とロール角のタプル(度単位)。

prime hubxacceleration along
imu.acceleration(axis, calibrated=True) float: mm/s²
imu.acceleration(calibrated=True) vector: mm/s²

ロボットの基準座標系 における、指定した軸に沿ったデバイスの加速度を取得します。

パラメータ:
  • axis (Axis) -- 加速度を計測する軸。すべての軸に沿ったベクトルを得るには None を指定します

  • calibrated (bool) -- 補正された加速度値を使う場合は True を指定してください生の加速度値を使う場合は False を指定してください。

戻り値:

指定された軸に沿った加速度。軸を指定しない場合は、すべての軸に沿った加速度のベクトルが返ります。

prime hubxgetangular velocityaround
imu.angular_velocity(axis, calibrated=True) float: deg/s
imu.angular_velocity(calibrated=True) vector: deg/s

ロボットの基準座標系 における、指定した軸に沿ったデバイスの角速度を取得します。

パラメータ:
  • axis (Axis) -- 角速度を測定する軸を指定します。すべての軸のベクトルを得る場合は None を指定してください。

  • calibrated (bool) -- 補正済みの角速度値を使う場合は True を指定してください。生の角速度値を得る場合は False を指定してください。

戻り値:

指定された軸に沿った角速度。軸を指定しない場合は、すべての軸に沿った加速度のベクトルが返ります。

prime hubget heading
imu.heading() float: deg

ロボットの方位角を取得します。正の値は時計回りに回転することを意味します。

プログラム開始時のヘディングは 0 です。ロボットが 180 度以上回転しても値は増え続けます。一部のアプリのように-180に折り返すことはありません。

注釈

今のところ、このメソッドはロボットが平らな場所にいる間だけ方位角を記録しています。

つまり、テーブルから持ち上げたり、傾斜のある場所で使った場合、その値はもはや正しいものではありません。この課題を解決するために hub.imu.heading('3D') を使ってみてください。この機能は将来のリリースでデフォルトになる予定です。試してみた場合は、ぜひフォーラムでフィードバックをお寄せください!

戻り値:

開始時の姿勢に対する方位角。

prime hub0°reset heading to
imu.reset_heading(angle)

ロボットの累積方位角をリセットします。

これは、ドライブベースがジャイロを使って走行または位置を保持している間は呼び出せません。代わりに DriveBase.reset() を使ってください。このメソッドはロボットを停止し、新しい方位角値を設定します。

バージョン 3.6 で変更: 走行中には角度をリセットできません。まず停止してください。

パラメータ:

angle (Number, deg) -- リセットする方位の値(deg)。

例外:

OSError -- ジャイロを使っているドライブベースがあります。

prime hubxgetrotationaround
imu.rotation(axis, calibrated=True) float: deg

ロボットの基準座標系 で示されている軸に沿ったデバイスの回転を取得します。

この値は、要求された軸に沿ってロボットが回転する場合に だけ 便利です。一般的な3次元の動きには、代わりに orientation() メソッドを使ってください。

パラメータ:
  • axis (Axis) -- 回転を測定する軸。

  • calibrated (bool) -- ジャイロスコープの設定されたスケールに対して補正された値を得るには True を指定します。生の値を得るには False を指定します。

戻り値:

回転角度。

imu.orientation() Matrix

ロボットの基準座標系 におけるロボットの3次元姿勢を取得します。

ロボットの X, Y, Z 軸を列とする回転行列を返します。

戻り値:

The 3x3 rotation matrix.

360°prime hubconfigureheading correction
2°/sprime hubconfigureangular velocity threshold
2500mm/s²prime hubconfigureacceleration threshold
imu.settings(*, angular_velocity_threshold, acceleration_threshold, heading_correction, angular_velocity_bias, angular_velocity_scale, acceleration_correction)
imu.settings() Tuple

IMU の設定を行います。引数を与えない場合は現在の値を返します。キーワード引数を使って設定することで、将来のリリースで設定項目が追加・変更されても正しく動作するようになります。

IMU 設定はハブに保存されます。この設定は値を変更するまで維持されます。設定値は、ハブのファームウェアを異なるバージョンに更新するか、 hub.system.reset_storage メソッドを呼び出すと、デフォルト値にリセットされます。

angular_velocity_thresholdacceleration_threshold は、ハブが静止しているとみなされるタイミングを定義します。すべての測定値がこれらの閾値を下回る状態が1秒間続くと、IMU は再キャリブレーションを行います。周囲の振動が大きい騒がしい部屋(競技会場など)では、ロボットがキャリブレーションを行う機会を与えるために、しきい値を少し大きくしておくことができます。設定が期待通りに機能していることを確認するには、 stationary() メソッドを使って、ロボットが動いている間に False 、静止している間に True になることをテストします。

ジャイロスコープはハブの回転速度を測定し、そこから合計回転角度を推定します。しかし、製品の誤差により、360度回転しても正確に360度と測定されない場合 があります。たとえば、ハブが実際には 360 度回転しているのに 357 度と測定されることがあります。 hub.imu.rotation(-Axis.Z, calibrated=False) を使って、ハブが1回転したときの測定値を確認し、その値を heading_correction に設定します。以降は hub.imu.heading() が自動的にスケール補正を行い、正しく360度として扱われるようになります。

パラメータ:
  • angular_velocity_threshold (Number, deg/s) -- ハブがキャリブレーションを行うのに十分静止しているとみなされる角速度の変動のしきい値。リセット後、この値は 2 deg/s に設定されます。

  • acceleration_threshold (Number, mm/s²) -- ハブがキャリブレーションを行うのに十分静止しているとみなされる加速度の変動のしきい値。リセット後、この値は2500mm/s²に設定されます。

  • heading_correction (Number, deg) -- ロボットが1回転したときに報告される角度の値。リセット後のデフォルト値は360度です。これは angular_velocity_scale の指定によるスケール調整の上に適用されます。

  • angular_velocity_bias (tuple, deg/s) -- 起動直後の x、y、z 軸に沿った角速度測定の初期バイアス。リセット後の値は (0, 0, 0) deg/s となる。

  • angular_velocity_scale (tuple, deg) -- 製造上の個体差を補正するための x、y、z 軸の回転スケール調整。リセット後の値は (360, 360, 360) deg/s となります。正しい値は hub.imu.rotation(Axis.X, calibrated=False) を使って、各軸について繰り返し測定することで取得できます。

  • acceleration_correction (tuple, mm/s²) -- 製造上の個体差を補正するための、x、y、z 軸の重力加速度の大きさに対するスケール調整(両方向)。リセット後の値は (9806.65, -9806.65, 9806.65, -9806.65, 9806.65, -9806.65) mm/s² となります。正しい値は hub.imu.acceleration(Axis.X, calibrated=False) を使って、すべての軸の両方向について繰り返し測定することで取得できます。

スピーカーの利用

speaker.volume(volume)
speaker.volume() int: %

スピーカーの音量を取得または設定します。

音量が指定されない場合、このメソッドは現在の音量を返します。

パラメータ:

volume (Number, %) -- スピーカーの音量を 0-100 の範囲で指定します。

awaitspeaker.beep(frequency=500, duration=100)

ビープ音/トーンを鳴らします。

パラメータ:
  • frequency (Number, Hz) -- ビープ音の周波数を 64-24000 Hzの範囲で指定します。

  • duration (Number, ms) -- ビープ音の継続時間。0 より小さい場合、このメソッドはすぐに戻り、周波数の再生は無期限に行われます。

awaitspeaker.play_notes(notes, tempo=120)

音符のシーケンスを演奏します。たとえば ["C4/4", "C4/4", "G4/4", "G4/4"] といったものを演奏します。

各音符は次のような形式の文字列です。

  • 最初の文字が音名で、 A から G で指定します。休符は R で指定します。

  • 音名には # (シャープ)または b (フラット)の調号を含めることもできます。B#/Cb and E#/Fb は指定できません。

  • 音名の後にはオクターブ番号2~8が付きます。たとえば C4 はミドルCです。オクターブは音名Cの次の番号で変わります。たとえば B3 はミドルC (C4)の下の音です。

  • オクターブの後には / と音の大きさを表す数字が続きます。たとえば /4 は4分音符、 /8 は8分音符となります。

  • この後に . を付けると付点音符になります。付点音符は、付点なしの音符の1.5倍の長さになります。

  • 音符の最後にはタイまたはスラーである _ を付けられます。この場合、この音符と次の音符の間に間がなくなります。

パラメータ:
  • notes (iter) -- 演奏する音符のシーケンス。

  • tempo (int) -- 分あたりの拍数。4分音符が1拍です。

非接続 Bluetooth メッセージングの利用

prime hub000list withbroadcast
awaitble.broadcast(data)

ハブ初期化時に選択した broadcast_channel で、指定データのブロードキャストを開始します。

データには、型が int, float, str, bytes, True, False のものです。それらのリストやタプルも指定できます。

ブロードキャスト通信を停止するに None を指定します。ブロードキャスト通信が必要ない場合には、それを停止することによりパフォーマンスを向上させられます。同時にデータ観察をしている場合には特に便利です。

合計データサイズはかなり制限されています(26バイト)。 TrueFalse はそれぞれ1バイトを占有します。 float は5バイトを占有します。 int は数値の大きさに応じて2から5バイトを占有します。 strbytes はオブジェクトのバイト数に加えて1バイトを占有します。

マルチタスクを行う場合、ブロードキャスト通信は一度に1つのタスクでしかできません。複数のタスク(またはブロックスタック)からの情報をブロードキャストするには、ブロードキャスト通信用の専用タスクを用意して、他の複数タスクからの情報を送信するようにできます。

パラメータ:

data -- ブロードキャストする値、もしくは値のリスト。

バージョン 3.3 で追加.

prime hubobserve0
ble.observe(channel) bool | int | float | str | bytes | tuple | None

指定したチャンネルで最後に観測されたデータを取得します。

ハブがコンピュータや他のデバイスに同時に接続しないようにすると、データを受信する信頼性が高くなります。

パラメータ:

channel (int) -- 観測するチャンネル(0から255)。

戻り値:

送信されたデータは、送信された形式と同じ形式で受信されます。最近のデータが利用できない場合は None が返されます。

バージョン 3.3 で追加.

ble.signal_strength(channel) int: dBm

指定したチャンネルの平均信号強度を dBm 単位で取得します。

これはブロードキャストデバイスがどれだけ近くにあるかを示します。近くのデバイスは約 -40 dBmの信号強度を持ち、遠くのデバイスは約 -70 dBmの信号強度を持ちます。

パラメータ:

channel (int) -- チャンネル番号(0から255)。

戻り値:

最近の観測データがない場合、信号強度は -128 となります。

バージョン 3.3 で追加.

ble.version() str

Bluetooth チップからファームウェアバージョンを取得します。

バージョン 3.3 で追加.

バッテリー値の利用

prime hubbatteryvoltage
battery.voltage() int: mV

バッテリーの電圧を取得します。

戻り値:

バッテリーの電圧

prime hubbatterycurrent
battery.current() int: mA

バッテリーから供給される電流を取得します。

戻り値:

バッテリーの電流。

充電状況の取得

charger.connected() bool

USB を使って充電が行われているかをチエックします。

戻り値:

充電が行われていれば True 、さもなけれな False を返します。

charger.current() int: mA

充電電流を取得します。

戻り値:

充電電流。

charger.status() int

バッテリー充電の状態を取得し、以下のいずれかの値で表す。これは USB ポートのすぐ横にあるバッテリーランプのインジケーターに対応します。

  1. 充電中でない(消灯)。

  2. 充電中(ランプは赤)。

  3. Charging is complete (light is green).

  4. 充電に問題がある(黄色に点灯)。

戻り値:

ステータス値。

システム制御

system.info() dict

ハブに関する情報を、以下のキーを持つ辞書として取得します:

  • "name": ハブの名前。これは Bluetooth 接続時に表示される名前です。

  • "reset_reason": ハブが(再)起動した理由。通常の電源オフ後に起動した場合は 0 になります。ファームウェア更新後など、自動的に再起動した場合には 1 になります。ウォッチドッグタイムアウトによるクラッシュ(ファームウェアの問題を示唆)した場合には 2 になります。

  • "host_connected_ble": ハブが Bluetooth 経由でコンピュータ、タブレット、またはスマートフォンに接続されているかどうか。

  • "program_start_type": プログラムの開始方法。ハブの電源オン時に自動的に開始した場合には 1 になります。ハブのボタンで開始された場合には 2 になります。接続されたコンピュータから開始された場合には 3 になります。

戻り値:

システム情報を持つ辞書。

バージョン 3.6 で変更: 名前とリセット理由は、以前は別々のメソッドとして提供されていましたが、現在は info 辞書に含まれています。 ただし、互換性のために従来のメソッドも引き続き利用可能です。

system.storage(offset, write=)
system.storage(offset, read=) bytes

バイナリデータを永続ストレージに読み書きします。

これにより、次にプログラムを実行するときに使えるデータを保存できます。

データは通常、ハブの電源をオフにしたときにフラッシュメモリーに保存されます。ハブを起動したままバッテリーを外すと保存されません。

一度保存されたデータは、バッテリーをを外しても残ります。

パラメータ:
  • offset (int) -- ユーザーストレージメモリの先頭からのオフセットをバイト数で指定します。

  • read (int) -- 読み込むバイト数。書出しの場合はこの引数を省略します。

  • write (bytes) -- 書き込むバイト数。読込み場合は、この引数を省略します。

戻り値:

読込み場合は読み込んだバイト数、書出しの場合は None

例外:

ValueError -- 許容範囲外のデータを読み書きしようとした場合。

このハブには最大512バイトのデータを保存できます。保存されているデータは Pybricks ファームウェア更新時に消去されます。

system.reset_storage()

すべてのユーザ設定をデフォルト値にリセットし、ユーザプログラムを消去します。

prime hubshut down
system.shutdown()

プログラムを停止し、ハブをシャットダウンします。

注釈

以下の例では PrimeHub クラスを使っています。サンプルはどちらのハブでも同じなので問題なく動作します。望むのであれば InventorHub に変更することも可能です。

ステータスライトの利用例

ライトの点灯と消灯

from pybricks.hubs import PrimeHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# ライトの点灯と消灯を5回繰り返す。
for i in range(5):

    hub.light.on(Color.RED)
    wait(1000)

    hub.light.off()
    wait(500)

明るさの変更と独自色の指定

from pybricks.hubs import PrimeHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# 30% の照度で色を表示。
hub.light.on(Color.RED * 0.3)

wait(2000)

# 独自の色を使用。
hub.light.on(Color(h=30, s=100, v=50))

wait(2000)

# すべての色を変化させながら表示。
for hue in range(360):
    hub.light.on(Color(hue))
    wait(10)

ライトアニメーションの作成

from pybricks.hubs import PrimeHub
from pybricks.parameters import Color
from pybricks.tools import wait
from umath import sin, pi

# ハブを初期化。
hub = PrimeHub()

# 複数色を使ったアニメーションを行う。
hub.light.animate([Color.RED, Color.GREEN, Color.NONE], interval=500)

wait(10000)

# 赤をサインカーブのパターンで照度を変えながら表示hub.light.animate([Color.RED * (0.5 * sin(i / 15 * pi) + 0.5) for i in range(30)], 40)

wait(10000)

# 虹色で繰り返しながら表示。
hub.light.animate([Color(h=i * 8) for i in range(45)], interval=40)

wait(10000)

マトリクスディスプレイの例

イメージの表示

from pybricks.hubs import PrimeHub
from pybricks.tools import wait
from pybricks.parameters import Icon

# ハブを初期化。
hub = PrimeHub()

# 上を指す大きな矢印の表示。
hub.display.icon(Icon.UP)

# 何が表示されているかが確認できるように待機する。
wait(2000)

# ハートを半分の照度で表示。
hub.display.icon(Icon.HEART / 2)

# 何が表示されているかが確認できるように待機する。
wait(2000)

数値の表示

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# 0 から 99 までカウント。
for i in range(100):
    hub.display.number(i)
    wait(200)

テキストの表示

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# 文字 A を2秒間表示。
hub.display.char("A")
wait(2000)

# 1文字ずつテキストを表示。
hub.display.text("Hello, world!")

個別のピクセルの表示

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# 行 1、列 2 のピクセルを点灯。
hub.display.pixel(1, 2)
wait(2000)

# 行 2、列 4 のピクセルを照度 50% で点灯。
hub.display.pixel(2, 4, 50)
wait(2000)

# 行 1、列 2 のピクセルを消灯。
hub.display.pixel(1, 2, 0)
wait(2000)

ディスプレイ向きの変更

from pybricks.hubs import PrimeHub
from pybricks.tools import wait
from pybricks.parameters import Side

# ハブを初期化。
hub = PrimeHub()

# ディスプレイを回転。右側を上に変更。
hub.display.orientation(up=Side.RIGHT)

# 数値を表示。これは横向きに表示されます。
hub.display.number(23)

# 何が表示されているかが確認できるように待機する。
wait(10000)
from pybricks.hubs import PrimeHub
from pybricks.parameters import Icon
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

while True:

    # ハブの上になっている側をチェック。
    up_side = hub.imu.up()

    # チェックした向きに、ディスプレイ向きを設定。
    hub.display.orientation(up_side)

    # 何かを表示する。矢印など。
    hub.display.icon(Icon.UP)

    wait(10)

独自イメージの作成

from pybricks.hubs import PrimeHub
from pybricks.tools import wait, Matrix

# ハブを初期化。
hub = PrimeHub()

# 外側が明るく、真ん中がうすくなるような正方形を作成。
SQUARE = Matrix(
    [
        [100, 100, 100, 100, 100],
        [100, 50, 50, 50, 100],
        [100, 50, 0, 50, 100],
        [100, 50, 50, 50, 100],
        [100, 100, 100, 100, 100],
    ]
)

# 正方形を表示。
hub.display.icon(SQUARE)
wait(3000)

# Python のリスト内包を使った画像を作成。このイメージで、各ピクセルの
# 明るさは行と列のインデックスの和になります。つまり、左上は淡く、
# 右下は明るくなります。
GRADIENT = Matrix([[(r + c) for c in range(5)] for r in range(5)]) * 12.5

# 作成したグラデーションを表示する。
hub.display.icon(GRADIENT)
wait(3000)

アイコンを組み合わせた表現

from pybricks.hubs import PrimeHub
from pybricks.parameters import Icon, Side
from pybricks.tools import wait

from urandom import randint

# ハブを初期化。
hub = PrimeHub()
hub.display.orientation(up=Side.RIGHT)

while True:

    # 左の眉毛を上か下か、ランダムでスタート。
    if randint(0, 100) < 70:
        brows = Icon.EYE_LEFT_BROW * 0.5
    else:
        brows = Icon.EYE_LEFT_BROW_UP * 0.5

    # 左の眉毛を上か下か、ランダムで追加。
    if randint(0, 100) < 70:
        brows += Icon.EYE_RIGHT_BROW * 0.5
    else:
        brows += Icon.EYE_RIGHT_BROW_UP * 0.5

    for i in range(3):
        # 目を見開いて、ランダムな眉毛を表示。
        hub.display.icon(Icon.EYE_LEFT + Icon.EYE_RIGHT + brows)
        wait(2000)

        # 瞬いだ目+無造作な眉毛を表示。
        hub.display.icon(Icon.EYE_LEFT_BLINK * 0.7 + Icon.EYE_RIGHT_BLINK * 0.7 + brows)
        wait(200)

アニメーションの表示

from pybricks.hubs import PrimeHub
from pybricks.parameters import Icon
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# ハブのライトを消灯(オプション)。
hub.light.off()

# 0から100まで、100から0までの照度のリストを作成。
brightness = list(range(0, 100, 4)) + list(range(100, 0, -4))

# 照度を変えながらハートのアイコンをアニメーション表示。
hub.display.animate([Icon.HEART * i / 100 for i in brightness], 30)

# バックグラウンドでアニメーションを繰り返す。ここでは待機するだけ。
while True:
    wait(100)

ボタンの例

ボタン押下の検出

from pybricks.hubs import PrimeHub
from pybricks.parameters import Button, Icon
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# ボタンのどれかが押されるまで待機し、その結果を保存。
pressed = []
while not any(pressed):
    pressed = hub.buttons.pressed()
    wait(10)

# 円を表示。
hub.display.icon(Icon.CIRCLE)

# すべてのボタンを離すまで待機。
while any(hub.buttons.pressed()):
    wait(10)

# どのボタンが押されていたのかを示す矢印を表示。
if Button.LEFT in pressed:
    hub.display.icon(Icon.ARROW_LEFT_DOWN)
elif Button.RIGHT in pressed:
    hub.display.icon(Icon.ARROW_RIGHT_DOWN)
elif Button.BLUETOOTH in pressed:
    hub.display.icon(Icon.ARROW_RIGHT_UP)

wait(3000)

IMU の利用例

上がどっちかのテスト

from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Side
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# それぞれの側の色を辞書に定義。
SIDE_COLORS = {
    Side.TOP: Color.RED,
    Side.BOTTOM: Color.BLUE,
    Side.LEFT: Color.GREEN,
    Side.RIGHT: Color.YELLOW,
    Side.FRONT: Color.MAGENTA,
    Side.BACK: Color.BLACK,
}

# 検出した側を元に色を更新し続ける。
while True:

    # ハブの上になっている側をチェック。
    up_side = hub.imu.up()

    # 検出した側を元に色を変更。
    hub.light.on(SIDE_COLORS[up_side])

    # 結果の表示も行う。
    print(up_side)
    wait(50)

傾き値の読取り

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

while True:
    # 傾き値を読み込む。
    pitch, roll = hub.imu.tilt()

    # 結果を表示。
    print(pitch, roll)
    wait(200)

ハブの向きの変更

from pybricks.hubs import PrimeHub
from pybricks.tools import wait
from pybricks.parameters import Axis

# ハブを初期化。この場合、ハブは上側を前に、前側を右に向けるよう
# 組み立てているいるように指定します。たとえば、51515セットのBLASTでは
# そのようになります。
hub = PrimeHub(top_side=Axis.X, front_side=-Axis.Y)

while True:
    # 傾きの値を読み取ります。今、BLAST が直立しているときの値は0です。
    # 前傾姿勢ではピッチがプラスになります。右に傾くとロールがプラスになります。
    pitch, roll = hub.imu.tilt()

    # 結果を表示。
    print(pitch, roll)
    wait(200)

加速度と角速度ベクトルの読取り

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# 加速度のベクトルを g で取得。
print(hub.imu.acceleration() / 9810)

# 角速度のベクトルを取得。
print(hub.imu.angular_velocity())

# 何がプリントされているかが確認できるように待機。
wait(5000)

1つの軸の加速度と角速度の読取り

from pybricks.hubs import PrimeHub
from pybricks.tools import wait
from pybricks.parameters import Axis

# ハブを初期化。
hub = PrimeHub()

# 1つの軸に沿った加速度あるいは angular_velocity を取得する。
# 1つの値しか必要ない場合は、こちらの方がメモリ効率が良い。
while True:

    # 前方の加速度を読み取る。
    forward_acceleration = hub.imu.acceleration(Axis.X)

    # ヨーレートを読み取る。
    yaw_rate = hub.imu.angular_velocity(Axis.Z)

    # ヨーレートを表示。
    print(yaw_rate)
    wait(100)

Bluetooth の例

他のハブへのデータのブロードキャスト

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub(broadcast_channel=1)

# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)

while True:
    # 他のハブに送るモーター回転角度の読取り。
    left_angle = left_motor.angle()
    right_angle = right_motor.angle()

    # ブロードキャストするデータを設定。まだブロードキャストしていなければ開始。
    data = (left_angle, right_angle)
    hub.ble.broadcast(data)

    # ブロードキャストは100ミリ秒ごとにのみ送信するので、それ以上の頻度で
    # broadcast() メソッドを呼び出す理由はありません。
    wait(100)

他のハブからのデータ観測

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Color, Port
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub(observe_channels=[1])

# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)

while True:
    # 他のハブからのブロードキャストの受信。

    data = hub.ble.observe(1)

    if data is None:
        # 過去1秒間にデータが受信されていない。
        hub.light.on(Color.RED)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(Color.GREEN)

        # *data* には、他のハブで hub.ble.broadcast() に指定した
        # 順序と同じ値が同じ順序で含まれています。
        left_angle, right_angle = data

        # 他のハブのモーターの位置をこのハブのモーターに反映します。
        left_motor.track_target(left_angle)
        right_motor.track_target(right_angle)

    # ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の頻度で
    # observe() メソッドを呼び出す理由はありません。
    wait(100)

システムの例

ストップボタンの組合わせの変更

from pybricks.hubs import PrimeHub
from pybricks.parameters import Button

# ハブを初期化。
hub = PrimeHub()

# ストップボタンの組合わせを設定。これで、センターボタンと Bluetooth
# ボタンを同時に押すと、プログラムが停止。
hub.system.set_stop_button((Button.CENTER, Button.BLUETOOTH))

# これでセンターボタンを普通のボタンとして利用できるようになる。
while True:

    # センターボタンを押したら音が鳴らす。
    if Button.CENTER in hub.buttons.pressed():
        hub.speaker.beep()

ハブの電源オフ

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

# ハブを初期化。
hub = PrimeHub()

# さよならを言い、少し時間をおいて実行する。
print("Goodbye!")
wait(100)

# ハブをシャットダウン。
hub.system.shutdown()