ESP32 開発ボードを Arduino IDE で扱う

ESP32-WROOM-32 を Arduino 互換機として設定するための自分用の備忘録です。

これは ESPRESSIF という上海の企業が製造しているマイコンボードです。なんと WiFi と Bluetooth Low Energy (BLE) がデフォルトで使えて、お値段は 1,300 円という汎用性抜群の便利アイテムです。

日本の技適認証もきちんとクリアされていて、箱から出した状態のまま使えます。BLE モジュールを購入してきて苦労していた過去の自分がアホらしく思えてくるほどの性能です。

ただし、ESP32 自体は Arduino ではありませんので、互換機として使用するには自身で設定を行う必要があります。

とは言え、既に先行事例がたくさんありますので、難しいポイントは皆無です。


arduino-esp32/boards_manager.md at master · espressif/arduino-esp32 · GitHub
https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md


開発プラットフォームを設定するには、製造元の公開している資料(上のリンク)に従って Arduino IDE (Ver. 1.8 以降)に必要なファイルを読み込みこみます。




まずは Arduino IDE を開く前に必要なファイルを準備します。この過程で Python 3 が必要になります。

$ mkdir -p /usr/local/share/arduino/hardware/espressif && cd /usr/local/share/arduino/hardware/espressif
$ git clone https://github.com/espressif/arduino-esp32.git esp32
$ cd esp32 && git submodule update --init --recursive
$ python tools/get.py 

ここまで準備ができましたら Arduino IDE を起動して、Crtl と カンマ [Comma] キーを同時に押して Preferences ウィンドウを立ち上げます。

そして Additional Board Manager URLs の最後尾に  https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json を追記して OK を押します。

そうすると Tools > Boards Manager… に ESPRESSIF が出てくるので、これをインストールします。

使用するのは ESP32 Dev Module というやつです。

こいつはスケッチをアップロードするときに pyserial (Python ver 2) を使用するので、あらかじめインストールされていない環境ではエラーを吐きます。

エラーに慌てずに、必要なライブラリをインストールしてやれば問題ありません。

$ sudo pip2 install pyserial

これで一応は万全です。

まだ下記のようなエラーを吐くことがあるのですが、この場合は Tools > Upload Speed から転送速度を 115200 に変更します(デフォルト値は 912600 になっているようです)。


Serial port /dev/ttyUSB0
Connecting…….._____….._____….._____….._____….._____….._____…..____ An error occurred while uploading the sketch
_

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header


そしてスケッチの転送時にボード本体の Boot ボタンを押してやります。

ボタンを押しながら転送を始めるぐらいでいいかもしれません。

これでもスケッチを書き込めないときは、正しいポートを選択できているかどうかを確認してみて下さい。

うまくいった場合には書き込みが始まります。

ESP32 にはサンプルが大量に用意されていますので、無事にスケッチを書き込めるようになりましたら、まず一通りのサンプルを動かしてやると挙動がつかめるようになります。

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

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

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

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

挙動を調べるためのプロトタイプにおいて画像認識の問題で引っ掛かりたくないので、判別対象をシンプルな単色ブロックにして、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ケースのファンも、自動ドアも、電気自動車もモータの音を気にする人などいません。

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

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

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

つづき