慣れない模型作りに四苦八苦しながら、それでも数時間かけてコンベアベルトのハードウェアの部分を完成させたのが前回の話です。
このハードウェアに電子回路を載せて、画像認識用コンベアベルトのプロトタイプとして動かしてみることが当面の目的です。
これで上手く動作するようであれば、本格的なセンサ付きコンベアベルトの製作を考えます。
挙動を調べるためのプロトタイプにおいて画像認識の問題で引っ掛かりたくないので、判別対象をシンプルな単色ブロックにして、RGBカラーセンサをカメラの代用にすることに決めました。
使用するセンサモジュールはこちらです。
このモジュールには白色LEDライトが搭載されており、近くにあるものの色を三原色の数値で表します。
以下のリンクからライブラリを入手して、プログラムの冒頭部分で読み込んでおくと、簡単に使えるようになります。
GitHub – adafruit/Adafruit_TCS34725: Driver for Adafruit’s TCS34725 RGB Color Sensor Breakout
https://github.com/adafruit/Adafruit_TCS34725
このセンサで対象物の色情報を読み取りましたら、その出力結果をサーボに反映させ、色によって角度を4段階に変更できるように設定します。
コンベアベルトに運ばれてきた4色のブロックを色ごとに分類して、色別の箱のなかに落とすことが最初の目標です。
SG90-HV 360度旋回タイプ デジタル・マイクロサーボ
そのためにサーボをコンベアベルトの末端に取り付けて、ブロックが落ちる先の角度を制御します。
肝心のコンベアベルトを動かすのは、前回の記事の最後に取り上げた H-bridge モータドライバです。
こいつは非常に優秀でステッピングモータと組み合わせると、センサの真下で対象物を止めたり、判定の対象物以外が投げ込まれたときに回転の向きを変えて異物を押し戻したりといった細かな作業ができます。
見ての通り、小さくてハンダ付けが大変な点と発熱が凄まじい点にだけ注意が必要です。
今回はDCモータに直接つないでしまうので回転速度の調整ぐらいにしか役立ちませんが、これだけならライブラリを読み込まなくても使えます。
TCS34725 RGBカラー認識モジュールは照度も計測できるので、コンベアベルトで対象物を動かしつつ、照度が最大になった時点、つまり、センサと対象物の距離が最短になった時点の観測値を用いてサーボを動かせば、計測ごとに回転を止める必要もないかという考えです。
照度は光源からの距離の二乗に反比例するので、最大値を求める際の範囲の決定、つまり、コンベアベルト上に対象物が乗っているか否かも照度を使えば区別できます。
このアイデアでうまく動くことを期待して作成したものが以下のスケッチです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <Adafruit_TCS34725.h> #include <Servo.h> // Params for the DC motor const int MINPUT = 5; const int SPEED = 110; //const int VR = A0; // Params for the servo Servo myservo; const int SINPUT = 9; // Params for the color sensor uint16_t r, g, b, c, colorTemp, lux; Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X); // servo horn angles const int RED = 30; const int GREEN = 60; const int BLUE = 90; const int YELLOW = 120; void setup() { Serial.begin(9600); if (tcs.begin()) { myservo.attach(SINPUT); analogWrite(MINPUT, SPEED); // runs DC motor } else { Serial.println("TCS34725 not found"); } } void loop() { tcs.getRawData(&r, &g, &b, &c); Serial.print(r, DEC); Serial.print(","); Serial.print(g, DEC); Serial.print(","); Serial.print(b, DEC); Serial.print(","); Serial.print(c, DEC); Serial.println(""); int color = getColor(r, g, b, c); myservo.write(color); } int getColor(int r, int g, int b, int c) { return -1; } |
プログラム的には問題なく動きます。しかしRGBセンサから取得した数値を自身で色に変換しないといけません(この部分が未完です)。
なぜかと言えば、周辺環境(センサモジュール以外の光源)の影響を強く受けるので、あらかじめ決められた値を用いて場合分けをしても、うまく動かないことがあります。
判別対象は単色のブロックなので、RGBの比率だけで判別できるかと思いきや、周辺の明るさで敏感に値が変わります。
それを全てルールベースで条件分岐として書き表していくのは やってられない と思いました。
率直に言い換えると機械学習を使いたいです。
そうなると 8bit マイコンには荷が重いので Raspberry Pi の導入を検討しなければなりません。
Raspberry Pi Zero W – ラズベリー・パイ ゼロ W ワイヤレス
私は Raspberry Pi を持っていないどころか、今までに触ったこともないんですよね。Arduino ではマイコンにブートローダを焼いてコピーを増やせることと比較すると、本体が高価で複製もできない点が不便に感じます。
センサと一緒に基盤にハンダ付けして、どこかに設置するという使い方ができなくなりますので。
また 普段から Linux を常用しているので、敢えて機能限定版を求める必要もないかと思えて、購入を見送ったまま現在に至ります。
いずれにせよ、本格的にコンベアベルト上で画像認識を行う際には必要になるものなので、急いで購入しなくてもそのうち入手するだろうとは思いますけれども、今すぐというわけにはいきません。
そして、その前に私にとって最大の問題である 工作が下手 という問題も解決手段を模索しなければなりません。
センサの取り付けやサーボのアームの加工に難があり、普通に動かしているだけで部品が外れたり、位置がズレたりするので何かしらのうまい方法を考えないと、このままでは調査にもなりません。