LoginSignup
0
0

XiaoR GEEK Raspberry Pi TH Robotのサーボを自前で操作してみる

Last updated at Posted at 2023-11-19

概要

XiaoR GEEK Raspberry Pi TH Robotを購入してさあ動かすぞとした際に、付属のライブラリが動かず、自前で動かすハメになりました。しかし、ソースコードやドキュメントといった情報がなかったので調べてみました。

困ったこと

そもそも以下のことに困っていました。

  • 付属のライブラリがPython2用であり、かつ32bitのため最新のOSに対応していない
  • 付属しているドライバ基板がPWR-A53-B2なのですが、ドキュメントはバージョンが古く、PWR-A53-Aを対象としている。回路図上ではサーボ信号とラズパイは直結ですが、実物をみると間にICが挟まっている
  • そのICの通信は、ドキュメント上ではUARTで通信しているように見えるがそうじゃないらしい。どうもI2Cのように見える
  • じゃあ自前で操作したろうと思っても、通信仕様がどこにもない

と言うことで大変困っていました。

やったこと

i2cdetect

なんとなくi2cdetectしてみると、0x17に反応あり。
image.png
他には何も繋いでないので、これがドライバ基板のICっぽい気がした。

制御

じゃあ、適当に書き込んだれと思いましたが、反応なし。
ただ、何回かi2cdumpするとサーボのトルクが0になる謎の挙動が。
色々調べていくと以下のことがわかった。

  • i2c読み取りで制御しているっぽい
  • 特定のフレームシーケンスでメモリアドレスを読み取ると動くっぽい

と言うことで、以下のフレームシーケンスで読み取ると何かしら制御できるっぽいことがわかった。

0 1 2 3 4 5
0xFF 0xFF 0xFF コマンド種別 0xFF
  • コマンド種別: 制御対象となるモノ
  • 値: 制御値 0x00-0xFEまでの値?

ちなみに先述の通りi2cdumpをするとicにリセットがかかる模様でしばらくトルクが0になります。

コマンド種別

これらは全て当方による推測です。ご承知おきください。

種別番号 内容
0x01 角度 00-FE Servo1 角度
0x02 角度 00-FE Servo2 角度
0x03 角度 00-FE Servo3 角度
0x04 角度 00-FE Servo4 角度
0x05 角度 00-FE Servo5 角度
0x06 角度 00-FE Servo6 角度
0x07 角度 00-FE Servo7 角度
0x08 角度 00-FE Servo8 角度

サンプルコード

各サーボを0x10-0x70の範囲で動かします。

import time
import smbus

if __name__ == '__main__':
    data=[
        [0xff,0xff,0xff,0x01,0x10,0xff,],
        [0xff,0xff,0xff,0x01,0x70,0xff,],
        [0xff,0xff,0xff,0x02,0x10,0xff,],
        [0xff,0xff,0xff,0x02,0x70,0xff,],
        [0xff,0xff,0xff,0x03,0x10,0xff,],
        [0xff,0xff,0xff,0x03,0x70,0xff,], 
        [0xff,0xff,0xff,0x04,0x10,0xff,],
        [0xff,0xff,0xff,0x04,0x70,0xff,],
        [0xff,0xff,0xff,0x05,0x10,0xff,],
        [0xff,0xff,0xff,0x05,0x70,0xff,],
        [0xff,0xff,0xff,0x06,0x10,0xff,],
        [0xff,0xff,0xff,0x06,0x70,0xff,],
        [0xff,0xff,0xff,0x07,0x10,0xff,],
        [0xff,0xff,0xff,0x07,0x70,0xff,],
        [0xff,0xff,0xff,0x08,0x10,0xff,],
        [0xff,0xff,0xff,0x08,0x70,0xff,],
    ]
    i2c=smbus.SMBus(1)
    addr=0x17
    for d in data:
        print(d)
        for c in d:
            # read
            _=i2c.read_byte_data(addr,c)
            time.sleep(0.05)
        time.sleep(1)

動画
img.gif

続き

しばらく動かしていたらアームのサーボが動かなくなりました。
カメラのサーボはどの端子に繋いでも動くのですが、アームの方はカタカタ言うだけで動きません。一応、手で支えてやると指定した角度で止まりますが・・・色々試していたら電流流せなくなったのかな。

なので、最終的には諦め別で用意したサーボコントローラを使用することとなりました。ちゃんちゃん。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0