04_Distance-Servo

近づくとサーボを動かす

距離センサーに物体が近づくと、サーボモーターを回転させます。

距離センサーモジュールサーボモーターモジュール
1

準備する

CherryIoTとモジュールを接続する

CherryIoTの指定コネクタに以下のモジュールを接続し、CherryIoTをPCのUSB-A挿入口に接続します。

距離センサーモジュール

距離センサーモジュール

接続先:A

サーボモーターモジュール

サーボモーターモジュール

接続先:B

Arduino IDEに必要なライブラリをインストールする

このサンプルでは、次のライブラリを追加する必要があります。

  • ESP32Servo by Kevin Harrington

初めて使用する場合のみインストールしてください。

ライブラリをインストールする
2

サンプルコード

GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。

04_Distance-Servo.ino
GitHubで開く
GitHubからコードを読み込んでいます...
3

プログラムを書き込む

上のサンプルコードをコピーし、Arduino IDEに貼りつけます。

ボードとポートの設定を確認し、左上の 「→(書き込みボタン)」を押してCherryIoTに書き込みます。

初めて書き込む方は「はじめてのCherryIoT」で詳しい手順を確認してください。

4

動作確認

Arduino IDEの画面右上にあるアイコンをクリックすると、 画面下にシリアルモニターが表示されます。

Arduino IDEでシリアルモニターを表示する場所

物体を10cm未満まで近づけるとサーボが動き、10cm以上離すと元の位置へ戻るなら成功です。

動作中、シリアルモニターには距離センサーで測定した距離が表示されます。

5

コードの解説

測定距離が10cm未満かを判定し、結果に応じてサーボの角度を変えます。

04_Distance-Servo.ino
GitHubで開く
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秒待ちます。