プログラミングもできる(そしてカワイイ)オープンソースの二足歩行ロボットOTTOを作る

Amazonとか中国の通販サイトを見ていると、4関節の二足歩行ロボットをちょくちょく見かけるなと思っていたのですが

↑こういうやつ

s.click.aliexpress.com
↑これも

同タイプのロボットがオープンソースで公開されているのを発見したので作ってみました。
名前はOTTOといいます。こんなかんじです。

f:id:slideglide:20190104152012g:plain
あるく

f:id:slideglide:20190104151956g:plain
踊る

かわいい……!

f:id:slideglide:20190106230925j:plain
公式サイトより。好きな色で作れる

というわけでこのエントリはOTTOの紹介記事です。

↓OTTO公式サイト
www.ottodiy.com

できること

OTTOはこんなことができます。

サンプルプログラムを動かす

まず、あらかじめ用意されたサンプルプログラムを動かすことができます。
f:id:slideglide:20190104160215p:plain
これがプログラムの一覧です。歩いていって障害物をよけるプログラム(目の部分が超音波式の距測センサになっています)や、ハッピーバースデーを歌う、Smooth Criminalを踊る、などがあります。これだけで十分遊べる充実度です。

www.youtube.com
障害物をよけるプログラムです。床が滑って歩行がいまいちですが、なんとなく避けてくれてます。

www.youtube.com
こちらはOtto_allmovesというプログラムで、こんな動きができますよ、というカタログ的なパフォーマンスです。最後コケるのがかわいい。

プログラミングする

Scratchベースの環境で動作をプログラミングすることができます。
できるのは前進したり曲がったりの移動のほか、ポーズをとる、音を鳴らす、センサーの値での条件分岐、などなど。後述する拡張機能にも対応しています。

f:id:slideglide:20190104160140p:plain
左のブロックを使って真ん中のエリアにプログラムを作ります。右のコード部分は自動生成されます。このキャプチャ内にあるプログラムで

www.youtube.com
こんな動きをします。最後のきめポーズが「LOVE」のポーズらしい。

これはPCからリアルタイムにOTTOをリモートコントロールしているわけではなくて、ロボットのマイコンにプログラムを書き込んでスタンドアローンで動作しています。そのため、一度書き込んでしまえばそのまま持ち出して遊ぶことができます。

もっとプログラミングする

さっき紹介したサンプルプログラムはArduino言語で書かれています。ということは、もちろん自分でもArduino言語でゴリゴリプログラミングすることが可能です。
汎用的な機能はあるていどライブラリ化されているので、そこそこ書きやすそう。

さらに拡張する

今回作ったのはOTTOですが、拡張版としてOTTO+というのもあります。これはBluetoothでスマホから操作できたり、タッチセンサで本体を触るだけで操作できたり、音に反応して動いたりします。
Bluetooth化については試して失敗したので、そのあたりは記事の終盤に。

以上がOTTOの概要です。機能的には以上ですが、なによりフリフリと全身を揺らしながら歩く様子が非常にカワイイです。欲しくなってきましたか?なったあなたに朗報です。なんとOTTOは自作が可能です!

作り方

公式のマニュアルはここっぽいのですが、ぜんぶ英語ですし実際作ってみると注意すべき点などもあったので、そういった情報も含めて、ここでひととおり説明したいと思います。公式マニュアルとあわせて参照してください。

用意するもの

材料

ネット通販を使えば手に入りにくいものはないですが、ブザーやスイッチは日本の定番*1とはちょっと違う形状かも。

  • サーボモータ SG90×4

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

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

  • Arduino Nano 今回は互換品を使用

  • Arduino Nano I/O拡張シールド

  • 超音波センサ HC-SR04

HC-SR04 超音波距離センサーモジュール For Arduino

HC-SR04 超音波距離センサーモジュール For Arduino

  • 12mm径パッシブ・ブザー

  • ジャンパ線 メス-メス

  • 電池ボックス(単3電池4本、2×2のもの)

  • 8mmロックスイッチ

  • M2のねじ+ナット 各2

※ねじはホームセンター等で買った方が安くすみます

工具

はんだづけが必要な個所が少しだけあります。
あとボディは3Dプリンタで出力が必要です。持ってない場合はFablabなどの借りられる施設に行くか、DMM等の出力サービスを使おう。

  • 3Dプリンタ
  • ミニUSBのケーブル(Arduino書き込み用)
  • ドライバー
  • 瞬間接着剤
  • ヤスリ
  • はんだづけ道具一式

キットを買う

買い集めるのが面倒とか、3Dプリンタを使えるあてがどうしてもない場合は、公式サイトで一式そろったキットが買えます
その場合、上記のリストのうちM2ねじ、ナット、およびドライバー以外の工具は僕が付け加えたものなので入ってません。別途用意しよう。

つくる

組み立て時間はざっくり2時間くらいです。(3Dプリントの時間はのぞく)

1.ボディを3Dプリントする

3Dモデルはここからダウンロードできます。
www.thingiverse.com
太ももと足は同じものが2つずつ必要で、ボディと頭をあわせて計6個です。

f:id:slideglide:20190101203411j:plain
こんな感じ。今回は家にウッドPLAのフィラメントが余っていたので使いました。

ウッドPLAは粉末になった木材の混ざったフィラメントです。写真で見ると段ボールっぽい色ですが、3Dプリントの積層が木の繊維のようなテクスチャになるため、実物を見ると思いのほか木製っぽいです。おもしろい質感のものができるので、普通のフィラメントに飽きた人にはおすすめ。
ただちょっと扱いが難しく、高温では糸を引き、低温ではノズルが詰まります。ウッドフィラメントの商品説明にはよく「温度によって色を変えることができます」というようなことが書いてあるのですが、実際には自由度は低いです。
僕が使ったのは上に貼ったやつですが。もっと評判のいいのがあったので今から買うならこっちの方がいいかも。

……とここまでウッドPLAの魅力を熱弁してしておいてなんですが、可能ならABSで出力した方が、あとあと楽です。

2.サーボのセンター出し

組み立ての前に、サーボモーターのセンター出しをします。

公式マニュアルにはこんな図が出てくるのですが、
f:id:slideglide:20190104164927p:plain

要は180度まわるサーボモーターをあらかじめ90度の位置にしてから組み立てよ、ということです。
その割にやり方が書いてないので、ここで説明します。

まずこうしてください。

f:id:slideglide:20190101215253j:plain
Arduino nanoを拡張ボードに刺し、USBケーブルでPCにつなぎます。
さらに、4つあるサーボモーターの端子をIOボードの6、8、9、12に挿します。
サーボの端子の向きは、茶色い線がIOボードのG(黒)、黄色がS(青)です。

で、おもむろにPCの方でArduino IDEを立ち上げまして、以下のコードをコピペします。

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

void setup() {
  servo1.attach(6);
  servo1.write(90);
  delay(1000);

  servo2.attach(8);
  servo2.write(90);
  delay(1000);
  
  servo3.attach(9);
  servo3.write(90);
  delay(1000);

  servo4.attach(12);
  servo4.write(90);
  delay(1000);

}

void loop() {
}

これをArduinoに書き込みます。

書き込みの際は、ツール>ボードから「Arduino Nano」を選ぶのを忘れないようにしましょう。また、場合によってはその下のプロセッサのところで、「ATMega328P(Old Bootloader)」を選ぶ必要があるかもしれません。ここは「やってみてダメだったら変えてみる」方式で大丈夫です。

これでプログラム的にはサーボモータのセンタリングが行われるはずなのですが、パソコンのUSBポートだと電流不足でたぶん動きません。
なので書き込みが終わったら、PCにつないでいるUSBケーブルを携帯の充電アダプタとかに繋ぎなおして、Arduinoのリセットボタンを押してください。
サーボモーターが反応したでしょうか?

終わったらいったん全部ばらします。

3.ボディと太ももの固定

いよいよ組み立てです。まずはボディにサーボモーターをはめます。
f:id:slideglide:20190101215838j:plain
穴にちょうどサーボのでっぱりがはまるように。はまらない場合はボディの穴をヤスリで整えましょう。(以下ずっと、ヤスリは適宜使ってください)

f:id:slideglide:20190101215825j:plain
逆から見るとこんな感じ。はめるだけでなくねじ止めもしてください。サーボ付属のねじの大きい方を、サーボ1個につき2本ずつです。あまりきつく締めるとボディが割れるので、ある程度まででOKです。

次に、付属のサーボアームを加工します。2本分を、以下のようにカットしましょう。がんばればハサミでも切れます。

f:id:slideglide:20190101220521j:plain
上が加工前、下が加工後です。まんなかは説明のために切取り部分を塗りつぶしたところ。

これを太ももパーツにはめる……のですが、そのまえに、次の工程の準備をしておきます。
f:id:slideglide:20190101222449j:plain
のこりのサーボモーターの線を、太ももパーツの開口部からいれて底板の穴に通し、そのままボディ側の穴にも通します。この工程は公式マニュアルではあとでやることになってますが、かなり大変になるので、先にやっておいた方がいいです。

で、いよいよ太ももをボディに固定します。
f:id:slideglide:20190101222604j:plain
右が固定したところ。さっきのサーボアームを、ボディにはめたサーボにグッと押し付けてはめこみます。向きが写真と同じになるように注意してください。はめたら付属の小さい方のねじをサーボアームの真ん中に入れて、固定します。
これをもう片方の足も。

f:id:slideglide:20190101222704j:plain
こんな感じになりました。これで太ももの取り付けは完了です。

4.足の取付け

太ももから先、足のパーツを取り付けていきます。

のこり2本のサーボモーターに、サーボアームを付けます。
f:id:slideglide:20190101222729j:plain
この形のやつを、この向きで。写真はネジがまだですが、締めちゃってOKです。

f:id:slideglide:20190101223313j:plain
そのサーボをこんな感じで太ももパーツにつけて、ねじ止めします。ここはねじ穴が1個しかないので、1個だけ固定します。
ここのねじですが、ねじ穴が1個しかないうえに付属のビスだとどう考えても固定が弱いので、別途用意したM2のボルトを使いましょう。ただし、いまはまだボルトを挿し込むだけにとどめて、ナットはあとで締めます。

で、次がOTTO組み立ての最難関です。足パーツに溝が2つありますよね?
ここに、太ももパーツの突起と、サーボアームを奥までぐっと差し込みます。
コツとしては、

f:id:slideglide:20190104173330j:plain
こういう感じでサーボモータを思い切ってググっと傾けてしまいます。(太もものネジ穴が割れない程度に!)

f:id:slideglide:20190101224230j:plain
で、太ももパーツの突起側を、とにかく足パーツにはめてしまう。

f:id:slideglide:20190104173324j:plain
そのうえで、傾けていたサーボモータを起こしてきて、太ももにグイグイ押し付けて、奥まではめこみます。

以上のような感じやるとうまくいくはず。健闘を祈ります。

f:id:slideglide:20190101225955j:plain
なんとかうまくはまったら、ナットを締めます。

f:id:slideglide:20190101230039j:plain
下半身の完成!!

5.頭の組み立て

ここまで出来たらもう完成したようなものです。
次は頭パーツに超音波センサの取り付け。

f:id:slideglide:20190101230117j:plain
こんな感じ。穴に通すだけです。

f:id:slideglide:20190101230121j:plain
裏です。

突然ですが、ここではんだづけタイムです。

f:id:slideglide:20190101235802j:plain
まずIOボードの、裏にVINと書かれている穴に適当な銅線をはんだ付けします(写真の緑の線)。ない場合はジャンパ線を切って」作りましょう。
もうひとつ、裏にGNDと書かれているところにも、電池ボックスの黒い線をはんだ付けします。

f:id:slideglide:20190102000116j:plain
銅線の空いてるほうの端に、スイッチをはんだ付けします。
スイッチの端子はここです。
f:id:slideglide:20190104174544p:plain
線はどっちがどっちでもいいです。

f:id:slideglide:20190102000202j:plain
これは主電源スイッチになります。実際に電池を入れてみて、ArduinoのON/OFFができることを確認してください。

f:id:slideglide:20190102000920j:plain
配線がすんだら、スイッチをボディに固定します。サーボアームのあまりを使って固定できるようになっていました(見にくいですがサーボアームの下にスイッチがあります)。よくできてる!
写真を撮り忘れましたが、一緒にブザーも差し込んでください。スイッチの反対側(写真でいうと左側)にブザーの固定穴があります。こっちは穴にねじ込むだけです。入らない場合はヤスリで調整しよう。

f:id:slideglide:20190102000302j:plain
できたら頭にArduinoを入れます。ねじ穴がありますが、しっかりねじ止めしてしまうとたぶんUSB端子の位置がボディの穴からずれます。調整しつつ固定しましょう。

できたらいよいよ配線です。
f:id:slideglide:20190104175305p:plain
図は公式マニュアルより。超音波センサがちょっと複雑なので間違えないようにしましょう。

f:id:slideglide:20190102000724j:plain
こんな感じになります。

ここまでできたらいよいよ大詰めです。
f:id:slideglide:20190102001044j:plain
電池ボックスはボディのここに収めまして
f:id:slideglide:20190102001127j:plain
フタを締めます!!!

中身が配線でぎゅうぎゅうなので、力づくで閉めましょう。
閉める過程で9割方の人は頭パーツについてるツメが折れると思いますが、瞬間接着剤で直しましょう。折れる→直す、を3回くらい繰り返すと、鍛えられて折れなくなります。

f:id:slideglide:20190102011102j:plain
できた!!!!!!!!!!!!!!!!!!!!

6.サンプルプログラムの書き込み

ハードウェアが完成したので、今度はソフトウェアです。魂を入れていきます。

GitHubからソース一式をDLします。
f:id:slideglide:20190104175937p:plain
ここ。適当な場所に解凍したら、まずはライブラリをインストールします。
解凍したフォルダ/libraries の中身を、Arduinoのライブラリフォルダ(Windowsの場合 C:\Users\ユーザ名\Documents\Arduino\libraries とか)にコピーします。
LICENSE.mdとreadme.txtはコピーしなくていいです。

できたら、解凍したフォルダに戻って、適当なフォルダの適当なinoをArduino IDEで開きます。
Otto_allmoves/Otto_allmoves.ino あたりが動きも音もあってわかりやすいと思います。

開けたらOTTOのUSB端子をPCに接続して、
f:id:slideglide:20190104120608j:plain
「書き込み」を押して、書き込みできたら完了です。

USBケーブルを外して、スイッチを押してみましょう。
OTTOが動き出します!

f:id:slideglide:20190104151956g:plain

カワイイ……!

プログラミングをする方法

このようにOTTOは見ているだけでもかわいいですが、支配欲の強い人はOTTOを自分で操ってみたくなるかもしれません。

Scratchベースの環境でプログラミングをする方法はこちらに載っています

ざっくり説明すると、

  1. mblock3をインストールする(間違って一番上にあるmblock5を入れてしまうと使えないので注意)
  2. mblock3を起動、Extensions>Manage Extensions>Otto(search)>ottodiy>Download →ブロックのRobotsカテゴリにottodiy用のボタンが追加される
  3. Edit>Arduino Mode
  4. (OTTOをUSB接続しておく)Connect>Serial Port>(Ottoの繋がっているポート)
  5. Boards>Arduino Nano (mega328)

以上で設定は完了です。

あとは好きにプログラムを組んで、右の自動生成コードの上にある「Upload to Arduino」ボタンを押せばArduinoにプログラムが書き込まれます。いったん書き込まれたらUSBケーブルは外してもOKです。

ちなみにOttoのプログラムは「Otto Program」ブロックから実行されるので、処理の最初に入れるようにしましょう。

また、僕は試してませんが、サンプルプログラムの Otto_Mblock_ScratchMode_Serial.ino を使うと、いちいちArduinoに書き込まなくてもリアルタイムでmblockからOTTOを動かせるようです。

拡張する(OTTO+、ほか)

拡張版のOTTO+は、ここにマニュアルがあるので興味があればどうぞ。ボディタッチによるスイッチ操作と音センサ、Bluetoothによるスマホからのコントロールを搭載できます。3Dプリントしたパーツは同じものが使えるようですが、ただでさえ中がギュウギュウなのにこれ以上部品を増やしても大丈夫なのだろうか。
他にも腕を追加したバージョンとかLEDマトリクスを紹介したバージョンなどが、こちらのプロジェクト一覧で見られます。

Bluetoothとの闘い

かくいう僕もBluetoothを搭載しようとして格闘してはみたのですが、結局うまくいかなかったので、以下に経過だけ書き残しておきます。あとに続く人の参考になれば。

  • 標準のbluethoothモジュール、HC-05は技適通ってないので日本では使えない。
  • HC-05を調べると、どうもbluetoothで受信したものをそのままシリアルで送ってくるだけっぽい
  • 代わりにESPr Developer 32を使用することに。ESP32の標準ライブラリにbluetoothSerialというライブラリを発見、サンプルコードがそのまま使えそう。通信速度だけ合わせる。
  • Android端末に専用アプリをインストール、ESP32でコマンドを受信できることを確認。
  • ESP32、電気食いなので乾電池からArduinoと並列つなぎでは辛くて、別電源がいるかも。
  • OttoにBluetooth対応のプログラムをインストール、別電源につないだESP32をシリアル接続する(TX-RX/RX-TX/GND-GNDを接続)も動作せず。シリアル転送のランプはちゃんと点滅するのに。
  • デバッグ。Arduino Nano上で、ESP32からのシリアルをSoftwareSerialで別のArduinoに転送。シリアルモニタで確認するとArduinoまでちゃんとコマンドが来ている。
  • でもサーボもブザーも反応しない、なぜ??
  • (Arduino側5VでESP32が3.3Vなのがちょっと気になったけど、コマンド届いてるのでそこの問題ではなさそう。)

というところで終了です。プログラム側でコマンドのデコードがうまくできてないのかも。これ以上打つ手がなくなったので諦めました。

※追記
未検証ですが下記の方法で動いたという報告がありました。ありがとうございます!

かわいいので作ろう

締めが厳しい話になってしまいましたが気を取り直してまとめです。
OTTOはとてもかわいいロボットですし、自分で作ったとなると愛くるしさもひとしおなので、ぜひ作ってみてください。
大きくカスタマイズしなくても、3Dプリントの色を変えるだけで雰囲気が変わって楽しいと思います!

*1:秋月基準