tetrix の利用方法

✏️ Edit this page on GitHub

#contents

概要

TETRIX は Pitsco Education が販売している LEGO Mindstroms の拡張製品です。 アルミ製フレーム、高トルクのモーター等がセットに含まれており、本格的なロボットの製作が可能になります。

仕様

  • DCモーター
電圧 12V
静止トルク 2.1N・m
回転数 152rpm
  • RCサーボ
名前 HS-485HB(HITEC)
電圧 6V
静止トルク 0.59N・m
回転数 56rpm

モータードライバ

TETRIX ベースセットには DCモータードライバ (DC Motor Controller for TETRIX)、RCサーボドライバ (Servo Controller for TETRIX) が付属しています。

これらのモータードライバと EV3 を接続することで DCモーター及び RCサーボの制御が可能になります。

接続方法

以下のように接続してください。

接続してモータードライバの電源が ON の状態で EV3 の電源を投入してください。

操作方法

EV3 とモータードライバの通信は I2C により行います。

接続に成功している場合、/dev以下にi2c-3、i2c-4、i2c-5、i2c-6 のいずれかのデバイスファイルが追加されているはずです。 後ろの値がポート番号に2を足した値になっています。例えばポート1に接続した場合は i2c-3 になります。 以下で ev3dev上で C++、及び Python によるモータードライバの制御方法について述べます。

まずは I2C 通信に必要なファイルをインクルードしてください。

  • C++
     #include <fcntl.h>
     #include <sys/ioctl.h>
     #include <linux/i2c-dev.h>
    
  • Python
     import smbus
    

I2C の通信を開始します。

  • C++
     int fd; = open("/dev/i2c-3", O_RDWR);
    
  • Python
     sm = smbus.SMBus(3)
    

モータードライバのアドレスは 0x01 に設定されますが、デイジーチェインで接続した場合 0x02~0x08 に設定されます。 上記の接続の場合、DCモータードライバは 0x01 で RCサーボドライバは 0x02 に設定されているはずです。 まずは DCモータードライバを操作してみます。

DCモータードライバ

制御モードを設定します。 モーター1 は 0x44、モーター2 は 0x47 のレジスタに以下の値を書き込むことで制御モードが設定可能です。 ※TETRIX ベースセットにはエンコーダーは付属していないので速度制御、位置制御モードを使用する場合は別途購入する必要があります。

入力値 制御モード
0b00 PWM
0b01 速度制御
0b10 位置制御
0b11 エンコーダーリセット


PWM モードに設定します。

  • C++
     ioctl(fd, I2C_SLAVE, 0x01)
     unsigned char buf[2] = {0x44, 0x00};
     write(fd, buf, 2);
    
  • Python
     sm.write_i2c_block_data(0x01, 0x44, [0x00])
    

最後に PWM の幅を設定します。 モーター1は 0x45、モーター2 は 0x46 のレジスタに書き込むことにより設定可能です。 PWM は正回転するばあいは 1~127 の値、逆回転する場合は -127~-1 の値で設定できます。 ただし、0 の場合はフロートモードで停止、128 の場合はブレーキモードで停止します。

  • C++
     unsigned char buf[2] = {0x45, 0x30};
     write(fd, buf, 2);
    
  • Python
     sm.write_i2c_block_data(0x01, 0x45, [0x30])
    

RCサーボドライバ

RCサーボドライバは最大6個の RCサーボを制御可能であり、0x42~0x47 のレジスタに目標角度を書き込むことで制御できます。 パルス幅は 0.75ms~2.25ms で設定可能です。

  • C++
     ioctl(fd, I2C_SLAVE, 0x02)
     unsigned char buf[2] = {0x42, 0x60};
     write(fd, buf, 2);
    
  • Python
     sm.write_i2c_block_data(0x02, 0x42, [0x60])
    

応用例

以下は DCモーターを利用した乗り物の作成例です。

取っ手部分にLモーターが2個取り付けられており、Lモーターを回転させることで車体の制御が可能になっています。

使用した RTC は以下の通りです。

TetrixVehicle

上記の乗り物を制御するためのコンポーネントです。

  • https://github.com/Nobu19800/TetrixVehicle
TetrixVehicle
InPort
名前 データ型 説明
target_velocity RTC::TimedVelocity2D 目標速度
update_position RTC::TimedPose2D 位置の再設定
OutPort
名前 データ型 説明
position RTC::TimedPose2D 現在位置
コンフィギュレーションパラメータ-
名前 デフォルト値 説明
wheelRadius 0.04 車輪の半径
wheelDistance 0.34 車輪間の距離
portNum 1 ポート番号
rot_dir_left_motor 1 左車輪の回転方向
rot_dir_righteft_motor -1 右車輪の回転方向
GearRatio 3.0 ギア比

VehicleController

Lモーターの角度から車体の目標速度を出力するコンポーネントです。

TetrixVehicle
OutPort
名前 データ型 説明
out RTC::TimedVelocity2D 目標速度
コンフィギュレーションパラメーター
名前 デフォルト値 説明
rotation_by_angle -0.6 根元のモーターの角度に対する目標角速度の変化量
velocity_by_angle -0.1 先端のモーターの角度に対する目標速度の変化量