前回の続きです。引き続き、基本設計をやっていきます。
Contents
マイコン側の構成
構成はこんな感じです

機器 | プログラム |
---|---|
スマホ | ・親機としてBluetooth接続する ・画面に左右のボタンを付ける (そのボタンをタップするとサーボの指示角が変化) ・指示角を子機(マイコン)に伝達 ・子機から情報取得・表示 |
マイコン | ・子機としてBluetooth接続する ・親機(スマホ)から指示角を取得 ・指示角にサーボを制御 ・状況を親機に送る |
この中で一番簡単なのはESP32によるサーボモーターの制御なので、まずはここから始めようと思います。
ESP32の概要
ESP32は、Espressif Systemsが開発するBluetooth・Wifiが内蔵されたマイクロコントローラです。Tensilica社のXtensa LX6という32bitのチップが内部に使用されています。
ESP32のメリットは上記の通り通信機能がデフォルトで備わっていること、Arduino Unoよりも計算能力が高速・かつメモリ容量が大きいことなどが上げられます。
加えてArduinoのIDEにESP32用のライブラリをインポートすることでArduino IDEからスケッチ書き込みが可能でなことも強みと言えます。
デメリットは、Arduinoと比べて扱うための情報量が少ないこと、Arduino IDEは使えるがArduino用のライブラリの多くと互換性がないことなど、入門者にはやや敷居が高い事です。
開発環境
どんな開発環境があるか
一番よく使われているのは開発元のEspressifが公開しているライブラリをArduino IDEに導入する方式です。ネットで見つかるのは大体これ。
これ以外にはESP-IDFと呼ばれる同じく本家が開発している開発環境があります。使いこなせればこちらのほうがESP-32の全機能を使えてより高度なことが出来る模様です。ただしコマンドプロンプトを使って動かす方式のため敷居は高そうです。コマンドラインからの操作だけでなくVisual StudioやEclipseをフロントエンドとして使う事も出来るそうですが、そこまでたどり着くのも大変そうなので今回はArduino IDEを使って操作することにします。
基本ライブラリのインストール
ボードマネージャーを使用してインストールする方法について説明します。
①まず、ここにアクセスし、「Stable release link」の横のURLをコピーします。
②次に、Arduino IDEを開き「ファイル」→「環境設定」の「追加のボードマネージャのURL」に、先ほどコピーしたURLを貼り付けます
③Arduino IDEの「ツール」→「ボードマネージャ」を開き、「esp32 by Espressif Systems」を選択、インストールします。
↓以前説明動画を作ったので参考に載せておきます
サーボモーター動作用のライブラリの調査
Arduino用のライブラリの中には、<servo.h>というサーボモーター操作用のライブラリが標準で入っているのですが、ESP32では動作しません。
Espressifのライブラリの中にも入っていないので、自作するか探してきてインストールする必要があります。
単純に一個を動作させるだけなら、PWM波をどれかのピンから出力させればいいので自作も可能だと思いますが、大変そうなので探してきてインストールしようと思います。
ESO32でサーボモーターを動作させられるライブラリをいくつか探してみました(これ以外にもいくつもある模様です)。
ざっと見た感じ、どれも似たような内容で、導入するとArduino用のServo.hとほぼ同様に使えるみたいです。
今回は、Arduinoのライブラリマネージャーから簡単にインストールが可能なESP32Servo(Kevin Harrington)を使用することにします。
ESP32Servo(Kevin Harrington)のインストール
インストールはArduino IDEで「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」に移動し、ライブラリマネージャの画面で検索ウインドウに「ESP32Servo」と入力して絞り込むと、ESP32Servo( by Kevin Harrington)が出てくるので、「インストール」ボタンを押してインストールします。

インストールが完了すると、サンプルからESP32 Servoが選べるようになります。

スマホとESP32の操作
Visual Studioでいきなりアプリ開発するのは大変そうなので、まずはBluetooth通信が可能なスマホアプリを入れて試してみることにしました。
Andoroidから操作可能な手ごろなアプリを探したところ、以下が見つかりました。
Bluetooth Serial(Bluetooth上でシリアル通信を仮想的に行う)でデータを送受信できるアプリです。アプリ内課金ありとのことですが基本無料で使用可能で、気が向いたら寄付してくださいという事みたいです。複雑なことは出来なさそうですが、文字列(というか数字)が送れればそれでサーボ操作程度なら可能なので、これを使用してみます。
スケッチ
スケッチはこんな感じです。
スマホ側から文字列を受信し数字に変換、サーボの動作範囲の角度ならその角度に動かす、範囲外や数値化できない値の場合は前ループの指示角度を保ってスマホ側に「Invalid Input(=無効な入力)」を返すという内容です
#include "BluetoothSerial.h"
#include <ESP32Servo.h> // Include the ESP32 Arduino Servo Library instead of the original Arduino Servo Library
BluetoothSerial SerialBT;
Servo myservo; // create servo object to control a servo
// Possible PWM GPIO pins on the ESP32: 0(used by on-board button),2,4,5(used by on-board LED),12-19,21-23,25-27,32-33
int servoPin = 18; // GPIO pin used to connect the servo control (digital out)
int val; // variable to read the value from the analog pin
int val_ipt; // variable to read the value from the analog pin
void setup()
{
//BTの処理
Serial.begin(115200);
SerialBT.begin("ESP32test");
//Servo用の処理
// Allow allocation of all timers
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50);// Standard 50hz servo
myservo.attach(servoPin, 500, 2400);
val = 90;//角度の初期値
}
void loop() {
//Bluetooth経由でのデータ取得
if (SerialBT.available()) {
String receiveData = SerialBT.readStringUntil(';');
val_ipt=receiveData.toInt();
if (val_ipt < 0 | 180 < val_ipt) {
SerialBT.print("invalid input\n");
} else {
val=val_ipt;
SerialBT.print("set servo" + receiveData);
}
}
myservo.write(val); // set the servo position
delay(200); // wait
}
動作
無事に動作しました。次回はスマホアプリの自作に挑戦したいと思います。