概要
XiaoR GEEK Raspberry Pi TH Robotを購入してさあ動かすぞとした際に、付属のライブラリが動かず、自前で動かすハメになりました。しかし、ソースコードやドキュメントといった情報がなかったので調べてみました。
困ったこと
そもそも以下のことに困っていました。
- 付属のライブラリがPython2用であり、かつ32bitのため最新のOSに対応していない
- 付属しているドライバ基板がPWR-A53-B2なのですが、ドキュメントはバージョンが古く、PWR-A53-Aを対象としている。回路図上ではサーボ信号とラズパイは直結ですが、実物をみると間にICが挟まっている
- そのICの通信は、ドキュメント上ではUARTで通信しているように見えるがそうじゃないらしい。どうもI2Cのように見える
- じゃあ自前で操作したろうと思っても、通信仕様がどこにもない
と言うことで大変困っていました。
やったこと
i2cdetect
なんとなくi2cdetectしてみると、0x17に反応あり。
他には何も繋いでないので、これがドライバ基板の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)
続き
しばらく動かしていたらアームのサーボが動かなくなりました。
カメラのサーボはどの端子に繋いでも動くのですが、アームの方はカタカタ言うだけで動きません。一応、手で支えてやると指定した角度で止まりますが・・・色々試していたら電流流せなくなったのかな。
なので、最終的には諦め別で用意したサーボコントローラを使用することとなりました。ちゃんちゃん。