2000円台で買えるロボットおもちゃをWifiとscratch対応に改造してプログラミング教育王に俺はなる

(あらすじ)レビュー依頼がきたので少しレビューしたあと改造し倒す記事です。

中国のロボットおもちゃ CADY WIGI

中国の通販サイトとか見てると、ロボットのおもちゃが結構あるんですよね。それもただ眼が光るとか音が出るじゃなくて、ちゃんと自走したりプログラムとかできるような機能がついてるやつ。いっこ欲しいなと思ってたんですけど、いかんせん見た目がこんな感じなんです。

日本で売ってるロボホンとかと全然方向性違うじゃないですか。かわいいのが唯一の正義とは言いませんけど、もうちょっと何とかなったのではないか。

という感じで微妙に食指が動かずにいたところ、タイミングよく通販サイトのGEARBESTから「レビュー書いてくれたら商品あげるよ」というメールが来たので、それならというので送ってもらうことにしました。

Gearbest CADY WIGI
(商品ページ)JJRC R6 Intelligent Programmable RC Robot - BUTTERFLY BLUE

しかも、よく探したらけっこうかわいいのもあったんですよ。JJRCというメーカーのCADY WIGIというロボットです。これなら部屋にあっても「異形!」って感じにはならないでしょう。これをいっこもらってレビューを書くということで交渉成立しました。

f:id:slideglide:20180702131544j:plain

届きました。海を越えてきたな、という感じの箱。

f:id:slideglide:20180702131625j:plain

いいですね、かわいい。

CADY WIGIは2つの駆動輪で自走します*1。あと出力としては目が光るのと、スピーカーがついています。入力はリモコン用の赤外線センサと、底面にフォトリフレクタ×2。
ロボットとしての機能は下記です。

  • 赤外線リモコンによる操作(前後の移動、左右の方向転換、目のON/OFF、ボリューム、電源ON/OFF、および以下の各機能の起動)
  • ライントレース(黒い線に沿って進む)
  • 迷路探索(ゴールするとは限らない)
  • ダンス
  • プログラミング(といっても押したボタン操作を記憶して、再生ボタンで順番に動くというだけ)

この入出力構成でパッと思いつく感じの機能は一通りついているという印象です。

各機能の様子を動画にまとめました。

あと、腕と頭はモーターが入ってないので自動では動きませんが、手で動かせば角度を変えることはできます。

f:id:slideglide:20180702134309j:plain

ちょっと動きのある感じのポージングが可能。

Intelligentとかいって付属の迷路すらゴールにたどり着けなかったり、Programmableとかいって押したボタンを記憶するだけだったりと、すごいものを期待して買うとガッカリしそうですが、なにぶん値段が2000円台なので価格なりには十分に遊べる商品だと思いました。


レビューは以上です。さて義務は果たしたので改造していくぞ!!

プログラミング教育王に俺はなる

上でも言及しましたが、やっぱりポイントは「Programmable」だと思うんですよね。あらかじめついているのは押したボタンを記憶するだけの機能なのですが、そうじゃなくてコーディングが可能な、ほんとにProgrammableなロボットに改造しようというのがこの記事の趣旨です。

プログラミング環境は、2020年プログラミング必修化を前にグイグイ来ている、ビジュアルプログラミング環境のScratchを使います。プログラミング教育ビジネスで一攫千金を狙うぞ!

f:id:slideglide:20180616224735p:plain
Scratchです

いまさらですが、長くなるので目次を入れます。

Scratch経由で操作できるようにする

さて、改造といっても内蔵のチップを書き換えたりできるわけではないので、いまある機能をうまくハックして、目的の機能を実装する必要があります。
幸い、CADY WIGIにはリモコンから前進後退・方向転換等の操作ができる機能があります。この赤外線信号をScratchの指示で出すことができれば、Programmableといえそうですよね。ここを今回の第一目標とします。

Scratchから赤外線信号を出力する

赤外線信号の出力にはArduinoを使います。

やりかたをざっくり説明すると、

  • ScratchからArduinoを操作するためのScrattino2というソフトウェアを導入
  • 赤外線シグナルを出す処理はあらかじめArduinoのスケッチに書いておく
  • ScratchからScrattino専用のブロックでそれを呼び出す

という感じです。この方法の詳細は、先日のエントリで紹介済みです。

nomolk.hatenablog.com

やってることは同じなので詳しい手順は割愛しまして、Arduinoのスケッチだけを載せておきます。

Scrattino2 callback sample (send IR signal) for JJRC CADY WIGI · GitHub

動いているところを動画で見てみましょう。

胸の部分に雑に赤外線LEDを貼っただけですが、ちゃんと動いていますね。このやり方だと赤外線が弱いので近づけないと届かず、どうしてもこのように有線になります。


また、ロボットの動作中(前進中とか後退中とか)に送られたシグナルは全部取りこぼしになるので、

f:id:slideglide:20180708234942p:plain

こんな感じでいちいちウェイトを入れる必要があります。が、ちょっと不格好だし面倒ですよね。Scratch2.0は「その他」のところで定義ブロック(いわゆる関数)が作れるので

f:id:slideglide:20180708234930p:plain

f:id:slideglide:20180708234938p:plain

こういう感じにしておくと

f:id:slideglide:20180708234935p:plain

こうやってすっきり書けます。

Wifi対応にしてみる

さて、これでいちおう「Programmable」という要件は満たしましたが、もともと赤外線だったものが有線になってしまったので、動かしているうちに線が届かなくなったり、絡まったりします。なので今度はWifi経由で制御する方法を検討しました。

Scratch1.4の遠隔センサー機能

ですが、そもそもScratchでWifiなんて使えるんでしょうか?調べてみると、Scratch1.4には「遠隔センサ」という機能があることがわかりました。

Remote Sensors Protocol - Scratch Wiki

この機能を使うと、「〇〇を送る」のブロックを使って、Wifi経由で別のデバイスと通信ができるそうです。すげえ。
ただし先ほど使ったScratch2.0にはない機能なので、別途1.4をインストールする必要があります。(iPad用のScratch、Pyonkeeでも使えるそうです!アベ先生情報)

f:id:slideglide:20180709003357p:plain

Scratch1.4を起動して、「調べる」カテゴリの「〇〇センサーの値」を右クリック、「遠隔センサー接続を有効にする」をクリックします。
次に「制御」カテゴリの「〇〇を送る」ブロックを実行すると、送った情報がネットワーク内にブロードキャストされます。ファイアウォールソフトの警告が出た場合は許可してあげましょう。

ESP-WROOM-02で無線化する

次に受信側です。
ESP-WROOM-02というのはWifiモジュールなのですが、マイコンとしても使うことができ、Arduinoの開発環境が使えるのでほぼArduinoと同じ感覚で開発できます。今回は実装済みボードとして、家に余っていたスイッチサイエンスの ESPr Developer を使います。

Scrattino2を使わなくなったので、スケッチは書き直しです。こちらの記事にESP-WROOM-02をScratchの遠隔センサ機能と連携するためのサンプルコードがあったので、ベースにしました。できたスケッチはこちらです。

A sketch for ESP8266 to be controlled with Scratch and send infrared signal for JJRC CADY WIGI · GitHubA sketch for ESP8266 to be controlled with Scratch and send infrared signal for JJRC CADY WIGI · GitHub

注意点としては、ESP-WROOM-02ではArduino用の赤外線通信用ライブラリであるIRremoteが動きません。IRremoteESP8266を別途入れる必要があります。確か Arduino IDE のライブラリマネージャから入れられた気がするのですが、なかったらこちらから。

赤外線LEDを内蔵する

あと、やっぱりLEDがマステで貼ってあるのはかっこ悪すぎなので、内蔵することにしました。

f:id:slideglide:20180706003746j:plain

LEDと抵抗、銅線をはんだ付けしてつないでしまいます。

f:id:slideglide:20180706004022j:plain

熱収縮チューブで絶縁。

f:id:slideglide:20180703235736j:plain

ロボットをばらしたところです。赤外線センサは胸に入っていると思って胸にLEDを貼ってたのですが、実は頭にあることが分かりました。ほほう。

f:id:slideglide:20180706004754j:plain

LEDは基板の裏にホットボンドで固定しました。LEDと向き合ってる、黒い四角が赤外線センサです。

ここまでやるんだったら赤外線通さずに、ロボット内蔵のマイコンとESP-WROOM-02を直結してしまえばいいのでは……とも思ったのですが、ちょっと試してうまくいかなかったので即座にあきらめました*2。こんなところで寄り道していてはプログラミング教育王の座までたどり着けないので。

f:id:slideglide:20180706005955j:plain

銅線はわき腹に穴をあけて通して…

f:id:slideglide:20180706010302j:plain

ESPr Developerに接続。これで接続完了。モバイルバッテリと一緒に袋に入れて、ロボットの背中に取り付けました。完成!

実際に動いているところの動画です。

できた!けど

f:id:slideglide:20180706010641j:plain

荷物めっちゃ多いんですけど!?!?!?!?

M5Stackでコンパクト化&双方向化

いやー、実はバッテリのこと完全に忘れてました。開発中はESPr DeveloperをパソコンにつなぐからUSB給電で動かしてるじゃないですか。そうすると電源が要ることをすっかり忘れちゃうんですよね。
というわけで次の課題は軽量化です。そういえば家にいいものがありました。

f:id:slideglide:20180709010515j:plain

M5Stack。ざっくりいうと、さっき使ったESP-WROOM-02の上位機種であるESP32に、液晶とバッテリとケースがついたやつです。これだ!

f:id:slideglide:20180709012535j:plain

めっちゃコンパクトになりました。というか最初からこれを使えばよかったのでは…。

しかもですね、マイコンがESP-WROOM-02からESP32になったことでもうひとついいことがありました。アナログ入力が2ch使えるようになったんですね。どういうことかというと…。

センサ値もScratchに送れる

f:id:slideglide:20180702224224j:plain

これはロボットの底面の写真なんですけど、まんなか辺に小さい穴が4つあるのわかりますか?この中にはフォトリフレクタという部品が入っています。穴2つが一組で、片方には赤外線LEDが入っていて、片方は光センサが入っています。LEDで出した光の反射の強さをセンサで測ることによって、前にあるものとの距離を測ったり、色(明度)を調べたりできる部品です。ライントレースや迷路の機能はこのパーツが入ってるから実現できるわけです。

これまではScratchから一方的に指示を送るだけでしたが、このセンサーの値をScratchに送れたら、もっと本格的にProgrammableになると思いませんか?そこで問題になってくるのが、マイコン側の入力端子の数です。

これ穴2つで1個のフォトリフレクタなので、穴4つということは2セットのフォトリフレクタがついています*3。フォトリフレクタはアナログセンサなので、これをマイコンに送るにはアナログ入力が2つ要るわけです。でもESP-WROOM-02は1つしかなかった。しかしM5Stack(ESP32)は2つ以上あります。やった!さっそく、センサーの出力もM5Stackに引き込みましょう。

f:id:slideglide:20180709101323j:plain

……と気軽に考えたものの、これはちょっと厄介で、基板を改造する必要がありました。

まず、このフォトリフレクタ、「ライントレース」か「迷路探索」のモードの時しか電源が来ないようになっていました。そりゃそうか。
ということで上の方にある赤丸の部分、本来は眼のLEDの電源に使われている3Vなのですが、ここから電源を引いてくることで常時フォトリフレクタを動作させておきます。中央下の青丸のところがフォトリフレクタにつながるコネクタ。間に入っている抵抗は、LEDとフォトリフレクタに来てる電圧が違ったので調整のために75Ωをそれぞれ入れました。あと作業中にもともとついてた1kΩのチップ抵抗がひとつ吹っ飛んでなくなってしまったので、代わりのカーボン抵抗を入れました……。
下のほう、赤白黒の線をつけたところが、2つのフォトリフレクタの出力と、GNDです。

f:id:slideglide:20180708022538j:plain

これをさっきの赤外線LEDと合わせてピンヘッダにまとめまして、M5Stackに差し込みました。

M5Stackに書き込むスケッチはこんな感じです。

A sketch for M5Stack to be controlled with Scratch and send infrared signal for JJRC CADY WIGI · GitHub

注意点として、普通のIRremoteライブラリは現時点ではESP32に対応していないので、こちらを入れ直す必要があります。これは早くマージされてほしい。

GitHub - SensorsIot/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols

最終版の完成

というわけで、プログラミング教育王仕様のCADY WIGIができました!

こちらもScratch上でプログラミングする際はウェイトを入れてやらないといけないのですが、Scratch1.4の場合は定義ブロックの機能がありません。かわりに「〇〇を送る」を使うとこんな感じで関数っぽくまとめられます。

f:id:slideglide:20180709014553p:plain

このプログラムの動作の様子を動画で見てみましょう。

良い感じ。さらに、せっかくセンサーの値の取得も実装したので、これを生かした作例もどうぞ。

f:id:slideglide:20180709102034p:plain

単純ですが、自動的に黒い紙を避けて進むプログラムです。

センサーの機能も使ったプログラミングができました!(さいご思いっきり紙を蹴散らしていますが……。)

まとめ

Scratchとの連携で本格的なプログラミングが可能になり、さらにセンサーの値まで使えるようになったことで、かなり自由度も上がりました。

実は、ここまで実装できればあのIntelligentな迷路探索をScratchで実装し直せるのでは……、とも考えていたのですが、前進1歩の距離が長すぎて壁を突き抜けてしまうのでダメでした。なるほど……という感じです。
内蔵のマイコンを使わずにモーターの制御まで全部M5Stackでやるように作り直せばいけると思いますが、さすがに複雑になりそうだったのでやめました。時間と技術を持て余している方がいらっしゃいましたらよろしくお願いします。

というわけで、楽しいハックのご報告でした!

Gearbest CADY WIGI
(商品ページ)JJRC R6 Intelligent Programmable RC Robot - BUTTERFLY BLUE

↑みんな買おう中国製ロボット、CADY WIGI。

注意点

Gearbest makeblock
(商品ページ)Makeblock mBot Scratch 2.0 DIY Robot Car Kit

↑この改造の材料費(CADY WIGI+M5Stack)で、最初からカスタム版ScratchでプログラミングできるmakeblockのmBotが買えます……。

お知らせ

8/4〜5のMaker Faire Tokyoでヘボコンを開催します。来てね
portal.nifty.com

*1:2輪でバランスとるタイプのやつではなくて、キャスター付きで3点で支えてます

*2:どうも赤外線センサを通すと信号のHIGH/LOWが逆転してるっぽい気がするんだけど(ほんとかどうか不明)、赤外線用のライブラリで信号出してる以上、反転した信号が出せない

*3:例えばライントレースしたい時、2セットで線をまたいで、常に白い床を検出するように動けばライントレースできますよね