04_Distance-Servo
近づくとサーボを動かす
距離センサーに物体が近づくと、サーボモーターを回転させます。
準備する
CherryIoTとモジュールを接続する
CherryIoTの指定コネクタに以下のモジュールを接続し、CherryIoTをPCのUSB-A挿入口に接続します。
距離センサーモジュール
接続先:A
サーボモーターモジュール
接続先:B
Arduino IDEに必要なライブラリをインストールする
このサンプルでは、次のライブラリを追加する必要があります。
- ESP32Servo
初めて使用する場合のみインストールしてください。
ライブラリをインストールするサンプルコード
GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。
GitHubからコードを読み込んでいます...プログラムを書き込む
上のサンプルコードをコピーし、Arduino IDEに貼りつけます。
ボードとポートの設定を確認し、左上の 「→(書き込みボタン)」を押してCherryIoTに書き込みます。
初めて書き込む方は「はじめてのCherryIoT」で詳しい手順を確認してください。
動作確認
Arduino IDEの画面右上にあるアイコンをクリックすると、 画面下にシリアルモニターが表示されます。

物体を10cm未満まで近づけるとサーボが動き、10cm以上離すと元の位置へ戻るなら成功です。
動作中、シリアルモニターには距離センサーで測定した距離が表示されます。
コードの解説
測定距離が10cm未満かを判定し、結果に応じてサーボの角度を変えます。
GitHubからコードを読み込んでいます...#include <ESP32Servo.h>ESP32でサーボモーターを動かすため、ESP32Servoライブラリを読み込みます。ライブラリは、複雑な処理を簡単な命令で使えるようにまとめたプログラムです。
const int trigPin = 3;コネクタAから超音波を送信するGPIO3を、定数trigPinへ保存します。
const int echoPin = 1;コネクタAで反射した超音波を受信するGPIO1を、定数echoPinへ保存します。
const int motorPin = 4;コネクタBのサーボモーターに対応するGPIO4を、定数motorPinへ保存します。
float Duration = 0;超音波が往復する時間を保存するため、float型の変数Durationを用意し、初期値を0にします。
float Distance = 0;計算した距離を保存するため、float型の変数Distanceを用意し、初期値を0にします。
int angle = 0;サーボモーターの角度を保存する整数型の変数angleを用意し、0度から始めます。
Servo myservo;サーボモーターを操作するServo型のオブジェクトを作り、myservoという名前を付けます。
void setup() {setup関数は最初に1回だけ実行されます。ここでシリアル通信、距離センサー、サーボモーターを使う準備をします。
Serial.begin(115200);測定した距離をPCへ表示するため、115200bpsでシリアル通信を開始します。
pinMode(echoPin,INPUT);距離センサーから戻る信号を読み取れるように、echoPinをINPUT(入力)に設定します。
pinMode(trigPin,OUTPUT);距離センサーへ超音波を送る信号を出せるように、trigPinをOUTPUT(出力)に設定します。
myservo.attach(motorPin);myservoをmotorPinへ割り当て、コネクタBのサーボモーターを操作できるようにします。
void loop() {loop関数は繰り返し実行されます。距離を測定し、10cm未満ならサーボを180度へ、離れている場合は0度へ動かします。
digitalWrite(trigPin, LOW);正確な送信信号を作るため、最初にtrigPinをLOWにします。
delayMicroseconds(2);2マイクロ秒待ちます。マイクロ秒は100万分の1秒です。
digitalWrite(trigPin, HIGH);trigPinをHIGHにして、距離センサーから超音波を送信します。
delayMicroseconds(10);10マイクロ秒待ちます。
digitalWrite(trigPin, LOW);trigPinをLOWに戻し、超音波を送るための信号を終了します。
Duration = pulseIn(echoPin, HIGH);pulseInでechoPinがHIGHになっている時間を測り、超音波が往復した時間としてDurationへ保存します。
Duration = Duration/2;往復時間を2で割り、物体までの片道の時間にします。
Distance = Duration*340*100/1000000;音速を毎秒340mとして、片道時間から物体までの距離をcm単位で計算し、Distanceへ保存します。
Serial.println(Distance);計算した距離をシリアルモニターへ表示して改行します。
if (Distance < 10) {Distanceが10未満、つまり物体が10cmより近いかを確認します。
for(angle; angle <= 180; angle++) {angleが180以下の間、処理後にangleを1増加させて繰り返します。サーボを現在の角度から180度まで少しずつ動かします。
myservo.write(angle);サーボモーターをangleに保存されている角度へ動かします。
delay(15);0.015秒待ちます。
delay(200);0.2秒待ちます。
} else {物体までの距離が10cm以上の場合は、else以降の処理を実行します。
for(angle; angle >= 0; angle--) {angleが0以上の間、処理後にangleを1減少させて繰り返します。サーボを現在の角度から0度まで少しずつ戻します。
myservo.write(angle);サーボモーターを、減少していくangleの角度へ動かします。
delay(15);0.015秒待ちます。
delay(200);0.2秒待ちます。