PR

【PythonでmBot2プログラミング】モーター制御しよう

Python
この記事は約12分で読めます。

今回は、mBot2プログラミングシリーズ(Python編)の第1回です。

この回では、Pythonを使ってmBot2を実際に動かすための簡単なプログラムを作成します。
前進」「停止」「回転」といった基本的な動作を指示する方法を学びましょう。

目標

  • mBot2のモーター制御の基本を理解する
  • サーボモーターを動かすAPIを理解する
  • mBot2を動かす基本的なプログラムを作成する

Python環境(mBlock Python editor)の立ち上げ

ここでは、『mBlock Python editor』を使って、Pythonコードでプログラミングしていきます。
事前にPython環境を導入しておいてください。

環境の導入に関しては、次の記事を参考にしてください。

mBot2のモーター制御の基本

mBot2のタイヤ駆動には、高精度な制御が可能なエンコーダモーターが使用されています。
エンコーダモーターとは、モーターの回転速度や回転位置を正確に制御することが可能なモーターです。

エンコーダモーターの特徴

  • 高精度な制御:モーターの回転速度や位置を非常に高い精度で制御できます。
  • 位置情報の取得:モーターシャフトが回転する角度を計測可能です。
  • 速度情報の取得:モーターの回転速度を計測可能です。

APIとは

API(Application Programming Interface)は、ソフトウェアやハードウェアが外部のプログラムとやり取りをするためのインターフェース(接点)です。
簡単に言うと、『決められたルールに従って機能を利用するための仕組み』です。

cyberpiライブラリをインポートすることで、CyberPiや、mBot2センサーなどの各機能を簡単に利用できます。

mBot2動作のPython API

回転速度制御

mBot2の前進

mbot2.forward(speed = 50, t)

mBot2を指定された速度で前進させます。

  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:-200~+200RPM
    • 負の値に設定すると、mBot2は後退
  • t:前進し続ける時間
    • 単位:秒
    • 範囲:0~+∞
    • 初期値:”null”
    • “null”の場合、前進の停止指示がされるまで、指定速度で前進を続ける

mBot2の後退

mbot2.backward(speed = 50, t)

mBot2を指定された速度で後退させます。

  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:-200~+200RPM
    • 負の値に設定すると、mBot2は前進
  • t:後退し続ける時間
    • 単位:秒
    • 範囲:0~+∞
    • 初期値:”null”
    • “null”の場合、後退の停止指示がされるまで、指定速度で後退を続ける

mBot2の左回転

mbot2.turn_left(speed = 50, t)

mBot2を指定された速度で左回転させます。

  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:-200~+200RPM
    • 負の値に設定すると、mBot2は右回転
  • t:左回転し続ける時間
    • 単位:秒
    • 範囲:0~+∞
    • 初期値:”null”
    • “null”の場合、左回転の停止指示がされるまで、指定速度で左回転を続ける

mBot2の右回転

mbot2.turn_right(speed = 50, t)

mBot2を指定された速度で右回転させます。

  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:-200~+200RPM
    • 負の値に設定すると、mBot2は左回転
  • t:右回転し続ける時間
    • 単位:秒
    • 範囲:0~+∞
    • 初期値:”null”
    • “null”の場合、右回転の停止指示がされるまで、指定速度で右回転を続ける

左右のタイヤの個別制御

mbot2.drive_speed(EM1_speed, EM2_speed)

EM1(左タイヤ)EM2(右タイヤ)のエンコーダーモーターの回転速度を設定します。

  • EM1_speed:エンコーダーモーター1(左タイヤ)の回転速度
  • EM2_speed:エンコーダーモーター2(右タイヤ)の回転速度
    • 範囲:-200~+200RPM
    • 正の値に設定すると、モーターの出力軸は反時計回りに回転

モーター出力制御

左右のタイヤの個別制御

mbot2.drive_power(EM1_power, EM2_power)

EM1(左タイヤ)EM2(右タイヤ)のエンコーダーモーターの出力を設定します。

  • EM1_power:エンコーダーモーター1(左タイヤ)の出力
  • EM2_power:エンコーダーモーター2(右タイヤ)の出力
    • 範囲:-100~+100%
    • 正の値に設定すると、モーターの出力軸は反時計回りに回転

位置制御

mBot2の移動距離制御

mbot2.straight(distance, speed = 50)

mBot2を指定された距離だけ前進させます。

  • distance:mBot2が前進する距離
    • 単位:cm
    • 負の値に設定すると、mBot2は後退
  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:0~+200RPM
    • 負の値に設定すると、速度は設定した値の絶対値となる

mBot2の回転角制御

mbot2.turn(angle, speed = 50)

mBot2を指定された角度だけ時計回りに回転させます。

  • angle:mBot2が時計回りに回転する角度
    • 単位:度
    • 負の値に設定すると、mBot2は反時計回りに回転
  • speed:mBot2のエンコーダーモーター回転速度
    • 範囲:0~+200RPM

エンコーダーモーターのPython API

回転速度制御

回転速度制御

mbot2.EM_set_speed(speed, port)

指定したポートのエンコーダーモーターの回転速度を設定します。

  • speed:エンコーダーモーターの回転速度
    • 範囲:-200~+200RPM
    • 正の値に設定すると、モーターの出力軸は反時計回りに回転
  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

回転速度取得

mbot2.EM_get_speed(port)

指定したポートのエンコーダーモーターの回転速度をリアルタイムで取得します。

  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “em1″、”em2″、”EM1″、”EM2″、1、2
  • 値:反時計回りの回転が正の値、時計回りの回転が負の値。
    • 範囲
      • -∞~+∞RPM

モーター出力制御

モーター出力制御

mbot2.EM_set_power(power, port)

指定したポートのエンコーダーモーターの出力を設定します。

  • speed:エンコーダーモーターの出力
    • 範囲:-100~+100%
    • 正の値に設定すると、モーターの出力軸は反時計回りに回転
  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

モーター出力取得

mbot2.EM_get_power(port)

指定したポートのエンコーダーモーターの出力をリアルタイムで取得します。

  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “em1″、”em2″、”EM1″、”EM2″、1、2
  • 値:反時計回りの回転が正の値、時計回りの回転が負の値。
    • 範囲
      • -100~+100%

位置制御

回転角度制御

mbot2.EM_turn(angle, speed, port)

指定したポートのエンコーダーモーターを、指定された角度だけ反時計回りに回転させます。

  • angle:mBot2が時計回りに回転する角度
    • 単位:度
  • speed:エンコーダーモーター回転速度
    • 範囲:0~+200RPM
  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

回転角度取得

mbot2.EM_get_angle(port)

指定したポートのエンコーダーモーターの回転角度をリアルタイムで取得します。

  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “em1″、”em2″、”EM1″、”EM2″、1、2
  • 値:
    • モーター始動時に角度をリセットする
    • 反時計回りに回転すると、角度は増加
    • 時計回りに回転すると、角度は減少
    • 範囲
      • -∞~+∞RPM

回転角度リセット

mbot2.EM_reset_angle(port)

指定したポートのエンコーダーモーターの角度をリセットします。

  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

タイヤのロック

mbot2.EM_lock(is_lock = False, port)

指定したポートのエンコーダーモーターのロック機能を有効にします。
有効にすると、モーターは現在の位置に留まろうとします。

  • is_lock:ロック機能の有効/無効設定
    • False:無効
    • True:有効
  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

停止

mbot2.EM_stop(port = "all")

指定したポートのエンコーダーモーターの回転を停止します。

  • port:エンコーダーモーターが接続されているポート
    • 設定範囲
      • “all”、”em1″、”em2″、”ALL”、”EM1″、”EM2″、1、2

簡単な動作プログラム作成

mBot2のモータ制御プログラム

mBot2を3秒間前進させる』プログラムを作ってみます。

from cyberpi import mbot2

mbot2.forward(50, 3)

forward関数を使用し、回転速度50PRM、時間3秒を引数として設定します。


次に、『mBot2を1m(100cm)移動させる』プログラムです。

from cyberpi import mbot2

mbot2.straight(100, 50)

straight関数を使用し、移動距離100cm、回転速度50PRMを引数として設定します。


最後に、『mBot2を180°回転させる』プログラムです。

from cyberpi import mbot2

mbot2.turn(180, 50)

turn関数を使用し、回転角度180°、回転速度50PRMを引数として設定します。

mBlock Python editorからmBot2へ書き込みして、動作を確認してみましょう。

【例題】mBot2を動かしてみよう

例題1:ジョイスティックで動かす

  • 例題
  • 解答例

ジョイスティックを上下左右に倒したときに、mBot2を各方向へ動かし
ジョイスティックを押したときに、停止するプログラムを作ってみましょう。

import cyberpi

@cyberpi.event.is_press("up")
def callback():
    cyberpi.mbot2.forward(50)

@cyberpi.event.is_press("down")
def callback():
    cyberpi.mbot2.backward(50)

@cyberpi.event.is_press("left")
def callback():
    cyberpi.mbot2.turn_left(50)

@cyberpi.event.is_press("right")
def callback():
    cyberpi.mbot2.turn_right(50)

@cyberpi.event.is_press("middle")
def callback():
    cyberpi.mbot2.EM_stop("all")
    
プログラムのポイント
  • イベントヘッダーAPIを使用して、ジョイスティックの該当キーのイベントを作成する
  • 各イベントにて、前進後退左回転右回転の動作を記述する
  • 動作時間の引数を省略して、初期値(“null”)として動作させる

mBlock Python editorからmBot2へ書き込みして、動作を確認してみましょう。

例題2:円を描いて走らせる

  • 例題
  • 解答例

『mBot2が円を描いて動く』プログラムを作ってみましょう。
※円の大きさは問いません

from cyberpi import mbot2

mbot2.drive_power(40, -80)
プログラムのポイント
  • 円軌道を描かせるために、左右のモーター回転速度を個別に設定するブロックを使う
    ( mbot2.drive_speed もしくは mbot2.drive_power )
  • 左右のモーター速度設定は、一方をプラスもう一方をマイナス設定とする

mBlock Python editorからmBot2へ書き込みして、動作を確認してみましょう。

左右のモーター速度は、一方をプラスもう一方をマイナス設定とすることでmBot2のタイヤは同一方向に回ります。
あとは、左右のモーター回転速度に差をつけることで、円を描いて走ることができます。

左右のモーター回転速度の設定の違いによって、次のように動作します。

  • 正数と正数:回転(スピン)
  • 負数と負数:回転(スピン)
  • 正数と負数:前進または後退

まとめ

今回は、mBot2の「前進」や「回転」、「停止」といった基本的な動作プログラムを作成ました。
こうした基本が、後の応用プログラムに繋がっていきますので、是非、基本を押さえるようにしてください。

次回は、超音波センサーを使った障害物回避について紹介します。

mBlockを使ったmBot2のプログラミング方法を丁寧に解説していておススメです。

『mBotでものづくりをはじめよう』には、mBotを使用した拡張的な遊びが満載で、mBot2にも活かせます。mBotのパーツを段ボールと組み合わせてオリジナルのロボットを作るといったような拡張的な遊びが楽しめます。

タイトルとURLをコピーしました