Arduinoでロボットの制御やIoTプロジェクトができるようになると、カメラが使いたくなります。
カメラを使う目的によって、使用するカメラやマイコンボードが異なるため、ここでは一般的な情報をまとめた記事を書くことにしました。
なお、こちらはUdemyというオンライン学習プラットフォームで販売中の「【Arduinoではじめる】ロボットプログラミング完全マスターコース|電子工作の基礎からコーディングまで全行程を詳細解説」コースの受講生の方よりご質問をいただきましたので、その回答としております。
具体的な繋ぎ方やプログラミングについてはコースの範囲外となりますので、こちらでは解説しておりません。
入り口の基礎知識としてご覧いただき、興味がありましたら調べてみて下さいね。
では、始めましょう!
Arduinoでカメラを使うプロジェクトのパターン
まず、どのような方法があるのか?
ここでは、主に3パターンに分けて解説します。
①Arduinoにカメラをつなぐ方法
最も手軽に使用する方法がこちら。
趣味向けのArduinoボードはスペックがあまり高くないため、基本的に低解像度のカメラを使用します。
推奨カメラボード
いくつか販売されていますが、私が実際に使用した中でもトラブルがなく使用できたものを紹介します。
Arduinoで直接使用するには、高解像度のカメラは使用できません。
その中でも、こちらは使い勝手が良い商品です。
ただし、「静止画」の処理にとどめ、動画の処理が必要な場合は他の方法を検討して下さい。
なお、ボードについても注意点があるのでその点を理解した上で実践してみましょう。
使用できるボード
いわゆるUNO R3やnanoのようなボードはスペック的に難しいです。
おすすめは、こちらのMega2560です。
公式は高いのと入手しづらいことがあるため、私は互換ボードのこちらを使用しました。
互換ボードを使用する際の注意点として、製品によってはスペックが異なる場合があるため説明をよく確認しましょう。
予算に余裕があれば、業務用やプロユースのこちらのモデルが推奨されます。
私は使用したことがありませんが、業務用ならこちら。
②ESP32ボードを使用する方法
純粋なArduinoボードではありませんが、カメラを使ったりWi-FiやBluetoothを使うプロジェクトではこちらの「ESP32」が使われます。
私個人としては、こちらの「ESP32CAM」を使用したことがあります。
カメラを使用することがメインなら、こちらの方が使いやすいでしょう。
ESP32は、種類がたくさんあり選ぶのが難しいことや、Arduino IDEに接続して使用するにはボードの書き換えなどの作業が必要な場合があるなど、初心者には少し敷居が高いです。
私もいくつか使用したことがありますが、ボードの不具合に気づかず数日も試行錯誤した苦い経験があり、あまり良い印象がありません。
しかし、顔認証のプロジェクトにも使用できるため、Arduinoボードだけでカメラを使うプロジェクトよりも可能性が広がります。
③PC+Arduinoで使用する方法
Arduino単独で使用する必要がなければ、この方法が最も汎用性が高く、わかりやすく、オススメです。
また、AIプロジェクトを目的とした場合でもArduinoと組み合わせて使用できるため、私個人としてはこの方法を推奨します。
ただし、常にArduinoをPCと接続しながら使用する必要があるため、ロボットカーに載せながら使うとか、遠隔操作で使うものには向いていません。
(小型のPCを使用する方法もありますが、電源の問題で断念することでしょう。)
具体的な方法
使用するカメラは、USBでPCに接続できるものなら何でもOKです。
一番簡単なのはウェブカメラを使用することです。
個人的にロジクールが好きなのでこちらは良く使っていましたが、ここまで良いものでなくても問題ありません。
500万画素程度あれば、結構いろいろできるので、こちらの1000円台のカメラでもOKです。
実際に、カメラでじゃんけんの手を判別し、コンピュータの手はArduinoでサーボを制御して紙を出すというプロジェクトではこちらを使いました。
この方法の良い点は、ライブラリを使用すればArduinoだけでも簡単なAIプロジェクトができるという点です。
上記の①②の方法ではできない「動画を使った処理」もできるので、物理的な制限がなければ本当にオススメです。
目的別の推奨方法
これまで3つの方法を紹介しました。
では、よくある目的別に推奨する方法を紹介します。
①ロボットカーのライン認識
Udemyコースでは、ライントレースロボットの制御に赤外線センサーモジュールを使用した方法を紹介しました。
しかし、より高度なプロジェクトとして、カメラでラインを認識する方法も存在します。
カメラを使うことで、複雑なラインやカラー識別まで対応できるため、学習効果も高まります。
この場合、カメラの解像度やデータの処理速度を考慮する必要がありますが、紹介した方法の中ではESP32-CAMが特に適しています。
リアルタイム処理を必要とせず、静止画でラインを解析する場合は、どの方法でも実現可能です。
ラインを認識すること自体は簡単ですが、そのラインに沿ってタイヤの制御を正確に行うためには、PID制御などの高度なアルゴリズムが必要になります。
Udemyコースでは基礎的な制御を扱っているため、さらに詳しい制御方法に興味のある方は、他の方のYouTube動画などを参考にしてみてください。
②ルービックキューブを揃える
色を識別する場合、最もシンプルなのは**色センサーモジュール(例: TCS34725)**を使用する方法です。
しかし、カメラを使って色を認識する方法も可能です。
この場合、各面の色を静止画として撮影し、色をデジタル化して判断するため、リアルタイム映像は不要です。
そのため、どの方法でも実現可能ですが、特にESP32-CAMやMega2560が扱いやすいでしょう。
サーボモータなどを使ってルービックキューブを回転させる制御も必要になるため、デジタルピンがたくさん使えるMega2560がオススメです。
より複雑なルービックキューブの自動解決アルゴリズムを実装する場合、計算処理の負荷を考慮し、ESP32やMega2560の使用が推奨されます。
③大きさ判定(例:野菜の自動仕分け装置)
野菜の大きさを自動で判定して仕分ける装置を作りたい場合、カメラの映像解析が適しています。
静止画から輪郭やサイズを測定し、サーボモーターで自動的に仕分けることが可能です。
この場合、特定の位置で静止画を撮影して判別するため、どの方法でも実現可能ですが、解像度と処理速度を考慮するとESP32-CAMが適しています。
さらに高度なサイズ認識(複数の野菜を同時に識別するなど)を行う場合は、ESP-IDFなどのネイティブライブラリを使用する方法がより効果的です。
ラズベリーパイを使う場合
ここまで、Arduinoでカメラを使ったプロジェクトについて紹介してきました。
しかし、実際にカメラの映像からさまざまな処理を行う場合、ArduinoでもESP32でも少し役不足です。
この場合、やはりraspberry pi一択となります。
上の画像は、Udemyコースでも使用した赤外線センサーモジュールを使ったArduinoのロボット(右)とraspberry piでカメラモジュールを使ったライントレースロボット(左)の比較です。
raspberry piには、専用のカメラモジュールがあるため、カメラを使ったプロジェクトが簡単に実行できます。
こちらは今後Udemyでコースを販売予定です。
興味がある方は、メルマガにてお知らせしますのでぜひ登録してお待ちください。
まとめ
今回は、Arduinoでカメラを使ったプロジェクトをする方法について3つのパターンごとに紹介してきました。
ご不明な点や、さらに詳しく知りたいことがありましたら、コメントやフォームにてご質問ください。
今後もプログラミングの情報をお届けします。
以下のメルマガにご登録頂くと、不定期に配信をお届けします。
ぜひ購読してください!
それでは、ステキなロボットプログラミングライフを!