Raspberry pi でロボットアームを動かす その4 接続と動作テスト
MG996R も、DS3218 も、可動域が違いますがほぼ一緒です。
PCA9685 で、60hzで全部動かしちゃいます。
150 で最小値、 600 で最大値 を取ってくれる、、、みたいです。
可動域
MG996R 120度 DS3218 180度
ちなみに、可動域を超えて動かそうとすると、すごい発熱します!
ハンドの部分は、モーターの可動域そのままは使用しません。
ハンドの可動域を超えて動こうとして壊れないように、範囲を限定して動かします。
私の場合は
min = 250 max = 395
です。
コーディング
ハンド以外も、パーセント指定で動かせたほうが楽かと思い、書き直しました。
#!/usr/bin/python # coding: utf-8 from __future__ import division import time import Adafruit_PCA9685 # Uncomment to enable debug output. #import logging #logging.basicConfig(level=logging.DEBUG) pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(60) def MG996R_BASE( percent ): channel = 0 min = 150 max = 600 a_percent = (max-min)/100 pwm.set_pwm(channel, 0, int(a_percent*percent)+min) def DS3218_LEAN_UNDER( percent ): percent = 100 - percent channel = 1 min = 250 max = 500 a_percent = (max-min)/100 pwm.set_pwm(channel, 0, int(a_percent*percent)+min) def MG996R_LEAN_UPPER( percent ): channel = 2 min = 150 max = 500 a_percent = (max-min)/100 pwm.set_pwm(channel, 0, int(a_percent*percent)+min) def MG996R_WRIST( percent ): channel = 3 min = 150 max = 600 a_percent = (max-min)/100 pwm.set_pwm(channel, 0, int(a_percent*percent)+min) def MG996R_HAND( percent ): channel = 4 min = 250 max = 395 a_percent = (max-min)/100 pwm.set_pwm(channel, 0, int(a_percent*percent)+min) def calibration(): MG996R_BASE(0) time.sleep(1) MG996R_BASE(50) time.sleep(1) MG996R_BASE(100) time.sleep(1) MG996R_BASE(50) time.sleep(1) DS3218_LEAN_UNDER(0) time.sleep(1) DS3218_LEAN_UNDER(50) time.sleep(1) DS3218_LEAN_UNDER(100) time.sleep(1) DS3218_LEAN_UNDER(50) time.sleep(1) MG996R_LEAN_UPPER(0) time.sleep(1) MG996R_LEAN_UPPER(50) time.sleep(1) MG996R_LEAN_UPPER(100) time.sleep(1) MG996R_LEAN_UPPER(10) time.sleep(1) MG996R_WRIST(0) time.sleep(1) MG996R_WRIST(50) time.sleep(1) MG996R_WRIST(100) time.sleep(1) MG996R_WRIST(50) time.sleep(1) MG996R_HAND( 5 ) time.sleep(1) MG996R_HAND( 95 ) time.sleep(1) def move01(): MG996R_HAND(80) time.sleep(1) MG996R_HAND(0) time.sleep(1) DS3218_LEAN_UNDER(20) time.sleep(1) MG996R_BASE(40) time.sleep(1) MG996R_BASE(48) time.sleep(1) MG996R_LEAN_UPPER(10) time.sleep(1) MG996R_LEAN_UPPER(18) time.sleep(1) time.sleep(2) for var in range(0, 4): MG996R_HAND(10) time.sleep(0.5) MG996R_HAND(90) time.sleep(0.5) if __name__ == '__main__': try: while True: #calibration() move01() break except KeyboardInterrupt: pass MG996R_BASE(50) # 旋回 time.sleep(0.5) DS3218_LEAN_UNDER(80) # 傾斜・下 time.sleep(0.5) MG996R_LEAN_UPPER(10) # 傾斜・上 time.sleep(0.5) MG996R_WRIST(50) #ハンド回転 time.sleep(0.5) MG996R_HAND( 50 ) # ハンド開閉 time.sleep(0.5) print("END.\n")
電源の交換
それぞれ独立して動かす分には、6V 2A で足りることがわかったので、別途用意した ACアダプター(6V 2.8A)を使用することにしました。
動作も問題無さそうです。
以下の2つを使用しました。
スイッチングACアダプター6V2.8A 100V〜240V GF18−US0628−T: 電源一般 秋月電子通商 電子部品 ネット通販
2.1mm標準DCジャック⇔小型ねじ端子台(着脱可能): パーツ一般 秋月電子通商 電子部品 ネット通販