masato-ka's diary

日々思ったこととか、やったことの備忘録。

3DプリンタなしでオリジナルJetbotを作った記録

この記事について

JetbotはNVIDIAのJetson nanoを搭載したDIY Robotcarだ。その作成方法をNVIDIAオープンソースで公開し誰もが作成できる。しかし、車体といった筐体パーツは3Dプリントが必要になる。STLファイルが公開されているとはいえ、3Dプリンタサービスで筐体を出力するのにはそれなりの金額がかかる。そこで、入手性の良い部品を使ってオリジナルのJetbotを作成したので紹介する。

近々キットも発売されるようなのでそれでも面倒な方はそちらから。

robotstart.info

完成したオリジナルJetbot

  完成したJetbotはアルミ製のロボット台車をベースにしている。この台車は秋月電子で購入できる市販品だ。この上にアルミ板を一枚載せてバッテリーとJetson nanoをマウントしている。モータドライバーもWaveshareのMotor Driver HATを利用している。こちらは千石通商で購入できる。

f:id:masato-ka:20190623125330j:plain
完成したJetbot

これらの部品選定については以下野良ハックさんのサイトを参考にさせていただいた。

note.mu

部品リスト

使用した部品は次の表のとおり。Jetson nanoを除けば16000円程度で部品か揃う。Jetson nanoも12000円程度なのでトータルで3万円に達しないくらいで構築できる。

  部品名 数量 参考価格 (円) 購入店舗 備考
FT-DC-002(台車) 1 1,480 秋月電子 -
Motor Driver HAT 1 1,560 千石通商 -
1ミリ厚アルミ板100mmx200mm 1 400 ホームセンタなど -
オスオスジャンパー線 1 200 秋月電子など モータとモータドライバの結線用
2mmネジ 14 200 西川電子部品 -
2mmナット 14 200 西川電子部品 -
2mmx15mmスペーサ 4 100 西川電子部品 -
2mmx5mmスペーサ 12 250 西川電子部品 -
INIU モバイルバッテリー 1 1999 Amazon -
広角カメラ 1 2499 Amazon -
Raspberry Pi Camera Model V2 1 3,900 Amazon -
micro SD Card U3 A2 1 3480 Amazon -

 

作成のノウハウ

基本的な作り方や構成はNVIDIA公開のWikiと同じになる。特別なノウハウは特にないのだがNVIDIA公開手順と違うポイントを中心に、紹介する。  

筐体の作成

筐体の構成は3層構造になている。まずはモータ含む台車部分だ。これは台車をそのまま組み立てる。その上にモバイルバッテリーを配置する。さらにスペーサを支柱がわりにアルミ板を載せる。アルミ板の上にJetson nanoをマウントする。

f:id:masato-ka:20190626095056j:plain

台車への穴あけ

台車に空いているネジ穴はモバイルバッテリーで塞がれてしまう。そこで、モバイルバッテリーに干渉しないよう、新しくネジ穴を開ける必要がある。台車の天板四隅に2mmネジの穴を開ける。穴にはスペーサを取り付ける。今回は15mmのスペーサと5mmのスペーサを組み合わせて20mmの長さにした。

f:id:masato-ka:20190623123223j:plain

アルミ板の加工方法は後述する。

アルミ天板の作成

次にアルミの天板を作成する。まずはアルミ板の切り出しサイズと台車と連結するネジ穴を開ける。寸法は実物を使って適当に印をつける。この際に、台車のネジ穴位置を間違えないようにする。

f:id:masato-ka:20190621222638j:plain
アルミ板の切り出しサイズの決定と穴あけ位置の決定

切り出しと穴あけが終わったアルミの天板にJetson nanoをそっとのせる。Jetson nanoがショートしないように電源を全て取り外し、十分に放電しておくと良いだろう。静電気にも注意したい。Jetson nanoのネジ穴の位置を天板城へ直接採寸する。Jetson nanoのネジ穴から細めの油性マジックで天板へ印をつけていく。Jetson nanoの設置むきに注意する。I/O用ピンヘッダがでている側が車体の後方である。また、前方にはカメラを固定する必要があるため、若干天板の後ろ気味に設置し、前方にスペースを出す方が良いだろう。

f:id:masato-ka:20190621224040j:plain
Jetson nanoの採寸、アルミ板に載せるのでショートに注意

 アルミの天板は本体と固定するスペーサ用の穴とJetson nanoを取り付ける穴を開ける。こちらも2mmのネジ穴となる。カメラを固定するためのネジ穴も開けておく。

カメラ天板の作成

 カメラマウントもアルミで作る。Raspberry Pi Camera V2とスペーサを介してアルミ板に固定する。カメラが少し地面を向くように「く」の字に曲げておき、カメラが付いていない辺を本体との固定に使う。

f:id:masato-ka:20190628135625j:plain
カメラマウント

作成したカメラマウントはアルミ天板に設置する。カメラ中心がなるべく車体中央になるように穴あけ位置を決める。先にカメラマウント側に穴を開け、位置合わせをするといいだろう。

f:id:masato-ka:20190623123921j:plain
カメラマウントを天板に設置した様子

加工について

 アルミのカットや穴あけは一見難しそうだが、カッターナイフやピンバイスといった工具で作業ができる。今回は写真のような工具を利用している。

f:id:masato-ka:20190623135318j:plain
利用した工具

左に写っているドリルはタミヤから発売されている組み立て式のドリルでヨドバシカメラでも購入できる。付属に2mmのピンバイスが付属しているのでネジ穴はこれで開けられる。

https://www.amazon.co.jp/%E3%82%BF%E3%83%9F%E3%83%A4-%E3%82%AF%E3%83%A9%E3%83%95%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%9B%BB%E5%8B%95%E3%83%8F%E3%83%B3%E3%83%87%E3%82%A3%E3%83%89%E3%83%AA%E3%83%AB-%E3%83%97%E3%83%A9%E3%83%A2%E3%83%87%E3%83%AB%E7%94%A8%E5%B7%A5%E5%85%B7-74041/dp/B01LX208SY/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%BF%E3%83%9F%E3%83%A4+%E3%83%89%E3%83%AA%E3%83%AB&qid=1561690301&s=gateway&sr=8-3www.amazon.co.jp

穴を開ける場合はけがき代わりにピンバイスで少し浅めの穴を削ってからドリルで穴あけする。こうすることでずれずに穴を開けることができるドリルを使う際はゴーグルなどをして、アルミの削りカスや折れたドリル歯の破片から目を保護することを強くお勧めする。

アルミのカットについては以下の動画が参考になる。こちらの動画では万力などを利用している。今回のサイズ感のものであれば手で抑えれば十分だ。

www.youtube.com

いずれにしても加工の際の怪我には十分注意する。自身がない場合は、ホームセンターや有料工作スペースで相談してみるのも良いだろう。 カインズホームでは有料の工作スペースがある店舗がある。3Dプリンタも置いていたりする。

www.cainz.co.jp

モータドライバ

モータドライバ接続の注意点

モータドライバは前述の通り、WaveshareのMotor Driver HATを利用している。このボードに外部電源を接続してはいけない。Jetson nanoの接続については何も考えずにピンヘッダに差し込むだけでOKだ。注意点は、モータ用の外部電源を接続してはいけないという点だ。このボードはモータ用に外部から6V以上の電源を供給できるようになっている。しかし、このボードに6Vを供給するとモータドライバ側からJetson nano側の5V端子に電力を供給してしまう。電気的に危険に思うので外部電源は接続しないのが無難だろう。Motor Driver HATのスイッチもオフにしておこう。

ソフトウェアの修正

オリジナルのJetbotで使われているモータドライバとWaveshareのモータドライバは基本構成は同じだ。それぞれPCA9685というI2CインタフェースのPWMコントローラからTB6612というDCモータドライバを制御している。しかし、PCA9685とTB6612の接続ピンアサインに違いがあるため、Jetbotのサンプルを使うためにはAdafruitのドライバを修正する必要がある。以下のコマンドで修正する。

sudo vi /usr/local/lib/python3.6/dist-packages/Adafruit_MotorHAT-1.4.0-py3.6.egg/Adafruit_MotorHAT/Adafruit_MotorHAT_Motors.py

class Adafruit_DCMotor:
    def __init__(self, controller, num):
        self.MC = controller
        self.motornum = num
        pwm = in1 = in2 = 0

        if (num == 0):
                 pwm = 5 # 8 -> 5
                 in2 = 4 # 9 -> 4
                 in1 = 3 # 10 -> 3
        elif (num == 1):
                 pwm = 0 # 13 -> 0
                 in2 = 1 # 12 -> 1
                 in1 = 2 # 11 -> 2
        elif (num == 2):
                 pwm = 2
                 in2 = 3
                 in1 = 4
        elif (num == 3):
                 pwm = 7
                 in2 = 6
                 in1 = 5

また、JetbotのリポジトリをコピーしてJetbotnライブラリをインストールする。自分の環境ではモータドライバのI2Cアドレスを0x60として呼び出しを行っていた。デフォルトは0x40なので修正した。

github.com

jetbot/robot.pyの22行目を以下のように修正する。 (追記 2020/04/26 Lunranさんからのご指摘で、引数名が違っていたようです。address->addrに変更しました。)

       self.motor_driver = Adafruit_MotorHAT(addr=0x40, i2c_bus=self.i2c_bus)

まとめ

Jetbotは手軽に移動ロボットが作れるプラットフォームとして興味があった。しかし3Dプリンタのボディー作成にお金がかかりそうで躊躇していた。今回のように既製品とちょっとの工作の組み合わせでオリジナルJetbotを構築できれば同じようなポイントで躊躇してる人もはじめやすくなるのではないだろうか。Jetbotを使った面白い事例がもっと増えてほしい。