TAMIYAのロボット工作キットをラズパイで制御する!実践編

1.CAM-PROGRAM ROBOT 製作

それでは、CAM-PROGRAM ROBOT を製作しましょう。

設計図に従って作成すれば、問題なく組みあがると思います。

ギヤケース、モーターの取り付けたの説明書です。

実際に出来上がったギヤケースがこれです。

CAM-PROGRAM ROBOT は、基本的にプログラムバーというものを使用して、ロボットの動きを制御します。

Aタイプ、Bタイプが選べますが、今回はラズパイで制御するので、タイプ選びは不要です。そのため、今回は、ステアリングレッグ(Aタイプで使用)という部品の取付けは中止しました。

キャタピラ(設計図には、履帯※の作成と書いてあります)を作成します。

キャタピラは、8コマ、10コマ、30コマの3本を組み合わせるんですが、止め方がちょっと面倒ですが、落ち着いて行えば問題ないと思います。

さらに、アーム、ルーフを取り付けて完成です。キャタピラーというのは、登録商標なんですね。

※装軌車両において、金属の板を帯状に連結して車輪に履かせた走行装置。 履帯のほか、無限軌道、キャタピラー、クローラー、トラックなどの呼び方がある。 一般によく用いられる「キャタピラー」は、アメリカのキャタピラー社の登録商標である 【ピクシブ百科事典】参照

タミヤ 楽しい工作シリーズ No.227 カムプログラムロボット 工作セット 70227

新品価格
¥2,461から
(2020/1/18 10:45時点)

色違いのものも出ていますね。

タミヤ 工作 カムプログラムロボット工作セット限定カラー(ガンメタル/オレンジ)tk922

新品価格
¥3,456から
(2020/1/18 10:47時点)

2.モータ稼働のテスト

ラズパイを CAM-PROGRAM ROBOT に組み込む前に、モーターの稼働テストをしましょう。

CAM-PROGRAM ROBOT が動き出さないよう、逆さにして机に置きます。

次に、CAM-PROGRAM ROBOT のモーターからのジャンパ線を、前回使用したブレッドボードに接続します。

これで準備が整いました。

前回、使用したプログラムを実行してみます。

左右のキャタピラが同方向に動いた後、一旦止まって、先ほどとは逆方向に動くことが確認できました。

3.RaspberryPi zero WH を搭載

CAM-PROGRAM ROBOT にラズパイを搭載しましょう。
設計図に、ユニバーサルプレートの設定方法が書いてあります。

これに従い、ユニバーサルプレートを取り付けます。

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

新品価格
¥469から
(2020/1/18 10:48時点)

タミヤ 楽しい工作シリーズ No.172 ユニバーサルプレートL 210×160mm (70172)

新品価格
¥514から
(2020/1/18 10:48時点)

まずは、ルーフを取り外します。

突起をユニバーサルプレートの穴に差し込みます。

水色の部品をロボットにセットすることで、ユニバーサルプレートをセットできます。

横から見るとこんな感じです。

取り付けたユニバーサルプレートに、ブレッドボードを置きます。

ブレッドボードの空いたところに、zero WH を両面テープで貼り付けます。

電池ボックスは、奥にセットします。

これで、RaspberryPi zero WH を搭載できました。

4.走行テスト

(1) 走行テスト用プログラム

前後に走らせるだけでは面白くないので、次の順に走行させてみます。

  • 前進 ⇒ 右回転 ⇒ 後進 ⇒ 左回転

右回転、左回転は、キャタピラの動く方向を左右で逆にすれば実現できます。
プログラムソースを以下に示します。

# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO

time.sleep(3)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(8,  GPIO.OUT) #ピン番号8を設定
GPIO.setup(10, GPIO.OUT) #ピン番号10を設定
GPIO.setup(12, GPIO.OUT) #ピン番号12を設定

GPIO.setup(16, GPIO.OUT) #ピン番号16を設定
GPIO.setup(18, GPIO.OUT) #ピン番号18を設定
GPIO.setup(32, GPIO.OUT) #ピン番号32を設定

pwmR = GPIO.PWM(12, 50)
pwmR.start(0)
pwmL = GPIO.PWM(32, 50)
pwmL.start(0)

#前進
pwmR.ChangeDutyCycle(0)
GPIO.output(8,  1)
GPIO.output(10, 0)
pwmL.ChangeDutyCycle(0)
GPIO.output(16, 1)
GPIO.output(18, 0)

pwmR.ChangeDutyCycle(100)
pwmL.ChangeDutyCycle(100)
time.sleep(3)  #前進の距離を調整

#ストップ
GPIO.output(8,  0)
GPIO.output(10, 0)
GPIO.output(16, 0)
GPIO.output(18, 0)
time.sleep(3)

#右回転
pwmR.ChangeDutyCycle(0)
GPIO.output(8,  1)
GPIO.output(10, 0)
pwmL.ChangeDutyCycle(0)
GPIO.output(16, 0)
GPIO.output(18, 1)

pwmR.ChangeDutyCycle(100)
pwmL.ChangeDutyCycle(100)
time.sleep(2)  #回転時間調整

#ストップ
GPIO.output(8,  0)
GPIO.output(10, 0)
GPIO.output(16, 0)
GPIO.output(18, 0)
time.sleep(3)

#後退
pwmR.ChangeDutyCycle(0)
GPIO.output(8,  0)
GPIO.output(10, 1)
pwmL.ChangeDutyCycle(0)
GPIO.output(16, 0)
GPIO.output(18, 1)

pwmR.ChangeDutyCycle(100)
pwmL.ChangeDutyCycle(100)
time.sleep(3) #後退の距離を調整

#ストップ
GPIO.output(8,  0)
GPIO.output(10, 0)
GPIO.output(16, 0)
GPIO.output(18, 0)
time.sleep(3)

#左回転
pwmR.ChangeDutyCycle(0)
GPIO.output(8,  0)
GPIO.output(10, 1)
pwmL.ChangeDutyCycle(0)
GPIO.output(16, 1)
GPIO.output(18, 0)

pwmR.ChangeDutyCycle(100)
pwmL.ChangeDutyCycle(100)
time.sleep(2)  #回転時間調整

pwmR.stop()
pwmL.stop()

GPIO.cleanup()
time.sleep(1)

(2) 実行

それでは、このプログラムを実行してみます。

上記に示した通りに動きましたね。