先日、Arduinoを経由してPCからサーボモーターを動かす実験を行いました。

 

 

 

今回は、ESP32を使って、無線でサーボモーターを動かしてみようと思います。

いくつか手法はあるのですが、まずはESP32をアクセスポイントとして使用し、そこにPCを接続してサーボモーターを動かしてみようと思います。

この手法のメリットとしては、ネットワーク環境が無くても動かせる点です。

移動先で動かしたい場合はとても使い勝手が良いものになると思います。

 

 

実際に動かしてみた結果はこちら。

 

 

動いている様子は、Arduinoで動かしている時と変わらないので面白くないですね…。

しかし、動いた瞬間は感動するので是非やってみてほしいです。

 

 

ESP32とサーボモーター(SG90)を使用しますが、注意点が1つ。

サーボモーターに供給する5Vの電源が別途必要です。

ESP32からは、3.3Vの電圧は取れますが5Vの電圧は取れません。

 

配線図にすると、こんな感じの接続が必要になります。

 

 

一応写真も載せておきます。

ブレッドボード右上に刺さっている端子で、モバイルバッテリーから電圧を別途供給しています。

 

 

ESP32のプログラムは、Arduino IDEにて書き込みました。

ライブラリとしては、ESP32Servo.hを使用しました。

プログラムは下記のようにしました。

 

#include <WiFi.h>

#include <ESP32Servo.h>

 

const char* ssid = "Servo_Controller";

const char* password = "12345678";

 

WiFiServer server(5000);

Servo servo1;

 

void setup()

{

  Serial.begin(115200);

  servo1.attach(18);    //D18

  servo1.write(90);

 

  //APモード

  WiFi.softAP(ssid,password);

 

  Serial.println("AP START");

  Serial.print("IP Address : ");

  Serial.println(WiFi.softAPIP());

 

  //TCPサーバ開始

  server.begin();

}


void loop()

{

  WiFiClient client = server.available();

 

  if(client)

  {

    Serial.println("Client Connected");

    while(client.connected())

    {

      if(client.available())

      {

        String data = client.readStringUntil('\n');

        data.trim();

        Serial.println(data);

 

        if(data.startsWith("ANGLE:"))

        {

          int angle =

          data.substring(6).toInt();


          if(angle < 0)

            angle = 0;

 

          if(angle > 180)

            angle = 180;

 

          servo1.write(angle);

 

          Serial.print("ANGLE = ");

          Serial.println(angle);

        }

      }

    }

 

    client.stop();

 

    Serial.println("Client Disconnect");

  }

}

 

 

ESP32にプログラムを書きこんだら、PCからESP32にwifiを接続します。

 

こんな感じで。

接続先の名前とパスワードは、ESP32のプログラムを書き換えることで自由に変更できます。

 

Pythonのプログラムは下記のようにしました。

 

import tkinter as tk

import socket

 

HOST = "192.168.4.1"

PORT = 5000

 

#-----------------

 

def send_angle():

    try:

        angle = int(entry.get())

 

        if angle < 0:

            angle = 0

 

        if angle > 180:

            angle = 180

 

        command = f"ANGLE:{angle}\n"

 

        client = socket.socket(

                    socket.AF_INET,

                    socket.SOCK_STREAM

                 )

 

        client.connect(

            (HOST,PORT)

            )

 

        client.send(

            command.encode()

            )

 

        client.close()

 

        value_label.config(

            text=f"送信値:{angle}°"

        )


    except:

        pass

 

#-----------------

 

def slider_changed(value):

    angle = int(float(value))

    entry.delete(0,tk.END)

    entry.insert(

        0,

        str(angle)

    )

 

#-----------------

 

root = tk.Tk()

 

root.title(

    "Servo Controller"

    )

 

root.geometry("400x250")


#-----------------

 

label = tk.Label(

            root,

            text="角度入力"

        )

 

label.pack()

 

entry = tk.Entry(

            root,

            width=10

        )

 

entry.insert(0,"90")

entry.pack()

 

#-----------------

 

slider = tk.Scale(

            root,

            from_=0,

            to=180,

            orient="horizontal",

            length=300,

            command=slider_changed

         )

 

slider.set(90)

slider.pack()

 

#-----------------

 

send_button = tk.Button(

            root,

            text="送信",

            width=15,

            height=2,

            command=send_angle

            )

 

send_button.pack(pady=10)

 

#-----------------

 

value_label = tk.Label(

                root,

                text="送信値:90°"

                )

 

value_label.pack()

 

#-----------------

 

root.mainloop()

 

これで、wifi経由でサーボモーターを動かすことができました!

次はネットワークを使った方法にも挑戦してみようと思います。