nomolkのブログスマートフォン用の表示で見るnomolkのブログ2018-07-092000円台で買えるロボットおもちゃをWifiとscratch対応に改造してプログラミング教育王に俺はなる技術系(あらすじ)レビュー依頼がきたので少しレビューしたあと改造し倒す記事です。WIGI中国の通販サイトとか見てると、ロボットのおもちゃが結構あるんですよね。それもただ眼が光るとか音が出るじゃなくて、ちゃんと自走したりプログラムとかできるような機能がついてるやつ。いっこ欲しいなと思ってたんですけど、いかんせん見た目がこんな感じなんです。日本で売ってるロボホンとかと全然方向性違うじゃないですか。かわいいのが唯一の正義とは言いませんけど、もうちょっと何とかなったのではないか。いう感じで微妙に食指が動かずにいたところ、タイミングよく通販サイトのGEARBESTから「レビュー書いてくれたら商品あげるよ」というメールが来たので、それならというので送ってもらうことにしました。BLUEしかも、よく探したらけっこうかわいいのもあったんですよ。WIGIというロボットです。これなら部屋にあっても「異形!」って感じにはならないでしょう。これをいっこもらってレビューを書くということで交渉成立しました。海を越えてきたな、という感じの箱。いいですね、かわいい。WIGIは2つの駆動輪で自走します*1。あと出力としては目が光るのと、スピーカーがついています。入力はリモコン用の赤外線センサと、底面にフォトリフレクタ×2。ロボットとしての機能は下記です。赤外線リモコンによる操作(前後の移動、左右の方向転換、目のON/OFF、ボリューム、電源ON/OFF、および以下の各機能の起動)ライントレース(黒い線に沿って進む)迷路探索(ゴールするとは限らない)ダンスプログラミング(といっても押したボタン操作を記憶して、再生ボタンで順番に動くというだけ)この入出力構成でパッと思いつく感じの機能は一通りついているという印象です。各機能の様子を動画にまとめました。あと、腕と頭はモーターが入ってないので自動では動きませんが、手で動かせば角度を変えることはできます。動きのある感じのポージングが可能。Intelligentとかいって付属の迷路すらゴールにたどり着けなかったり、Programmableとかいって押したボタンを記憶するだけだったりと、すごいものを期待して買うとガッカリしそうですが、なにぶん値段が2000円台なので価格なりには十分に遊べる商品だと思いました。義務は果たしたので改造していくぞ!!プログラミング教育王に俺はなる上でも言及しましたが、やっぱりポイントは「Programmable」だと思うんですよね。ついているのは押したボタンを記憶するだけの機能なのですが、そうじゃなくてコーディングが可能な、ほんとにProgrammableなロボットに改造しようというのがこの記事の趣旨です。プログラミング環境は、2020年プログラミング必修化を前にグイグイ来ている、ビジュアルプログラミング環境のScratchを使います。プログラミング教育ビジネスで一攫千金を狙うぞ!Scratchですいまさらですが、長くなるので目次を入れます。WIGIプログラミング教育王に俺はなるScratch経由で操作できるようにするScratchから赤外線信号を出力するWifi対応にしてみるScratch1.4の遠隔センサー機能ESP-WROOM-02で無線化する赤外線LEDを内蔵するM5Stackでコンパクト化&双方向化センサ値もScratchに送れる最終版の完成まとめ注意点お知らせScratch経由で操作できるようにするさて、改造といっても内蔵のチップを書き換えたりできるわけではないので、いまある機能をうまくハックして、目的の機能を実装する必要があります。操作ができる機能があります。この赤外線信号をScratchの指示で出すことができれば、Programmableといえそうですよね。ここを今回の第一目標とします。Scratchから赤外線信号を出力する赤外線信号の出力にはArduinoを使います。赤外線シグナルを出す処理はあらかじめArduinoのスケッチに書いておくScratchからScrattino専用のブロックでそれを呼び出すという感じです。この方法の詳細は、先日のエントリで紹介済みです。nomolk.hatenablog.comやってることは同じなので詳しい手順は割愛しまして、Arduinoのスケッチだけを載せておきます。GitHub動いているところを動画で見てみましょう。胸の部分に雑に赤外線LEDを貼っただけですが、ちゃんと動いていますね。このやり方だと赤外線が弱いので近づけないと届かず、どうしてもこのように有線になります。ロボットの動作中(前進中とか後退中とか)に送られたシグナルは全部取りこぼしになるので、こんな感じでいちいちウェイトを入れる必要があります。不格好だし面倒ですよね。Scratch2.0は「その他」のところで定義ブロック(いわゆる関数)が作れるのでこういう感じにしておくとこうやってすっきり書けます。Wifi対応にしてみるさて、これでいちおう「Programmable」という要件は満たしましたが、もともと赤外線だったものが有線になってしまったので、動かしているうちに線が届かなくなったり、絡まったりします。今度はWifi経由で制御する方法を検討しました。Scratch1.4の遠隔センサー機能ですが、そもそもScratchでWifiなんて使えるんでしょうか?調べてみると、Scratch1.4には「遠隔センサ」という機能があることがわかりました。Wikiこの機能を使うと、「〇〇を送る」のブロックを使って、Wifi経由で別のデバイスと通信ができるそうです。先ほど使ったScratch2.0にはない機能なので、別途1.4をインストールする必要があります。(iPad用のScratch、Pyonkeeでも使えるそうです!アベ先生情報)Scratch1.4を起動して、「調べる」カテゴリの「〇〇センサーの値」を右クリック、「遠隔センサー接続を有効にする」をクリックします。次に「制御」カテゴリの「〇〇を送る」ブロックを実行すると、送った情報がネットワーク内にブロードキャストされます。ファイアウォールソフトの警告が出た場合は許可してあげましょう。ESP-WROOM-02で無線化する次に受信側です。ESP-WROOM-02というのはWifiモジュールなのですが、マイコンとしても使うことができ、Arduinoの開発環境が使えるのでほぼArduinoと同じ感覚で開発できます。Scrattino2を使わなくなったので、スケッチは書き直しです。こちらの記事にESP-WROOM-02をScratchの遠隔センサ機能と連携するためのサンプルコードがあったので、ベースにしました。できたスケッチはこちらです。GitHub注意点としては、ESP-WROOM-02ではArduino用の赤外線通信用ライブラリであるIRremoteが動きません。IRremoteESP8266を別途入れる必要があります。ライブラリマネージャから入れられた気がするのですが、なかったらこちらから。赤外線LEDを内蔵するあと、やっぱりLEDがマステで貼ってあるのはかっこ悪すぎなので、内蔵することにしました。LEDと抵抗、銅線をはんだ付けしてつないでしまいます。熱収縮チューブで絶縁。ロボットをばらしたところです。赤外線センサは胸に入っていると思って胸にLEDを貼ってたのですが、実は頭にあることが分かりました。LEDは基板の裏にホットボンドで固定しました。LEDと向き合ってる、黒い四角が赤外線センサです。ここまでやるんだったら赤外線通さずに、ロボット内蔵のマイコンとESP-WROOM-02を直結してしまえばいいのでは......とも思ったのですが、ちょっと試してうまくいかなかったので即座にあきらめました*2。こんなところで寄り道していてはプログラミング教育王の座までたどり着けないので。Developerに接続。モバイルバッテリと一緒に袋に入れて、ロボットの背中に取り付けました。完成!実際に動いているところの動画です。できた!けど荷物めっちゃ多いんですけど!?!?!?!?M5Stackでコンパクト化&双方向化いやー、実はバッテリのこと完全に忘れてました。DeveloperをパソコンにつなぐからUSB給電で動かしてるじゃないですか。すると電源が要ることをすっかり忘れちゃうんですよね。いうわけで次の課題は軽量化です。いえば家にいいものがありました。いうと、さっき使ったESP-WROOM-02の上位機種であるESP32に、液晶とバッテリとケースがついたやつです。これだ!めっちゃコンパクトになりました。いうか最初からこれを使えばよかったのでは...。マイコンがESP-WROOM-02からESP32になったことでもうひとついいことがありました。アナログ入力が2ch使えるようになったんですね。いうことかというと...。センサ値もScratchに送れるこれはロボットの底面の写真なんですけど、まんなか辺に小さい穴が4つあるのわかりますか?この中にはフォトリフレクタという部品が入っています。穴2つが一組で、片方には赤外線LEDが入っていて、片方は光センサが入っています。LEDで出した光の反射の強さをセンサで測ることによって、前にあるものとの距離を測ったり、色(明度)を調べたりできる部品です。ライントレースや迷路の機能はこのパーツが入ってるから実現できるわけです。これまではScratchから一方的に指示を送るだけでしたが、このセンサーの値をScratchに送れたら、もっと本格的にProgrammableになると思いませんか?そこで問題になってくるのが、マイコン側の入力端子の数です。これ穴2つで1個のフォトリフレクタなので、穴4つということは2セットのフォトリフレクタがついています*3。フォトリフレクタはアナログセンサなので、これをマイコンに送るにはアナログ入力が2つ要るわけです。ESP-WROOM-02は1つしかなかった。M5Stack(ESP32)は2つ以上あります。やった!さっそく、センサーの出力もM5Stackに引き込みましょう。......と気軽に考えたものの、これはちょっと厄介で、基板を改造する必要がありました。このフォトリフレクタ、「ライントレース」か「迷路探索」のモードの時しか電源が来ないようになっていました。いうことで上の方にある赤丸の部分、本来は眼のLEDの電源に使われている3Vなのですが、ここから電源を引いてくることで常時フォトリフレクタを動作させておきます。中央下の青丸のところがフォトリフレクタにつながるコネクタ。間に入っている抵抗は、LEDとフォトリフレクタに来てる電圧が違ったので調整のために75Ωをそれぞれ入れました。あと作業中にもともとついてた1kΩのチップ抵抗がひとつ吹っ飛んでなくなってしまったので、代わりのカーボン抵抗を入れました......。下のほう、赤白黒の線をつけたところが、2つのフォトリフレクタの出力と、GNDです。これをさっきの赤外線LEDと合わせてピンヘッダにまとめまして、M5Stackに差し込みました。M5Stackに書き込むスケッチはこんな感じです。GitHub注意点として、普通のIRremoteライブラリは現時点ではESP32に対応していないので、こちらを入れ直す必要があります。これは早くマージされてほしい。WIGIができました!こちらもScratch上でプログラミングする際はウェイトを入れてやらないといけないのですが、Scratch1.4の場合は定義ブロックの機能がありません。かわりに「〇〇を送る」を使うとこんな感じで関数っぽくまとめられます。このプログラムの動作の様子を動画で見てみましょう。センサーの値の取得も実装したので、これを生かした作例もどうぞ。単純ですが、自動的に黒い紙を避けて進むプログラムです。センサーの機能も使ったプログラミングができました!(さいご思いっきり紙を蹴散らしていますが......。)まとめScratchとの連携で本格的なプログラミングが可能になり、さらにセンサーの値まで使えるようになったことで、かなり自由度も上がりました。実は、ここまで実装できればあのIntelligentな迷路探索をScratchで実装し直せるのでは......、とも考えていたのですが、前進1歩の距離が長すぎて壁を突き抜けてしまうのでダメでした。......という感じです。内蔵のマイコンを使わずにモーターの制御まで全部M5Stackでやるように作り直せばいけると思いますが、さすがに複雑になりそうだったのでやめました。時間と技術を持て余している方がいらっしゃいましたらよろしくお願いします。WIGI+M5Stack)で、最初からカスタム版ScratchでプログラミングできるmakeblockのmBotが買えます......。Tokyoでヘボコンを開催します。nomolkはてなブログをはじめよう!slideglideさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。