自作のコンベアベルトにセンサを積むも無事に失敗

慣れない模型作りに四苦八苦しながら、それでも数時間かけてコンベアベルトのハードウェアの部分を完成させたのが前回の話です。

このハードウェアに電子回路を載せて、画像認識用コンベアベルトのプロトタイプとして動かしてみることが当面の目的です。

これで上手く動作するようであれば、本格的なセンサ付きコンベアベルトの製作を考えます。

挙動を調べるためのプロトタイプにおいて画像認識の問題で引っ掛かりたくないので、判別対象をシンプルな単色ブロックにして、RGBカラーセンサをカメラの代用にすることに決めました。

使用するセンサモジュールはこちらです。

このモジュールには白色LEDライトが搭載されており、近くにあるものの色を三原色の数値で表します。


TCS34725 RGBライトカラーセンサー認識モジュール

以下のリンクからライブラリを入手して、プログラムの冒頭部分で読み込んでおくと、簡単に使えるようになります。


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カラー認識モジュールは照度も計測できるので、コンベアベルトで対象物を動かしつつ、照度が最大になった時点、つまり、センサと対象物の距離が最短になった時点の観測値を用いてサーボを動かせば、計測ごとに回転を止める必要もないかという考えです。

照度は光源からの距離の二乗に反比例するので、最大値を求める際の範囲の決定、つまり、コンベアベルト上に対象物が乗っているか否かも照度を使えば区別できます。

このアイデアでうまく動くことを期待して作成したものが以下のスケッチです。

#include 
#include 

// 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 を常用しているので、敢えて機能限定版を求める必要もないかと思えて、購入を見送ったまま現在に至ります。

いずれにせよ、本格的にコンベアベルト上で画像認識を行う際には必要になるものなので、急いで購入しなくてもそのうち入手するだろうとは思いますけれども、今すぐというわけにはいきません。

そして、その前に私にとって最大の問題である 工作が下手 という問題も解決手段を模索しなければなりません。

センサの取り付けやサーボのアームの加工に難があり、普通に動かしているだけで部品が外れたり、位置がズレたりするので何かしらのうまい方法を考えないと、このままでは調査にもなりません。

タミヤ工作セットでコンベアベルトを自作する

電子工作や画像認識とあわせるためのコンベアベルトをタミヤの工作キットを用いて作成しました。

もう何年も前から欲しいとは思っていたのですが、そのために3Dプリンタを購入するわけでもなく、手作業が苦手な不器用人間に金属や木材の精密加工ができるわけもなく、といった事情から自作する気もありませんでした。

ふとした瞬間に知人にそのことを話してみると、タミヤの工作セットを使用すると簡単に実現できそうなことが分かりました。

そこで必要な材料を集めてきて、見様見真似で組み上げてみたら、本当にできてしまいました。

はじめて触る工作セットは 使い方がさっぱりわかりません でしたが、取り敢えずネジとナットで締め上げておけば部品を固定できるので、必要なかたちのプレートやアームを用意すれば良いということが徐々に分かってきました。

そして、このタミヤ工作セットの素晴らしい点にも気がつきました。




一点目は 部品の再利用が容易 であるところ。ネジとナットしか使用しませんので、間違えても何度でも修正できますし、必要ならば後から拡張もできます。

二点目は 素人でも精密な工作が可能 であるところ。ネジ穴の位置が決まっているので、自身で定規で線を引いて、穴を空けていくよりも正確な工作ができます。

そして三点目に、ドリルで穴を空けたり、ノコギリで裁断した際の微細な削りかすが飛び散らないところです。

できあがったものも、実用に耐えるとまでは言えませんが、検証用のプロトタイプとしては非常に良いものができあがります。

それも、わずか数時間ほどの製作時間で完成してしまいます。

それでは実際の工作に用いた部品を見ていきます。

使用したものは、以下のとおりです。

部位 使用製品 個数
支柱 No.143 ユニバーサルアームセット 2セット
土台 No.157 ユニバーサルプレート 2枚セット 2セット
シャフト受け No.156 ロングユニバーサルアーム 1セット
ベルト No.100 トラック&ホイールセット 1セット
モータ No.4 ウォームギヤーボックス 1セット

動力部分は他のものでもいいかも知れません。

また、私の場合は製作物の構造強化、センサ設置場所の確保、画像認識の精度向上のためという3つの理由から屋根と壁を設けていますが、これも必ずしも必要なものではありません。

必要なければ、ユニバーサルプレート2枚セットは1つで十分です。

トラック&ホイールセットのスプロケットホイール(大)は、デフォルト状態ではシャフトが貫通しませんので電動ドリルで穴を開けて、ユニバーサルアームセットのプラナット(廃材)で外側から固定しています。

それをポリキャップでギアボックスのシャフトに連結させています。

この辺りは、もっといい方法があると思われますが、私の目的は模型の改良ではありませんので動けば良しとしています。あらかじめご了承ください。

この状態で電源に接続すると実際に動きます。

しかし、そのままではコンベアベルトの試作品としては不十分なので、次回はドライバで制御することを考えます。

ここまで想像以上にうまく行きましたが、一つだけ想定外の問題もありました。

それはモータ音が凄くうるさいことです。

いまどきのモータは静音です。PCケースのファンも、自動ドアも、電気自動車もモータの音を気にする人などいません。

だから市販の汎用モータがこれほど大きな音を出すとは考えもしませんでした。

このサイズでも騒音が気になるということは、より大型になる本番のコンベアベルトではどうなるのかを真剣に考えなければなりません。

このように実際に試作して動かしてみると、いろいろな問題点も見えてくるので、気になるものがありましたらタミヤの工作セットでプロトタイプを制作してみるのもいいかもしれません。

つづき

Arduino のブートローダを焼いて安価に互換機を増やそう

いろいろな作業を手軽に自動化する目的に Arduino は非常に便利です。

使え方を覚えてしまえば、わずか30分以内にデスクトップ筐体内の温度を自動検知してファンを回したり、人が近づいたときだけ照明を照らしたり、GPS信号から現在地を取得する電子機器を自作できます。

センシングデバイスとしても優秀で、温度、照度、色、臭気、角速度といった馴染みのあるものから、風速、液体、紫外線量、土壌湿度、ガンマ線といった専門的なものまで幅広く用意されています。

センサー1つあたりの価格は数十円から数千円ぐらいであり、安価に必要なデータを収集して、統計分析ソフトで処理しやすい形式で出力できる点に大きな魅力があります。

そして Arduino 自体もわずか 200 円から 300 円程度で互換機を複製できます。




Arduino の正体をきわめて大雑把に説明すると、1つの基盤の上にマイクロコントローラと入出力ポートを載せ、それを専用ソフトウェアと併せてパッケージ化したものです。

その本体と言うか、頭脳とも言えるマイクロコントローラも市販品であり、1つあたり 200 円から 350 円ぐらいで購入できます。

そこで、同種のマイクロコントローラを購入してきて、Arduino のソフトウェアを書き込むと互換機として動作させることができるようになります。


ATMEGA328P-PUコントローラ ATMEGA328マイクロコントローラ DIP-28

詳細な手順は公式のウェブサイト上で説明されています。


From Arduino to a Microcontroller on a Breadboard – Arduino
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard


これを知っていると、書き込んだスケッチ(Arduinoプログラム)をマイクロコントローラ側に保持しておけるだけでなく、成果物を軽量化、省スペース化することにも役立ちます。

1つあたり 200 円ぐらいなので、用途が決まったらセンサと一緒に基盤に溶接してしまいましょう。


ユニバーサル基板 両面スルーホール ガラスエポキシ材 2.54mmピッチ

私はいつもセンサを購入するときに同数分のマイクロコントローラを一緒に購入しているので、無駄にたくさん持っています。

マイクロコントローラを購入してきたら、公式の解説どおりに回路を組んでブートローダを焼きます。

必要なのは 16MHz の水晶発振子20pF の積層セラミックコンデンサ、そして 10KΩ の抵抗です。

これらも1つあたり 10 円から 30 円ぐらいしか費用が掛かりません。

必要な部品を用意できましたら、実際に部品を接続します。

マイクロコントローラのピンには番号がついており、正しいピンに接続していないと書き込みに失敗しますので気をつけてください。

画像だとわかりにくいですが水晶発振子は D21 と D22 に接続して、それぞれ PB6 と PB7 のピンに繋がっています。

無事に接続できましたら、公式からハードウェア設定ファイルをダウンロードしてきて、指示通りに実行・・・する予定だったのですが、もっと良さそうなものがあったので、そちらを利用します。


GitHub – MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB
https://github.com/MCUdude/MiniCore


$ cd /usr/local/share/arduino/hardware/
$ unzip ~/Downloads/breadboard-1-6-x.zip -d .
$ ./tools/avr/bin/avrdude -v

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

$ git clone https://github.com/MCUdude/MiniCore ~/arduino/lib
$ ./tools/avr/bin/avrdude -v -v -v -v -P/dev/ttyACM0 -carduino -b19200 -C /home/buran/arduino/lib/packages/MiniCore-master/avr/avrdude.conf -patmega328 -e -Ulock:w:0x3f:m -Uefuse:w:0xfe:m -Uhfuse:w:0xd6:m -Ulfuse:w:0xe2:m

焼き終わりましたら基盤からマイクロコントローラを引き抜いて、新しく焼いたばかりのコントローラに差し替えます。

私はマイナスドライバで強引に引き抜いていますけれども、ピン先が非常に曲がりやすいので エンジニア 基板コネクタ抜き SS-10 のような専用工具を使用したほうがいいです。

ピン先を何度も曲げていると金属疲労で簡単に破断します。

私の場合は基盤に溶接することを前提にしていること、壊れる前から新しいものを調達してくることから気にしていませんが、再利用などを考えると本当は良くないことには違いがありません。

差し替えてデモ用のスケッチを書き込めれば、ブートローダの書き込みは成功です。

あとはこれに必要なスケッチを保存して、水晶振動子などと一緒に回路につなげば、Arduino ボードを使用しなくても Arduino のスケッチを動かせるようになります。