スポンサーリンク

海や川でゴミ回収できるRaspberryPiラジコンボートを作る

Raspberry Pi搭載 水面ゴミ回収ラジコンボートの構成

今年はRaspberry Piを使って「水面ゴミ回収ラジコンボート」を制作してみようと思います。今回の構成は以下の通りです。ざっくりと考えてみた構成なので、うまくいかない部分は変更していこうと思っています。規模は小さいですが、個人レベルでこのようなラジコンが作れる時代になって嬉しいなと感じています。(2019/1/5)

 

RaspberryPiを搭載したボートは以下のようになりました。

第一章 プロトタイプを作る

まずはプロトタイプを作っていきます。プロトタイプを作ることで課題なども見えてくると思います。

必要な材料を用意する

今回は以下の材料を用意しました。

本体部分

部品名 個数
Raspberry Pi Zero WH スターターキット 1
Webカメラ 「HD ウェブカメラ C270」 1
Goolsky Flytec HQ2011-1 ラジコンボート 27MHz 2CH 15km/h 1
5自由度ロボットアーム・キット  (SainSmart) 1

回路部分

部品名 個数
ユニバーサル基板 1
DCモータドライブ「TA7291P」 2
ジャンパーワイヤ 適量
モバイルバッテリー 1
ハンダ 1
ピンヘッダ 適量

※DCモータドライブ「TA7291P」は生産終了予定になっています。しばらくしたら購入できなくなってるかもしれませんが今回はこれを使います。

工具

部品名 個数
+ドライバー 1
ハンダごて 1
電動ドリル 1

ラジコンボートを分解する

ラジコンボートを購入しました!これをRaspberryPiで操作できるように改造していきます!

ボートの上部を取り外してもともと設置してあった回路を取り外しました。今回はこの部分に単三乾電池を設置していきます。中央の柱が邪魔だったりするので不要な部分はカットしていきます。

ロボットアームの組み立て(プロトタイプ2では取り外しました)

ロボットアームの組み立ては完了しました。手順については以下の記事に掲載しています。

RaspberryPiとサーボモータで5軸ロボットアームを動かしてみた

 

以降の手順は「Raspberry PiでWebから操作できるラジコンクローラーを作る」のときとほぼ一緒なので流用できるところはそのまま流用しています。ラジコンクローラでは「Raspberry Pi3 Model B」を使用しましたが、今回はスペースの関係上「Raspberry Pi Zero WH」を使用するようにしました。

Raspbian(Jessie)のインストール

RaspberryPiのOSにはRaspbian(Jessie)をインストールしておきます。後述で記載するRaspberry Piをアクセスポイント化して操作する場合にはRaspbianのJessieでないと方法を確立することができなかったためです。 今回は「Raspberry Pi3 Model B」もしくは「Raspberry Pi Zero WH」に「NOOBS_v2_4_1」で「Raspbian Jessie」をインストールした前提で以下の手順を実施していきます。(※Raspberry Pi3 Model B+にもNOOBS_v2_4_1を入れようとしてみましたが、インストールできませんでした。B+に上記のOSは入れられないかもしれません。。)

WebIOPIのインストール

まずはWebIOPIをインストールします。これをインストールするとブラウザからRaspberryPiのGPIOを操作することが可能となります。インストール方法については別の記事にまとめましたのでこちらをご参照ください。

WebIOPIをRaspberry Piにインストールする方法

RaspberryPiを起動するとWebIOPIも同時に起動するように設定しておきます。

Mjpg-Streamerのインストール

今回はRaspberryPiに設置したWebカメラ映像を操作画面に表示するために「Mjpg-Streamer」を使用しますので以下の記事に沿ってインストールしておきます。「Mjpg-Streamer」はRaspberryPiの起動時に同時に起動するように設定しておきましょう。

RaspberryPiとMJPG-Streamerでライブストリーミングをする方法

ラジコンの操作プログラムを作成

ブラウザから操作するようのプログラムを用意しておきます。ブラウザの表示には「HTML」、ロボットの操作には「Python」を使用します。 コンソールを起動し、以下のコマンドでプログラムファイルを格納するフォルダを作成しておきます。中間フォルダの名前は何でもいいです。

フォルダとファイルは以下のような構成にします。 

htmlフォルダに移動し、「index.html」を作成します。HTMLにはMJPG-Streamerの動画を表示する部分と、ロボットを操縦する部分で構成します。ボタンが押されたらPythonのスクリプトが呼ばれてモーターが動くようになっています。 MJPG-Streamerの映像を表示するためにIPアドレスの部分は書き換えてください。アクセスポイント化していない場合は割り当てられているIPアドレスを、アクセスポイント化しているときはアクセスポイント化の手順で設定したIPアドレスを指定します。 今回はアクセスポイント化した後のIPアドレスを記載しています。

次に「Python」フォルダに移動してラジコンボート操作用の「script.py」を作成します。HTMLでボタンが押されたら呼ばれるようになっています。動作は前進、後進、左旋回、右旋回、停止の動作となるようにしています。Pythonの内容を書き換えても変更内容が反映されない場合は一度リスタートしてみてください。

SDカードのバックアップを取得しておく

この段階でSDカードのバックアップを取得しておきます。RaspberryPiが壊れたりSDカードが壊れたりすることもありますので、被害が最小限になるようにバックアップを取得しておきます。とくに回路を動かすと発熱したりしてRaspberryPiが壊れたりすることが多いので、バックアップは必須だなと思いました。

回路の作成

RaspberryPiからラジコンボートを動かすために回路を作成します。ラジコンボートの中は狭いので今は以下の回路を半田付けして設置しています。ブログでは見やすいように大きいブレッドボードに配線しています。

まず、ラジコンに付属していたモーター2個はモータードライバーを経由して操作します。2本の線はモータードライバーの2番と10番のところに接続しています。次にRaspberryPiからは3.3vと5vの線をモータードライバーの4番と7番に接続しています。3.3vの部分に関してはPWM制御のときに使うことができるようなのですが、今回はPWM制御を使わずにモーターのオンとオフをするだけなのでそのまま3.3vにつないでいます。駆動用の電源としては単三乾電池4本(※変更しました)を使っています。これでラジコンボートのモーターと、ロボットアームのサーボモーターに電源を供給しています。これを間違って信号線に接続したりするとRaspberryPiが壊れてしまうことがあるので配線するときは要注意です。RaspberryPiの電源としてはモバイルバッテリーを使用しています。スイッチなどを用意していないのでモバイルバッテリーにつなげるとそのまま電源が入るようになっています。

今は設置していないのですが、今後はUSBポートにUSBカメラも接続して映像も取得できるようにしていきたいと思います。

 

ラジコンボートの組み立て

ラジコンボートを組み立てていきます。回路およびRaspberryPiはボートの中に格納し、ロボットアームはネジで固定します。ロボットアームを固定する用の穴と配線を通す用の穴は電動ドリルで空けておきます。駆動用の電源は当初、単三乾電池を8本セットしていましたが、4本(6V)で十分なことが分かりましたので4本だけでも動くように銅線で接続させています。

 

拡大するとこんな感じです。

RaspberryPiのアクセスポイント化

WiFiなどがない場所で操縦したい場合はRaspberryPiのアクセスポイント化を実施しておきます。そうすることで直接PCやスマホなどからRaspberryPiを操作することができるようになります。アクセスポイント化の方法は以下の記事にまとめてありますのでこちらをご参照ください。

Raspberry Pi3(Raspbian Jessie)をアクセスポイント化してWiFiで動画配信する

プロトタイプが完成

プロトタイプが完成したので池で操作してきました☆(2019/8/10)

まだ一度も水に浮かべたことがなかったのでWebカメラは設置していない状態で試してみました。

想定はしていましたが、水面に浮かべようとしたら転覆しそうになります。。

重心高いし、ロボット アーム重いしそうだよね~って思いながらすぐにロボット アームを取り外しました。

デフォルトの状態だとさすがに動かすことができました。

ラジコンボートを操縦したあとに中身の浸水状況を確認してみましたが、これについては大丈夫そうでした。でも可能性は十分あり得るので防水対策は何かしらやっておいたほうがよさそうですね。今はまったくやっていない状況です。

浮力を調整してみる

ロボットアームを設置すると重くなり、しかもバランスが悪くなるので転覆してしまうことが分かりました。そこで船の両サイドにペットボトルを設置して浮力を上げることにしました。(2019/8/18)

ボートの浮力を安定させるにあたり、こちらのサイトが分かりやすかったので参考にさせていただきました。このサイトによると両サイドに補助的な船体をもつものはアウトリガー船と呼ばれるそうです。

ペットボトルを設置したあとはちゃんと船が転覆せずに浮かんでくれたので作戦成功です。

転覆したりノーコンになったりすると岸に戻せなくなってしまい、ゴミ回収用に開発しているのにゴミを生み出しては元も子もないので、そういう場合でも回収できるようにラジコンボートには釣り糸を結び付けて操縦しています。

見た目は少しだけ不格好になりましたが、実用性を考えれば致し方無いでしょう。かなりバランスはよくなりました。

こちらが少しだけ動かしてみた様子です。

 

浮力の調整が必要だったり、ロボットアームの操作性だったりと、具体的な課題が分かってきたので少しずつ改善していきたいと思います。

第二章 プロトタイプの改善版を作る

第一章で課題などが見えてきましたので、次はその課題を解決していきたいと思います。

ロボットアームの操作性を改善する

第一章まではロボットアームがガタガタして操作性がよくなかったのでこれの改善版を作成しました。サーボモータの制御にpigpioというライブラリを使用するように変更し、これによってかなり滑らかに動かすことができるようになりました。

改善版のindex.htmlはこちらです。

つぎに改善版のscript.pyはこちらです。上記の回路図とは使用しているGPIOが異なりますので、今回のプログラムに合わせて配線を変更しておきます。

pigpioのインストール

以下のコマンドでpigpioをインストールしておきます。私の場合はすでにインストールされていました。

pigpioのデーモンを設定

上記のファイルを用意できたらpigpioのデーモンを自動で起動するようにしておきます。pigpioを使用する場合、デーモンを先に起動しておかないとエラーになってしまいます。これもRaspberryPiが起動したら自動で起動するように以下の設定をしておきます。

①以下のコマンドを実行してファイルを作成する

②作成したファイルの中身に以下の内容を記載して保存します

③以下のコマンドを実行して自動起動するようにしておく

こちらを実行しておくとRaspberryPiを起動したときにpigpioのデーモンが自動で起動するようになりました。

改良版ロボットアームを操作してみる

プログラムを変更して操作してみたときの様子がこちらです。改善前に比べてかなり滑らかに動いてくれるようになりました。

ロボットアームは取り外しました

ロボットアームでゴミをつかもうとしてきまししたが、なかなか操作が難しいのと関節が多くなってしまうので、今回のプロジェクトには向かないかなと判断しました。なので、ロボットアームは取り外しクローラ型に切り替えてみました。

クローラ型にしてみた形態がこちら。両サイドにサーボモータを1個ずつ配置してアームでゴミを持ち上げる作戦です。

こちらも実際に池で動かしてみました。

ピンポン玉は回収することに成功しました。500mL のペットボトルにも挑戦しましたが、風で流されたり横向きにペットボトルがならなかったりで難しかったです。もう少しアームが広くないと厳しいかもしれないですね。

サーボモータのトルクは大丈夫そうでした。まあ、そんなに重い物を持ち上げているわけでもないので。

ただ、前方のほうが重心が移ったせいで喫水線がギリギリになってしまいました。あとちょっとで浸水しそう。。

また浮力の調整が必要そうです。

プロトタイプ2を動かしてみて見えてきた課題

・ペットボトルが縦に流れてきたときはアームに乗せにくい → アームの面積を広くする、仕切り板を設置する

・アームを下げたときは水の抵抗が大きい → アームは上げた状態で走行する、肉抜きして抵抗を減らす

・ゴミ置き場のスペースが狭い → カゴを設置してスペースを広くとる

・ボートの前方の浮力が足りない(ボート前方が重い) → 結果的に単三乾電池4本を減らせた

・ボートの推進力がもうちょい欲しい → 他のモーターを検討する

・電源を入れずらい、メンテナンスしにくい → メンテしやすい回路を作り直す、電源スイッチは外に設置する

・サイズが大きくなってきて持ち運びにくい → すぐに分解できるようにする、上部と下部で切り離し?

・練習する場所がない(流れがなくて人が少ないところが理想) → 人が少ない早朝に行くしかない

・サーボの固定が弱い、できれば両軸持ちが理想 → アルミフレームを作り直す、両持ちは後々検討

サイズ感を見直す

サイズ感としてはこのような感じです。500mLペットボトルを横にするとちょうどいいぐらいのサイズになっています。

この向きになってくれないとなかなか拾えないんですよね~どうしよ。

アルミの板をもう少し広くしてみるとかはできるんですけど、全体的なバランス(見た目)が悪くなりそうなので嫌なんですよね~。サーボモータを後ろのほうにもう少し移動させてアルミ板を広くするとかならアリかもしれません。

結構重たくなるので不要な部分はニッパーとかで切り取っていきたいですね。

アルミ板を広くしてみる

仮付けでアルミ板を広くしてみました。予想通り、これならペットボトルが縦になっても拾ってくれそうな気配があります。

失敗するほうが多いので仕切り板を付けるとか工夫は必要そうですね。

電圧を測定してみる

今回のラジコンで使用しているモーターの電源を改めて測定してみようと思います。

まずはモータードライバーからの出力電圧を測定してみました。

約4Vぐらいの電圧がラジコンボートのモーターにはかかっていることが分かりました。駆動用の単三乾電池(4本→8本)を増やしてもこれに変化はありませんでした。モータードライバーの4番ピンには常時3.3vしかかけていないので、これが原因のようです。かと言って、RaspberryPiのGPIOからはMAX3.3Vしか取り出せないのでモーターの電圧もこれ以上あげられそうにありません。

電圧を上げるためには別の方法を探したほうがいいかもしれません。こちらの記事にあるMOSFETを利用した方法がよさそうです。

MOSFETとマイコン (3)  DCモータを動かす その1

上記の記事で紹介されているキットがこちら。こちらを購入するか検討中です。

TB6612使用 Dual DCモータードライブキット

 

ロボットアームのほうの電圧も測定してみます。

ロボットアームの電圧は約6Vとなっています。サーボモーターの適正電圧を考慮するとこれで大丈夫そうです。購入したラジコンボートにはもともと単三電池8本(12V)が直列接続されていたため、4本(6V)で動作するようにしています。

電池が4本少なくなると重量もかなり軽くなるので、その点は良かったかなと思います。

ラジコンボートのモーターをもう少しトルクのあるものとかに替えると動作電圧が高くなりそうなので、そのときは単三電池を8本に戻してみたいと思います。

カゴを設置する

今まではゴミなどを回収するときに後方のネットの上に置くようにしていましたが、それだけだとネット上から落ちてしまうことが多々ありました。そこでカゴを設置して保持力を高めることにしました。カゴは百均で丁度いい大きさのものを探してきてカットしました。

カゴを設置して動かしてみた様子がこちら。

両サイドで2本ずつぐらいなら500mLペットボトルを回収できそうです。まだカゴを付けてからは池で試走させてないので予想ですけど。

それにしてもかなりゴツくなってきました。笑

用途を考慮するとやっぱり大きいサイズのほうがいろいろとメリットあるんですよね。

荒川河川敷で走らせた場所

荒川でラジコンボートを走らせようとすると流れや風でラジコンボートが流されてしまう可能性があります。そこで今回は河川の「ワンド」と言われているところで走らせてきました。 こちらは河川敷で池のようになっている場所でしたので、流れも少なくていいかもと思いましてこちらのほうで実施しました。

どのような結果になったか

ラジコンボートは好調に走ってくれました。植物が生えている範囲が結構あったのでそちらのほうを避けてボートは動かすようにしました。風があるとやはり流されてしまって操縦するのが難しかったです。ペットボトルを配置して回収してみようと思いチャレンジしてみました。慎重に操縦すると回収することは可能でしたが、なかなか操縦は難しかったです。まず、旋回ができないので徐々にボートの向きを変えるしかないこと、取り込める範囲が狭いのでそれの位置調整が大変なことが挙げられます。頑張ったことでペットボトルはすべて回収することができました。

 

今後の課題

今回もいろいろと課題が見えてきましたのでまとめておきたいと思います。

・旋回性能が不十分すぎる

今回行ってみて思いましたが、旋回ができないと思うようにゴミを取り込むことができません。よって今後は旋回できるようにしていこうと思います。

・取り込み部分は一箇所で十分

操縦していて感じたのは、取り込み部分が二箇所あっても両方を同時に使うことはないなと思いました。人間が意識を向けられるのは一つぐらいなので二箇所あっても操作できません。それであれば一箇所に絞って行ったほうが効率的なような気がします。今後はそのような構成にしようと思います。

・モーターが弱い

ボートが極端に遅いということはないですけど、もう少しスピードがあってもいいかなと感じています。モーターはもう少し大きめのものを設置して速度とトルクを上げたいと思います。

・防水にするべき(やっとけ)

今回は防水対策を実施していなかったので、近くで船が通った際にその波であっさりと瞬殺されてしまいました。RaspberryPiとか回路とかすべて破損してしまいました。今まで壊れなかったのが不思議なぐらいなので、今後はしっかりと防水対策を実施していこうと思います。中身はすべてやられてしまいました↓

 

・釣り糸は自動巻取りにしたい

ラジコンが操縦不能となった際には釣り糸で回収できるようにしていたのですが、こちらを手動で行っているとラジコンボートの操縦が疎かになってしまいます。また記録用の動画などを撮影しようとすると、釣り糸・操縦用のスマホ・カメラを同時に操作することになり、水辺でそのようなことをするのも危険です。よって意識を分散させないように釣り糸は自動で巻き取れる仕組みを構築しようと思います。

・日光の下だとスマホの画面が見にくい

これは誰でも経験したことがあると思うのですが、明るいときにスマホの画面を見ると何が映っているのか全然分かりません。コントローラのボタンの位置もそうですし、ボートに設置しているWEBカメラの映像も見えません。だったらラジコンボートの操縦はプロポで行ったほうがいい気がします。また、カメラの映像を見ている余裕もないのでカメラも取り外したほうがいいかもしれません。 この項目については要検討となります。

画面にはこのような操作画面が映っています。

次はざっくりと以下のような構成にしたいと考えています。

続きはこちらの記事に書いていきます。次回からはプロポを使って操作してみたいと思います。

海や川でゴミ回収できるロボットを作る

当ブログの関連記事

他のこともしながら少しずつ進めています。以下が当ブログの関連記事です。

RaspberryPiとサーボモータで5軸ロボットアームを動かしてみた

Raspberry PiでWebから操作できるラジコンクローラーを作る

WebIOPIをRaspberry Piにインストールする方法

Google Colaboratory上でYOLOを動かして画像認識させてみた

YOLOでペットボトルの物体検出をやってみた

カスケード分類器でペットボトルを判別してみる

OpenCVとWebカメラでリアルタイム顔認識をする

OpenCVとC++とVisualStudioで顔認識してみる

参考にするブログ

今後はこの方のブログを参考にさせてもらいたいと思います。

Raspberry Piによる戦艦大和プラモデル ラジコン化 完結編 – 抜錨!大和 外洋(洲原池)に向け発進!