« シャープのRoBoHoN 6月発売! | トップページ | Apple IIのソフト500本が動くサイト »

2016年3月17日 (木)

Raspberry Piで4足歩行ロボット作ってみた

なんだかレトロPC復活だのセンサー系の工作だので、気が付いたら大人の喜ぶ(?)物しか作ってませんね。

ということで、Raspberry Piレーダーからごろっと方針転換、今度は子供の喜びそうなものを作ってみました。

先日「Arduinoでロボット工作をたのしもう」買ってみたという記事を書きましたが、あれを読んでたら4足歩行くらいなら簡単に作れるんじゃないかと思いまして。

早速作ってみました。

で、買ったものはこちら。

Img_0448

右のテスターはついでに買っただけで今回は登場しません。

”発泡スチロールカッター”というのが今回使った道具の一つ。何に使ったのかは後ほど。

Img_0449

最低8自由度が必要なので、このSG-90サーボを10個買いました。

10個で4,000円。ほんと安いですね、このサーボ。

これに先日買ったPCA9685を組み合わせて使います。

さて、ロボットを作るにはサーボ同士を結合しなきゃいけません。

その結合用ブラケットをどうやって作るのか!?

先の「Arduinoでロボット工作をたのしもう」ではアルミ板を使ってブラケットを作成。

しかし万力が必要だったり、金鋸でごりごりやるため室内での作業がやりづらいなど、少々敷居が高い。

でいろいろとググって、参考にしたのはこちらのサイト。

その10 プラ板でブラケット作成に挑戦する!

プラ版を使ってSG-90用サーボ ブラケットを作成してます。

金属を加工するわけじゃなければ、比較的簡単に作れそう。

Img_0450

てことで、近所のホームセンターで厚さ1mmのアクリル板を購入。

15mm幅の線をマジックで引いてカッターで深さ1/3ほど切れ込みを入れて

Img_0451

曲げるとぱきっときれいに切れます。

これは楽ですね。

Img_0452

こんな感じに寸法を書いておきます。

Img_0453

なお、今回作ったブラケットは上の2種類。

あとは折れ線に沿って曲げるだけなんですが

Img_0454

そこで登場するのがこの発泡スチロールカッター。ホームセンターで購入、約600円。

乾電池でニクロム線を加熱、このニクロム線の熱で曲げ加工します。

Img_0456

なおこの辺がスイッチになってて

Img_0457

ぎゅっと押してる間だけ通電します。

Img_0458

曲げ方ですが、まず5秒通電して過熱 → 折り曲げ線に20秒押し当てる → そこからじわーっと10秒ほどかけて曲げる → スチロールカッターを引き抜き、曲げた状態を5秒ほど保つ。

Img_0459

するときれいに90度曲がった板に成形できます。

Img_0464

とはいえ、最初のうちはなかなかうまくいきません。

これくらいしなってても、何とか支障なく使えました。

Img_0465

ただのコの字のブラケットと、先端5mmを曲げた2種類のブラケット、これらの腹部分を上のようにねじで結合。

ねじを通す前に、1mm径のピンバイスで穴を開けておきます。

なお、今回の工作ではこのねじをSG-90付属のものだけ使いました。

SG-90には長いねじが2本、短いのが1本ありますが、数の関係でなるべく長いのを使います。

Img_0466

端曲げブラケットに、上のようにサーボを固定。

Img_0467

で、もう一方のブラケットに、サーボホーンを取り付けるため9mmの穴を開けようとしたんですが・・・

Img_0468

割っちゃいました・・・

Img_0470

仕方がないので、一方を20mm、もう一方を11mmの長さにカットして、上のように無理やりサーボホーンを取り付け。

Img_0469

もう一方の20mm長さのほうには3mm径の穴を開けて

Img_0473

サーボ底面にSG-90付属の短い方のねじをつけて軸とします。

取り付け後、上のように角をカットしておくと安全です。

さてロボット本体ですが、

Img_0472

タミヤのこういうのを購入。

Img_0474

この穴だらけの板を本体として使います。

Img_0476

こんな感じに軸受け部品を取り付けて

Img_0477

両面テープとバンドで無理やり固定しました(;´Д`)

相変わらず手抜き多いです、このブログ。

Img_1311

さて、脚の部分をどうしようかと思ったんですが、上のように長さ80mm×幅30mmの板を

Img_1312

4枚作成。

Img_1313

これを先のスチロールカッターで曲げて・・・と行きたいところですが、わずかに幅が大きすぎてうまく加工できません。

左右端を交互に暖めて、徐々に曲げていき

Img_1314

なんとか作りました。

Img_1315

あとはこんな感じに無理やりサーボホーンを取り付けて

Img_1316

なんだか、ロボットの足っぽくなりました。

Img_1319

残り3本作る前に、ちゃんと8個のサーボが動作するかどうかチェック。

使ったプログラムは以下の記事のものを使用。

Raspberry Piで10個のサーボモーター動かしてみた: EeePCの軌跡

動作確認をしたサーボを使って残り3本の脚を作成します。

Img_1317

ブラケットですが、上から下にかけて、だんだんと工作精度が上がってるのがわかるかと思います。直角に曲げられるようになってきましたねぇ。

Img_1322

ついに4本の脚完成!

さらっと書いてますが、半日仕事でした。

Img_1310

アクリル板も常にきれいに割れてくれるわけでもなし、時々こうなります。ちゃんと切れ込みをしっかり入れて割らないとだめですね。

こういう失敗をくぐり抜けトライ&エラーしたため、結構時間かかりました。

Img_1324

あとは上にRaspberry Pi B+とPCA9685をぶちまけておき、いよいよ動作チェック・・・

と行きたいところですが、問題が2つ発生。

一つはアクリル板を曲げただけの脚ではつるつる滑って前に進まない恐れあり。

Img_1325

これを解決するため、百均で買った激落ちくんを使います。

Img_1327

こんなくらいの厚さに切って真ん中に切れ込みをいれて

Img_1328

差し込みます。

エッジの怪我対策と、脚部摩擦対策の一石二鳥なアイデアです。

そのままでは簡単に抜けるため、アロンアルファを隙間に流し込み接着します。

Img_1332

もう一つの問題はこれ。

脚とサーボホーンの固定に長めの方のねじを使った結果、サーボに引っかかる場合があります。

ねじの先をカットしなきゃいかんですが、困ったことにサーボホーンが邪魔でペンチでカットできません。

Img_1337

で、編み出した解決策はこれ。

ダイソーで以前買った金鋸でねじの根元を60~70回削り

Img_1335

ペンチでぐりぐりこじって

Img_1336

へし折ります。

ちょっと大変ですが、これで何とかなりました。

Img_1340

Raspberry Piをオンして、サーボを0点にあわせると・・・なんだかゆがんでます。

サーボホーンを抜いて、ちょうどいい位置にあわせます。

Img_1341

またしてもトラブル発生!!

ブラケットが一つへし折れました orz

Img_1342

そこはアロンアルファ様を召喚し、強引に固めていただきました。

Img_1345

さて、ハードはほぼ完成、いよいよソフト編。

とその前に、サーボの番号をチェック。

本当は右前足、左前足、右後足、左後足の順に、根元(root)/脚(leg)の順にIDをつけたつもりだったんですが・・・動作チェックしてみると、上のような付き方をしてました。

モーション作成時に気づいたため、このままPCA9685のコネクタの差し替えをせず、そのままコードを組みました。

まずは、前進用コード(Servo_f2.py)。

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 150  # Min pulse length out of 4096
servoMax = 600  # Max pulse length out of 4096
servoMid = 375  # Mid pulse length out of 4096

def setServoPulse(channel, pulse):
  pulseLength = 1000000                   # 1,000,000 us per second
  pulseLength /= 60                       # 60 Hz
  print "%d us per period" % pulseLength
  pulseLength /= 4096                     # 12 bits of resolution
  print "%d us per bit" % pulseLength
  pulse *= 1000
  pulse /= pulseLength
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz
# Change speed of continuous servo on channel O
# Forward
#Motion 1
for i in range(0,3):
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 300) #left rear leg
  time.sleep(0.1)

#Motion 2
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 300) #left rear leg
  time.sleep(0.1)

#Motion 3
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 450) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 300) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 4
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 450) # Left front leg
  pwm.setPWM(3, 0, 450) # Left front root

  pwm.setPWM(4, 0, 300) # Right rear leg
  pwm.setPWM(5, 0, 300) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 5
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 450) # Left front root

  pwm.setPWM(4, 0, 450) # Right rear leg
  pwm.setPWM(5, 0, 300) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 6
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 450) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 7
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 300) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 450) #left rear leg
  time.sleep(0.1)

#Motion 7
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 300) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 450) #left rear leg
  time.sleep(0.1)

#Motion 8
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root
 
  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

# Zero Position
  pwm.setPWM(0, 0, 375)
  pwm.setPWM(1, 0, 375)

  pwm.setPWM(2, 0, 375)
  pwm.setPWM(3, 0, 375)

  pwm.setPWM(4, 0, 375)
  pwm.setPWM(5, 0, 375)

  pwm.setPWM(6, 0, 375)
  pwm.setPWM(7, 0, 375)
  time.sleep(0.2)

右ターンのコード(Servo_r2.py)。

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 150  # Min pulse length out of 4096
servoMax = 600  # Max pulse length out of 4096
servoMid = 375  # Mid pulse length out of 4096

def setServoPulse(channel, pulse):
  pulseLength = 1000000                   # 1,000,000 us per second
  pulseLength /= 60                       # 60 Hz
  print "%d us per period" % pulseLength
  pulseLength /= 4096                     # 12 bits of resolution
  print "%d us per bit" % pulseLength
  pulse *= 1000
  pulse /= pulseLength
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz
# Change speed of continuous servo on channel O
# Right turn
#Motion 1
for i in range(0,8)
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 450) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 2
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 3
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 450) #left rear leg
  time.sleep(0.1)

#Motion 4
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

# Zero Position
  pwm.setPWM(0, 0, 375)
  pwm.setPWM(1, 0, 375)

  pwm.setPWM(2, 0, 375)
  pwm.setPWM(3, 0, 375)

  pwm.setPWM(4, 0, 375)
  pwm.setPWM(5, 0, 375)

  pwm.setPWM(6, 0, 375)
  pwm.setPWM(7, 0, 375)
  time.sleep(0.1)

左ターンのコード(Servo_l2.py)。

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 150  # Min pulse length out of 4096
servoMax = 600  # Max pulse length out of 4096
servoMid = 375  # Mid pulse length out of 4096

def setServoPulse(channel, pulse):
  pulseLength = 1000000                   # 1,000,000 us per second
  pulseLength /= 60                       # 60 Hz
  print "%d us per period" % pulseLength
  pulseLength /= 4096                     # 12 bits of resolution
  print "%d us per bit" % pulseLength
  pulse *= 1000
  pulse /= pulseLength
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz
# Change speed of continuous servo on channel O
# Left turn
#Motion 1
for i in range(0,8):
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 2
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 3
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 300) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 4
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 300) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

# Zero Position
  pwm.setPWM(0, 0, 375)
  pwm.setPWM(1, 0, 375)

  pwm.setPWM(2, 0, 375)
  pwm.setPWM(3, 0, 375)

  pwm.setPWM(4, 0, 375)
  pwm.setPWM(5, 0, 375)

  pwm.setPWM(6, 0, 375)
  pwm.setPWM(7, 0, 375)
  time.sleep(0.1)

後退のコード(Servo_b2.py)

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 150  # Min pulse length out of 4096
servoMax = 600  # Max pulse length out of 4096
servoMid = 375  # Mid pulse length out of 4096

def setServoPulse(channel, pulse):
  pulseLength = 1000000                   # 1,000,000 us per second
  pulseLength /= 60                       # 60 Hz
  print "%d us per period" % pulseLength
  pulseLength /= 4096                     # 12 bits of resolution
  print "%d us per bit" % pulseLength
  pulse *= 1000
  pulse /= pulseLength
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz
# Change speed of continuous servo on channel O
# Backward
#Motion 1
for i in range(0,3):
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 300) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 450) #left rear leg
  time.sleep(0.1)

#Motion 2
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 300) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 450) #left rear leg
  time.sleep(0.1)

#Motion 3
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 450) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 4
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 300) # Left front leg
  pwm.setPWM(3, 0, 450) # Left front root

  pwm.setPWM(4, 0, 450) # Right rear leg
  pwm.setPWM(5, 0, 300) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 5
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 450) # Left front leg
  pwm.setPWM(3, 0, 450) # Left front root

  pwm.setPWM(4, 0, 300) # Right rear leg
  pwm.setPWM(5, 0, 300) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 6
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 450) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 300) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

#Motion 7
  pwm.setPWM(0, 0, 375) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 375) #left rear root
  pwm.setPWM(7, 0, 300) #left rear leg
  time.sleep(0.1)

#Motion 7
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 450) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root

  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 300) #left rear leg
  time.sleep(0.1)

#Motion 8
  pwm.setPWM(0, 0, 300) # Right front root
  pwm.setPWM(1, 0, 375) # Right front leg

  pwm.setPWM(2, 0, 375) # Left front leg
  pwm.setPWM(3, 0, 375) # Left front root
 
  pwm.setPWM(4, 0, 375) # Right rear leg
  pwm.setPWM(5, 0, 375) # Right rear root

  pwm.setPWM(6, 0, 450) #left rear root
  pwm.setPWM(7, 0, 375) #left rear leg
  time.sleep(0.1)

# Zero Position
  pwm.setPWM(0, 0, 375)
  pwm.setPWM(1, 0, 375)

  pwm.setPWM(2, 0, 375)
  pwm.setPWM(3, 0, 375)

  pwm.setPWM(4, 0, 375)
  pwm.setPWM(5, 0, 375)

  pwm.setPWM(6, 0, 375)
  pwm.setPWM(7, 0, 375)
  time.sleep(0.2)

どうやって動いているのかは、動画をご覧ください(前進、左ターンのみですが)。

あまりきれいなコードではありませんが、一応動作するようになりました。

Img_1378

こんな感じに有線LANのまま、しかもモバイルバッテリーを引きずってます。完成形には程遠い。

しかも、現状では前進するたびに

sudo python Servo_f2.py

などとコマンドを実行しなきゃいけません。

出来ればリモコンのようなものや、ブラウザ操作できるようにしたいですね。

まだまだ、先は長そうです。

しかし、意外と簡単にできました、4足歩行ロボット。

でもそろそろ3Dプリンター、欲しいですねぇ。部品加工が大変です。

デジタル・マイクロサーボ SG90 (5個)

PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続)

« シャープのRoBoHoN 6月発売! | トップページ | Apple IIのソフト500本が動くサイト »

おもちゃ系」カテゴリの記事

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

お疲れさまです
いつもながら工作記事は楽しまれながら書かれてますねw

アクリルブラケットの穴加工ですが、下に木片を当てた状態で行うと割らずに済みます。
Cチャンネルみたいな形に成型してしまい、後で木片を噛ませるのが困難なら、
平のまま予め穴を開けてから折り曲げ加工すると楽です。
いずれも下にダメにしていい木材を敷い(当て)て、対象をたわませないようにするのがミソです。

タッピングビスはそのやり方でもいいですが、切る時にどうしても周囲に傷を付けてしまいます。
なのでこれも予め短くしたビスを作っておいた方がいいでしょう。
5mm厚ぐらいのベニヤなんかに先端が飛び出すように打ってあげれば、今回同様の工程で加工出来ます。
実際の固定時には下穴の空いてる樹脂相手ならそのままでもねじ込めると思いますし、
固いようならちょっと手間ですが未加工のビスを1本打ってタップを切り、
それを抜いてから改めて短くしたビスで固定すると良いかと思います。

それにしてもWDが専用HDDなんてのまで出してきましたし、
どこまでいくんでしょうね、ラズパイ

こんにちは、緋呂々さん。

今思えば準備不足も甚だしいですね。ネジもあらかじめ切っておけばよかったんですが、最初のやつがなんとなくうまくいったため、そのままにしてたんですよね。

一旦つけてから外し、カットしてからもう一度付けるというのをやってもよかったんですが、横着しました。反省。

こんな道具でもロボットを作ろうと思えば作れるというのが証明できただけでも収穫でしょうか?もうちょっと改良していきます。

はじめまして。

面白い記事をありがとうございます。

ブラケットもタミヤのユニバーサルプレートで作ったほうが
手間・強度・精度の面で良いのではないでしょうか。

また、アルミ製のブラケットを制作する場合はアルミ板を万力で直角に曲げるのではなく、
アルミ角パイプを電ノコなどで輪切りにした方が手間をかけずに精度よく作れます。
(この方法なら曲げ加工の必要も無いので強度も上がります)

こんにちは、吹雪改二さん。

おっしゃるとおりですね。アクリル板の方が安かったのでついこちらの方法で強行してしまいました。不器用なくせに、貧乏臭い方法を選んでしまうもので。

次に作る機会があるときは、アルミ角パイプも考えてみます。まずは電ノコを買わなきゃいけないでしょうが・・・まあ、いずれ使う道具ならば、買っておくのも手でしょうけど。

arkoujiさん

こんばんは。
電ノコは工具レンタルで借りるのもアリだと思います。
四足歩行ロボットの更なる進化を楽しみにしております。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Piで4足歩行ロボット作ってみた:

« シャープのRoBoHoN 6月発売! | トップページ | Apple IIのソフト500本が動くサイト »

無料ブログはココログ

スポンサード リンク

ブログ村